Вы находитесь на странице: 1из 16

A LÓGICA

COMO LINGUAGEM DE PROGRAMAÇÃO


Os progressos verificados na década de 1960 na mecanização
do raciocínio dedutivo, e o consequente aparecimento na década seguinte
do paradigma da lógica como linguagem de programação,
criam a possibilidade aliciante de que a automatização dos processos de inferência
se venha a tornar tão importante como o cálculo infinitesimal,
o que constitui a versão moderna do sonho de Leibniz.

LUÍS MONTEIRO

E
mbora os algoritmos tenham tido sempre gran- apesar da grande variedade de modelos computacionais
de importância em toda a história da Matemática, propostos, com os concomitantes modelos de algorit-
e se conheçam algoritmos que remontam à mo, a classe manteve-se sempre invariante. Daí que o
Babilónia de 1800 AC, só neste século, a partir da dé- lógico Alonzo Church tenha proposto o que passou a
cada de 1930, a própria noção de algoritmo se tornou ser conhecido como a tese de Church: identificar a no-
objecto de estudo enquanto tal por parte de lógicos e ção intuitiva e informal de algoritmo com as suas ca-
matemáticos. A razão desse interesse prendia-se com racterizações formais, já que todas elas se revelaram equi-
questões relacionadas com os fundamentos da Matemática, valentes. Em termos mais pragmáticos, a resolubilidade
que estavam a ser investigadas pela Lógica. Com o ad- de um problema é insensível às mudanças de modelo
vento dos computadores, o estudo de computador ou de linguagem de
dos algoritmos incrementou-se e de- programação. Mas se assim é, outros
senvolveu-se em novas direcções, critérios têm de ser chamados a jus-
constituindo uma parte importante tificar novas propostas de modelos
da nascente Ciência da Computação. de computação, como o de tornar a
Num artigo intitulado “Algorithms’’, programação mais simples e conse-
publicado na revista Scientific American quentemente menos susceptível de
em 1977, o cientista da computação produzir erros. Um critério em que
Donald Knuth apresentava a um pú- geralmente não há desacordo é que
blico informado a noção de algorit- a programação se torna tanto mais
mo como um conjunto de regras ou simples quanto mais próxima da lin-
instruções que permitem obter, num guagem em que o problema é enun-
número finito de passos, resultados ciado se situar a linguagem de pro-
bem definidos a partir de dados bem gramação (isto é, de representação
definidos. Muitas actividades do dia- do algoritmo). No limite, a simplici-
-a-dia cabem nesta descrição, como dade máxima seria alcançada se fos-
mudar um pneu, consultar uma lista Licenciado em Engenharia Electrotécnica pelo se possível fazer coincidir as duas lin-
telefónica ou multiplicar dois núme- Instituto Superior Técnico e doutorado em Informática guagens — aquela em que o problema
ros. Mas o que distingue essencial- pela Universidade Nova de Lisboa, Luís Monteiro é se enuncia, ou linguagem de especi-
correntemente professor catedrático na Faculdade
mente um algoritmo é que ele tem de Ciências e Tecnologia da mesma Universidade. ficação, e aquela em que o proble-
de ser formulado com uma precisão Os seus interesses científicos centram-se no estudo ma se resolve algoritmicamente, ou
tal que pode ser, pelo menos em prin- dos modelos da computação, com particular real- linguagem de programação.
cípio, traduzido para uma linguagem ce para a programação em lógica e modelos da con- A lógica matemática — mais pro-
corrência. Tem mantido colaboração com diversos
de programação e executado num grupos europeus, nomeadamente através da parti- priamente, o cálculo de predicados
computador. cipação em projectos de investigação do programa de primeira ordem — é tradicional-
Após mais de meio século de in- Esprit. Deu vários cursos a nível internacional, mente uma linguagem mais “próxi-
vestigações, pode afirmar-se que a entre os quais um curso na escola de verão sobre ma” da especificação. Porém, na se-
“Language, Logic and Information” em Saarbrücken
classe dos problemas que têm reso- em 1991 e um curso inserido no programa de dou- quência das investigações sobre a
lução algorítmica é bastante robusta: toramento da Universidade de Pisa em 1993. demonstração automática de teore-

3
mas na década de 1960, reconheceu-se que a demons- pecialmente apropriada para tratamento automático. Por
tração é uma forma de computação, pelo que as espe- um lado, a linguagem da lógica era extremamente sim-
cificações dos problemas em lógica encerram a sua pró- ples e uniforme, baseada em certo tipo de frases cha-
pria resolução algorítmica. madas cláusulas. Por outro lado, o sistema não tinha
Em boa verdade, a ideia de demonstração como com- axiomas e tinha uma unica regra de inferência, chama-
putação é bastante mais antiga, e remonta ao trabalho da resolução.
de Kurt Gödel sobre a incompletude da aritmética pu- Não era um sistema apropriado para uso humano,
blicado em 1931. Gödel mostrou que toda a função (re- já que muita informação não se exprime “naturalmente”
cursiva primitiva) f pode ser descrita por uma fórmula por cláusulas e a resolução é uma regra de inferência
φ(x,y) tal que f(m)=n se e só se existir uma demonstra- bastante elaborada. Mas, em contrapartida, a sua uni-
ção da fórmula φ(m,n). Desta maneira, as capacidades formidade e exiguidade de conceitos tornava-a atraente
dedutivas da aritmética de primeira ordem permitem cal- para tratamento automático. Acresce que o cálculo de
cular f(m)=n por dedução de φ(m,n). Mas foi só mais predicados de primeira ordem pode ser traduzido na lin-
recentemente, em resultado dos trabalhos sobre de- guagem das cláusulas — de modo que a utilização de
monstração automática de teoremas, cujo ponto alto se cláusulas não representa uma diminuição de expressivi-
situa em 1965 com a descoberta do princípio da resolu- dade — e isso de forma automática — de modo que um
ção de J. Alan Robinson, que se generalizou a ideia de utilizador humano pode continuar a usar a linguagem
programação em lógica, ou seja, a utilização da lógica completa do cálculo de predicados sem ter que se preo-
como linguagem de programação. Para muitos, o ideal cupar em fazer a tradução para cláusulas quando pre-
para que a programação tende consiste em enunciar um tender fazer uma demonstração.
problema de forma precisa, e deixar que a sua resolu- O trabalho de Robinson gerou grande entusiasmo
ção algorítmica se extraia automaticamente a partir do na comunidade da demonstração automática de teore-
enunciado — é o paradigma da programação declarati- mas, e várias extensões e refinamentos da sua teoria fo-
va, por oposição a um modelo imperativo baseado na ram surgindo. Paralelamente, ensaiaram-se as primeiras
descrição directa das acções a executar pelo algoritmo. aplicações: interrogação de sistemas de conhecimentos,
No ideal declarativo, programar consistirá não tanto na robótica, demonstração de propriedades de programas.
prescrição de um certo número de passos conduzindo No meio de todas estas actividades, não deve ter passa-
dos dados iniciais do problema aos resultados deseja- do desapercebida a vários investigadores a analogia en-
dos, mas na especificação das condições a que a solu- tre os processos de dedução e a computação, mas foi
ção tem de obedecer. A programação em lógica é vista talvez Cordell Green quem primeiro a enunciou expli-
como um passo nessa direcção. citamente num trabalho datado de 1968. Mas esta ob-
O sistema lógico usado por Robinson era uma va- servação não teve sequência na altura por falta de de-
riante do cálculo de predicados de primeira ordem es- senvolvimentos técnicos que só ocorreram mais tarde.
O primeiro desses desenvolvimentos foi a descoberta
por Robert Kowalski e David Kuehner em 1971 de um
procedimento de resolução orientado por objectivos, que
tem a vantagem computacional de não derivar conse-
quências irrelevantes para a demonstração a efectuar. O
segundo foi o de restringir uma vez mais a linguagem
lógica considerada, desta vez a um tipo de cláusulas es-
peciais denominadas cláusulas de Horn. Esta restrição
foi feita independentemente por Colmerauer no início
da década de 1970 com a implementação da linguagem
de programação Prolog (designação derivada da ex-
pressão francesa “programmation en logique”), moti-
vada por aplicações ao processamento da língua natu-
ral por computador, e por Kowalski em 1974 numa
perspectiva mais teórica. Neste artigo procuraremos so-
bretudo mostrar a génese da idéia de programação em
Fig. 1 - Fragmento de uma página de uma edição de 1482 dos lógica em detrimento da exploração das suas aplicações.
Elementos de Euclides (c. 300 A.C.). Uma das mais originais con-
tribuições da Grécia Antiga para o pensamento científico foi a
introdução da noção de demonstração, que procede por dedu- A dedução como um jogo formal
ção a partir de axiomas. O método axiomático foi defendido por
vários pensadores gregos e profusamente ilustrado por Euclides
nos Elementos.
A matéria prima da lógica são as proposições (afir-
(Fonte da figura: Dirk J. Struik, História Concisa das Matemáticas, mações, asserções), e o seu ponto de partida o estudo
Gradiva, 1989.) da relação de consequência: a determinação de condi-

