Escolar Documentos
Profissional Documentos
Cultura Documentos
PROGRAMAÇÃO EM
LÓGICA E PROLOG
3.1 - Introdução
A lógica, desde Aristóteles, sempre esteve ligada ao pensamento
científico. Ela constitui a base para deduzir conseqüências a partir de certas
premissas; para estudar a validade ou a falsidade de sentenças dada a
validade ou a falsidade de outras sentenças; para verificar a validade de
argumentações; e para estabelecer a consistência de um conjunto de
sentenças.
Já os computadores surgiram na história há muito pouco tempo, ao
compará-los com a lógica. Quase todos os computadores de hoje em dia são
baseados no modelo (ou máquina) de von Neumann que surgiu na década de
40. Esta máquina é uma concretização da máquina ideal de Alain Turing. A
máquina proposta por von Neumann é constituída por um "grande" conjunto
de células de memória e uma unidade de processamento com algumas células
de memória locais chamadas registradores.
A unidade de processamento pode copiar dados armazenados nas células
de memória para os registradores, realizar operações com esses dados nos
registradores e transferir os resultados de volta para as células de memória.
Um programa para a máquina de von Neumann deverá fornecer instruções
que realizem as operações descritas acima.
O desenvolvimento de computadores baseados na máquina de von
Neumann encontrou muitas limitações tecnológicas e de engenharia que
foram sendo resolvidas através dos anos. Porém, à medida que os problemas
relativos à construção de computadores eram resolvidos, os problemas
relativos a como utilizá-los apareciam. Em outras palavras, os computadores
eram capazes de realizar as instruções fornecidas pelo homem porém o
homem ainda não era plenamente apto a programar os computadores para
resolver problemas práticos que surgiam. A única linguagem disponível na
época era a linguagem específica de cada máquina através da qual o
programador fornecia instruções ao "estilo von Neumann".
A construção de programas escritos em linguagem de máquina era
complexa e tomava muito tempo. A partir daí, linguagens mais fáceis para a
compreensão humana começaram a aparecer: Fortran, Algol e Pascal mas
todas elas apresentavam características marcantes da máquina de von
Neumann subjacente. Notamos que apesar dessas linguagens serem mais
fáceis para a compreensão do homem, elas ainda eram orientadas à máquina,
isto é, o homem contruía programas nessas linguagens pensando em termos
de operações do computador.
1
O conceito de máquina de Turing apóia toda a Teoria da Computabilidade que contém
problemas em aberto que desafiam pesquisadores do mundo todo.
2
A citada linguagem específica de cada máquina na verdade é a linguagem do
microprocessador com o qual a máquina (o computador) foi construído.
Pergunta: Programa Lógico P
Sim!
A fórmula F pode ser
deduzida a partir dos Axiomas
axiomas e regras de e
inferência de P? Regras de Inferência
Não!
Figura 2: Funcionamento de
um programa lógico.
Em outras palavras, as "perguntas" nada mais são do que fórmulas as
quais desejamos saber se são teoremas na teoria formal fornecida pelo
programa lógico. Essa teoria formal seria constituída pelos axiomas e regras de
inferência do programa lógico.
Dizemos que as "perguntas", que na verdade são fórmulas, as quais
submetemos ao programa lógico constituem a entrada do programa lógico.
Dada uma entrada, dizemos que o processo de tentarmos demonstrar essa
entrada a partir dos axiomas e regras de inferência do programa lógico é a
execução do programa lógico. Esta noção se identifica com a noção de
computação da máquina de Turing.
Paralelamente aos trabalhos de Robert Kowalski, Alain Colmerauer e
seus colegas desenvolveram um programa que capturava a idéia do
mecanismo de tentar provar as "perguntas" (fórmulas) a partir de um conjunto
de axiomas e regras de inferência. Esse programa recebeu o nome PROLOG (do
francês "PROgramation et LOGique"). Mais adiante veremos um pouco sobre
o PROLOG mas antes disso veremos os principais conceitos e ferramentas da
programação em lógica. Para começar, teremos uma seção totalmente
dedicada às cláusulas de Horn pois é através delas que poderemos escrever os
programas lógicos. Depois, teremos uma seção dedicada a exemplos e mais
conceitos ligados aos programas lógicos.
4.3 - Cláusula de Horn
A linguagem que utilizamos para trabalhar com a programação em
lógica é um subconjunto da linguagem do cálculo de predicados vista no
capítulo 3 e recebe o nome de linguagem das cláusulas de Horn. Portanto,
trabalharemos com o cálculo de predicados restrito à linguagem das cláusulas
de Hom.
Esquematicamente, temos:
Exemplos:
1. p(x).
2. q2 (x,y).
0. mãe(y,x).
3. q3(x,y,z).
Podemos dizer que uma fórmula atômica é uma literal positiva. Portanto, os
exemplos dados acima, além de serem exemplos de fórmulas atômicas,
também são exemplos de literais positivas.
A negação de uma fórmula atômica é dita literal negativa. Como
exemplos de literais negativas, podemos citar:
Exemplos:
1. —,q4 (x,y).
2. —itio(y,x).
3. —,q5(x,y,z).
4. —iavó (x,y).
Em programação em lógica, podemos escrever uma implicação do
tipo:
A—>B
de maneira inversa, ou seja,
B <—A
3.5 - Cláusula
Uma cláusula é uma fórmula (do cálculo de predicados) do seguinte tipo:
vxi , , vxk ( Li v v Lm ) (1)
na qual Li é uma literal positiva ou negativa e x1, xk são as variáveis que
ocorrem em Liv v Lm.
Exemplos: (Cláusulas)
1. v x v y v z ( p ( x ) v q(y,z) v (x,y,z)).
0. vx 1)5 (x).
1. VY Vz —,1)6(Y) v (13(z) ).
2. vx vy ( tio (x) v pai (y) ).
0. vx vz ( maior(x,z) v menor(x,z) v igual(x,z) ).
3. vx ( solteiro(x) v easado(x) v viúvo(x) v divorciado(x) ).
Diremos que a cláusula, tal como escrita em (1) , está no formato
original de disjunção. Porém, para escrevermos os programas lógicos, é
conveniente escrever (1), na notação clausal. Escrever uma cláusula na
notação clausal é reescrevê-la utilizando-se o conectivo de implicação ("<—").
Para entendermos melhor, vamos reescrever a cláusula (1) na notação clausal,
explicitando cada passo:
Passo 1 : Separação das literais positivas e negativas: já que temos a lei
comutativa e associativa para o conectivo de disjunção, podemos escrever
primeiro as literais negativas seguidas das positivas. Deste modo, podemos
reescrever (1) assim:
vxi , , vxk ( (—Bi v v ) v (Ai v v A )) (2)
s r
na qual — B ,
1 — B s são as literais negativas e Á , 1 A são as literais
r
positivas.
Passo 2 : Aplicação das leis de De Morgan: observemos que em (2) temos
uma disjunção de literais negativas, a saber, —B v v —B . Através das leis de
1 s
Observação:
· Todas as variáveis que ocorrem nas literais componentes de (5) estão
quantificadas universalmente : então, se não escrevermos "vxi ,..., vx2"
não tem problema pois já saberemos que todas as variáveis que ocorrem em
(5) já estão quantificadas universalmente;
· O corpo de (5) é composta de uma conjunção de literais: então ao
invés de escrevermos o conectivo "A" poderemos escrever uma vírgula (",")
e não haverá perigo de confusão;
· A cabeça de (5) é composta de uma disjunção de literais: então ao
invés de escrevermos o conectivo "v" poderemos escrever uma vírgula (",")
e não haverá perigo de confusão.
Com isso em mente, podemos escrever (5) da seguinte maneira:
A i, . . . , A r< — B i, . . . , B s (6)
e dizemos que (6) está escrita na notação clausal.
Dizemos que uma cláusula tem corpo vazio se não possui literais
negativas no formato original de disjunção. Dizemos que uma cláusula tem
cabeça vazia se não possui literais positivas no formato original de disjunção.
Vamos fazer alguns exemplos de escrever cláusulas nesta notação
através dos passos vistos anteriormente?
Exemplos:
1. cláusula vx vy ( p(x) v q(x) v —42(x,y) ).
Passo 1: Separação de literais: vx vy ( —42 (x,y) v (p(x) v q(x)) ).
Passo 2 : Aplicação das leis de De Morgan: como só há uma literal negativa,
não precisamos aplicar.
Passo 3 : Formato de implicação: vx vy ( q2 (x,y) —> (p(x) v q(x)) ).
Passo 4 : Notação clausal: p(x), q(x) <— q2(x,y).
Observação:
A notação clausal é compacta e muito conveniente. A seguir,
estudaremos alguns tipos especiais de cláusulas.
Exemplos:
1.) Veja os exemplos 1, 3, 4, 6, 7 e 8 da definição 5.3.3;
2.) p2 (x)<—p3 (x), q2 (y): Podemos ler esta cláusula do seguinte modo: "Para
toda atribuição de valores às variáveis x e y, se p3 (x) e q2 (y) forem ambas
verdadeiras então p2 (x) também o será";
3. q1 (x)4—r2 (x,y), rs (y,z), p3 (x,y): Podemos ler esta cláusula do seguinte
modo: "Para toda atribuição de valores às variáveis x, y e z, se r2 (x,y), rs (y,z) e p3
(x,y) forem verdadeiras ao mesmo tempo, q1 (x) também o será";
0. p3 (x)<—q2 (x,y,z): Podemos ler esta cláusula do seguinte modo: "Para toda a
atribuição de valores às variáveis x, y e z, se q2 (x,y,z) for verdadeira então p3
(x) também o será.
1. tio(z,.,,c)<—pai(y,.,,c),irmão(y,z): Podemos ler esta cláusula do seguinte modo:
"Para toda a atribuição de valores às variáveis x, y e z, se pai(y,x) for verdadeiro
( "se y for pai de x") e irmão(y,z) também o for ("se y for irmão dez") então
tio(z,x) também o será ("z é tio de x").
4
do inglês "goal clause" A palavra goal podde ser traduzida também como meta
porém preferimos a palavra gol por ser mais "familiar"
4. (x,y,z,w), r6 (x) que é o mesmo que escrever: ( 3x 3y 3z 3w
<— p2 (x,y,z), qs
qs (x,y,z,w) r6 (x)).
p 2 (x,y,z)
pergunta:
Será que o fato de cláusulas gol serem, no fundo, negações contribui para
alguma coisa???
A resposta é "Sim". Ainda bem!
Geralmente, quando temos uma teoria formal axiomática T e uma
fórmula F e desejamos saber se há uma demonstração para F em T, um dos
procedimentos a tomar é admitir como hipótese que —Fé verdadeira. A partir
daí, utilizando os axiomas e regras de inferência de T, tentamos obter alguma
fórmula que seja a negação de algum axioma de T. Se conseguirmos
demonstrar uma fórmula que seja a negação de algum axioma de T, isso quer
dizer que —F é falso e, portanto, F pode ser demonstrada em T. A esse tipo de
demostração damos o nome de demonstração por redução ao absurdo.
Cláusul2s de Hom
Figura 4: Tipos (1? cláusulas de Hom.
Cláusulas de Programa
Podemos, ainda, delall-mi-
Cláusulas Gol
Cláusulas dc Horn
Cláusula
Figura dc Programa
5: Tipos Incondicionais
de cláusulas de Horn.
Exercícios
1) Escreva as seguintes implicações na notação clausal.
a) vx ( p(x) s(x) —> q(x) v r(x) ).
0) Vx VY (x,Y) A P2 (x,Y) —> P3 (x,Y) v P4 (x,Y) ).
160
í 9 í
—>( .
(it'xfil (zx)zb —> (it'z'x)lb (j
.—> (zx)zb (o
.(z‘x)s `(z`x).1 —> (p
.(z`if`x)s `((f`x).1 —> (x)b (o
.—>(x)d (g
' 3 'ff —> f r
.sup!monuo SiOAVinA SU Z 'iç `X 0.10MSUOD 'ouSunfs-g) op
juu! !.10 uuuoj uu su-unoioso 'moi{ op suinsnujo sowOos su supuG (z
.( (x)odtuuJus <— ( (x)suffiattuaA-smpuutu v (x)a.maj ) ) xA (
.( (iç`z)gAu <— ( (x`z)md v (iç`x)md ) ) zA içA xA (j
.( (z`x)vd A (it)b <— (z`x)b v (z`i9.1 v (x)d ) ifAxA (o
A (x`z)zb <— (z`x)b v (z`x)d ) zA (CA xA (p
.( (z‘if‘x)9b <— (if`x)9b v (x) lb ) zA (CA xA (o
4.13 - Programa Lógico
Um programa lógico é um conjunto finito de cláusulas de programa.
Vejamos alguns exemplos de programas lógicos:
Exemplos:
1 .)- Programa Pl.
(1) p(a)<—.
(0) q(b) <—.
(1) q(x)<— p(x).
162
Juntamente com esses três axiomas, podemos considerar:
· A regra de modus ponens e
· A regra de particularizaçã o.
Notemos que com esses cinco itens, temos uma teoria formal
axiomática fornecida pelo programa Pi. Então, dado qualquer programa,
podemos construir uma teoria formal axiomática a partir dele de acordo com a
Figura 6 e dizemos que essa teoria formal axiomática foi fornecida pelo
programa.
Programa P
CI.Prog. !cond.
Cl. Prog.
Cond. 1
Cl. Prog. Cond.2
Cl. Prog. Cond3
163
consulta F, podemos executar os seguintes passos para verificar se F pode
ser deduzida a partir de P:
Método para computação de gols:
Passo 1: construção de T: construimos T conforme a Figura 6;
Passo 2 : construção do gol F': a partir de F, construimos o gol F' <— F.
Notemos que F' é a negação de F, conforme a seção 4.3.6;
Passo 3 : obtenção de contradição: assumimos F'como verdadeira em T e
tentamos demonstrar através dos axiomas e das regras de inferência de T que
a cláusula gol F' implica em uma contradição em T (computação de gols via
demonstração por absurdo).
Passo 4 : término da computação : se conseguirmos deduzir que F' implica
em uma contradição, conseguimos provar que F é um teorema em T que é o
mesmo que dizer que F foi deduzida a partir de P.
Caso contrário, se ao longo da tentativa de deduzir uma contradição
obtivermos uma fórmula F" tal que:
· F" não está na lista de axiomas ou
· Não podemos aplicar regras de inferência em F" e mais outro axioma
então dizemos que F não é um teorema de T e, portanto, F não pode ser
deduzida a partir de P.
Agora ficou mais claro porque chamamos de computação de gols o
método de tentar provar teoremas na teoria T fornecida pelo programa P:
simplesmente porque construímos uma cláusula gol com a consulta F
"candidata" à teorema em T. De acordo com o passo 2 do método acima, F' é a
negação de F. De acordo com o passo 3, tomaremos F' como verdadeira e
utilizaremos os axiomas e regras de inferência para tentar deduzir uma
contradição. Também dizemos que a computação do gol F' foi bem sucedida.
Sem mais discussões, vamos dar uma olhada nos exemplos da
subseção anterior. Tínhamos o programa P1 do exemplo 1 que
transcrevemos:
Exemplos:
Exemplo 1) - Programa Pl.
p(a) <—.
q(b) <—. q(x)<
— p(x).
Seguindo o passo 1 do método descrito acima, temos a seguinte
teoria fornecida por P1:
Teoria T1.
Axiomas:
(A1). p(a) <—
(A0).«h) <—
(A1).( —,q(x) —> —ip(x))
Regras de inferência:
164
• Modus ponens; •
Particularização.
Ok! Agora, consideremos algumas consultas a Pl. Para computar gols, vamos
utilizar o método descrito acima.
Consulta 1 - F p(a).
Passo 1: Teoria T1 já foi construída;
Passo 2: Podemos construir a cláusula gol F' 4—p(a). Lembremos que a
cláusula gol F' é a negação de F e, portanto, F' —, p(a);
Passo 3: Vamos assumir que F' é verdadeira em T1. Notemos que F' por si
mesma já contradiz (A1). Portanto, F' implica em uma contradição em T1;
Passo 4: Então F é teorema em T1 que é o mesmo que dizer que F foi deduzida a
partir de P1.
Consulta 2- F q(a).
Passo 1: Teoria T1 já foi construída;
Passo 2: Podemos construir a cláusula gol F' <— q(a) que significa —4(a);
Passo 3: Vamos assumir que F' é verdadeira em T 1. Observamos (A1) e (A2) e
não podemos utilizá-los para q(a) (o bom seria que ou (A 1) ou (A2) fosse um
axioma do tipo q(a) e aí já teríamos uma contradição!) porém podemos utilizar o
(A3) com particularização. Temos que:
—4(a) —> —, p(a).
Utilizando a regra de modus ponens, temos:
—,q(a).
—4(a) —> —, p(a).
—, p(a).
Notemos que —p(a) é o mesmo que <— p(a) que é uma nova cláusula
gol. De posse da nova cláusula gol, damos uma nova olhada nos axiomas.
Ao observamos os axiomas de T1, vemos que —p(a) contradiz o axioma (A2).
Portanto, F' implica em uma contradição em P1;
Passo 4: Então, F é teorema em T1 que é o mesmo que dizer que F foi deduzida a
partir de P1.
Consulta 3- F p(b).
Passo 1: Teoria T1 já foi construída;
Passo 2: Podemos construir a cláusula gol F' <— p(b) que significa —, p(b);
Passo 3: Vamos assumir que F' é verdadeira em T1. Olhando para os axiomas
(A1) e (A2) concluimos que não podemos utilizá-los para chegar a lugar
algum com —ip(b). Olhando para o axioma (A3) concluímos que também não
165
podemos utilizá-lo;
Passo 4: Concluimos que F não é um teorema de T1 e, portanto, F não pode
ser deduzida de P1.
Vamos dar uma olhada no programa P2 do Exemplo 2o qual transcreveremos:
p(a,b)<—.
q(a,b)<—.
r(x,y)<— p(x,y).
s(x,y)<— q(y,.,,c).
Construindo a teoria T2 associada ao Programa P2 (Passo 1), temos:
Teoria T2.
Axiomas:
(A1) p(a,b) <—
(A2) q(a,b) <—
(A3) vx vy (—ir(x,y) —> —ip(x,y) )
(A4).4-->x <-->y (—s(x,y) —> —4(y) )
Regras de inferência:
· Modus ponens;
· Particularização.
Consideremos algumas consultas a P2.
Consulta 1 - F r(a,b).
Passo 1: Teoria T2 já construída;
Passo 2: Considere a cláusula gol F' <— r(a,b) que significa —, r(a,b);
Passo 3: Vamos assumir que F' é verdadeira em T2. Ao olharmos para os
axiomas de T2 notemos que o único axioma que podemos utilizar é o (A3).
Utilizando particularização em (A3) podemos escrever:
—, r(a,b) —> —, p(a,b).
Utilizando a regra de modus ponens, temos:
—,r(a,b)
—,r(a,b) —> —ip(a,b)
—ip(a,b).
Notemos que —ip(a,b) é uma nova cláusula gol pois é o mesmo que <
— p(a,b). De posse da nova cláusula gol, damos uma nova olhada nos
axiomas. Podemos ver que a nova cláusula gol já contradiz o axioma (A1).
Portanto F' implica em uma contradição em T2;
Passo 4: Portanto, F é um teorema em T2 que é o mesmo que dizer que F foi
166
deduzida a partir de P2.
Consulta 2 - F s(a,b).
Passo 1: Teoria T2 já foi construída;
Passo 2: Considere a cláusula gol F' <— s(a,b) que significa —,s(a,b);
Passo 3: Vamos assumir que F' é verdadeira em T2. Olhando para os axiomas de
T2, não podemos utilizar nenhum deles bem como não podemos utilizar
nenhuma regra de inferência;
Passo 4: Portanto, concluímos que F não é teorema de T2 que é o mesmo que
dizer que F não pode ser deduzida a partir de P2.
Exemplo 3) - Examinemos o programa P4 o qual é o seguinte:
Programa P4.
(A1) p(x)<— p(x).
(A2) p(a) <—.
(A3) P(b) <—.
(A0) q(c) <—.
Construindo a teoria T4 associada ao P4 (através do Passo 1 do
Algoritmo 4.4.2.) ,temos:
Teoria T4.
Axiomas:
(A1) p(x)<—p(x)
(A0) p(a)<—.
(A1) q(c)<—.
(A2) P(b)<—.
Regras de inferência:
· Modus ponens;
· Particularização.
Consideremos algumas consultas a P4:
Consulta 1 - F p(a).
Passo 1: Teoria T4 já foi construída;
Passo 2: Consideremos a cláusula gol F' 4—p(a) que significa —ip(a);
Passo 3: Vamos assumir que F' é verdade em T4. Olhando para os axiomas,
podemos afirmar que —p(a) e o axioma (A2) já se contradizem em T4;
Passo 4: Portanto, F é teorema em T4 que é o mesmo que dizer que F pode ser
deduzida a partir de P4.
Vamos supor que, por algum motivo, não "tenhamos visto" o axioma
(A2) mas sim o axioma (A1): afinal, o axioma (A1) é o primeiro axioma da lista de
axiomas e podemos utilizá-lo. Aplicando particularização em (A1) para x =
167
a, temos:
—p(a) —> —p(a)
e aplicando modus ponens, temos:
168
teoria fornecida por um programa. Antes disso, na seção 4.5 (a próxima
seção) veremos alguns conceitos bem importantes relacionados à SLD-
derivação.
Axiomas:
(A1) p(a,b)<—.
(A2) q(b,c)<—.
(A0) X
VY Vz ( —,r(x,z) —> —, ( 1)(x ,Y) A (1(y,Z) ) )*
Regras de inferência:
· modus ponens;
· particularização.
Vamos fazer algumas consultas a P3.
Consulta 1 - F r(a,c).
Note que a premissa da fórmula acima poderia ser vista como uma cláusula
gol <— ( p(a,b) A q(b,c) ).
169
—,r(a,c) —> (—ip(a,b) v —,q(b,c) ).
—,r(a,c).
—,r(a,c) —> (—ip(a,b) v —,q(b,c))
—ip(a,b) v —,q(b,c).
—,r(c,a).
—,r(c,a) —> (—ip(c,b) v —,q(b,a) ).
—ip(c,b) v —,q(b,a).
170
Exercícios
5) Cada item abaixo contém um programa lógico. Para cada um deles, escreva
a teoria finita associada e faça a computação das cláusulas gol dadas.
a) Programa:
p(x)<—q(x).
q(a)<—.
c) Programa:
p(x)<—p(y),q(xty).
q(xty)<—q(y,x).
q(a,b)<—.
p(a)<—.
d) Programa:
p(x)<—p(x).
p(a)<—.
q(a)<—.
Consultas : p(a) , p(b) , q(a) , q(b).
e) Programa:
p(x,z)<—q(xty,z), q(y,x,z).
q(a,b,e)<—.
q(a,c,e)<—.
q(b,a,e)<—.
Consultas: p(a,c) , p(c,a) , q(a,b,e) , p(a,e) , p(e,a).
171
f) Aplicação de programas lógicos em diagnóstico médico:
mal-estar(Pedro)<—. temp-
maior-37(Maria)<—.
bolhinhas(Maria)<—. mal-
estar(Maria)<—. manchas-
verm(Pedro)<—. gland-
inflam(Pedro)<—. febre(x)<—
temp-maior-37(x).
gripe(x)<— mal-estar(x), febre(x).
sarampo(x)<— manchas-verm(x),febre(x).
caxumba(x)<— gland-inflam(x),febre(x).
catapora(x)<— bolhinhas(x),febre(x),mal-estar(x).
Consultas: catapora(Pedro), catapora(Maria), sarampo(Pedro).
172
para que alguém possa decidir se duas fórmulas podem ser unificadas ou
não. Além disso, se o algoritmo decidir que as duas fórmulas podem ser
unificadas ele também fornece o unificador mais geral, ou seja, a melhor
particularização possível para o axioma utilizado na computação.
3.15 - Substituição
Uma substituição a ?é um conjunto finito da forma
{ vIt, v21t2, vn/tn }
e
· cada vi é uma variável;
· cada t. é um termo distinto de v •
· as variáveis v1,•n • • ,v são distintas.
é chamada de :
Exemplos:
1. Considere a expressão Ei p(x ,y) e a substituição p = { x/a , y/b } Temos
que Eil3 p(a,b).
2. Considere a expressão E2 p(x,y) e a substituição 132 = x/a }
173
Temos que E2132 p(a,y).
3. Considere a expressão E3 q2(x,y,z) A q5(x,y) e a substituição p 3 = xly yl
z , z/x }
Temos que E3133 q2(y,z,x) A q5(y,z).
4. Considere a expressão E4 p(x,y) v p5(y,z,x,z2) e a substituição 134= { x/a ,
y/x , z/b , z2/y}
Temos que E4P4 p(a) v p5(x,b,a,y).
3.17 - Composição de substituições
Considere duas substituições a = {ui/si, ..., um/sm} e 13= {vi/ti,
vn/tn}. A composição aP de a eP éa substituição obtida pelo conjunto:
{ui/siP, um/smP, vit.}
de onde devemos retirar as eventuais ligações do tipo: •
ui/siP para as quais ui siP e
{• v./t.
JJ
para as quais v. E 111, ..., }.
Temos que a2?a, 3a4 = { x2/z2a4 , y2/y3a4 , z3/xia4 , y3/b , z2/x2 , y3/y2 } = =
{ x2/x2 , y2/b , z3/xi , y3/b , z2/x2 , y3/y2 } = = { y2/b
, z3/xi , y3/b , z2/x2 , y3/y2 } =
= { y2/b , z3/x1 , y3/b , z2/x2 }
3.18 - Variante
Consideremos duas expressões E e F. Dizemos que E e F são
variantes se existirem substituições a e P tais que E F a e F Ep. Também
dizemos que E é variante de F ou F é variante de E.
Exemplos:
1. Considere as expressões E q(x,y,a) e F q(z,y2,a). E e F são variantes pois
dadas as substituições:
a= { z/x , y 2 /y } e 13?= { x/z , y/y 2 }
t em os q ue F E a e F p .
174
temos que F E y e E Fp, .
3.19 - Proposição
Para quaisquer substituições a, 13 e y e uma expressão E, temos que:
(i ) (a13)Y aRy
( ii) (aR)y a(13y)
Demonstração : Exercício 11.4.
3.21 - Unificador
Considere duas expressões A e B e uma substituição a. Se tivermos
que Act Ba então dizemos que a substituição a é um unificador de A e B.
Também podemos dizer que A e B são unificáveis.
Exemplos:
Considere as expressões E q(x,y,a) e F q(z,y 2,a) e a substituição a ={ x/d ,
y/e , z/d , y2/e } . Aplicando a substituição em E e F, temos:
175
temos:
176
predicado de B então emitir "não" como saída e parar o algoritmo indicando
uma falha, senão criar uma coleção P constituído por pares de termos (t i, si) (i=
{ 1,2, ..., n } ) tais que C p(ti, t.) e D p(si,..., s.).
Passo 1: escolher aleatoriamente um par (C , D) de P;
Passo 2: se C f(si,...,s.) e D f(ti,...,t.) então remover o par (C , D) de P e
incluir os pares (si,ti), ..., (s., t.) em P e voltar ao Passo 1, senão
Passo 3 : se C f(si,...,s.) e D g(ti,...,tm) então emitir "não" como saída e
parar algoritmo indicando uma falha, senão
Passo 4 : se C D x (x variável) ou C D c ( c constante) então remover o
par (C , D) de P e voltar ao Passo 1, e se C c (constante) e D d (
constante) então emitir "não!" e parar o algoritmo indicando falha senão
Passo 5 : se C t (t termo que não é variável) e D x (x variável) remover o
par (C , D) de P e incluir o par (D , C) em P e voltar ao Passo 1, senão
Passo 6 : se C x (x variável) e D t ( t termo) ex t e x ocorre em algum
par de P
Além disso, se x ocorrer em t, emitir "não"como saída e parar o
algoritmo indicando uma falha, senão substituir cada x pelo termo t em todos os
outros pares de P e voltar ao Passo 1.
Passo 7: se nenhum passo anterior puder ser executado então emitir "sim" e
parar o algoritmo. O umg de A eB é dado pela substituição cujas ligações são
dadas pelos pares (C , D) que pertencem ao conjunto P.
Exemplos: (Utilização do algoritmo de unificação)
Considere Á p(x,y,z) eB q(x,y,z).
Passo O : o símbolo de predicado de A é diferente do símbolo de predicado de
B. Portanto, o algoritmo emite "não!" (pois não é possível unificar A e B) e
pára.
2. Considere Á p(x,y,z) eB q(x2,y2,z5).
P = { (x , x 2) ; (y , y2) ; (z , z 5) }
Passo 1: Escolhemos o primeiro par (x , x2).
Observemos que:
177
Notemos que para o par ( x , x2 ) não pudemos fazer muita coisa.
Acontecerá o mesmo ao escolhermos o segundo ou o terceiro par. Notemos
que P permanecerá inalterado e aí teremos:
Passo 7: Portanto, o algoritmo de unificação emite "sim!" e fornece o umg
para A eB é a substituição cujas ligações são x/x2 , y/y2e z/z5.
Notemos que:
voltamos ao Passo 1.
e voltamos ao Passo 1.
Notemos que não aplicamos o Passo 2 nem o Passo 3 pois não há símbolo
funcional.
178
P = { (x,y) ; (y,y)}
e voltamos ao Passo 1.
Exercícios Resolvidos.
10.1. Em cada item, dada a substituição ? e a expressão E, obtenha a instância
E??
a) E p(x,y,z2) e a = { x/y } .
b) E q(x,y) A r(x,z) A p(x,y,z) e a = { x/a ,y/b ,z/x } .
c) E q4(x,y,z2) e a = { x/c ,y/d } .
d) E p(x,y,z) e a = { } .
Resolução:
a) Temos que substituir todas as ocorrências de da variável x pela variável y e
teremos Ea p(yy,z2).
0) Substituindo todas as ocorrências da variável x pela constante a, todas as
ocorrências da variável y pela constante b e todas as ocorrências da variável z
pela variávely, teremos que: Ea q(a,b) A r(a,x) A p(a,b,x).
a) Substituindo todas as ocorrências da variável x pela constante c e todas as
ocorrências da variável y pela constante d termos: Ea q4 (c,d,z2).
b) Aqui temos que a não possui nenhuma ligação pois é a substituição
identidade. Temos que Ea p(x,y,z).
10.2. Em cada item serão dadas duas substituições a e Í. Obtenha a
composição de a e 13?
a) a = { x/a , y/b , z/x } e 13 = { ak};
0) a = { y/b , z/x } e 13 = { y/z};
b) a = {x/y,z/y} e 13 = { x/a , y/b} ;
a) a = { xi/z ,y/z } e 13 = { z/c } .
Resolução:
a) Temos que a composição al3= { x/aj3 , y/ bl3 , z/xl3 , ak 13 } = { x/c ,y/b , z/ c ,
a/c };
0) Temos que a composição al3 = { y/b z/x y/z } = { y/b , z/x , y/z } ;
b) Temos que a composição al3 = { x/y z/y x/a , y/b } = { x/b , z/b , y/b };
179
d) Temos que a composição aP = { xi /z y/ z z/ c } = { xi /c , y/c , z/c }.
10.3. Em cada item será dado um par de expressões (E,F). Decida se E e F
são variantes. Se forem, exiba também substituições a e 13 tais que E Fa e
F Ep.
a) E p(x,y,z) e F p(y,z,x).
b) E q(x) e F p(y).
c) E p(x,y,z) A q(x,y) e F q(y,x,z) A q(z ,x).
d) E q(xi ,x2 ) v p(z,w) e F q(x,y) v p(w,z).
Resolução:
a) Temos que E e F são variantes pois tomando as substituições a = { x/y , y/ z ,
z/x } e P={ y/x , z/y , x/z } teremos que Ea FP.
0) Temos que E e F não são variantes pois não existem substituições a e P
tais que Ea FP. Na verdade, o que realmente impede que E e F sejam
variantes é que o símbolo de predicado de E é diferente do símbolo de
predicado de F.
a) Temos que E e F não são variantes pois não existem substituições a e P
tais que Ea FP. Além disso, temos o mesmo problema do item anterior.
Exercícios Propostos.
11.1. Em cada item, dada a substituição a e a expressão E, obtenha a
instância Ea.?
a) E p(x,y,z) A q(y,.,,c,z,w) v r(x,y) e a = { x/c, y/x };
0) E pi (x,y,z2) A —,q4(x,y) A r(x,y,z) e a = { z2/x ,y/c , x/y };
180
c) E tio(x,z) A mãe(x) v casados(x,w) e a= { x/z , w/y} ;
0) E casados(x,y) A irmãos(x,w) e a = { y/w , x/a };
d) E irmão(x,y) A irmão(y,z) —> irmão(x,z) e a = { x/y ,y/z , z/x}; O E
pai(x,y) A irmão(x,z) —> tio(z,y) e a = { x/a ,y/b , z/c };
g) E namorados(x,y) A namorados(x,z) —> problema(x,y,z) e a= {x/y
,z/x ,y/ z } ,
0) E p(x,y,z,w) A q(x) e a = { };
h) E q(x) A p(y) e a = { w/y , x2 /a };
i) E p(x,y,z) A q(x,y,z)v r(x,y) e a = { z/a } .
11.2. Em cada item serão dadas duas substituições a e p. Obtenha a
composição de a e 13:?
a) a = {x/a ,y/b , z/x,xi / z} el3 = {x/c,y/z};
b) a = { y/b , z/x , x/y} e 13 = { y/z, x/a} ;
c) a = {y/z,x/y ,z/y} e 13 = { w/c , x/a , y/b} ;
d) a = { x,/z , y/z , z/x , w/x} e 13 = {y/a , z/c };
e) a = { xly y/z , z/w } e13 = {y/w ,x/w ,z/y}; O a = { x2 /x , y2/y , z2 /z } e13 =
{};
g) a = { x/y , y/w} e 13 = { w/x };
h) a = { } e 13 = { };
0) a = { y/w , x/y } e 13= { y/a , z/c } ;
i) a = {wi/w , x2/ x} el3= {xi/ z};
11.3. Em cada item será dado um par de expressões (E,F). Decida se E e F
são variantes. Se forem, exiba também substituições a e 13 tais que E Fa
eFEI3.?
a) E p(x) A q(y) e F p(z) A q(w);
0) E q(x,y,z) e F p(x,y,z);
0) p(xi , x2 , z ) e F (y,z);
a) E pai(x,z) A pai(x,y) e F pai(w,y) A mãe (z,w);
b) E p(x,y,z,)v q(x,y) e F p(wi ,w2 ,w3) v q(xi ,x2);
O E pai(x,z) A irmãos(x,y) e F pai(wi , w) i'. irmãos(x,y);
g) E p(x,y,zi , z2) e F q(x,y,z,w);
h) E filho(x,y) A filho(z,y) e F filho (xi,yi ) A filho (z1 ,y1);
0) E q(y,x) e F q2(x,y,z);
a) E mãe(x,y) v pai(z,y) e F mãe(y,x) v pai(y,z).
11.4 Prove a Proposição 5.
11.5 Utilize o algoritmo de unificação para obter um umg para os seguintes
pares de fórmulas:
a) A p(x,y,z) e B p(f(y) ,w,x);
b)A q(x,y,z) e B p(w,y,z);
c) A q(x,g(y),z) e B q(w,g(y), x1);
d)A p6(x,y,g(x,y)) e B p 6 (w,z,h(w,z));
e) A p4( x,y,z,w) e B p4(x,y,g(x),w));
O A tio(x,y,g(x,y,z) ) e B tio (w1, w2 g ( w1,w2, w));
g) A colineares(x,g(x,y) ) e B colinéares(w,g(w,x) );
181
Programas lógicos e a SLD-derivação.
Nesta seção, apresentaremos o conceito de SLD-derivação.
Conforme já havíamos adiantado anteriormente, este conceito vem a ser um
método de computação de gois tal que não temos a necessidade de escrever a
teoria associada ao programa: as cláusulas gol podem ser diretamente
submetidas ao programa.
3.24 - Resolvente
Seja P um programa lógico e G <— Ai, ..., An uma cláusula gol.
Suponhamos que CÁ <— Bi,...,Bk é uma cláusula de programa de P. Se para
algum i, 1 i n, podemos unificar A e Ai através de um umg a então
chamamos:
de resolvente de G e C.
Programa P1.
p(a) <—. (1)
q(b) <— . (2)
q(x) <— p(x) . (3)
182
seja, q(a) não pode ser unificada nem com (1) (símbolo de predicado é
diferente) nem com (2) (símbolo de predicado é o mesmo mas o argumento que
é uma constante é diferente). A única cláusula de programa que poderá ser
unificada com q(a) é a (3).
2. Ainda com base no Programa P1, vamos considerar a cláusula gol G <—
p(a). Observemos que G pode ser unificada com a cláusula de programa (1) de
P1.
G'.
183
que é o resolvente de G 4—p(a) e de C p(a) .
3.25 - SLD-derivação
Considere um programa P e uma cláusula gol G. Uma SLD-derivação
de P u {G} consiste de:
· uma seqüência (finita ou infinita) G=Go, G1, G2, ... de cláusulas gol;
· uma seqüência (finita ou infinita) Co, C1, C2, ... de cláusulas de
programa de P;
· uma seqüência (fmita ou infinita)?? ?i ?2 ??? de substituições
Cn, (In
184
Existe um jeito muito prático e útil de representar o esquema
acima. Ao efetuarmos um SLD-derivação, podemos representar os gols,
cláusulas de programa e unificadores mais gerais do seguinte modo:
GL, =G Cu
urriga.,
G1
C11-
unvA
3.26 - SLD-refutação
Considere um programa P e uma cláusula gol G. Uma SLD-refutação de
P u {G} é uma SLD-derivação finita de P u {G} que tem a cláusula vazia como
última cláusula gol da derivação. Se Gn = ,dizemos que a SLD-refutação tem
tamanho n. Neste caso dizemos que o gol G foi refutado, ou que a
computação de G foi bem sucedida. Já que uma cláusula gol F' é a negação de
uma outra fórmula F, quando refutamos F', provamos F, ou seja, provamos
que F pode ser deduzida a partir do programa.
185
Na próxima sub-seção, veremos apenas exemplos de programas e
computaremos alguns gols a partir deles utilizando o novo conceito de SLD-
derivaç ão.
Exemplos.
1. O Programa P1 ataca novamente!
Programa P1.
p(a) <—. (1)
q(b) <—. (2)
q(x) <— p(x). (3)
Vamos considerar as mesmas cláusulas gol vistas na sub-seção
4.4.2:
Gi
Gi <— p(a).
E temos uma nova cláusula gol <— p(a). De posse da nova cláusula
gol, damos uma nova olhada nas cláusulas de programa de P 1 e tentamos
unificar o corpo da cláusula gol com a cabeça de alguma cláusula de programa de
P .
1 Escolhemos a cláusula de programa (2) e temos:
186
q(x) <— p(x)
umg ai ={ x/a}
<— p(a) p(a)<— G1 <— p(a) e C1
p(a) <—
umg a, ={}
Agora temos que unificar p(a,y) e q(y,c) com duas cláusulas de P3.
Ao olharmos as cláusulas de programa de P3, podemos escrever:
187
Portanto, conseguimos refutar o gol 4—r(a,c).
2. <— r(c,a). O objetivo é tentar unificar o corpo da cláusula com a cabeça
de alguma cláusula de programa de P3. Podemos escolher a cláusula de
programa (3) e temos:
r(c,a) r(x,z) p(x,y), q(y,z). G Go 4—r(c,a) e C Co
r(x,z)<—p(x,y),q(y,z)
oci={x/a, z/c }
p(c,y), q(y,a) Gi 4—p(c,y),q(y,a).
José Maria
Fábio Eduardo Carlos T Mariana
Sônia
podemos escrever:
homem(José)<—. (1)
188
homem(Fábio)<—. (2)
(3) homem(Eduardo)<—.
4) homem(Carlos)<—.
(5) homem(Marcos)<—.
(0) homem(Adriano)<—.
(6) homem(Mário)<—.
e
(0) mulher(Maria)<—.
(1) mulher(Sônia)<—.
(0) mulher(Ana)<—.
(0) mulher(Mariana)<—.
(1) mulher(Fátima)<—.
(2) mulher(Cláudia)<—.
(1) mulher(Paula)<—.
(3) pai(José,Fábio)<—.
(4) pai(José,Ana)<—.
(5) pai(José,Carlos)<—.
(6) pai(Fábio,Marcos)<—
(7) pai(Fábio,Fátima)<—.
(8) pai(Eduardo,Adriano)<—.
(9) pai(Eduardo,Cláudia)<—.
22)pai(Carlos,Mário)<—.
(23)pai(Carlos,Paula)<—.
(24)mãe(Maria,Fábio)<—.
(25)mãe(Maria,Ana)<—.
(26)mãe(Maria,Carlos)<—.
(27) mãe(Sônia,Marcos)<—.
(28) mãe(Sônia,Fátima)<—.
(29) mãe(Ana,Adriano)<—
(30) mãe(Ana,Cláudia)<—.
189
Tendo essas relações de parentesco básicas estabelecidas, podemos
construir outros predicados baseados nesses mais básicos. Um exemplo seria
o predicado "irmão". Como poderíamos estabelecer que duas pessoas são
irmãs baseados nos predicados que temos até agora? Uma sugestão seria o
seguinte:
irmãos(x,y) 4—pai(z,x),pai(z,y). (33)
Para duas pessoas x e y serem irmãs, podemos ter que existe uma
pessoa z tal que z é pai de x ez é pai de y. Dizer isto é sufuciente? Considere o
programa P formado pelas cláusulas de (1) até (33). Façamos a seguinte
consulta: irmãos(Mário,Paula). Temos, então, o seguinte gol:
G <— irmãos(Mário,Paula) e
a seguinte SLD-derivação:
4—irmãos(Mário,Paula) irmãos(x,y)<—pai(z,x),pai(z,y)
umg = { x/Mário , y/Paula } 4
—pai(z,Mário), pai(z,Paula) pai(Carlos,Mário)<—
umg = { z/Carlos }
que quer dizer : "para que x seja filho de y, y deve ser o pai de x e além disso x
deve ser do sexo masculino". Também poderíamos ter definido o predicado de
filho(x,y) por:
filho(x,y)<— mãe(y,x),homem(x) (35)
que significa : "para que x seja filho de y, y deve ser a mãe de x e além disso x
deve ser do sexo masculino". Notemos que, no nosso caso, como para cada
filho x temos uma cláusula do tipo pai(y,x) e uma cláusula do tipo mãe(z,x)
então qualquer uma das cláusulas (34) ou (35) serve. Vamos manter as duas
cláusulas. Ao colocarmos todas as possibilidades de definição de um
predicado, vamos obter informações de árvores de família que podem não
estar tão completas como no nosso exemplo.
Vamos considerar a cláusula gol G 4—filho(Marcos,José). Só dando
190
uma olhada na árvore, já podemos dizer que esta cláusula gol não poderá ser
refutada pois Marcos é, na verdade, neto de José. Vejamos:
<— filho(Marcos,José) filho(x,y) 4—pai(y,x),homem(x)
umg = { x/Marcos , y/José } 4
—pai(José,Marcos),homem(Marcos) homem(Marcos)<—.
umg = { }
4—pai(José,Marcos)
Exercícios Propostos.
7.1. Considere o exercício proposto 4.4.4.1. Para cada item do exercício 4.4.4.1.
faça a computação das cláusulas gol dadas diretamente a partir do programa.
191
7.2. Consideremos o problema de relações de parentesco. Cada item é um
predicado a ser definido. Para cada predicado, escreva todas as maneiras
como podemos defini-lo:
a) tia(x,y) "x é tia de y";
0) sobrinho(x,y) "x é sobrinho de y" ;
0) sobrinha(x,y) "x é sobrinha de y" ;
0) avô(x,y) "x é avô de y" ;
b) avó(x,y) "x é avó de y" ;
a) neta(x,y) "x é neto de y" ;
a) neta(x,y) "x é neta de y";
b) primos(x,y) "x ey são primos".
7.3. Considere a árvore da sua própria família. Primeiramente, faça um esboço
desta árvore: incluindo seus pais, tios, avós, primos, cônjuge, filhos. Escreva
cláusulas incondicionais para relações de parentesco do tipo pai, mãe,etc.,
como fizemos na sub-seção 4.6.5 e depois inclua as cláusulas condicionais
que definem os predicados vistos até gora.
p(a)
192
q(b) <—. q(x) <
— p (x).
Escrevendo P1 na notação de PROLOG, temos:
p (a).
(0).
q(X) :- p(X).
Observações:
· constantes são representadas por letras minúsculas e as variáveis,
por letras maiúsculas;
· todas as cláusulas de programa são finalizadas com "." (ponto
fmal);
· cláusulas de programa incondicionais não necessitam de "<—" no
fmal. Apenas devemos escrever a(s) fórmula(s) seguidas do ponto final;
· o conectivo de implicação "<—" das cláusulas de programa
condicionais é representado por ":-" (dois pontos seguidos de um hífen).
As consultas são representadas por ?-p(a) (por exemplo) ao invés
de <—p (a).
P(a,b).
q(b,c).
r(X,Z) :- p(X,Y),q(Y,Z).
P(X) :- P(X).
p (a).
q(c). P()).
193
antes de escolher uma cláusula de programa.
P(X):-P(X). (1)
p(a). (2)
q(c). (3)
p(b). (4)
Se fizermos a consulta ?-p(a), nós, humanos, escolheríamos a
cláusula (2) para a unificação e já obteríamos a cláusula vazia, refutando o gol
<—p(a) correspondente à consulta ?-p(a). Porém, o PROLOG escolherá (1) e
obterá novamente o mesmo gol como resolvente, a saber , 4—p(a). De posse do
novo gol, o PROLOG lerá alista de axiomas de P4 e escolherá (1) novamente
194
para a unificação obtendo, como resolvente, o mesmo gol 4—p(a) e assim por
diante. Enquanto que nós, humanos já obtemos uma refutação para o gol 4—
p(a), o PROLOG prosseguirá a SLD-derivação sempre utilizando a cláusula (1) e
não parará a computação. Neste caso de computação sem término, o
PROLOG não emite resposta alguma.
Este modo através do qual o PROLOG escolhe as cláusulas para
unificação é um tipo de estratégia determinística que, grosso modo, é um
método precisamente definido de, no nosso caso, escolha de cláusulas. Já o
modo com nós, humanos, escolhemos uma cláusula a ser unificada é um tipo de
estratégia não-determinística, ou seja, não existe uma regra ou um método
precisamente defmido para a escolha de cláusulas de programa.
?-P(c).
no.
195
que habitavam a floresta. Alice os encontra e deseja obter alguma informação
sobre o dia da semana. O problema é que o Leão mente em determinados dias
da semana e o mesmo acontece com o Unicórnio. Alice sabe que eles
mentem e sabe em que dia cada um mente. Naquela época o Leão mentia às
segundas, terças e quartas e falava a verdade nos outros dias da semana. O
Unicórnio mentia às quintas, sextas e sábados e falava a verdade nos outros
dias da semana.
Quando Alice os encontra o Leão diz:
o Unicórnio diz:
Ontem foi um dos meus dias de mentir!
ontem(domingo, sábado) .
ontem(segunda, domingo) .
ontem(terça, segunda) .
ontem(quarta, terça) .
ontem(quinta, quarta) .
ontem(sexta, quinta) .
ontem(sábado, sexta) .
196
mentira(leão, sábado).
mentira(leão, domingo)
mentira(unicórnio, segunda).
mentira(unicórnio, quarta).
mentira(unicórnio, sexta).
mentira(unicórnio, domingo)
197
a) ontem(X,Y), verdade(leão, Y), mentira(leão, X) : quando o leão
falou com
Alice ele disse a verdade sobre o dia anterior. Obtemos X = seg e Y = dom;
a) ontem(X,Y), verdade(unic, Y), mentira(unic, X) : mesma situação
acima para
o unicórnio. Obtemos X = qui e Y = qua.
Exercícios Propostos.
4.1. Refaça o exercício 4.6.7.2. só que desta vez utililize a notação do
PROLOG.
4.2. Refaça o exercício 4.6.7.3. utilizando a notação do PROLOG.
198
3.5. Desta vez o Unicórnio encontra Alice e diz:
199