Seminars details

  • Programação com Quantificadores em C++
  • As linguagens de programação vêm equipadas com os operadores lógicos simples not, and e or, sempre, e nalguns casos xor e implies. Estranhamente, não trazem quantificadores. Porque será que perante um vector de inteiros, por exemplo, temos de escrever uma função para ver se todos os elementos são maiores que zero, por exemplo, em vez de recorrer a um operador forall, que arrumaria com a questão sem mais delongas?<P> Em situações mais elaboradas, os quantificadores são muito convenientes. Na programação com classes, por exemplo, muitos invariantes de classe são expressos em termos quantificadores universais: neste vector de pessoas não há duas pessoas com o mesmo nome; neste conjunto de gabinetes todos têm duas ou mais pessoas; nesta lista de strings não há strings vazias; etc.<P> Claro que podemos sempre reforçar as nossas classes com funções suplementares para realizar os cálculos pertinentes. No entanto, se se tratar de classes de biblioteca, não teremos acesso ao programa-fonte e as coisas complicam-se.<P> Pois bem: perante este desolador e deprimente estado de coisas, o que nos propomos fazer é trazer os quantificadores para o C++. A ideia não é nova. Há extensões ao Java que fazem precisamente isso, para permitir ao Java chegar ao Desenho por Contrato. Mas nós não vamos estender o C++. (Pudera!) Quanto muito, enriqueceremos as bibliotecas de classes.<P> Enriqueceremos as bibliotecas de classes com classes para os quantificadores. Surpreendentemente, em vez dos dois quantificadores expectáveis, Forall e Exists (sim, são classes genéricas), teremos ao todo seis variantes, o que complica a utilização, é verdade.<P> As classes para os quantificadores não existem isoladas: elas integram-se na biblioteca de classes que usamos (não, não se trata da STL) e relacionam-se sobretudo com as classes genéricas Collection, para colecções genéricas, Iterator, para iteradores genéricos, e Predicate, para predicados genéricos. Claro: o quantificador usará o iterador para visitar todos os elementos da colecção, verificando se cada um deles satisfaz o predicado.<P> Ilustraremos o desenvolvimento com exemplos simples com listas e vectores de listas, para escrever expressões que respondem a questões como "há alguma lista no vector de listas onde todos os elementos são múltiplos de 5"?, "será que em todas as listas um dos elementos é igual ao comprimento da lista a que pertence"?. Também abordaremos o exemplo standard deste domínio: uma classe Company com imensos Rooms e Employees. Veremos se na companhia há gabinetes só com mulheres, se todos os empregados têm gabinete e outras questões igualmente decisivas para o bem estar laboral.<P>
  • 23/10/2002 14:00
  • Pedro Guerreiro