4
ções em que a verdade de uma proposição — a con- origem a um jogo desta natureza. No sistema de lógica
clusão — decorre da verdade de outras proposições — de cláusulas em que estamos interessados, as situações
as premissas. Quando uma proposição é consequência são colecções de cláusulas, como as que a seguir se
de outras, é-o exclusivamente em virtude da forma das apresentam:
proposições envolvidas e não do que elas possam sig-
nificar. É o que confere o carácter formal à lógica e a
(1) s,p ← c,
torna independente de quaisquer circunstâncias factuais.
A apresentação de qualquer sistema de lógica co- (2) m ← c,
meça assim invariavelmente com a definição de uma lin-
(3) r,p ← s,m,
guagem formal na qual as proposições são expressas.
Parte-se de uma colecção finita de símbolos — símbo- (4) c ←,
los lógicos para representar composições de proposições (5) ← m,r,
como a conjunção “e” ou quantificações como “para to-
do o”, e símbolos não lógicos para representar entida- (6) ← m,p.
des ou relações entre elas — e acrescentam-se regras
precisas para juntar símbolos de forma a constituir as fra- As cláusulas estão numeradas para referência futu-
ses da linguagem. O carácter formal da linguagem deve- ra, mas a numeração não faz parte delas, bem como a
se a que os símbolos não lógicos não têm um significa- vírgula que separa cada cláusula da seguinte e o ponto
do fixado de antemão. Ao escolher uma interpretação que termina a lista. Cada cláusula é constituída por dois
para esses símbolos, as frases da linguagem transformam- grupos de letras, separados por uma seta: o antecedente
se em afirmações sobre o domínio da interpretação — é o grupo da direita e o consequente o da esquerda.
chamado uma estrutura —, que são susceptíveis de se- As letras de cada grupo, quando em número superior a
rem verdadeiras ou falsas. A noção de consequência po- um, escrevem-se por uma ordem qualquer separadas por
de definir-se assim: uma proposição é uma consequên- vírgulas, e várias ocorrências de uma mesma letra con-
cia de certas premissas se for verdadeira em todas as tam como uma só, pelo que em geral se omitem as re-
estruturas nas quais as premissas forem verdadeiras. A
teoria de uma estrutura é a colecção de todas as propo-
siçcões que são verdadeiras quando os seus símbolos
são interpretados na referida estrutura.
Quando se dispõe de uma classe de estruturas, põe-
-se o problema de saber quando uma proposição é ver-
dadeira em todas, isto é, pertence à teoria da classe da-
da. Em Lógica, o procedimento usual é procurar axiomatizar
a teoria: tomam-se como axiomas certas proposições que
se sabe pertencerem à teoria, e escolhem-se certas re-
gras — ditas de inferência — para derivar (inferir, de-
duzir) novas proposições a partir de proposições dadas.
Aplicando consecutivamente regras de inferência aos
axiomas ou a proposições anteriormente obtidas por es-
te processo a partir dos axiomas, chega-se a novas pro-
posições que tecnicamente são denominadas teoremas,
e o processo da sua obtenção demonstrações. De se-
guida veremos como algumas destas noções se caracte-
rizam na lógica de cláusulas de Robinson, partindo dos
aspectos mais formais relacionados com a dedução e
abordando posteriormente as questões relativas ao sig-
nificado.
Vamos começar por encarar a dedução como um jo-
go formal, que se joga numa folha de papel inscreven-
do símbolos de acordo com certas regras simples. As re-
gras dependem apenas da forma como os símbolos se Fig. 2 - Gottfried Wilhelm Leibniz (1640-1710) foi o primeiro a
combinam entre si e não do que eles possam significar. defender que deveria existir um "calculus ratiotinator" para racioci-
Há um único jogador, cujo objectivo é transformar uma nar sobre proposições àcerca do mundo de importância compa-
rável ao cálculo infinitesimal para lidar com equações numéricas
situação inicial numa situação final através de pequenos
que descrevem o mundo.
passos que resultam da aplicação das regras de mani- (Fonte da figura: Souleymane B. Diagne, Boole: L'Oiseau de Nuit
pulação simbólica permitidas. Cada sistema de lógica dá en Plein Jour, Éditions Belin, Paris, 1989).

5
petições. Como se observa nas três últimas cláusulas, não (12) ← p por (6) e (8),
é obrigatório que antecedente e consequente contenham
(13) p ← por (10) e (11),
letras, admitindo-se mesmo que nenhum as tenha; a cláu-
sula nesse caso diz-se vazia e representa-se convencio- (14) G por (12) e (13).
nalmente por G de preferência à seta ← isolada. Quando
é necessário (ou por comodidade), é usual adornar as le- O leitor constatará que em cada situação intermédia
tras com índices ou pelicas, ou até usar palavras em seu se pode aplicar a resolução a vários pares de cláusulas,
lugar, mas por simplicidade continuaremos a chamar-lhes sendo que nem todos contribuem para se encontrar uma
apenas letras (na literatura são vulgarmente referidas por refutação. O processo dedutivo é não-determinista e a
letras — ou símbolos, ou variáveis — proposicionais). pesquisa de uma refutação no meio de todas as possi-
No espírito do nosso jogo formal, adiamos a discussão do bilidades em aberto faz-se por tentativa-e-erro e é em
significado das cláusulas para mais tarde e concentramo- geral bastante ineficiente. É por essa razão que a pro-
nos sobre as manipulações a que as podemos sujeitar. gramação em lógica se baseia apenas num certo tipo par-
O objectivo do jogo da dedução que estamos a con- ticular de cláusulas — as cláusulas de Horn — que per-
siderar é produzir a cláusula vazia por sucessivas trans- mitem disciplinar a pesquisa e tornar o processo
formações das cláusulas dadas. Cada transformação con- suficientemente eficiente para que seja plausível a ideia
siste na selecção de duas cláusulas apropriadas, seguida de usar a lógica como linguagem de programação. Mas
de uma aplicação da regra de inferência resolução para antes de apresentar as cláusulas de Horn vamos discutir
obter a resolvente das cláusulas seleccionadas. Eis os algumas questões de semântica e proceder a uma gene-
dois passos em pormenor: ralização que consiste na introdução de variáveis.

Selecção: Escolhem-se duas cláusulas em que uma Consideraçcões semânticas


mesma letra figure no antecedente de uma e no conse-
quente da outra. O que significam as cláusulas? As letras (proposicio-
Por exemplo, as cláusulas (1) e (3) estão nestas con- nais) que nelas ocorrem representam proposições sus-
dições com respeito à letra s (mas não com respeito a p ceptíveis de serem verdadeiras ou falsas. Posto isto:
ou a qualquer outra letra).
Uma cláusula afirma que se todas as proposições do
Resolução: A resolvente das cláusulas escolhidas antecedente forem verdadeiras então pelo menos uma
obtem-se juntando os correspondentes antecedentes e proposição do consequente é verdadeira.
consequentes, após o “corte” da letra comum no ante-
cedente de uma e no consequente da outra. É claro que uma cláusula pode ela própria ser ver-
Por exemplo, a resolvente das cláusulas (1) e (3) é dadeira ou falsa, dependendo do valor de verdade das
proposições que a constituem. Como se determina o va-
(7) r,p ← c,m. lor de verdade de uma cláusula? O mais simples é ver
em que condições ela é falsa:
Note-se que ao juntar os consequentes a letra p apa-
receria repetida, mas a repetição foi eliminada.

O jogo pode agora prosseguir com novas aplicações


da resolução, em que intervêm não só as cláusulas ori-
ginais como as que foram entretanto sendo produzidas.
O desenrolar do jogo constitui o processo de dedução
(inferência, derivação) das novas cláusulas tendo como
premissas as cláusulas originais. O objectivo do jogo
nesta lógica é a derivação da cláusula vazia, que se cha-
ma uma refutação das premissas. Eis um exemplo de
refutação, onde à frente de cada cláusula se indicam as
duas cláusulas de que ela é a resolvente:

(8) m ← por (2) e (4),


(9) r,p ← c por (7) e (8),
Fig. 3 - Máquina de calcular concebida por Leibniz para efectuar
(10) r,p ← por (4) e (9), multiplicações, 1871.
(Fonte da figura: G. Masini, História Ilustrada da Ciência: A
(11) ← r por (5) e (8), Electrónica, Círculo de Leitores, 1979.)

6
Independentemente do valor de verdade que estas
Uma cláusula é falsa quando todas as proposições proposições possam ter, a cláusula
do antecedente forem verdadeiras e nenhuma do con-
sequente o for, visto que isto é o contrário do que a cláu- s,p ← c
sula afirma. Em qualquer outro caso a cláusula conside-
ra-se verdadeira. afirma que se c é verdade então s é verdade ou p é ver-
dade, isto é, se João é casado com uma rainha então João
No nosso exemplo, suponhamos que interpreta- é um soberano ou João é um príncipe. (Face a esta in-
mos as letras c, m, p, r e s como as seguintes propo- terpretação, pareceria mais natural escrever a cláusula
sições: na forma c → s,p, invertendo as posições do anteceden-
te e consequente como é usual em Lógica, mas não se-
ria tão vantajoso para a interpretação da lógica de cláu-
c — João é casado com uma rainha.
sulas como linguagem de programação.) A afirmação
m — João é do sexo masculino. que a cláusula encerra não permite tirar nenhuma con-
clusão sobre as proposições individuais que a consti-
p — João é um príncipe.
tuem — qualquer uma delas pode ser verdadeira ou fal-
r — João é um rei. sa. O que a cláusula faz é estabelecer uma relação de
s — João é um soberano. dependência mútua entre elas que tem como conse-
quência excluir uma determinada combinação de valo-
res de verdade — mais precisamente, aquela em que as
proposições do antecedente forem verdadeiras e as do
consequente falsas. Por exemplo, se soubéssemos que

Fig. 4 - George Boole (1815-1864), pouco tempo depois da sua


nomeação como professor no Queen's College de Cork, em 1849.
Embora tenha tido vários percursores, como Leibniz e De Morgan,
Boole é considerado o verdadeiro criador da lógica simbólica
moderna. Inspirando-se no raciocínio algébrico, que opera so-
bre símbolos, Boole define pela primeira vez de forma explícita
um cálculo de classes, que representam proposições lógicas ca- Fig. 5 - Frontispício da obra mais importante de George Boole,
racterizadas em extensão. entre as várias que dedicou à sua álgebra da lógica.
(Fonte da figura:Souleymane B. Diagne, Boole: L'Oiseau de Nuit (Fonte da figura: G. Masini, História Ilustrada da Ciência: A
en Plein Jour, Éditions Belin, Paris, 1989.) Matemática, Círculo de Leitores, 1979.)

7
c é verdade (João é casado com uma rainha) e p é falsa é verdadeira ou p é verdadeira, uma vez mais como se
(João não é um príncipe), concluiríamos que s é verda- pretende.
de (João é um soberano) porque a situação em que c é A definição de consequência ilustra bem o carácter
verdade e p e s são ambas falsas é excluída pela cláu- formal da lógica, dado que não depende do que as pro-
sula. posições constituintes exprimem nem sequer de qual é
Adoptando uma forma mais comum de escrita, as o seu valor de verdade. Uma consequência deve ser vá-
três primeiras cláusulas têm a seguinte leitura: lida em todas as circunstâncias possíveis, o que no caso
presente significa para todos os valores de verdade das
(1’) Se João for casado com uma rainha, é um sobe- proposições para os quais as premissas são verdadeiras.
rano ou um príncipe. Isso também ficou patente no raciocínio onde se de-
(2’) Se João for casado com uma rainha, é do sexo monstrou que a cláusula (7) é consequência das cláu-
masculino. sulas (1) e (3), o qual não precisou de atribuir nenhum
(3’) Se João for um soberano do sexo masculino, é significado concreto às letras c, m, p, r e s para se po-
um rei ou um príncipe. der realizar. Um computador que simule este tipo de ra-
ciocínio procede de forma análoga, usando para esse
Como interpretar cláusulas em que o antecedente ou efeito exclusivamente a informação que lhe é fornecida.
o consequente não têm letras? No caso de o anteceden- No exemplo essa informação é veículada pelas cláusu-
te ser vazio, a condição de todas as suas proposições se- las numeradas de (1) a (6), que por sinal é bastante in-
rem verdadeiras é imediata, visto que não há nenhuma
que seja falsa. Uma tal cláusula representa pois a afir-
mação incondicional de que pelo menos uma proposi-
ção do consequente é verdadeira — é uma asserção.
Se o consequente for vazio, não tem nenhuma pro-
posição verdadeira. Se todas as proposições do antece-
dente forem verdadeiras, a cláusula é falsa, como se viu
anteriormente. Assim, uma cláusula de consequente va-
zio afirma que pelo menos uma das proposições do an-
tecedente é falsa — é uma negação.
As cláusulas (4), (5) e (6) afirmam então o seguinte:

(4’) João é casado com uma rainha.


(5’) João não é do sexo masculino ou não é rei.
(6’) João não é do sexo masculino ou não é príncipe.

O papel fundamental da noção de verdade é per-


mitir definir consequência (lógica). Uma cláusula é con-
sequência de outras cláusulas se for verdadeira sempre
que elas o forem. Precisemos os termos da definição.
Chamemos premissas às cláusulas das quais se preten-
de extrair consequências. O valor de verdade de uma
cláusula depende, como se viu, dos valores de verdade
das proposições nela contidas. Dizer que uma cláusula
é consequência das premissas significa que ela é verda-
deira para todos os valores de verdade das proposições
que tornam as premissas verdadeiras.
A título de exemplo, verifiquemos que a cláusula (7)
é consequência das cláusulas (1) e (3). Vamos supor que
c, m, p, r e s têm valores de verdade atribuídos de tal
forma que as cláusulas (1) e (3) são verdadeiras. Temos Fig. 6 - Kurt Gödel (1906-1978) é geralmente considerado o mais
de mostrar que (7) também é verdadeira, isto é, que se importante lógico do século vinte. No seu célebre trabalho de
1931 sobre a incompletude da aritmética (Acerca de Proposições
m e c forem verdadeiras então r é verdadeira ou p é ver- Formalmente Indecidíveis nos Principia Mathematica e Sistemas
dadeira. Como c é verdadeira, de (1) conclui-se que s é Relacionados, trad. M. Lourenço, Fundação Calouste Gulbenkian)
verdadeira ou p é verdadeira. No caso de p ser verda- estava implícita a idéia de demonstração como computação que,
deira nada há a acrescentar porque já satisfaz o que se com uma diferente interpretação, viria a ser mais tarde o tema
central da programação em lógica.
pretende. No caso de s ser verdadeira, e como m é ver- (Fonte da figura: D. Bergamini and the Editors of LIFE, Mathematics,
dadeira por hipótese, conclui-se desta vez de (3) que r LIFE Science Library, 1965.)

8
completa na matéria sobre que versam. Entre muitas ou- gica de cláusulas consiste em mostrar que as premissas,
tras coisas, nada se diz sobre o que se entende por se- juntamente com as cláusulas que representam a nega-
xo masculino, e as cláusulas nem sequer têm como con- ção da conclusão, são contraditórias, o que estabelece a
sequência a cláusula m ← r, que afirma que se João é veracidade da conclusão.
rei então é do sexo masculino. É este processo, de dedução de uma conclusão por
Não é uma coincidência que a cláusula (7) seja uma refutação da sua negação, que é completo: se uma afir-
consequência das cláusulas (1) e (3) e também sua re- mação é consequência de um certo número de cláusu-
solvente. Na verdade, o raciocínio que estabeleceu que las, a sua negação e essas cláusulas são contraditórias.
(7) é consequência de (1) e (3) é geral e pode ser adap- Por exemplo, vimos que a ← b, c é consequência de
tado para provar que a resolvente de quaisquer duas a ← b mas não se pode deduzir dela. Para vermos que
cláusulas é uma sua consequência. Dado que uma de- se pode deduzir por refutação, comecemos por obser-
dução não é mais do que uma aplicação repetida da re- var que a sua negação consiste em afirmar a sua falsi-
gra de resolução, qualquer cláusula deduzida a partir de dade, isto é, em afirmar b e c e em negar a, o que se re-
certas premissas é uma consequência dessas premissas. presenta pelas cláusulas b ←, c ← e ←a. Seguidamente,
Noutros termos, o que se deduz a partir das premis- verificamos que estas cláusulas e a ← b são contraditó-
sas é verdade, na hipótese de as premissas o serem. Esta rias:
é evidentemente uma propriedade desejável de qualquer
lógica, conhecida como a coerência da dedução. O seu
interesse é que dá credibilidade à dedução, asseguran- (15) a ← b premissa,
do-nos que o que se deduz não é um completo dispa- (16) b ← negação
rate mas está em perfeita consonância com o que é ob-
(17) c ← da
servável no “mundo real” e se exprime em termos da
verdade ou falsidade de afirmações. (18) ← a conclusão,
Há uma questão complementar da coerência que é
(19) a ← por (15) e (16),
a completude, e consiste em saber se toda a conse-
quência das premissas pode ser deduzida a partir delas. (20) G por (18) e (19).
A resposta é negativa, nos termos em que a dedução foi
definida, mas há uma formulação aparentada que con-
duz a uma resposta positiva. Por exemplo, a cláusula
a ← b, c é consequência de a ← b, como o seguinte ra-
ciocínio mostra: se b e c forem verdade então, em par-
ticular, b é verdade; assumindo que a segunda cláusula
é verdadeira, a é verdade; logo, a primeira cláusula é
verdadeira. Mas a ← b, c não é dedutível a partir de
a ← b, como se conclui notando que para aplicar a re-
gra da resolução são precisas pelo menos duas premis-
sas. A forma de resolver a questão é adoptar o método
de raciocínio por redução ao absurdo, que consiste em
negar a conclusão e mostrar que isso contradiz as hipó-
teses. Que forma assume este tipo de raciocínio na ló-
gica de cláusulas?
Ainda não mencionámos explicitamente o significa-
do da cláusula vazia. Ela é simultaneamente uma asser-
ção (a de que alguma proposição do consequente é ver-
dadeira) e uma negação (a de que alguma proposição
do antecedente é falsa), mas são ambas obviamente fal-
sas, já que consequente e antecedente não têm propo-
sições. A cláusula vazia representa pois uma afirmação
que é falsa em virtude da sua própria forma — é uma
contradição. À derivação de uma contradição chamá-
mos anteriormente uma refutação. Fig. 7 - J. Alan Robinson (1930-) deu em 1965 o passo decisivo
As premissas de uma refutação não podem ser to- para a mecanização do processo dedutivo ao introduzir o méto-
das simultaneamente verdadeiras, porque pela proprie- do da resolução para a lógica das cláusulas de primeira ordem,
dade da coerência isso obrigaria a que a cláusula vazia que conduziria poucos anos mais tarde ao primeiro sistema de
programação em lógica baseado nas cláusulas de Horn.
também o fosse. Diz-se então que as premissas são con- (Fonte da figura: J.-L. Lassez, G. Plotkin (eds.), Computational
traditórias. O raciocínio por redução ao absurdo na ló- Logic, Essays in Honor of Alan Robinson, The MIT Press, 1991.)

9
Na refutação apresentada em primeiro lugar, as cláu- aqui que a pergunta tem resposta positiva, pelo menos quan-
sulas (4), (5) e (6) são a negação da afirmação conjunta do se consideram apenas afirmações que se podem expri-
das cláusulas mir na chamada lógica de predicados de primeira ordem,
mas não podemos ser mais explícitos sobre este ponto.
Há, porém, uma limitação importante à capacidade
(21) m ← c,
de expressão das cláusulas que temos vindo a considerar
(22) r, p ← c, — ao representar as proposições por uma simples letra
estamos a ignorar o papel que a sua estrutura possa ter
que significam que se João é casado com uma rainha en- no processo dedutivo. Uma lógica deste tipo diz-se pro-
tão é do sexo masculino e é rei ou príncipe. A sua ne- posicional, e a lógica de cláusulas é apenas um membro
gação consiste em afirmar que João é casado com uma relativamente recente de uma família numerosa. Vamos
rainha mas não é simultaneamente do sexo masculino e agora estender o formalismo das cláusulas a uma lógica
rei, nem do sexo masculino e príncipe, o que corres- de predicados de primeira ordem, que tem a capaci-
ponde de facto às cláusulas de (4) a (6). A refutação for- dade de representar entidades e relações entre entidades.
mada pelas cláusulas de (1) a (14) mostra que (21) e (22)
são uma consequência por refutação de (1), (2) e (3). Predicados, constantes e variáveis
Até aqui evitámos a questão de saber se qualquer afir-
mação em que estamos interessados pode ser representada Há raciocínios em que as proposições não podem
por cláusulas. Uma resposta pormenorizada a esta questão ser tomadas em bloco, e requerem uma análise mais fi-
sai fora do âmbito deste artigo e não é imprescindível para na dos elementos que entram na sua constituição.
se compreender como a lógica pode ser usada como lin- Um caso típico é o conhecido argumento sobre a
guagem de programação. Limitamo-nos assim a assinalar mortalidade de Sócrates:

Todo o homem é mortal.


Sócrates é homem.
Logo, Sócrates é mortal.
Se tentássemos deduzir por refutação a conclusão a
partir das premissas, sem atender à estrutura das pro-
posições, procederíamos do seguinte modo. Representaría-
mos as proposições por letras como u, h e m, as pre-
missas pelas asserções u ← e h ← , e a negação da
conclusão por ← m. Mas como é evidente, nada se po-
de inferir destas três cláusulas pela regra da resolução.
Outra coisa não seria de esperar, porque ao representar
as proposições por letras escondem-se as relações exis-
tentes entre elas, manifestas na utilização comum dos
termos “homem”, “mortal” e “Sócrates”.
A primeira proposição tem um carácter “universal”,
visto que se aplica a toda e qualquer entidade, afirman-
do que se essa entidade for homem então é mortal. Um
caso particular — ou instância — dessa afirmação é:

Se Sócrates é homem, Sócrates é mortal.

Nesta afirmação reconhecem-se as proposições que


acima representámos pelas letras h e m, de forma que a
própria afirmação se pode representar pela cláusula
m ← h. As três cláusulas

m ← h,
h ←,
Fig. 8 - Folha de rosto do livro Logic: Form and Function, de ← m,
Robinson, datado de 1979, onde expõe com grande clareza os
princípios da sua teoria sobre a mecanização do processo dedu- formadas por uma instância apropriada da primeira pre-
tivo. missa, pela segunda premissa e pela negação da con-

10
clusão, já são refutáveis. Note-se que isto estabelece que Expressões como h(s) ou m(s) chamam-se átomos.
m ← é dedutível por refutação a partir de m ← h e h ←, Letras como h e m, que representam propriedades (ou,
mas ainda falta justificar como se pode obter uma de- mais geralmente, relações arbitrárias entre entidades, co-
dução empregando directamente a afirmação universal u. mo veremos mais adiante), chamam-se símbolos de pre-
Consideremos agora a afirmação “Platão é homem”. dicado, e as letras que representam entidades recebem
Por um raciocínio análogo, é evidente que podemos con- o nome de constantes. Bem entendido, também aqui
cluir “Platão é mortal”. Mais formalmente, as três cláu- as letras podem vir munidas de índices ou pelicas, ou
sulas¨ em seu lugar serem usadas palavras. Convencionamos,
porém, utilizar apenas letras minúsculas ou palavras que
m’ ← h’, se iniciam por uma letra minúscula, para distinguir fa-
cilmente estes símbolos das variáveis, introduzidas a se-
h’ ←, guir.
← m’, A cláusula que representa “Se Sócrates é homem en-
tão é mortal” é, na nova notação, m(s) ← h(s). Para cap-
são refutáveis, em que h’ e m’ representam as mesmas
tar a estrutura da proposição u temos de recorrer a va-
afirmações que h e m mas desta feita aplicadas a Platão. riáveis. Estas comportam-se como as constantes, mas
Para tornar mais nítidas as semelhanças entre h e h’ por não denotam nenhuma entidade particular (pode dizer-
uma lado e m e m’ por outro, podíamos fazer uso de ín- se que denotam uma entidade genérica). Como é tradi-
dices em vez de pelicas e utilizar as notações hs e ms cional na programação em lógica, para as variáveis re-
quando nos referíssemos a Sócrates, e hp e mp para Platão. servamos as letras maiúsculas, ou palavras iniciadas por
Se mais tarde pretendêssemos aplicar o mesmo raciocí- uma letra maiúscula, possivelmente com índices ou pe-
nio a Aristóteles, podíamos usar ha e ma, por exemplo. licas. Assim, h(X) denota “X é homem”, que é uma afir-
Tudo quanto precisamos é ter nomes — como s, p mação que está indefinida em parte porque X não de-
e a — para as entidades às quais o raciocínio se vai apli- nota ninguém em especial. A proposição u, que afirma
car, e usá-los como índices das letras h e m. Esta ideia
parece boa, tão boa, aliás, que uma simples notação es-
tá prestes a transformar-se num conceito. Mas antes pre-
cisamos de limar algumas arestas.
Na ordem de ideias que temos vindo a discutir, as
próprias letras h e m tomadas isoladamente (isto é, sem
índices) podem adquirir significado.
Elas representam as proposiçcoes “incompletas”

... é homem,
... é mortal,

com um espaço vazio a ser preenchido mais tarde por


Sócrates, Platão ou qualquer outra entidade que venha-
mos a considerar — o campo está aberto a todas as pos-
sibilidades. Vistas sob este prisma, h e m representam
propriedades que quando se aplicam a entidades como
s se transformam nas proposições hs e ms. Com esta ob-
servação, é chegada a altura de generalizar a notação
utilizada até aqui para melhor se adequar à nova situa-
ção.
Em vez de hs e ms passaremos a escrever h(s) e m(s),
substituindo o índice por um argumento, para corres-
ponder mais de perto à ideia de aplicação, corrente em
matemática. Aplicando uma propriedade a uma entida-
de obtem-se uma proposição que exprime que a enti-
dade satisfaz a referida propriedade. Por exemplo, h(s) Fig. 9 - A difusão da linguagem de programação em lógica Prolog
significa que s satisfaz a propriedade h. Assim, afirma- ficou a dever muito ao compilador que foi desenvolvido na
ções como “Sócrates é homem” serão sistematicamente Universidade de Edimburgo por David Warren, com a colabora-
ção de Luís Moniz Pereira e Fernando Pereira, então no Laboratório
interpretadas como “Sócrates satisfaz a propriedade de
Nacional de Engenharia Civil em Lisboa. A figura mostra a pri-
ser homem” e representadas na forma homem (Sócrates) meira página do primeiro artigo publicado sobre essa imple-
ou qualquer outra forma abreviada como h(s). mentação apresentado a uma conferência nos E.U.A. em 1977.

11
que toda a entidade que é homem é mortal, admite a se- vente destas duas instâncias é a cláusula (25). Assim, se
guinte reformulação: para todo o X, se X é homem en- às cláusulas (23) e (24) juntarmos a negação de (25), que
tão X é mortal. A parte que se segue a “para todo o X” é a cláusula
é semelhante à correspondente afirmação para Sócrates
e representa-se pela cláusula ←m(s),

pode-se derivar a cláusula vazia.


m(X) ← h(X).
O termo técnico para a operação que torna iguais
dois átomos (possivelmente) diferentes por aplicação de
A expressão “para todo o X” chama-se uma quanti-
uma substituição é unificação, e a substituição em ques-
ficação universal de X, e uma notação corrente para
tão um unificador.
ela em lógica é V X. Na lógica de cláusulas ela é omiti-
Dois átomos podem não ser unificáveis, como
da, entendendo-se tacitamente que todas as variáveis que
ocorrem numa cláusula (podem ser mais do que uma,
como veremos) estão universalmente quantificadas. É h(s) e m(s),
importante observar que a escolha das variáveis que fi-
ou
guram numa cláusula é em larga medida arbitrária. Elas
podem ser trocadas à vontade por outras que não ocor- h(s) e h(p),
ram na cláusula que isso não lhe altera o significado (desde
que, bem entendido, todas as ocorrências de uma variável visto que em ambos os casos não há nenhuma substitui-
sejam substituídas pela mesma variável). Por exemplo, se em ção que aplicada a uma das expressões dê a outra (co-
vez de X tivéssemos usado Y, a cláusula m (Y) ← h (Y) ler- mo os átomos não têm variáveis, qualquer substituição
-se-ia “para todo o Y, se Y é homem então Y é mortal”, que se lhes aplique deixa-os inalterados).
que obviamente tem o mesmo significado que anterior-
mente.
Reproduzamos as três cláusulas que constituem o ar-
gumento de Sócrates:

(23) m(X) ← h(X),


(24) h(s) ←,
(25) m(s) ←.
Para aplicar a regra de inferência resolução na nova
situação, temos de ser um pouco mais liberais quanto às
condições em que permitimos o “corte” de um átomo
no antecedente de uma cláusula e no consequente da
outra. Em vez de exigir que são exactamente o mesmo
átomo (no caso proposicional tinha de ser a mesma le-
tra), basta-nos requerer que os átomos possam ser igua-
lados mediante uma substituição apropriada de variáveis
por constantes ou mesmo por outras variáveis. Se for es-
se o caso, trabalhamos não com as cláusulas originais,
mas com as instâncias que se obtêm procedendo às re-
feridas substituições. As instâncias já terão um mesmo
átomo no antecedente de uma e no consequente da ou-
tra, que pode então ser “cortado” pelo procedimento do
caso proposicional.
Por exemplo, os átomos h(X) e h(s) nas cláusulas (23)
e (24) podem ser igualados se substituirmos X por s. Esta
operação chama-se substituição e será indicada por
{ X = s },
que se pode ler “X toma o valor s”. Aplicando esta subs-
tituição à cláusula (23) obtem-se a instância Fig. 10 - Em reconhecimento do papel pioneiro desempenhado por
Portugal na programação em lógica, coube-lhe organizar na Praia da
m(s) ← h(s), Falésia, Algarve, o Logic Programming Workshop'83, que foi o último
antes da primeira conferência internacional dedicada ao tema que te-
e aplicando-a à cláusula (24) obtem-se a mesma cláusu- ve lugar em Marselha em 1984 (e de que o presente autor se orgulha
la, visto que ela não contém ocorrências de X. A resol- de ter sido o primeiro orador).

12
Por outro lado, dois átomos podem ter mais de um Renomeando Y em W na segunda cláusula, obtemos
unificador. é o caso de h(X) e h(Y), que podem ser tor-
nados iguais substituindo o X por Y, ou o Y por X, ou
p(X),q(Y) ← r(X),
ambos por s (ou por p, ou por qualquer outra constan-
te ou variável). As substituições correspondentes são s(W),t(Z) ← p(Z).

{X=Y}, {Y=X} e {X=s, Y=s}. Os átomos p(X) e p(Z) são unificáveis, e um unifi-
cador mais geral é {X=Z}. “Cortando” esses átomos, jun-
Cada uma das primeiras é mais geral que a terceira tando o que resta dos antecedentes e consequentes das
pela seguinte razão. Se aplicarmos {X=Y} a h(X) e h(Y) cláusulas, e aplicando a substituição {X=Z}, obtem-se a
obtemos duas cópias do átomo h(Y), a partir do qual po- cláusula
demos obter h(s) por aplicação de {Y=s}. Porém, se co-
meçarmos por aplicar {X=s,Y=s} a h(X) e h(Y), obtemos q(Y),s(W),t(Z) ← r(Z).
duas cópias de h(s), a partir do qual não podemos ob-
ter h(Y). Note-se que {X=Y} é tão geral como {Y=X}, quan- Se tivéssemos procurado determinar a resolvente di-
rectamente das duas cláusulas primitivas, obtinha-se
to mais não seja por uma questão de simetria. Mas ana-
lisando a situação em pormenor, observa-se que no
q(Y),s(Y),t(Z) ← r(Z),
primeiro caso o átomo unificado é h(Y), no segundo ca-
so h(X), e qualquer dos dois pode ser transformado no
onde se estaria a forçar desnecessariamente q(Y) e s(Y)
outro por substituição.
a partilharem a mesma variável.
Na regra da resolução (ver mais abaixo) exige-se que
Posto isto, cada passo do jogo da dedução na lógi-
o unificador escolhido seja tão ou mais geral que qual-
ca de cláusulas de primeira ordem pode ser pormenori-
quer outro unificador, e é chamado um unificador mais zado como segue:
geral. A determinação de unificadores mais gerais é pois
fundamental na lógica de cláusulas de primeira ordem, e
é o principal mecanismo computacional na interpretação
desta lógica como linguagem de programação. Ela é efec-
tuada pelo chamado algoritmo de unificação de Robinson
(ou uma das suas variantes), que é demasiado complexo
para ser descrito aqui e cujo conhecimento não é neces-
sário para compreender os exemplos que se seguem.
Uma condição prévia à aplicação da resolução é que
as cláusulas envolvidas não tenham variáveis em comum,
para que não se criem artificialmente concordâncias que
não são necessárias. Por exemplo, as ocorrências da va-
riável Y nas cláusulas

p(X),q(Y) ← r(X),
s(Y),t(Z) ← p(Z)

são independentes, e podem ser renomeadas (substituí-


das por outras variáveis) sem alterar o significado das cláu-
sulas. Uma situação análoga verifica-se quando escrevemos

f(x)=x2,
g(x)=x+3

para definir duas funções. O facto de se usar a mesma


letra x em ambas as definições não tem qualquer signi-
ficado visto que as definições são independentes, po-
dendo escrever-se por exemplo g(y)=y+3 para definir a
segunda função. Noutros termos, o alcance de uma ocor-
Fig. 11 - Capa do primeiro número da revista Journal of Logic
rência de uma variável é apenas a definição ou cláusu- Programming, saído em 1984, da qual Robinson foi o primeiro
la onde a ocorrência se verifica. coordenador.

13
Uma cláusula de primeira ordem é verdadeira se to-
Selecção: Escolhem-se duas cláusulas sem variáveis das as suas instâncias chãs forem verdadeiras, e falsa se
em comum (efectuando previamente as renomeações pelo menos uma instância chã for falsa. Por exemplo, a
que se impuserem), em que um átomo no antecedente afirmação de que todos os portugueses são marinheiros,
de uma seja unificável com um átomo no consequente que se pode traduzir pela cláusula
da outra.
Resolução: A resolvente determina-se juntando en- marinheiro (X) ← português (X),
tre si os antecedentes e os consequentes das cláusulas
seleccionadas com exclusão dos átomos unificáveis, e é falsa se se conseguir encontrar alguém que seja por-
aplicando à cláusula resultante um unificador mais ge- tuguês e não seja marinheiro. Se português (pedro) for
ral dos referidos átomos. verdade e marinheiro (pedro) falsa, a cláusula

Como exemplo consideremos o seguinte raciocínio: marinheiro (pedro) ← português (pedro)

Todo o professor é do sexo masculino ou do sexo é falsa, e como é uma instância chã da anterior, essa tam-
feminino. bém é falsa.
João é professor, e não é do sexo feminino. Até aqui fomos propositadamente vagos sobre o que
Logo, João é do sexo masculino. se entende por valores das variáveis. Não é possível en-
trar em pormenores num artigo desta natureza, e por is-
As premissas e a negação da conclusão podem ser so limitamo-nos a indicar que no caso da lógica das cláu-
representadas pelas cláusulas seguintes: sulas de primeira ordem (e na sua aplicação à programação
em lógica) basta considerar como valores das variáveis
(26) sexo (X, masc), sexo (X, fem) ← professor (X), um conjunto de constantes fixadas de antemão, com-
preendendo todas as que figurem nas cláusulas que es-
(27) professor ( joão) ←, tiverem a ser consideradas. Tal como no caso proposi-
(28) ← sexo ( joão, fem ), cional, a dedução por refutação é coerente e completa
relativamente a esta forma de interpretar o significado
(29) ← sexo ( joão, masc ).
das cláusulas.
Nestas cláusulas, a condição “... é do sexo ...” é re-
presentada por sexo (..., ...,) que tem dois argumentos. Cláusulas de Horn
Em geral, admitem-se átomos com um número qualquer
de argumentos e não apenas um só como temos consi- Para usar a lógica das cláusulas de primeira ordem
derado até aqui. como linguagem de programação há dois problemas fun-
Como é de esperar, estas cláusulas são refutáveis: damentais que têm de ser endereçados: como utilizar o
processo dedutivo para efectuar cálculos, e como tornar
(30) sexo (joão, masc), sexo (joão fem) ← esse processo computacionalmente eficiente.
por (26) e (27) com {X=joão} Consideremos de novo as cláusulas (26) a (28) co-
(João é do sexo masculino ou do sexo feminino), mo premissas, que conjuntamente afirmam que todo o
professor é do sexo masculino ou do sexo feminino, e
(31) sexo (joão, masc) ←
que João é professor e não é do sexo feminino. Em vez
por (28) e (30)
de deduzir que João é do sexo masculino, como fizémos
(João é do sexo masculino),
anteriormente, em geral estamos mais interessados em
(32) G utilizar a informação disponível para determinar qual o
por (29) e (31) sexo de João. A diferença entre as duas situações é que
(Contradição). na primeira temos de verificar que sexo (joão,masc) ←
é uma consequência das premissas, enquanto na segunda
Uma cláusula de primeira ordem tem um significa- queremos calcular o valor da “incógnita” Y para o qual
do análogo ao de uma cláusula proposicional, generali- a correspondente instância de sexo (joão,Y) ← é uma
zado apenas para ter em conta os possíveis valores das consequência das premissas. A verificação envolve co-
variáveis que nela figuram. Por exemplo, m(X) ← h(X) nhecer previamente a resposta, o cálculo fornece-a. Uma
significa que para toda a entidade a que substitua X, se distinção semelhante pode fazer-se a propósito de equa-
h(a) for verdade então m(a) é verdade, isto é, a cláu- ções como 2 x x = 6, em que se pode verificar que 3 é
sula m(a) ← h(a) é verdadeira. Vê-se assim que uma solução ou então calculá-la.
cláusula de primeira ordem representa as cláusulas pro- No nosso caso, para utilizar a técnica da dedução
posicionais que dela se obtêm substituindo as variáveis por refutação, começamos por negar que exista um tal
por valores, chamadas as suas instâncias chãs. valor para Y, ou seja, afirmamos que, para todo o Y, João

14
não tem sexo Y. A refutação desta afirmação consiste em (35) filho (miguel, rita) ←,
construir um contra-exemplo para ela, o qual consti-
(36) filho (joana, rita) ←,
tui o valor desejado para a incógnita. Mais formalmen-
te, a negação da conclusão traduz-se pela cláusula (37) neto (X,Z) ← filho (X,Y), filho (Y,Z).

(33) ← sexo (joão,Y), Nele estão definidas algumas relações familiares, on-
de por simplicidade se usa o género masculino para re-
que vai ser refutada conjuntamente com as cláusulas (26) presentar qualquer dos dois géneros indiferentemente,
a (28). Tal como anteriormente derivam-se as cláusulas como é prática corrente. As três primeiras cláusulas de-
(30) e (31), e a partir de (31) e (33) deriva-se a cláusula finem a relação filho afirmando que Rita é filha de Ana,
vazia com a substituição {Y=masc}, que dá o valor es- e Miguel e Joana são filhos de Rita. A cláusula seguinte
perado para a incógnita (a outra substituição que é usa- caracteriza a relação neto, já que X é neto de Z se X for
da na refutação atribui um valor a X, que desempenha filho de Y e Y filho de Z. Um lógico objectará, e com ra-
um papel meramente auxiliar). zão, que a cláusula (37) não caracteriza completamente
Este pequeno exemplo ilustra já algumas das carac- a relação neto, visto que não se exclui a possibilidade
terísticas da programação em lógica. Uma certa classe de de X ser neto de Z sem ser filho de um filho de Z. Mas
problemas é formalizada por meio de cláusulas de pri- o que se tem em mente quando se escrevem programas
meira ordem que são usadas como premissas, e a reso- em lógica é apenas caracterizar as suas consequências,
lução de cada problema particular consiste em mostrar e aí já é verdade que as únicas consequências do tipo
que ele é consequência das premissas. A demonstração neto (X,Z) são aquelas para as quais existe um Y tais que
tem um carácter construtivo, na medida em que a exis- filho (X,Y) e filho (Y,Z) também são consequências do
tência de solução é demonstrada através do seu cálculo programa. Bem entendido, estas considerações aplicam-
efectivo. Mas como linguagem de programação isto só -se a qualquer definição de um símbolo de predicado.
por si não basta, é preciso conceber um método para O programa é chamado a executar por uma cláu-
encontrar soluções de forma exaustiva e eficiente. sula sem átomos no consequente— uma negação ou
Um conjunto de cláusulas tem muitas consequên- cláusula negativa e o resultado da computação é uma
cias, a maioria das quais é irrelevante para a demons- substituição para as variáveis que figuram na chamada.
tração de qualquer consequência particular. Para ser efi- Uma chamada pode ter, bem entendido, vários resulta-
ciente, o procedimento a adoptar deve evitar a dispersão dos, e em geral estamos interessados em obter todos.
e procurar concentrar-se ao máximo nas consequências Por exemplo, a chamada
que forem relevantes para o fim em vista — tem de ser
guiado por objectivos. Mas não o deve fazer à custa de ← filho (rita,X)
perder a capacidade de determinar todas as soluções de
um problema. Este equilíbrio entre eficiência e busca (de quem é Rita filha?) tem como único resultado {X=ana},
exaustiva de soluções nem sempre é fácil de alcançar. A por resolução com a cláusula (34). Mas já a chamada
solução adoptada passa por restringir as cláusulas a uma
forma particular, chamadas cláusulas de Horn, que têm ← filho (X, rita)
apenas um ou zero átomos no consequente. Embora es-
sa restrição represente a perda de alguma capacidade de (que filhos tem Rita?) tem duas refutações, resolvendo-
expressão lógica, de um ponto de vista computacional a com as cláusulas (35) e (36), de que resultam as subs-
o sistema resultante tem a potência máxima que se po- tituições {X = miguel} e {X = joana}.
de esperar de qualquer modelo de computação. Estas refutações obtiveram-se num só passo. Eis a
Uma cláusula de Horn com um átomo no consequente seguir um exemplo de uma refutação envolvendo vários
diz-se definida, e um programa (em lógica) é qualquer passos:
colecção destas cláusulas. É costume empregar uma ter-
minologia mais próxima das linguagens de programação (38) ← neto (X, ana),
tradicionais e referir o consequente como a cabeça da
(39) ← filho (X,Y), filho (Y, ana),
cláusula e o antecedente como o seu corpo. Uma cláu-
sula definida contribui com uma informação bem defini- {X = miguel ,Y = rita}
da sobre a sua cabeça sempre que as condições expres-
(40) ← filho (rita, ana),
sas no corpo se verificarem, e um programa é visto como
a definição conjunta dos símbolos de predicado que fi- (41) G.
guram nas cabeças das suas cláusulas. Por exemplo, as
cláusulas seguintes constituem um programa: Quando nos restringimos às cláusulas de Horn, é sufi-
ciente considerar aplicações da regra de resolução em que
(34) filho (rita, ana) ←, uma das cláusulas é definida e a outra é negativa, obten-

15
do-se então como resolvente uma cláusula negativa. Assim, Mas esta chamada falha, porque o seu primeiro e único
uma refutação vai ser, como no exemplo, uma sucessão de átomo não unifica com a cabeça de nenhuma cláusula.
cláusulas negativas, em que a primeira representa a cha- Retrocede-se para a cláusula (39). Nesta procura-se re-
mada inicial do programa (que netos tem Ana?), cada cha- solver o seu primeiro átomo com a próxima cláusula com
mada seguinte obtem-se por resolução da anterior com uma o qual ele unifica, que é a (35), o que acaba por pro-
cláusula do programa, e a última é evidentemente a cláu- duzir a refutação anteriormente mostrada. Para a refuta-
sula vazia (que por sinal é negativa, por ter consequente ção seguinte retrocede-se de novo até à cláusula (39) e
vazio). Entre duas chamadas consecutivas indica-se a subs- explora-se a última alternativa para o seu primeiro áto-
tituição obtida no correspondente passo de resolução, mas mo. A determinação de todos os resultados da chamada
apenas para as variáveis que ocorrem nas chamadas, omi- inicial pode resumir-se na seguinte figura:
tindo-se as substituições das variáveis em cláusulas do pro-
grama. ← neto (X, ana)
Analisemos a refutação anterior em pormenor. A cláu- ← filho (X,Y), filho (Y, ana)
sula (39) obtem-se por resolução da anterior, (38), com
a cláusula do programa (37), que contém a definição de {X=rita, Y=ana} {X=miguel, Y=rita} {X=joana, Y=rita}
neto. Como as duas cláusulas partilham a variável X, as ←filho (ana, ana) ←filho (rita, ana) ←filho (rita, ana)
suas ocorrências na cláusula do programa são previa-
mente renomeadas para X0, digamos. Os átomos neto (X, (Falha) G G
ana) e neto (X0,Z) são unificáveis, e {X0=X,Z=ana} é o Este método para determinar todos os resultados de
unificador mais geral usado para produzir (39). A cláu- uma chamada é bastante simples de aplicar na prática.
sula (40) resulta da resolução de (39), com o átomo fi- Infelizmente, não garante que eles sejam mesmo todos
lho (X,Y), e (35), que determina o unificador {X=mi- encontrados. Vejamos porquê com um exemplo.
guel,Y=rita}. Finalmente, (34) e (40) produzem a cláusula Suponhamos que definíamos a relação de descen-
vazia. O resultado da refutação é {X=miguel}, que é a dência dizendo que X é descendente de Z se for filho
substituição obtida para a variável na chamada inicial. de Z ou filho de um descendente de Z. Isto pode tradu-
Para a mesma chamada (38) podia produzir-se uma zir-se pelas seguintes cláusulas definidas:
refutação diferente, dando o resultado {X=joana}. Para
determinar de forma sistemática todos os resultados po- (42) desc (X,Z) ← filho (X,Z),
de proceder-se do seguinte modo: (43) desc (X,Z) ← filho (X,Y), desc (Y,Z).
Procura-se resolver cada chamada com a primeira Se pretendêssemos conhecer os descendentes de Ana
cláusula do programa cuja cabeça unifique com o pri- chamaríamos o programa com
meiro átomo da chamada.
(44) ← desc (X, ana)
Se não existir uma tal cláusula no programa, a deri-
vação não se pode prolongar a uma refutação, e a cha- obtendo, pelo método anterior, três refutações com Rita,
mada falha. Nesse caso, retrocede-se até à chamada an- Miguel e Joana como resultados. É o que se esperava.
terior e tenta-se resolvê-la com a próxima cláusula cuja Porém, se tivéssemos trocado a ordem de escrita das
cabeça unifique com o seu primeiro átomo. cláusulas e dos átomos no corpo da segunda cláusula,
Se não existir uma tal cláusula retrocede-se de no- ficando com
vo, e assim sucessivamente. Tratando-se da chamada ini-
cial, não é possível retroceder mais e a própria compu- desc (X,Z) ← desc (Y,Z), filho (X,Y),
tação falha sem fornecer qualquer resultado. desc (X,Z) ← filho (X,Z),
Tendo chegado a uma refutação, para produzir a pró- não obteríamos sequer uma refutação. Na verdade, a cha-
xima retrocede-se até uma chamada cujo primeiro áto- mada (44) resolveria com a primeira destas cláusulas dan-
mo ainda possa ser resolvido com uma cláusula do pro- do a chamada
grama e procede-se como anteriormente.
← desc (Y, ana), filho (X,Y).
Vejamos como se pode aplicar este método para de- O primeiro átomo desta chamada, desc (Y, ana), ape-
terminar todos os resultados da chamada (38). O seu pri- nas difere do anterior na variável do primeiro argumen-
meiro átomo é também o único, e a cláusula (37) é a to, e a continuação da aplicação do método resultaria na
única com cuja cabeça ele unifica. Não há escolhas pos- chamada
síveis, e obtem-se (39). O seu primeiro átomo é filho
(X,Y), que unifica com a cabeça das cláusulas (34), (35) ← desc (Y’, ana), filho (Y,Y’), filho (X,Y).
e (36). Escolhendo a primeira destas a resolvente é Como se observa, o processo repete-se indefinida-
← filho (ana, ana), com substituição {X=rita,Y=ana}. mente e nenhuma refutação é encontrada. São conheci-

16
dos outros métodos que geram efectivamente todos os (47) ← soma (s(0),s(s(0)),Z),
resultados, mas não são tão eficientes como o que des-
{Z=s(Z’)}
crevemos. A linguagem de programação Prolog, que se
baseia na lógica das cláusulas de Horn, está implemen- (48) ← soma (s(0),s(0),Z’),
tada segundo este método, numa opção clara pela efi-
{Z’=s(Z’’)}
ciência, deixando ao cuidado do programador a escrita
do seu programa de forma a garantir que não se perdem (49) ← soma (s(0),0,Z’’),
soluções.
{Z’’=s(0)}
Um programa em lógica como o que acabámos de
ver pode ser interpretado como incorporando um con- (50) G.
junto de conhecimentos sobre os quais pode ser inter-
Resultado: {Z=s(s(s(0)))}
rogado. Deste ponto de vista uma chamada correspon-
de a uma pergunta, uma refutação a sucessivas reformulações
da pergunta acompanhadas de respostas parciais, e o re- A chamada (48) deriva de (47) e (46), onde se re-
sultado da chamada é uma resposta à pergunta inicial. nomeou Z em Z’. Um unificador mais geral de soma
Outra forma de encarar um programa é como a especi- (s(0),s(s(0)),Z) e soma (X,s(Y),s(Z’)) é
ficação da resolução de uma classe de problemas. Aqui,
uma chamada representa um problema particular, o re- {X=s(0),Y=s(0),Z=s(Z’)},
sultado da chamada é uma solução do problema, e uma
refutação corresponde a sucessivas decomposições do
de que apenas se apresentou na refutação a substituição
problema inicial em sub-problemas. São os diversos pon-
para a variável Z que figura na chamada. Os passos se-
tos de vista sobre o paradigma da lógica como lingua-
gem de programação que lhe conferem a aplicabilidade guintes têm uma justificação análoga. No fim apresenta-
num grande número de situações. se a composição das substituições que se obtiveram nos
vários passos intermédios, fornecendo o resultado 3 pa-
ra Z, como era esperado.
Termos estruturados
Uma característica curiosa, e por vezes útil, dos pro-
gramas em lógica é que a noção de dado e resultado não
As variáveis e as constantes recebem conjuntamente
está fixada de antemão, podendo variar de chamada pa-
a designação de termos. Em Lógica, utiliza-se uma clas-
ra chamada. Por exemplo, a chamada
se mais vasta de termos que inclui expressões como pai
(joão), X+Y ou s(X), que poderiam representar o pai do
João, a soma de X com Y, ou o sucessor de X (isto é, X+1). ← soma (X,s(0),s(s(0)))
Tais termos desempenham um papel fundamental na pro-
gramação em lógica, para representar dados que estão tem como resultado {X=s(0)}, que é a diferença entre o
munidos de uma certa estrutura. Não é possível dar aqui terceiro e o segundo argumento. Deste modo, a mesma
pormenores sobre esta utilização de termos estruturados, definição — cláusulas (45) e (46) — pode ser usada pa-
limitando-nos a exemplificá-la com programas aritméticos ra calcular a adição e a subtracção.
para efectuar adições e multiplicações. Usando esta forma de representação dos números
Se representarmos por 0 o número zero e por s(...) naturais, as operações e relações aritméticas usuais po-
o sucessor de ..., os números naturais 0, 1, 2, etc ficam diam ser definidas. Juntando às cláusulas (45) e (46) as
representados pelos termos 0, s(0), s(s(0)), etc. Escrevendo cláusulas
soma (X,Y,Z) para significar que a soma de X com Y é
igual a Z, o símbolo de predicado soma pode ser defi-
nido pelas seguintes cláusulas: (47) produto (X,0,0) ←,
(48) produto (X,s(Y),Z) ← produto (X,Y,W),
(45) soma (X,0,X) ←, soma (W,X,Z),
(46) soma (X,s(Y),s(Z)) ←soma (X,Y,Z).
fica-se com um programa que calcula somas e produtos.
A primeira cláusula afirma que a soma de X com 0 Estas definições têm, bem entendido, um interesse me-
é igual a X, e a segunda que se a soma de X com Y for ramente teórico — o de ilustrar a expressividade e o po-
Z então a soma de X com Y+1 é Z+1. der de cálculo da lógica das cláusulas de Horn, que é
Estas afirmações são suficientes para calcular a so- equivalente aos modelos teóricos de algoritmo conheci-
ma de quaisquer dois números naturais representados dos e vem assim reforçar a tese de Church — e na lin-
por meio dos símbolos 0 e s. A refutação seguinte mos- guagem Prolog usam-se soluções mais expeditas para
tra o cálculo de 1+2: efectuar cálculos numéricos.

17
Conclusão lizar na linguagem Prolog, que teve de abdicar de usar
exclusivamente a lógica das cláusulas de Horn e re-
A programação em lógica é um passo em direcção correr ao que se consideram certas “impurezas” do pon-
ao ideal declarativo de programação, em que um pro- to de vista lógico para conseguir um desempenho acei-
blema é especificado independentemente de conside- tável do ponto de vista computacional. Mesmo sem estas
rações sobre a sua execução. Isso é possível em virtu- alegadas impurezas, o programador não consegue abs-
de do duplo ponto de vista sob o qual um programa trair-se completamente dos aspectos operacionais. Muitas
em lógica pode ser encarado: o do seu significado em vezes é possível elaborar programas distintos para o
termos das consequências que dele derivam, que cons- mesmo problema com igual significado declarativo mas
titui a chamada semântica declarativa do programa e com comportamentos operacionais bastante diferentes
na qual presumivelmente o programador se baseia pa- quanto à eficiência, e em geral preferem-se os progra-
ra o elaborar; e o ponto de vista dedutivo caracteriza- mas mais eficientes.
do pelas refutações que origina, que suporta a inter- Para além destas questões, nem todos os progra-
pretação computacional da lógica e constitui a semântica madores comungam do ideal declarativo, ou porque
operacional do programa, a qual pode em princípio preferem raciocinar em termos estritamente operacio-
ser ignorada pelo programador. A coerência e a com- nais, ou porque o tipo de problemas a que se dedicam
pletude da lógica (das cláusulas de Horn) mostram que torna mais aconselhável esse modelo computacional.
os aspectos declarativo e operacional são duas faces de Como em tantas outras actividades humanas, a varie-
uma mesma moeda, que se completam para reforçar o dade de métodos e abordagens deve ser fonte de enri-
entendimento que o programador tem do problema a quecimento e não de atropelo, e a programação em ló-
resolver e assim facilitar a sua tarefa. gica é uma contribuição para essa actividade em constante
Este ideal, cuja importância é inegável e tem pro- evolução, por alguns considerada ciência e arte em par-
duzido muitos frutos, só parcialmente se conseguiu rea- tes iguais, que é a programação.

SUGESTÕES DE LEITURA

Citam-se apenas algumas obras significativas


MELVIN FITTING, First-Order Logic and Automated Theorem Proving, KEES DOETS, From Logic to Programming, The MIT Press, Cambridge MA,
Sprimger, New York, 2nd edition, 1996 1994.
(Cobre as principais abordagens à demonstração automática de teoremas (Contém os aspectos essenciais da teoria da programação em lógica, en-
em lógica de primeira ordem, incluindo implementações na linguagem quadrando-a na demonstração automática de teoremas.)
Prolog para algumas delas.)
LEON STERLING and EHUD SHAPIRO, The Art of Prolog, The MIT Press,
CHRISTOPHER J. HOGGER, Essentials of Logic Programming, Oxford Cambridge MA, 1986.
University Press, Oxford, 1990. (É a obra mais referida sobre a linguagem de programação
(É uma introdução, de leitura agradável, à programação em lógica.) Prolog.)

18

Вам также может понравиться