Exercicios de Logica de Programação
Exercicios de Logica de Programação
Ana Cardoso-Cachopo
Maio de 2014
CONTEDO
Contedo
1
Argumentos e Validade
17
31
37
51
59
69
77
85
93
97
111
119
135
149
CONTEDO
CONTEDO
Prefcio
Este documento contm uma compilao de exerccios para a disciplina de
Lgica para Programao da LEIC e baseado no livro Lgica e Raciocnio
do Professor Joo Pavo Martins.
A maior parte dos exerccios foi criada por mim especificamente para as aulas
prticas ou para as provas de avaliao da disciplina e outros foram tirados
de livros ou artigos acerca da matria em questo.
Existem dois exerccios cujo enunciado foi feito pelo Professor Joo Pavo
Martins nas aulas sobre os sistemas de deduo natural da lgica proposicional e da lgica de primeira ordem. Esses exerccios esto assinalados com a
etiqueta (JPM).
O Professor Joo Cachopo, para alm de discutir comigo algumas das respostas dos exerccios, ajudou-me a fazer em LaTeX as figuras dos vrios captulos,
tornando esta compilao muito mais apresentvel.
Obviamente, a responsabilidade por quaisquer erros ou gralhas que esta compilao de exerccios possa ter inteiramente minha.
Correces de gralhas ou sugestes de melhorias podem ser enviadas para o
meu endereo de email: acardoso@tecnico.ulisboa.pt.
CONTEDO
Argumentos e Validade
Sumrio:
Apresentao
Trazer para as aulas os enunciados e as resolues dos exerccios
Argumentos e validade
Resumo:
Um argumento representado por um par (, ), em que um conjunto de proposies
(premissas) e uma proposio (concluso).
Uma proposio uma frase declarativa que pode ser verdadeira ou falsa.
Um argumento vlido (podendo tambm dizer-se que as premissas implicam semanticamente a concluso, ou que a concluso uma consequncia semntica das premissas)
quando logicamente impossvel ter todas as premissas verdadeiras e a concluso falsa,
ou seja, quando todos os modelos das premissas tambm so modelos da concluso.
invlido caso contrrio.
Princpio da irrelevncia do valor lgico: excepto no caso em que as premissas so todas
verdadeiras e a concluso falsa, a verdade ou falsidade das proposies que constituem
um argumento no relevante para determinar a validade ou invalidade do argumento.
Princpio da forma: se dois argumentos tm a mesma forma, ento estes so ambos vlidos
ou ambos invlidos.
Um contra-argumento um argumento com a mesma forma do argumento inicial, cujas
premissas sejam todas verdadeiras e a concluso seja falsa.
1.1. PROPOSIC
OES
E ARGUMENTOS
7
A figura
seguinte
ilustra uma metodologia para provar a validade/invalidade
de um
argumento e foi retirada do livro do Professor Pavo Martins.
(, )
Palpite
V
alido
"!
!
!
!
Inv
alido
& #
#
#
Tente
encontrar
uma
prova
Sim
%
Sabido
v
alido
#
$
Tente
encontrar
um contra
argumento
'(
N
ao
Mude de
palpite
N
ao
Sim
%
Sabido
inv
alido
(Validade /
Invalidade
Desconhecida)
ARGUMENTOS E VALIDADE
7
Exerccio 1.1
Usando apenas a informao que est explcita, diga, justificando, se os seguintes argumentos so vlidos ou so invlidos:
1. Peregrino Cinzento Gandalf
Mithrandir Gandalf
Peregrino Cinzento Mithrandir
2. Mithrandir um feiticeiro
Mithrandir Gandalf
Gandalf um feiticeiro
3. Os orcs so feios
Os orcs so feios
4. Nemo um peixe
Dori um peixe
Nemo Dori
5. Os tubares so carnvoros
Os tubares no so vegetarianos
O Bruce vegetariano
O Bruce no tubaro
6. Os peixes so animais
Os tubares so animais
Resposta:
Pretendemos saber se cada argumento satisfaz a definio de argumento vlido: vamos ver se
possvel ter a concluso falsa e as premissas verdadeiras. Se for possvel, o argumento no satisfaz
a definio e por isso invlido; so no for possvel, o argumento satisfaz a definio e por isso
vlido.
Podemos resolver este exerccio usando diagramas de Venn ou usando a forma dos argumentos
e partindo do princpio que a noo de igualdade (com as suas propriedades) est definida na
lgica que estivermos a usar.
Tambm podemos fazer as provas directamente, partindo do princpio que todas as premissas
so verdadeiras e testando se a concluso pode ser falsa; ou por reduo ao absurdo, partindo do
princpio que a concluso falsa e vendo se possvel todas as premissas serem verdadeiras sem
dar origem a uma contradio.
Para alm destas maneiras de provar se um argumento vlido ou no, tambm o podemos fazer
partindo de um palpite, como est no livro. Se o palpite for que o argumento vlido, tentamos
provar que impossvel ter todas as premissas verdadeiras e a concluso falsa. Se conseguirmos,
o argumento sabido vlido. Se no conseguirmos, mudamos o palpite para invlido e tentamos
encontrar um contra-argumento, isto , argumento com a mesma forma mas que ns saibamos
que no vlido. Se conseguirmos, o argumento sabido invlido. Se no conseguirmos provar
que o argumento vlido nem invlido, o argumento tem validade desconhecida.
Vamos usar vrias alternativas para resolver cada um dos exerccios. Normalmente, deve ser
usada apenas uma delas.
1. Peregrino Cinzento Gandalf
Mithrandir Gandalf
Peregrino Cinzento Mithrandir
ARGUMENTOS E VALIDADE
9
Feiticeiros
M
G
M
G
3. Os orcs so feios
Os orcs so feios
10
ARGUMENTOS E VALIDADE
Feios
Orcs
Orcs
Orcs
11
, Nemo no ser Dori. Assim, o argumento no vlido.
Peixes
Nemo
Dori
Nemo
Dori
12
ARGUMENTOS E VALIDADE
5. Os tubares so carnvoros
Os tubares no so vegetarianos
O Bruce vegetariano
O Bruce no tubaro
(a) Diagrama de Venn, prova directa:
Para os tubares serem carnvoros, o conjunto que representa os tubares tem que
estar contido no conjunto que representa os carnvoros. Para os tubares no serem
vegetarianos, o conjunto que representa os tubares no pode estar contido no conjunto que representa os vegetarianos, embora os carnvoros e os vegetarianos se possam intersectar, sem problemas. Para o Bruce ser vegetariano, tem que estar contido
no conjunto que representa os vegetarianos. Com isto, impossvel que o Bruce esteja
contido no conjunto que representa os tubares. Logo, o argumento e vlido.
Carnvoros Vegetarianos
Tubares
Bruce
Tubares
Bruce
13
V egetariano(Bruce) que d uma contradio. Logo, como impossvel ter simultaneamente todas as premissas verdadeiras e a concluso falsa, o argumento vlido.
(e) Pelo algoritmo do livro:
Palpite: o argumento vlido.
Resoluo: tentar encontrar uma prova. A prova pode ser qualquer uma das apresentadas anteriormente.
Concluso: como conseguimos encontrar uma prova, o argumento sabido vlido.
6. Os peixes so animais
Os tubares so animais
(a) Diagrama de Venn, prova directa:
Para os peixes serem animais, tm que estar contidos no conjunto dos animais. Com
base nesta premissa, nada nos impede de ter o conjunto dos tubares fora do conjunto
dos animais. Logo, possvel ter todas as premissas verdadeiras e a concluso falsa,
isto , os tubares no serem animais. Assim, o argumento no vlido.
Animais
Peixes
Tubaroes
Peixes
Tubaroes
14
ARGUMENTOS E VALIDADE
Exerccio 1.2
Sempre que for possvel, d exemplos de argumentos vlidos e invlidos com:
Argumento Vlido
Argumento Invlido
(Verd, Verd)
Os pares so inteiros
Os pares so inteiros
Os pares so mltiplos de 2
Os mltiplos de 2 so pares
(Verd, Falsa)
Impossvel
Os inteiros so nmeros
Os nmeros so inteiros
(Falsas, Verd)
As estrelas so pessoas
As pessoas irradiam luz
As estrelas irradiam luz
Os astros so estrelas
As estrelas so astros
(Falsas, Falsa)
As bicicletas so casas
As bicicletas so casas
Os patins so animais
Os animais so patins
Uma maneira mais automtica de resolver este exerccio considerar o teorema da forma, que
diz que todos os argumentos com a mesma forma so vlidos ou invlidos. Com base numa
forma, encontrar os exemplos que satisfaam o valor de verdade das premissas e concluso.
Para os argumentos vlidos, sabemos que um argumento com a seguinte forma vlido:
Os As so Bs
Os Bs so Cs
Os As so Cs
15
C
Para os argumentos invlidos, sabemos que um argumento com a seguinte forma no vlido:
Os As so Bs
Os Cs so Bs
B
Agora, s preciso encontrar exemplos de proposies com o valor de verdade pedido, de maneira a que o argumento satisfaa estas formas.
(prem, concl)
Argumento Vlido
Argumento Invlido
(Verd, Verd)
Os pares so inteiros
Os inteiros so nmeros
Os pares so nmeros
Os inteiros so nmeros
Os reais so nmeros
(Verd, Falsa)
Impossvel
Os inteiros so nmeros
Os animais so nmeros
(Falsas, Verd)
Os inteiros so pessoas
As pessoas so nmeros
Os inteiros so nmeros
Os animais so nmeros
Os inteiros so nmeros
(Falsas, Falsa)
Os inteiros so pessoas
As pessoas so plantas
Os inteiros so plantas
Os animais so nmeros
Os carros so nmeros
16
ARGUMENTOS E VALIDADE
17
Sumrio:
Regras do sistema de deduo natural da lgica proposicional
Provas usando o sistema de deduo natural da lgica proposicional
Resumo:
As frmulas bem formadas (ou fbfs) correspondem ao menor conjunto definido atravs
das seguintes regras de formao:
1. Os smbolos de proposio so fbfs (chamadas fbfs atmicas);
2. Se uma fbf, ento () uma fbf;
3. Se e so fbfs, ento ( ), ( ) e ( ) so fbfs.
Uma prova (tambm chamada demonstrao) uma sequncia finita de linhas numeradas, cada uma das quais ou contm uma premissa ou uma fbf que adicionada prova
recorrendo a uma das regras de inferncia e utilizando as fbfs que existem nas linhas anteriores. No lado direito de cada linha existe uma justificao da introduo da linha na
prova.
Uma prova de a partir de uma prova cuja ltima linha contm a fbf e cujas restantes
linhas contm ou uma fbf em ou uma fbf obtida a partir das fbfs das linhas anteriores
atravs da aplicao de uma regra de inferncia. Se existir uma prova de a partir de ,
dizemos que derivvel a partir de e escrevemos ` .
Existem dois tipos de provas: as provas categricas que no so iniciadas com a introduo de uma hiptese; e as provas hipotticas que so iniciadas com a introduo de
uma hiptese. As fbfs de uma prova hipottica so chamadas contingentes, uma vez que
dependem da hiptese que iniciou a prova; as fbfs nas provas exteriores so chamadas
categricas.
Uma fbf que obtida numa prova que no contm premissas chamada um teorema.
Quando {} ` , ou seja, quando um teorema, usual escrever apenas ` .
Os argumentos continuam a ser representados por um par (, ). Quando uma frmula derivvel (usando o sistema sintctico) a partir de um conjunto de frmulas
, escrevemos ` . Quando uma frmula consequncia lgica (usando o sistema
semntico) de um conjunto de frmulas , escrevemos |= .
Provas nos testes
Embora no livro sejam referidas regras de inferncia derivadas, nos testes em geral o
enunciado diz que apenas se podem usar as regras bsicas: premissa, hiptese, repetio,
re-iterao e introduo e eliminao de cada conectiva lgica.
Para simplificar as provas, permitimos que se usem algumas das regras bsicas com mais
graus de liberdade, mas sempre usando fbfs que estejam no nvel de prova correcto:
18
Em geral podemos no ter as fbfs pela ordem em que aparecem no enunciado da regra
(uma vez que isso poderia ser obtido atravs da utilizao de repeties), desde
que os nmeros dos passos estejam pela ordem correcta na justificao do passo
correspondente.
Reit podemos passar para dentro de mais do que um nvel de cada vez.
Em todas as outras regras temos que respeitar os nveis de prova.
No fim dos exerccios est um resumo das regras de inferncia bsicas do sistema de
deduo natural da lgica proposicional.
19
Exerccio 2.1
(JPM) Demonstre os seguintes teoremas e argumentos usando o sistema de deduo natural da lgica proposicional. Em cada alnea indique se est a demonstrar um teorema
ou um argumento.
1. A (B A)
2. (A A) B
3. ({A B, B A}, A)
4. ({A}, B (A B))
5. ({}, ((A B) (B C)) (A C))
Resposta:
1. A (B A) teorema
A
Hip
Hip
Rei, 1
BA
4
5
A (B A)
I, (2, 3)
I, (1, 4)
2. (A A) B teorema
1
A A
Hip
Hip
A A
Rei, 1
E, 3
E, 3
E, 6
(A A) B
I, (1, 7)
AB
B A
Hip
AB
Rei, 1
E, (3, 4)
B A
Rei, 2
E, (5, 6)
Prem
Prem
20
Prem
Hip
Rei, 1
AB
I, (3, 2)
B (A B)
I, (2, 4)
5. ({}, ((A B) (B C)) (A C)) argumento. Para alm disso, e uma vez que o
conjunto de premissas do argumento vazio, a fbf que a sua concluso um teorema.
1
(A B) (B C)
Hip
AB
E, 1
BC
E, 1
Hip
AB
Rei, 2
E, (4, 5)
BC
Rei, 3
E, (6, 7)
9
10
AC
((A B) (B C)) (A C)
I, (4, 8)
I, (1, 9)
Exerccio 2.2
Demonstre os seguintes teoremas usando o sistema de deduo natural da lgica proposicional.
1. (A (B C)) ((A B) (A C))
2. ((A (A B)) A) B
3. (A B) (B A)
4. (B A) (A B)
5. (A B) (A B)
6. ((A B) B) A
7. (A A) A
8. (A B) (B A)
9. ((A B) C) (A (B C))
10. (A (B C)) ((A B) (A C))
11. ((A B) (A C)) (A (B C))
21
12. ((A B) A) A
Resposta:
1. (A (B C)) ((A B) (A C))
1
A (B C)
Hip
AB
Hip
Hip
AB
Rei, 2
E, (3, 4)
A (B C)
Rei, 1
BC
E, (3, 6)
E, (5, 7)
AC
9
10
11
I, (3, 8)
(A B) (A C)
I, (2, 9)
I, (1, 10)
2. ((A (A B)) A) B
1
(A (A B)) A
Hip
A (A B)
E, 1
E, 1
AB
E, (3, 2)
E, (3, 4)
((A (A B)) A) B
I, (1, 5)
3. (A B) (B A)
1
AB
Hip
Hip
Hip
AB
Rei, 1
E, (3, 4)
Rei, 2
B A
(A B) (B A)
22
4. (B A) (A B)
1
B A
Hip
Hip
Hip
B A
Rei, 1
E, (3, 4)
Rei, 2
E, 7
9
10
AB
(B A) (A B)
I, (2, 8)
I, (1, 9)
5. (A B) (A B)
1
AB
Hip
A B
Hip
AB
Rei, 1
E, 3
E, (4, 2)
E, 3
7
8
(A B)
(A B) (A B)
I, (1, 7)
(A B) B
Hip
6. ((A B) B) A
1
2
Hip
(A B) B
Rei, 1
AB
E, 3
E, (2, 4)
E, 3
7
8
((A B) B) A
23
7. (A A) A
1
A A
Hip
Hip
A A
Rei, 1
E, (2, 3)
(A A) A
I, (1, 5)
8. (A B) (B A)
1
AB
Hip
Hip
BA
I, 2
Hip
BA
I, 4
BA
(A B) (B A)
9. ((A B) C) (A (B C))
1
(A B) C
Hip
AB
Hip
Hip
A (B C)
I, 3
Hip
BC
I, 5
A (B C)
I, 6
A (B C)
Hip
10
BC
I, 9
11
A (B C)
I, 10
12
13
A (B C)
((A B) C) (A (B C))
24
A (B C)
Hip
E, 1
BC
E, 1
Hip
Rei, 2
AB
I, (5, 4)
(A B) (A C)
I, 6
Hip
Rei, 2
10
AC
I, (9, 8)
11
(A B) (A C)
I, 10
12
13
(A B) (A C)
(A B) (A C)
Hip
AB
Hip
E, 2
E, 2
BC
I, 4
A (B C)
I, (3, 5)
AC
Hip
E, 7
E, 7
10
BC
I, 9
11
A (B C)
I, (8, 10)
12
13
A (B C)
25
12. ((A B) A) A
(A B) A
Hip
AB
Hip
E, 2
Hip
Rep, 4
((A B) A) A
I, (1, 6)
Exerccio 2.3
Demonstre os seguintes teoremas, que correspondem a aplicaes das leis de De Morgan,
usando o sistema de deduo natural da lgica proposicional.
1. (A B) (A B)
2. (A B) (A B)
3. (A B) (A B)
4. (A B) (A B)
Resposta:
1. (A B) (A B)
1
(A B)
Hip
Hip
AB
I, 2
(A B)
Rei, 1
Hip
AB
I, 6
(A B)
Rei, 1
9
10
11
2. (A B) (A B)
A B
I, (5, 9)
(A B) (A B)
I, (1, 10)
26
A B
Hip
A B
Hip
E, 1
E, 1
E, 1
E, 1
AB
Hip
AB
Hip
Hip
Hip
A B
Hip
Rep, 5
Rei, 5
Hip
Rei, 2
Hip
(A B)
Rei, 3
10
Hip
10
Rei, 7
11
A B
Hip
11
12
Rei, 10
12
E, 11
13
Rei, 3
13
14
Rei, 2
14
(A B)
15
(A B)
16
A B
Rei, 1
17
18
(A B)
(A B) (A B)
16
(A B)
(A B) (A B)
27
3. (A B) (A B)
1
2
(A B)
(A B)
Hip
Hip
Hip
A B
I, 3
(A B)
Rei, 2
E, 6
Hip
A B
I, 8
10
(A B)
Rei, 2
11
12
E, 11
13
AB
I, (7, 12)
14
(A B)
Rei, 1
15
16
17
4. (A B) (A B)
(A B)
A B
(A B) (A B)
28
1
2
A B
A
A B
Hip
Hip
AB
Hip
Hip
AB
Hip
E, 2
E, 3
E, 2
Rei, 2
A B
Rei, 1
(A B)
Hip
Hip
Hip
AB
Hip
Rei, 3
E, 8
Rei, 6
10
Rei, 7
10
11
Hip
Rep, 11
11
12
13
(A B)
(A B)
(A B) (A B)
I, (1, 12)
13
14
15
B
(A B)
(A B) (A B)
E
n
Prem
Hip
ou
n
n+1
...
Hip
n
..
.
m
..
.
E, n
n
..
.
m
..
.
E, n
n
..
.
m
..
.
n
..
.
m
..
.
Rep
n
..
.
m
..
.
Rep, n
ou
Rei
n
..
.
..
.
..
.
m
k
E
n
..
.
m
..
.
k
..
.
..
.
Rei, n
Hip
I, (n, m)
o
..
.
..
.
r
..
.
..
.
s
m
..
.
..
.
Hip
Hip
I
E, (n, m)
I
n
..
.
m
..
.
k
I, n
I
n
..
.
I, n
I, (n, m)
n
..
.
..
.
m
..
.
..
.
k
l
E
n
..
.
m
Hip
..
.
E, n
30
31
Sumrio:
Provas usando o sistema semntico da lgica proposicional
Interpretaes
Tabelas de verdade
Resumo:
Uma funo de valorao uma funo dos smbolos de proposio para os valores lgicos,
verdadeiro e f also.
Dada uma funo de valorao, uma interpretao uma funo das fbfs para os valores
lgicos, que atribui s frases da linguagem o valor verdadeiro ou f also.
Dado um smbolo de proposio P e uma interpretao v, dizemos que v satisfaz o smbolo de proposio P sse v(P ) = V (diz-se tambm que o smbolo de proposio P
verdadeiro segundo a interpretao v); caso contrrio, dizemos que a interpretao no
satisfaz o smbolo de proposio P (neste caso, diz-se tambm que o smbolo de proposio P falso segundo a interpretao v).
Um modelo de uma fbf uma interpretao que satisfaz . Um modelo de um conjunto
de fbfs uma interpretao que satisfaz todas as fbfs de .
Diz-se que uma fbf consequncia lgica de um conjunto de fbfs quando for impossvel
encontrar uma interpretao que satisfaa todas as fbfs do conjunto mas no satisfaa
. Ou seja, quando for satisfeita por todos os modelos do conjunto .
As tabelas de verdade para as fbfs so construidas tendo em conta as valoraes dos smbolos de proposio e as tabelas de verdade das conectivas lgicas, j conhecidas.
Usando a semntica, um argumento vlido se no existir nenhuma interpretao que
torne todas as premissas verdadeiras e a concluso falsa, ou seja, se no existir nenhuma
linha da tabela de verdade em que todas as premissas tenham o valor V e a concluso
tenha o valor F .
Uma fbf diz-se satisfazvel sse existe pelo menos uma interpretao na qual a fbf verdadeira.
Uma fbf diz-se falsificvel sse existe pelo menos uma interpretao na qual a fbf falsa.
Uma fbf diz-se tautolgica sse verdadeira para todas as interpretaes.
Uma fbf diz-se contraditria sse falsa para todas as interpretaes.
A lgica proposicional correcta e completa. Isto importante para nos permitir fazer
provas pela via sintctica, com base no conhecimento que temos, e sabermos que isso
tem uma correspondncia semntica no mundo que estamos a representar. Enquanto
que na lgica proposicional relativamente simples encontrar algoritmos eficientes para
fazer provas pela via semntica, na lgica de primeira ordem isso mais complicado.
32
Assim, fazemos as provas pela via sintctica e, pela correco e completude da lgica,
sabemos que seramos capazes de provar o mesmo pela via semntica.
Uma lgica correcta (do ingls, sound) se qualquer argumento demonstrvel (com o
seu sistema dedutivo) vlido de acordo com a sua semntica. Ou seja, se partindo de
um conjunto de premissas, o sistema dedutivo no gera nenhuma concluso errada.
Uma lgica completa (do ingls, complete) se qualquer argumento vlido de acordo
com a sua semntica demonstrvel no seu sistema dedutivo. Ou seja, significa que
podemos provar todas as proposies verdadeiras, tendo em ateno as premissas.
33
Exerccio 3.1
Para cada uma das seguintes fbfs, diga, justificando, se satisfazvel, falsificvel, tautolgica ou contraditria. necessrio conhecer todas as linhas das tabelas de verdade de
cada fbf para responder a estas perguntas?
1. A
2. A A
3. A A
4. (A B) (A B)
5. (A B) (A B)
Resposta:
Frmula
Satisfazvel
Se tiver pelo menos
uma
interpretao
Verdadeira.
Falsificvel
Se tiver pelo menos
uma
interpretao
Falsa.
Tautolgica
Se tiver todas as
interpretaes Verdadeiras.
Contraditria
Se tiver todas as interpretaes Falsas.
A
A A
A A
(A B) (A B)
(A B) (A B)
Sim
No
Sim
Sim
Sim
Sim
Sim
No
No
Sim
No
No
Sim
Sim
No
No
Sim
No
No
No
Para provar que uma frmula satisfazvel, podemos parar de procurar assim que encontrarmos uma interpretao que satisfaa a frmula, por isso pode no ser necessrio conhecer toda a
tabela de verdade. S ser necessrio conhecer toda a tabela no caso de a frmula no ser satisfazvel. Podemos dizer algo semelhante acerca das frmulas falsificveis, mas paramos quando
encontrarmos uma interpretao que no satisfaa a frmula.
Para provar que uma frmula tautolgica podemos parar numa de duas situaes: ou paramos
quando encontramos uma interpretao que no satisfaa a frmula e neste caso no tautolgica, ou ento temos que mostrar que todas as interpretaes satisfazem a frmula e neste caso
precisamos de percorrer toda a tabela. Podemos dizer algo semelhante para as frmulas contraditrias, trocando satisfazer por no satisfazer e vice-versa.
Exerccio 3.2
Considere o seguinte conjunto de frmulas:
{Homem P essoa, M ulher P essoa, Homem M ulher}
1. Mostre quais so os modelos desse conjunto.
2. P essoa consequncia lgica desse conjunto? Porqu?
3. Acrescente Homem ao conjunto. Diga quais so os seus modelos e as suas consequncias lgicas.
Resposta:
Considerando que: H representa Homem, M representa M ulher e P representa P essoa.
34
1.
H
V
V
V
V
F
F
F
F
M
V
V
F
F
V
V
F
F
P
V
F
V
F
V
F
V
F
HP
V
F
V
F
V
V
V
V
M P
V
F
V
V
V
F
V
V
H M
V
V
V
V
V
V
F
F
modelo?
S
N
S
N
S
N
N
N
Nota: se a pergunta fosse as frmulas derivveis, ainda seria necessrio fazer as provas
respectivas pela via sintctica.
Exerccio 3.3
Considere a seguinte tabela de verdade. Diga a que conectiva lgica corresponde a funo f .
P Q f (P, Q)
V V
V
V F
F
F V
F
F F
F
Resposta:
A funo f corresponde a um e lgico ou conjuno.
Exerccio 3.4
Usando o sistema semntico da lgica proposicional, mostre que {A, B} |= (A B).
35
Resposta:
Para uma interpretao satisfazer {A, B}, A e B tm que ser ambos falsos. Assim, (A B) tambm ser falso e por isso (A B) ser verdadeiro. Logo, todas as interpretaes que satisfazem
{A, B} tambm satisfazem (A B), ou seja, {A, B} |= (A B).
Outra possibilidade de resposta seria fazer uma tabela de verdade e mostrar que todas as linhas
da tabela (interpretaes) que tornam simultaneamente A e B verdadeiras tambm tornam a
fbf (A B) verdadeira.
Exerccio 3.5
Mostre que as frmulas A (B C) e (A B) C no so equivalentes apresentando uma interpretao para a qual elas tenham valores lgicos diferentes.
Resposta:
Um exemplo:
I1 (A) = F
I1 (B) = F
I1 (C) = F
Neste caso, temos I1 (A (B C)) = V e I1 ((A B) C) = F .
Outro exemplo:
I2 (A) = F
I2 (B) = V
I2 (C) = F
Neste caso, temos I2 (A (B C)) = V e I2 ((A B) C) = F .
Outra possibilidade de resposta seria fazer a tabela de verdade com as oito interpretaes possveis para A, B e C e mostrar que em pelo menos uma delas as duas fbfs do enunciado tm valores
de verdade diferentes.
Exerccio 3.6
Usando tabelas de verdade, prove que as seguintes frmulas, correspondentes s leis de
De Morgan, so tautologias.
(A B) (A B)
(A B) (A B)
Resposta:
A
V
V
F
F
B
V
F
V
F
(A B)
F
F
F
V
A B
F
F
F
V
(A B) (A B)
V
V
V
V
A
V
V
F
F
B
V
F
V
F
(A B)
F
V
V
V
A B
F
V
V
V
(A B) (A B)
V
V
V
V
36
37
Sumrio:
Resoluo em lgica proposicional
Provas usando resoluo em lgica proposicional
Resumo:
A resoluo surgiu da necessidade de criar um modo simples e eficiente de automatizar o
raciocnio lgico, para poder ser facilmente implementado em computador.
Antes de se poder usar a resoluo, as fbfs tm que ser passadas para a forma clausal, que
corresponde a uma conjuno de clusulas. Uma clusula um literal ou uma disjuno
de literais. Ou seja, uma fbf na forma clausal corresponde a uma conjuno de disjunes.
Uma fbf atmica corresponde a um smbolo de proposio. Uma fbf atmica ou a sua
negao chamada um literal. Um literal positivo corresponde a uma fbf atmica e um
literal negativo corresponde negao de uma fbf atmica.
Passos da passagem para a forma clausal:
1. Eliminao de : substituir todas as ocorrncias de por (normalmente, de dentro para fora).
2. Reduo do domnio de : eliminao da dupla negao , utilizao das
leis de De Morgan ( ) e ( ) (normalmente, de
fora para dentro).
3. Obteno da forma conjuntiva normal: transformar a frmula numa conjuno de
disjunes usando a propriedade distributiva da disjuno em relao conjuno
( ) ( ) ( ).
4. Eliminao de : transformar a frmula num conjunto de clusulas.
5. Eliminao de : transformar cada clusula num conjunto de literais.
Princpio da resoluo: a partir de e de , podemos concluir . Formalmente,
sendo e duas clusulas e uma fbf atmica tal que e , ento, usando
o princpio da resoluo, podemos inferir a clusula ( {}) ( {}), que o
resolvente das clusulas e .
1
2
3
{A}
{A, B}
{B}
Prem
Prem
Res, (1, 2)
A resoluo correcta mas no completa (por exemplo, {P } |= {P, Q} mas no possvel derivar a concluso {P, Q} a partir da premissa {P } usando resoluo). No entanto,
completa quanto refutao (pois possvel chegar a uma contradio, representada
38
ou
mas no conseguimos chegar a {}.
{P, P }
39
Exerccio 4.1
Transforme a seguinte frmula para a forma clausal:
1. A ((B C) (C D))
Resposta:
1. A ((B C) (C D))
(a) Eliminao de : A ((B C) (C D))
Nota: neste exerccio no se nega a fbf inicial, pois a nica coisa que foi pedida foi que a
passasse para a forma clausal, e no que se provasse alguma coisa com ela.
Exerccio 4.2
Demonstre os teoremas e argumentos do exerccio 2.1 usando resoluo. Em cada alnea
indique se est a demonstrar um teorema ou um argumento.
Resposta:
1. A (B A) teorema
Estamos a tentar provar que uma frmula teorema. Negamo-la, passamo-la para a forma
clausal, e tentamos chegar a uma clusula vazia usando resoluo.
Passagem para a forma clausal de (A (B A)):
(a) Eliminao de : (A (B A))
{B}
{A}
{}
Nota1: No foi necessrio usar todas as premissas da resoluo para chegar a uma clusula
vazia. Na realidade, isto faz sentido, uma vez que a contradio no depende de B, mas
apenas de A e de A.
Nota2: Se no negarmos a fbf inicial e a passarmos directamente para a forma clausal, temos
A (B A), depois A (B A), e finalmente {{A, B, A}}, e no podemos aplicar
resoluo a apenas uma clusula, por isso nunca conseguiremos chegar clusula vazia.
No esquecer que em resoluo as provas so feitas por refutao.
40
2. (A A) B teorema
Passagem para a forma clausal de ((A A) B):
(a) Eliminao de : ((A A) B)
(b) Reduo do domnio de : ((A A) B)
((A A) B)
(A A) B
(A A) B
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A, A, B}
(e) Eliminao de : {{A}, {A}, {B}}
Aplicao do princpio da resoluo:
{A}
{A}
{B}
{}
3. ({A B, B A}, A) argumento
Estamos a tentar provar um argumento. Cada premissa (individualmente) e a concluso
negada so passadas para a forma clausal e tenta-se chegar a uma contradio.
Passagem para a forma clausal de A B, B A, A:
(a) Eliminao de : A B, B A, A
(b) Reduo do domnio de : A B, B A, A
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A B, B A, A}
(e) Eliminao de : {{A, B}, {B, A}, {A}}
Aplicao do princpio da resoluo:
{A, B}
{B, A}
{A}
{A}
{}
4. ({A}, B (A B)) argumento
Passagem para a forma clausal de A, (B (A B)):
(a) Eliminao de : A, (B (A B))
(b) Reduo do domnio de : A, B (A B)
A, B (A B)
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A, B, A B}
(e) Eliminao de : {{A}, {B}, {A, B}}
41
Aplicao do princpio da resoluo:
{A}
{B}
{A, B}
{A}
{}
5. ({}, ((A B) (B C)) (A C)) argumento
Passagem para a forma clausal de (((A B) (B C)) (A C)):
(a) Eliminao de : (((A B) (B C)) (A C))
(d) Eliminao de : {A B, B C, A, C}
{B, C}
{A}
{C}
{A, C}
{C}
{}
Exerccio 4.3
Demonstre os teoremas do exerccio 2.2 usando resoluo.
Resposta:
1. (A (B C)) ((A B) (A C))
Passagem para a forma clausal de ((A (B C)) ((A B) (A C))):
(a) Eliminao de : ((A (B C)) ((A B) (A C)))
(d) Eliminao de : {A B C, A B, A, C}
42
{A, B}
{A}
{C}
{B}
{A, C}
{C}
{}
ou
{A, B, C}
{A, B}
{A}
{C}
{A, C}
{C}
{}
Nota: na segunda prova temos menos um passo porque aplicmos resoluo para eliminar
B e B a duas clusulas que tinham A repetido.
2. ((A (A B)) A) B
Passagem para a forma clausal de (((A (A B)) A) B):
(a) Eliminao de : (((A (A B)) A) B)
(d) Eliminao de : {A A B, A, B}
(e) Eliminao de : {{A, B}, {A}, {B}}
{A}
{B}
{B}
{}
3. (A B) (B A)
Passagem para a forma clausal de ((A B) (B A)):
43
(a) Eliminao de : ((A B) (B A))
(b) Reduo do domnio de : ((A B) (B A))
(A B) (B A)
(A B) (B A)
(A B) (B A)
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A B, B, A}
(e) Eliminao de : {{A, B}, {B}, {A}}
Aplicao do princpio da resoluo:
{A, B}
{B}
{A}
{A}
{}
4. (B A) (A B)
Passagem para a forma clausal de ((B A) (A B)):
(a) Eliminao de : ((B A) (A B))
(b) Reduo do domnio de : ((B A) (A B))
(B A) (A B)
(B A) (A B)
(B A) (A B)
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {B A, A, B}
(e) Eliminao de : {{B, A}, {A}, {B}}
Aplicao do princpio da resoluo:
{B, A}
{A}
{B}
{B}
{}
5. (A B) (A B)
Passagem para a forma clausal de ((A B) (A B)):
(a) Eliminao de : ((A B) (A B))
(b) Reduo do domnio de : (A B) (A B)
(A B) (A B)
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A, B, A B}
(e) Eliminao de : {{A}, {B}, {A, B}}
44
{B}
{A, B}
{A}
{}
6. ((A B) B) A
Passagem para a forma clausal de (((A B) B) A):
(a) Eliminao de : (((A B) B) A)
{B}
{A}
{A}
{}
7. (A A) A
Passagem para a forma clausal de ((A A) A):
(a) Eliminao de : ((A A) A)
{A}
{}
8. (A B) (B A)
Passagem para a forma clausal de ((A B) (B A)):
(a) Eliminao de : ((A B) (B A))
45
(e) Eliminao de : {{A, B}, {B}, {A}}
Aplicao do princpio da resoluo:
{A, B}
{B}
{A}
{A}
{}
9. ((A B) C) (A (B C))
Passagem para a forma clausal de (((A B) C) (A (B C))):
(a) Eliminao de : (((A B) C) (A (B C)))
(b) Reduo do domnio de : ((A B) C) (A (B C))
((A B) C) (A (B C))
((A B) C) A (B C)
((A B) C) A B C
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A B C, A, B, C}
(e) Eliminao de : {{A, B, C}, {A}, {B}, {C}}
Aplicao do princpio da resoluo:
{A, B, C}
{A}
{B}
{C}
{B, C}
{C}
{}
10. (A (B C)) ((A B) (A C))
Passagem para a forma clausal de ((A (B C)) ((A B) (A C))):
(a) Eliminao de : ((A (B C)) ((A B) (A C)))
(b) Reduo do domnio de : (A (B C)) ((A B) (A C))
(A (B C)) (A B) (A C)
A (B C) (A B) (A C)
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A, B C, A B, A C}
(e) Eliminao de : {{A}, {B, C}, {A, B}, {A, C}}
Aplicao do princpio da resoluo:
46
4
{A}
{B, C}
{A, B}
{C, A}
{A}
{}
11. ((A B) (A C)) (A (B C))
Passagem para a forma clausal de (((A B) (A C)) (A (B C))):
(a) Eliminao de : (((A B) (A C)) (A (B C)))
(b) Reduo do domnio de : ((A B) (A C)) (A (B C))
((A B) (A C)) (A (B C))
((A B) (A C)) (A (B C))
(c) Obteno da forma conjuntiva normal:
(((A B) A) ((A B) C)) ((A B) (A C))
((AA)(B A))((AC)(B C))((AB)(AC))
(e) Eliminao de : {{A}, {B, A}, {A, C}, {B, C}, {A, B}, {A, C}}
Aplicao do princpio da resoluo:
{A}
{B, A}
{A, C}
{B, C}
{A, B}
{A, C}
{C, A}
{A}
{}
Nota: aqui tambm no foi necessrio usar todas as premissas para chegar a uma contradio. Neste caso, as duas premissas que no foram usadas at poderiam ter sido eliminadas
usando a estratgia de eliminao de clusulas no mnimas, uma vez que ambas contm a
premissa {A}.
12. ((A B) A) A
Passagem para a forma clausal de (((A B) A) A):
(a) Eliminao de : (((A B) A) A)
(b) Reduo do domnio de : ((A B) A) A
((A B) A) A
47
Aplicao do princpio da resoluo:
{A}
{B, A}
{A}
{}
Exerccio 4.4
Demonstre os teoremas do exerccio 2.3, que correspondem a aplicaes das leis de De
Morgan, usando resoluo.
Resposta:
1. (A B) (A B)
Passagem para a forma clausal de ((A B) (A B)):
(a) Eliminao de : ((A B) (A B))
{B}
{A, B}
{A}
{}
2. (A B) (A B)
Passagem para a forma clausal de ((A B) (A B)):
(a) Eliminao de : ((A B) (A B))
{B}
{A, B}
{A}
{}
48
3. (A B) (A B)
Passagem para a forma clausal de ((A B) (A B)):
(a) Eliminao de : ((A B) (A B))
(b) Reduo do domnio de : (A B) (A B)
(A B) (A B)
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A B, A, B}
(e) Eliminao de : {{A, B}, {A}, {B}}
Aplicao do princpio da resoluo:
{A, B}
{A}
{B}
{B}
{}
4. (A B) (A B)
Passagem para a forma clausal de ((A B) (A B)):
(a) Eliminao de : ((A B) (A B))
(b) Reduo do domnio de : (A B) (A B)
(A B) (A B)
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A B, A, B}
(e) Eliminao de : {{A, B}, {A}, {B}}
Aplicao do princpio da resoluo:
{A, B}
{A}
{B}
{B}
{}
Exerccio 4.5
Usando uma estratgia de resoluo linear, apresente uma prova por refutao para A a
partir do seguinte conjunto de clusulas: {{A, B, C}, {D, A}, {B}, {C}}.
Resposta:
49
{A}
{A, B, C}
{B, C}
{B}
{C}
{C}
{}
Nota: no foi necessrio usar a clusula {D, A}. Alis, se a tivssemos usado no primeiro passo
no teramos conseguido fazer o resto da prova usando resoluo linear, pois no conseguiramos
eliminar D. A clusula {D, A} poderia at ser eliminada usando a estratgia de eliminao de
literais puros.
50
51
Sumrio:
Provas usando o sistema semntico da lgica proposicional
rvores de deciso
BDDs
Resumo:
As rvores de deciso correspondem verso grfica das tabelas de verdade. Uma rvore
de deciso para uma fbf uma rvore binria em que os ns contm os smbolos de
proposio existentes na fbf e as folhas da rvore so um dos valores V e F .
Os BDDs (Binary Decision Diagrams) so grafos acclicos dirigidos e rotulados que representam de forma compacta a mesma informao que as rvores de deciso. As rvores
de deciso em si tambm so BDDs, antes de serem simplificados.
Composio de BDDs:
1. O BDD para a fbf pode ser criado a partir do BDD , substituindo o n com o
rtulo V por F e vice-versa.
2. O BDD para a fbf pode ser criado a partir do BDD , substituindo o n com o
rtulo V pelo BDD e aplicando ao BDD resultante as redues R1 a R3.
3. O BDD para a fbf pode ser criado a partir do BDD , substituindo o n com o
rtulo F pelo BDD e aplicando ao BDD resultante as redues R1 a R3.
Da composio de BDDs podem resultar BDDs em que existe mais do que um n para
o mesmo smbolo de predicado. Isto no problemtico, mas necessrio considerar
apenas os caminhos consistentes. Para resolver este problema introduzem-se os OBDDs.
52
Exerccio 5.1
Considere a seguinte tabela de verdade:
P Q f (P, Q)
V V
V
V F
F
F V
F
F
F F
Resposta:
1.
P
2.
P
P
P
R1
R2
3. Seguindo o caminho desde a raz do BDD at ao n V , observa-se que, para f (P, Q) ser
verdadeira, P e Q tm ambos que ser verdadeiros, o que o mesmo que seria concluido
observando a tabela de verdade (como seria de esperar!).
Exerccio 5.2
Considere a seguinte tabela de verdade:
53
P
V
V
V
V
F
F
F
F
Q
V
V
F
F
V
V
F
F
R
V
F
V
F
V
F
V
F
f (P, Q, R)
V
F
F
F
V
F
V
F
2.
P
R1
54
R2 e R3
R2
3. Para saber se a forma do BDD reduzido seria a mesma usando outra ordenao, vamos
voltar a fazer a rvore de deciso e o BDD reduzido usando outra ordenao.
R
R1
R2
Exerccio 5.3
Usando BDDs, prove que as seguintes frmulas, correspondentes s leis de De Morgan,
so tautologias.
(A B) (A B)
55
(A B) (A B)
Resposta:
Mostrar que, para cada uma das frmulas, o BDD reduzido o BDD de uma tautologia, ou seja
tem apenas a folha V . Como todas as interpretaes das duas fbfs tm o valor verdadeiro e as
fbfs usam os mesmos smbolos proposicionais, ambas tero a mesma rvore de deciso.
A
A
A
B
B
R1
R2
R2
Exerccio 5.4
Considere que = A B C e = B C. Usando as regras de composio de BDDs,
determine os BDDs reduzidos para:
1.
2.
3.
4.
Resposta:
1. = A B C
A
A
B
B
B
C
F
2. = B C
56
B
B
C
C
3. = (A B C) (B C)
A
4. = (A B C) (B C)
57
Nota: o problema com as duas ltimas alneas, que correspondem composio simples de
BDDs, que temos caminhos por onde necessrio testar mais do que uma vez o valor de
verdade de um smbolo proposicional, e pior ainda que no mesmo caminho consideramos
que um smbolo proposicional verdadeiro e mais tarde que falso (ou vice-versa), o que
no faz sentido. Os OBBDs vm resolver estes problemas. Convm tambm notar que estes
problemas no existiriam se as fbfs e no tivessem smbolos proposicionais em comum.
58
59
Sumrio:
Provas usando o sistema semntico da lgica proposicional
OBDDs
Resumo:
Da composio de BDDs podem resultar BDDs em que existe mais do que um n para o
mesmo smbolo proposicional no mesmo caminho, no caso em que as fbfs a compor partilhem smbolos proposicionais. Isto no problemtico, apesar de ser ineficiente, mas
necessrio considerar apenas os caminhos consistentes. Para alm disso, difcil verificar a equivalncia de BDDs com ordenaes diferentes para os smbolos de predicado
usados. Para resolver estes problemas introduzem-se os OBDDs.
Um OBBD um BDD que que satisfaz alguma relao de ordem total para os smbolos
proposicionais que contm. Usando OBBDs, cada fbf tem uma representao nica, ou
seja, tem uma forma cannica, que sempre a mesma, independentemente da ordem
pela qual as redues forem aplicadas.
Dados OBDD1 e OBDD2 e um conjunto de smbolos de proposio {P1 , . . . , Pn } contendo os smbolos de proposio de OBDD1 e OBDD2, diz-se que OBDD1 e OBDD2
so compatveis sse existe uma ordem aplicada ao conjunto de smbolos de proposio
tal que ambos os OBDDs satisfazem essa ordem.
A ordenao escolhida para os predicados pode influenciar (e muito!) o tamanho do
OBBD correspondente.
Dada uma fbf e uma relao de ordem total para os smbolos de proposio de , o
OBDD reduzido correspondente a nico. Consequentemente, possvel saber se dois
OBDDs correspondem mesma fbf verificando se estes so estruturalmente semelhantes.
Teste para tautologia/validade uma fbf tautolgica/vlida (isto , tem sempre o
valor verdadeiro) sse o seu OBBD reduzido for V .
Teste para inconsistncia uma fbf contraditria sse o seu OBBD reduzido for F .
Teste para satisfazibilidade uma fbf satisfazvel sse o seu OBBD reduzido no for
F , ou seja, se tiver pelo menos um caminho para a folha V .
Teste de equivalncia semntica duas fbfs so equivalentes sse os seus OBBDs reduzidos so estruturalmente semelhantes.
Ausncia de variveis redundantes se o valor de uma fbf no depende de xi , ento
qualquer OBBD reduzido para no vai ter nenhum n para xi .
Algoritmo reduz
O algoritmo reduz percorre o grafo correspondente ao OBDD por nveis, comeando nos
ns terminais (folhas). Ao percorrer o grafo, atribui um identificador a cada OBDD de tal
60
modo que dois OBDDs representam a mesma fbf sse os seus identificadores so iguais,
ou seja, se id(o1 ) = id(o2 ).
1. Todas as folhas F recebem o identificador 0 e todas as folhas V recebem o identificador 1.
2. A atribuio de identificadores aos OBDDs do nvel i feita assumindo que o algoritmo atribuiu identificadores a todos os OBDDs do nvel i + 1. Dado um OBDD, o,
ao nvel i:
(a) Se id(neg(o)) = id(pos(o)), ento mudaId(o, id(neg(o))) pois a raiz deste OBDD
efectua um teste redundante e pode ser removida pela transformao R2.
(b) Se, entre os OBDDs que j tm identificador existe um oId tal que
(raiz(o) = raiz(oId )), id(neg(o)) = id(neg(oId )) e id(pos(o)) = id(pos(oId ))
ento mudaId(o, id(oId )), pois este OBDD corresponde a um OBDD redundante e pode ser removido pela transformao R3.
(c) Caso contrrio, o OBDD o recebe um novo identificador.
3. Aps a atribuio de identificadores a todos os sub-OBDDs, o OBDD resultante
compactado.
Algoritmo aplica
O algoritmo aplica recebe um operador lgico, op, e dois OBDDs reduzidos e compatveis
o e o , correspondentes s fbfs e , e devolve o OBDD reduzido correspondente
fbf ( op ). Nota: Para o aplica poder ser definido apenas para operadores binrios,
considera-se () ( V ), em que corresponde ao ou exclusivo.
A intuio subjacente a este algoritmo a seguinte:
1. Se ambos os ODBBs corresponderem a folhas, aplica-se a operao op aos correspondentes valores lgicos.
2. Caso contrrio, escolhe-se o smbolo de proposio com maior prioridade existente
em o e o e divide-se o problema em dois subproblemas mais simples, num dos
quais o predicado verdadeiro e no outro o predicado falso.
(a) Se o smbolo de proposio a raiz de ambos os OBDDs, o OBDD resultante
ter esse smbolo como raiz, o seu OBDD negativo resulta de aplicar recursivamente o algoritmo aos correspondentes OBDDs negativos e analogamente
para o seu OBDD positivo.
(b) Caso contrrio, o OBDD resultante ter esse smbolo de proposio como raiz,
o seu OBDD negativo resulta de aplicar recursivamente o algoritmo ao OBDD
negativo do OBDD que contm o smbolo e ao outro OBDD (que no contm
o smbolo), e analogamente para o OBDD positivo.
No fim, reduzir o OBBD resultante dos passos anteriores.
Notao para aplica(op, o , o ) = o( op )
o op o
=
o( op )
61
Exerccio 6.1
Considere as seguintes fbfs:
1. = A B C
2. = B C
3. = (A B) D
Partindo das suas rvores de deciso binrias, mostre os seus OBBDs reduzidos atravs
da aplicao do algoritmo reduz. Deve usar a ordenao [A, B, C, D] para os predicados.
Resposta:
1. = A B C
A
0
F
C
0
0
F
0
F
0
F
Nota: obtm-se um OBDD igual ao BDD reduzido da aula passada, mas com apenas uma
passagem pelo OBDD original. O mesmo vai acontecer na prxima alnea.
2. = B C
B
B
0
F
C
1
0
F
1
V
62
6
3. = (A B) D
A
0
F
D
1
0
F
D
1
D
1
0
F
0
F
1
V
Exerccio 6.2
Considerando os OBBDs reduzidos do exerccio anterior, combine-os usando o algoritmo
aplica (se isso for possvel) para obter os OBBDs reduzidos para as seguintes fbfs.
1.
2.
3.
Resposta:
possvel combinar os OBBDs porque eles so compatveis, isto , tm ordenaes que permitem
a sua combinao.
1. = (A B C) (B C)
Para determinar o OBDD de , vamos calcular aplica(, o , o ).
63
A
B
B
C
C
F
V
=
A
B
C C
F C
F
=
B
=
F
C
F
V
=
C
Este OBDD (que por acaso igual ao OBBD de ), mais compacto do que o resultante da
combinao da aula passada, no tem ns repetidos e consequentemente no tem caminhos
inconsistentes.
2. = (A B C) (B C)
64
B
C
V
V
=
B
V V
=
F
=
C
F V
V V
Tal como seria de esperar, este OBDD corresponde ao BDD de trocando V por F e
vice-versa.
65
A
B
B
C
C
V
V
=
A
B
F C
V
B
C C
=
B
=
B
C
C
F
V
=
C
F
=
C
3. = (B C) (A B) D
Para determinar o OBDD de , vamos calcular aplica(, o , o ).
66
B
B
C
V
F
=
A
B
D
C
C
F
=
B
C
D
V
=
C
V V
=
=
C
=
D
=
B
=
D
=
V
67
Que ainda pode ser reduzido, uma vez que ambos os arcos do n A apontam para o mesmo
n B.
B
68
69
Sumrio:
Sistema semntico da lgica proposicional
Algoritmos de propagao de marcas e de teste de ns
Algoritmo DP
Resumo:
Em SAT, pretende-se determinar se uma fbf satisfazvel, e em caso afirmativo determinar uma interpretao que a satisfaa (a testemunha). Os BDDs j encontram todas as
interpretaes que satisfazem uma fbf, o interesse de SAT que mais eficiente.
Para provar que uma frmula uma tautologia, negamos a frmula inicial e tentamos
chegar a uma contradio. Para provar que um argumento vlido, criamos uma frmula com a conjuno das premissas e a negao da concluso e tentamos chegar a uma
contradio.
Algoritmo de propagao de marcas
Este algoritmo muito eficiente (apresenta uma ordem de crescimento linear em funo
do nmero de smbolos de proposio existentes na fbf), mas no completo, porque no
funciona para frmulas da forma ( ).
Se as fbfs contiverem apenas conjunes e negaes, podemos usar um algoritmo de
propagao de marcas que propaga as restries atravs do DAG que representa a fbf.
1. Transformar a frmula para s conter conjunes e negaes:
traduzir para ( ),
traduzir para ( ) e
eliminar duplas negaes, traduzindo para .
2. Construir o DAG, partilhando as folhas e ns repetidos.
3. Propagar as marcas, usando o algoritmo de propagao de marcas e, se necessrio,
o algoritmo de teste de ns. Os inteiros que aparecem associados s marcas indicam
a ordem pela qual as marcas foram atribudas aos respectivos ns.
4. Verificar as marcas: se conseguirmos marcar o DAG sem contradies, propagar
as marcas das folhas para cima e verificar se realmente as marcas que colocmos
esto correctas. Se tudo estiver consistente, encontrmos a testemunha, que uma
interpretao que satisfaz a frmula inicial, e que corresponde s marcas que esto
nas folhas do DAG. Se encontrmos marcas contraditrias, a frmula inicial no
satisfazvel (ou contraditria).
Algoritmo de teste de ns
Quando o algoritmo de propagao de marcas no consegue marcar todos os ns de um
grafo, deve ser aplicado o algoritmo de teste de ns, que tem uma ordem de crescimento
70
71
Exerccio 7.1
Considere a seguinte frmula: (A (B C)) ((B C) D). Crie o seu DAG,
efectue a propagao de marcas de modo a que a frmula seja verdadeira e apresente
uma testemunha.
Resposta:
Em primeiro lugar, preciso transformar a frmula para que contenha apenas conjunes e negaes:
(A (B C)) ((B C) D)
(A (B C)) ((B C) D)
(A (B C)) ((B C) D)
(A (B C)) ((B C) D)
(notar que (B C) comum a ambas as conjunes exteriores)
1:V
2:V
2:V
4:V
A
3:V
5:F
3:V
7:F
8:F
4:V
C
6:F
9:V
Exerccio 7.2
Considere a seguinte frmula: (A B) (B (B C)).
1. Crie o seu DAG. Efectue a propagao de marcas, de modo a que a frmula seja
verdadeira. O que pode concluir?
2. Faa o mesmo para a negao da frmula dada. Consegue encontrar uma testemunha usando apenas o algoritmo de propagao de marcas? E usando o algoritmo
de teste de ns? O que pode concluir?
Resposta:
1. A fbf j s tem conjunes e negaes, por isso podemos criar j o seu DAG.
72
1:V
2:V
3:V
2:V
3:V
4:F 5:V
Esta frmula no satisfazvel porque existem duas marcas contraditrias para B, ou seja,
a frmula corresponde a uma contradio.
2:F
Usando o algoritmo de teste de ns para cada um dos ns, com V e com F , vo ficar sempre
ns por marcar. Assim, no vai ser possvel encontrar uma testemunha para esta fbf.
J agora, convm notar que, se esta frmula a negao de uma contradio, ento uma
tautologia e tem 8 testemunhas diferentes. Este exemplo mostra que o algoritmo de teste
de ns no completo.
Exerccio 7.3
Considere o seguinte DAG. Diga a que frmula corresponde. Efectue a propagao de
marcas, de modo a que a frmula seja verdadeira. Se for necessrio, use o algoritmo de
teste de ns. Se for possvel, apresente uma testemunha.
73
Resposta:
Este DAG corresponde frmula ((A B) (B C)) (C (D E)).
2:V
2:V
3:F
4:V
6:V
10:F
5:V
6:V
1:V
11:F
12T:V
5:V
8:V
7:F
9:V
13T:V 13T:V
E
Nota: as marcas 12T , e 13T so temporrias, pois so obtidas com o algoritmo de teste de ns,
supondo que este algoritmo pode ser usado para testar ns que no sejam folhas. Como todos
os ns ficaram marcados com marcas consistentes, o algoritmo termina, pois foi encontrada uma
testemunha.
Testemunha: I(A) = V , I(B) = F , I(C) = V , I(D) = V , I(E) = V .
Exerccio 7.4
Considere o seguinte conjunto de clusulas: {{A, B}, {B, A}, {B}}. Aplique o algoritmo DP e caso a frmula seja satisfazvel, indique uma testemunha.
1. Usando a ordem A B;
2. Usando a ordem B A.
74
Resposta:
1. Usando a ordem A B, temos os seguintes baldes iniciais:
bA : {A, B}, {A, B}
bB : {B}
Baldes aps aplicao do algoritmo:
bA : {A, B}, {B, A}
bB : {B}
{B}
Neste caso, a frmula correspondente ao conjunto de clusulas inicial no satisfazvel
porque no conseguimos encontrar nenhuma interpretao que satisfaa todas as clusulas
do balde de B.
2. Usando a ordem B A, temos os seguintes baldes iniciais:
bB : {A, B}, {B, A}, {B}
bA :
Baldes aps aplicao do algoritmo:
bB : {A, B}, {A, B}, {B}
bA :
{A}, {A}
Neste caso, a frmula correspondente ao conjunto de clusulas inicial no satisfazvel
porque no conseguimos encontrar nenhuma interpretao que satisfaa todas as clusulas
do balde de A.
Exerccio 7.5
Considere o seguinte conjunto de clusulas: {{D, B}, {C, A}, {A, D, C}, {C, E}, {E}}.
Aplique o algoritmo DP usando a ordem C E D A B. Caso a frmula seja satisfazvel, indique uma testemunha.
Resposta:
Baldes iniciais:
bC : {C, A}, {A, D, C}, {C, E}
bE : {E}
bD : {D, B}
bA :
bB :
Baldes aps aplicao do algoritmo:
bC : {C, A}, {A, D, C}, {C, E}
bE : {E}
bD : {D, B}
bA :
bB :
{A, D, E}
{A, D}
{B, A}
Notar que a primeira e a segunda clusulas do balde de C dariam origem ao resolvente {A, A, D},
que no foi adicionado a nenhum balde porque corresponde a uma tautologia.
Testemunha:
I(B) = V opo
I(A) = F opo
I(D) = F opo
I(E) = F necessariamente por causa de {E}
I(C) = F necessariamente por causa de {C, A} e I(A) = F
75
Exerccio 7.6
Considere a seguinte frmula ((A B) (A C)) (A D).
Determine se ela satisfazvel e se for indique uma testemunha, usando:
1. O algoritmo de propagao de marcas (e o algoritmo de teste de ns, se necessrio);
2. O algoritmo DP.
Resposta:
1. Primeiro, transformar a frmula para s conter conjunes e negaes:
((A B) (A C)) (A D)
((A B) (A C)) (A D)
((A B) (A C)) (A D)
((A B) (A C)) (A D)
1:V
2:V
3:F
5T:V
6T:V
6T:V
A
2:V
7T:F
8T:F
4:F
11T:F
9T:F
C
10T:V
12T:V
Marcas temporrias obtidas supondo que o algoritmo de teste de ns pode ser usado para
testar ns que no sejam folhas. Como todos os ns ficaram marcados com marcas consistentes, o algoritmo termina, pois foi encontrada uma testemunha.
Testemunha: I(A) = V , I(B) = F , I(C) = V , I(D) = V .
2. Transformar a frmula para a forma clausal:
((A B) (A C)) (A D)
((A B) (A C)) (A D)
{{A, B, C}, {A, D}}
Vamos escolher a ordem alfabtica para aplicar o algoritmo DP.
Baldes aps aplicao do algoritmo DP:
bA : {A, B, C}, {A, D}
bB :
bC :
bD :
Testemunha:
I(D) = V opo
I(C) = V opo
I(B) = F opo
I(A) = V opo
A testemunha encontrada a mesma que a da alnea anterior, mas poderia no ser. Havia
mais alternativas, por exemplo:
76
I(D) = V opo
I(C) = F opo
I(B) = F opo
I(A) = F necessariamente por causa de {A, B, C} e I(C) = F e I(B) = F
Podemos ainda dizer que a frmula satisfazvel porque conseguimos encontrar uma testemunha; falsificvel porque no caso de I(A) = V , I(B) = F , I(C) = F e I(D) = F a
frmula falsa; no tautolgica nem contraditria porque satisfazvel e falsificvel.
77
Sumrio:
Linguagem da lgica de primeira ordem
Regras do sistema de deduo natural da lgica de primeira ordem
Provas usando o sistema de deduo natural da lgica de primeira ordem
Resumo:
Linguagem
As funes so caracterizadas pelo seu domnio e contradomnio e usam-se para representar objectos. As funes de aridade zero (sem argumentos) so as constantes. Uma funo
representa uma correspondncia entre duas classes de entidades. Usa-se quando, dados
os seus argumentos, existe um e um s objecto que corresponde ao valor da funo.
Cada varivel pode ter como valor qualquer elemento do domnio da varivel, mas tem
que ser sempre o mesmo na mesma expresso. No entanto, variveis diferentes podem
ter o mesmo valor.
As relaes so representadas por predicados, que podem ser verdadeiros ou falsos. Uma
relao representa qualquer relao entre duas entidades, e cada objecto pode estar na
relao com zero ou mais objectos.
Os termos representam objectos sobre os quais queremos falar e correspondem a sintagmas nominais em lngua natural. Existem vrios tipos de termos: constantes (que correspondem a funes de zero argumentos), variveis, e aplicaes de funes ao nmero
apropriado de termos.
Um termo cho um termo que no contm variveis livres. Uma fbf que no contm
variveis uma frmula ch.
Uma fbf atmica corresponde apenas a um smbolo de predicado aplicado a termos, ou
seja, no tem smbolos lgicos.
Uma ocorrncia duma varivel diz-se ligada numa fbf se esta ocorrncia aparecer dentro
do domnio do quantificador que a introduz. Uma ocorrncia duma varivel diz-se livre
numa fbf se esta no estiver ligada.
Uma fbf que no contm variveis uma frmula ch. Uma fbf que no contm variveis
livres uma frmula fechada.
Uma substituio um conjunto finito de pares ordenados {t1 /x1 , . . . , tn /xn } em que cada
xi (1 i n) uma varivel individual e cada ti (1 i n) um termo. Numa substituio, todas as variveis individuais so diferentes e nenhuma das variveis individuais
igual ao termo correspondente. A cada um dos pares ti /xi chama-se uma ligao. Uma
substituio ch uma substituio na qual nenhum dos termos contm variveis. A aplicao da substituio s a uma fbf ( s) obtida a partir de substituindo todas as
ocorrncias livres de xi por ti . Isto significa que no se substituem variveis quantificadas.
78
Se for uma fbf e t for um termo, dizemos que t livre para x em se nenhuma ocorrncia
livre de x em ocorrer dentro do domnio do quantificador x (ou x) em que x uma
varivel em t. Informalmente, t ser livre para x em significa que se todas as ocorrncias
de x forem substitudas por t, nenhuma ocorrncia de uma varivel em t deixa de ser
livre em (t). Por exemplo, o termo g(y, f (b)) livre para x na fbf P (x, y), mas no o na
fbf y[P (x, y)]. Note-se, por definio, que um termo sem variveis sempre livre para
qualquer varivel em qualquer fbf.
Sistema de Deduo Natural
Usa todas as regras do sistema de deduo natural da lgica proposicional mais as regras
de introduo e eliminao de cada um dos quantificadores.
Tal como na lgica proposicional, para simplificar as provas permitimos que se usem
algumas das regras bsicas com mais graus de liberdade, mas sempre usando fbfs que
estejam no nvel de prova correcto.
No fim dos exerccios est um resumo das regras de inferncia do sistema de deduo
natural da lgica de primeira ordem.
79
Exerccio 8.1
Demonstre os seguintes argumentos, usando o sistema de deduo natural da lgica de
primeira ordem:
1. ({x[F (x)]}, x[F (x)])
2. ({x[F (x) G(x)], x[F (x) H(x)]}, x[G(x) H(x)])
Resposta:
x[F (x)]
F (a)
x[F (x)]
Prem
E, 1
I, 2
Prem
Prem
x0 F (x0 ) H(x0 )
Hip
F (x0 )
E, 3
Rei, 1
F (x0 ) G(x0 )
E, 5
G(x0 )
E, (4, 6)
H(x0 )
E, 3
G(x0 ) H(x0 )
I, (7, 8)
10
x[G(x) H(x)]
I, 9
11
x[G(x) H(x)]
Exerccio 8.2
(JPM) Demonstre os seguintes teoremas, usando o sistema de deduo natural da lgica
de primeira ordem:
1. (F (a) x[F (x) G(x)]) G(a)
2. (x[F (x) G(x)] x[G(x) H(x)]) x[F (x) H(x)]
3. (x[F (x) H(x)] y[F (y)]) z[H(z)]
Resposta:
80
Hip
F (a)
E, 1
E, 1
F (a) G(a)
E, 3
G(a)
E, (2, 4)
I, (1, 5)
Hip
E, 1
x[G(x) H(x)]
E, 1
x0
F (x0 )
Hip
Rei, 2
F (x0 ) G(x0 )
E, 5
G(x0 )
E, (4, 6)
x[G(x) H(x)]
Rei, 3
G(x0 ) H(x0 )
E, 8
10
H(x0 )
E, (7, 9)
F (x0 ) H(x0 )
11
12
13
I, (4, 10)
I, (4, 11)
I, (1, 12)
Hip
E, 1
y[F (y)]
E, 1
x0 F (x0 )
Hip
Rei, 2
F (x0 ) H(x0 )
E, 5
H(x0 )
E, (4, 6)
z[H(z)]
I, 7
9
10
z[H(z)]
81
Exerccio 8.3
Demonstre os seguintes teoremas, que correspondem a aplicaes das leis de De Morgan para os quantificadores, usando o sistema de deduo natural da lgica de primeira
ordem.
Resposta:
x[F (x)]
Hip
x[F (x)]
x0
Hip
F (x0 )
Hip
x[F (x)]
I, 3
x[F (x)]
Rei, 2
F (x0 )
F (x0 )
E, 6
x[F (x)]
I, (3, 7)
x[F (x)]
Rei, 1
10
x[F (x)]
11
x[F (x)]
E, 10
12
I, (1, 11)
82
x[F (x)]
Hip
x[F (x)]
x0 F (x0 )
Hip
x[F (x)]
Hip
Hip
x[F (x)]
Hip
x[F (x)]
Rei, 1
F (x0 )
E, 3
x0 F (x0 )
Hip
F (x0 )
Rei, 2
x[F (x)]
Rei, 2
F (x0 )
E, 5
x[F (x)]
Hip
F (x0 )
Rei, 6
F (x0 )
Rei, 4
6
7
8
x[F (x)]
x[F (x)]
I, (1, 7)
x[F (x)]
10
11
x[F (x)]
12
x[F (x)]
Rei, 1
13
14
x[F (x)]
x[F (x)]
Hip
x0
F (x0 )
Hip
x[F (x)]
I, 2
x[F (x)]
Rei, 1
5
6
7
F (x0 )
x[F (x)]
83
4. x[F (x)] x[F (x)]
1
x[F (x)]
Hip
x[F (x)]
Hip
x0 F (x0 )
Hip
x[F (x)]
Hip
F (x0 )
E, 4
F (x0 )
Rei, 3
x[F (x)]
x[F (x)]
x[F (x)]
Rei, 1
10
11
x[F (x)]
E
n
Prem
Hip
n
n+1
...
Hip
o
..
.
..
.
r
..
.
..
.
Hip
Rep
n
..
.
m
Rei
..
.
n
..
.
m
I
Rep, n
n
..
.
..
.
..
.
ou
ou
Rei, n
Hip
I, (n, m)
n
..
.
..
.
m
..
.
..
.
n
..
.
m
..
.
k
..
.
..
.
n
..
.
m
..
.
n
..
.
m
..
.
n
..
.
m
..
.
n
..
.
m
..
.
Hip
l
E
..
.
..
.
E
n
..
.
m
..
.
k
Hip
..
.
n
..
.
m
E, n
I
E, (n, m)
n
..
.
x0
..
.
m
I, (n, m)
(x0 )
m+1
x[(x)]
n
..
.
m
x[(x)]
..
.
(t)
n
..
.
m
(t)
..
.
x[(x)]
E, n
I
E, n
I, (n, m)
E, n
I, n
E
n
I, n
x[(x)]
m
..
.
x0 (x0 )
..
.
I, n
k+1
Hip
85
Sumrio:
Sistema semntico da lgica de primeira ordem
Conceptualizao
Interpretao
Resumo:
Sistema Semntico
O sistema semntico especifica em que condies as fbfs da linguagem so verdadeiras ou
falsas.
Uma conceptualizao descreve formalmente uma situao ou um mundo e um triplo
(D, F, R) em que: D o conjunto das entidades que constituem o mundo sobre o qual
vamos falar, o chamado universo de discurso; F o conjunto das funes que podem ser
aplicadas s entidades de D; R o conjunto das relaes ou predicados que podem ser
aplicados s entidades de D.
Uma interpretao uma funo I cujo domnio so as entidades da linguagem e cujo
contradomnio so as entidades da conceptualizao. Por a interpretao ser uma funo
das entidades da linguagem para as entidades da conceptualizao, cada constante da
linguagem associada apenas a uma entidade da conceptualizao, mas vrias constantes da linguagem podem ser associadas mesma entidade da conceptualizao. Sendo
uma entidade da linguagem, habitual escrever I() para representar o resultado da
aplicao da interpretao I entidade .
Dada uma conceptualizao (D, F, R), uma interpretao I uma funo das entidades
da linguagem para D F R que deve obedecer s seguintes condies:
1. Cada constante individual fi0 associada com uma entidade do universo de discurso D;
2. Cada letra de funo fin associada a uma funo de F . Se fin uma letra de funo
com aridade n, correspondendo funo I(fin ) da conceptualizao, e se t1 , . . . , tn
so termos, ento fin (t1 , . . . , tn ) corresponde entidade I(fin )(I(t1 ), . . . , I(tn )) da
conceptualizao;
3. A cada letra de predicado Pin associada uma relao de R.
Dada uma fbf , e uma interpretao I, diz-se que I satisfaz nas seguintes condies:
1. Se for uma fbf atmica, ou seja, uma fbf da forma Pin (t1 , . . . , tn ), a interpretao
I satisfaz sse o n-tuplo (I(t1 ), . . . , I(tn )) for um elemento da relao I(Pin ).
2. A interpretao I satisfaz a fbf sse I no satisfizer .
3. A interpretao I satisfaz a fbf sse I satisfizer as duas fbfs e .
86
4. A interpretao I satisfaz a fbf sse I satisfizer pelo menos uma das fbfs ou
.
5. A interpretao I satisfaz a fbf sse I no satisfizer ou I satisfizer .
6. A interpretao I satisfaz a fbf x[] sse, para toda a substituio {a/x}, em que
a qualquer constante individual, I satisfizer {a/x}.
7. A interpretao I satisfaz a fbf x[] sse existir uma substituio {a/x}, em que a
uma constante individual, tal que I satisfaz {a/x}.
Uma fbf verdadeira segundo a interpretao I sse I satisfizer ; caso contrrio, falsa
segundo a interpretao I.
Existem quatro tipos de proposies:
satisfazveis as que podem ser ou no ser verdadeiras, dependendo da interpretao escolhida, e so verdadeiras em pelo menos uma interpretao.
contraditrias as que nunca podem ser verdadeiras, independentemente da interpretao escolhida.
tautolgicas as que so sempre verdadeiras, independentemente da interpretao usada.
falsificveis as que podem ser ou no ser verdadeiras, dependendo da interpretao escolhida, e so falsas em pelo menos uma interpretao.
Uma interpretao que satisfaz todas as proposies de um conjunto de proposies
chama-se um modelo dessas proposies.
A lgica de primeira ordem correcta: se {1 , . . . , n } ` ento {1 , . . . , n } |= .
A lgica de primeira ordem completa: se {1 , . . . , n } |= ento {1 , . . . , n } ` .
87
Exerccio 9.1
Considere a seguinte conceptualizao C = (D, F, R):
D = {F, V, X, B, [, k}
F = {{(F, B), (V, [), (X, k)}}
R = {{(F), (V), (X)}, {(B), ([), (k)}, {(F, V), (F, X), (V, X)}}
e a seguinte interpretao:
I(eq) = F
I(es) = V
I(eo) = X
I(f q) = B
I(f s) = [
I(f o) = k
I(f lorDe) = {(F, B), (V, [), (X, k)}
I(Estrela) = {(F), (V), (X)}
I(F lor) = {(B), ([), (k)}
I(M enosP ontas) = {(F, V), (F, X), (V, X)}
Diga, justificando, quais das seguintes fbfs so satisfeitas por esta interpretao para esta
conceptualizao:
1. Estrela(eo)
2. Estrela(f lorDe(eq))
3. M enosP ontas(eo, eq)
4. Estrela(es) F lor(f q)
5. x[Estrela(x)]
6. x, y, z[(M enosP ontas(x, y) M enosP ontas(y, z)) M enosP ontas(x, z)]
Resposta:
1. A fbf Estrela(eo) satisfeita sse (I(eo)) I(Estrela), ou seja, sse (X) {(F), (V), (X)}, o
que se verifica e por isso a fbf satisfeita.
2. A fbf Estrela(f lorDe(eq)) satisfeita sse (I(f lorDe)(I(eq))) I(Estrela), ou seja, sse
(I(f lorDe)(F)) I(Estrela), ou seja, sse (B) {(F), (V), (X)} o que no se verifica e
por isso a fbf no satisfeita.
3. A fbf M enosP ontas(eo, eq) satisfeita sse (I(eo), I(eq)) I(M enosP ontas), ou seja, sse
(X, F) {(F, V), (F, X), (V, X)}, o que no se verifica e por isso a fbf no satisfeita.
4. A fbf Estrela(es) F lor(f q) satisfeita sse Estrela(es) no for satisfeita ou F lor(f q)
for satisfeita, ou seja, sse (I(es))
/ I(Estrela) ou (I(f q)) I(F lor), ou seja, sse (V)
/
{(F), (V), (X)} ou (B) {(B), ([), (k)} a primeira condio no se verifica, mas a segunda
verifica-se, logo a disjuno satisfeita.
88
5. A fbf x[Estrela(x)] satisfeita sse existir pelo menos uma substituio {a/x}, para uma
constante a, tal que I satisfaz Estrela(a). Vamos considerar a = eq. Neste caso Estrela(eq)
satisfeita sse (I(eq)) I(Estrela), ou seja, sse (F) {(F), (V), (X)}, o que se verifica e
por isso a fbf inicial satisfeita.
6. A fbf x, y, z[(M enosP ontas(x, y) M enosP ontas(y, z)) M enosP ontas(x, z)] satisfeita
sse para toda a substituio {a/x, b/y, c/z}, em que a, b, c so constantes individuais, I satisfizer ((M enosP ontas(x, y) M enosP ontas(y, z)) M enosP ontas(x, z)) {a/x, b/y, c/z}.
Uma implicao satisfeita sse o seu antecedente no for satisfeito ou o seu consequente
for satisfeito. Neste caso, o antecedente nunca satisfeito a no ser para a substituio
{eq/x, es/y, eo/z}, por isso necessrio saber se I satisfaz M enosP ontas(eq, eo), ou seja,
se (I(eq), I(eo)) I(M enosP ontas), ou seja, se (F, X) {(F, V), (F, X), (V, X)}, o que se
verifica e por isso a implicao satisfeita. Como no nico caso em que o antecedente satisfeito o consequente tambm , qualquer que seja a substituio considerada, a fbf inicial
satisfeita.
Exerccio 9.2
Considere a seguinte conceptualizao C = (D, F, R):
D = {I, V, X, C, D, M, 1, 5, 10, 100, 500, 1000}
F = {{(I, 1), (V, 5), (X, 10), (C, 100), (D, 500), (M, 1000)}}
R = {{(X), (C), (D), (M )}, {(I), (V )}}
e a seguinte interpretao:
I(um) 7 I
I(cinco) 7 V
I(dez) 7 X
I(cem) 7 C
I(quinhentos) 7 D
I(mil) 7 M
I(valor) 7 {(I, 1), (V, 5), (X, 10), (C, 100), (D, 500), (M, 1000)}
I(P ar) 7 {(X), (C), (D), (M )}
I(Impar) 7 {(I), (V )}
1. Diga, justificando, quais das seguintes fbfs so satisfeitas por esta interpretao
para esta conceptualizao:
(a) P ar(cem)
(b) Impar(valor(cinco))
(c) P ar(cem) Impar(dez)
(e) x[Impar(valor(x))]
2. Diga que alteraes faria na conceptualizao para os resultados serem os intuitivamente esperados. Que mudanas que isso implicaria na interpretao?
3. Diga, justificando, se o seguinte poderia ser uma interpretao para esta conceptualizao. Se no puder, indique todas as razes para no poder.
I(a) 7 X
89
I(a) 7 10
I(b) 7 100
I(c) 7 100
I(d) 7 20
I(f 1) 7 {(I, 1), (V, 5), (V, 10), (C, 100)}
I(R1) 7 {(X), (C), (D)}
Resposta:
1. Que fbfs so satisfeitas:
(a) A fbf P ar(cem) satisfeita sse (I(cem)) I(P ar), ou seja, sse (C) {(X), (C), (D), (M )},
o que se verifica e por isso a fbf satisfeita.
(b) A fbf Impar(valor(cinco)) satisfeita sse (I(valor)(I(cinco))) I(Impar), ou seja, sse
(I(valor)(V )) I(Impar), ou seja, sse (5) {(I), (V )}, o que no se verifica e por isso
a fbf no satisfeita.
(c) A fbf P ar(cem) Impar(dez) satisfeita sse P ar(cem) no for satisfeita ou Impar(dez)
for satisfeita, ou seja, sse (I(cem))
/ I(P ar) ou (I(dez)) I(Impar), ou seja, sse
(C)
/ {(X), (C), (D), (M )} ou (X) {(I), (V )}. A primeira condio verifica-se e a
segunda no se verifica e por isso a fbf no satisfeita.
(d) A fbf x[P ar(x)] satisfeita sse para toda a substituio {a/x}, em que a qualquer
constante individual, I satisfizer P ar(x) {a/x}, ou seja, sse (I(a)) I(P ar) para
qualquer constante. Como (I(um))
/ I(P ar), a fbf no satisfeita.
(e) A fbf x[Impar(valor(x))] satisfeita sse existir uma substituio {a/x}, em que a
uma constante individual, tal que I satisfaz Impar(valor(a)). Como o resultado de
aplicar a funo valor a qualquer constante um nmero rabe e no h nenhum
tuplo com nmeros rabes em I(Impar), a fbf no satisfeita.
Exerccio 9.3
Considere a relao binria EDivisorDe no domnio {1, 2, 3, 4, 5, 6}.
1. Apresente o conjunto de todos os pares que esto na relao para o domnio dado.
2. Diga, justificando, se a relao : reflexiva, simtrica, ou transitiva.
Resposta:
1. O conjunto de pares o seguinte:
{(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 4), (2, 6), (3, 3), (3, 6), (4, 4), (5, 5), (6, 6)}.
90
2. Uma relao reflexiva sse satisfizer x, y[Rel(x, y) (Rel(x, x) Rel(y, y))]. Nota: a definio no poderia ser x[Rel(x, x)], pois era demasiado forte, teria que se aplicar tambm
aos objectos que no fazem parte do domnio da relao; com este antecedente, garante-se
que reflexiva para os objectos do domnio, mas no tem que ser para os outros. A relao
do enunciado reflexiva, pois qualquer nmero divisor de si prprio.
Uma relao simtrica sse satisfizer x, y[Rel(x, y) Rel(y, x)]. Esta relao no simtrica porque possvel encontrar a e b tais que EDivisorDe(a, b) mas EDivisorDe(a, b),
por exemplo se a = 1 e b = 2.
A relao transitiva pois x, y, z[(EDivisorDe(x, y)EDivisorDe(y, z)) EDivisorDe(x, z)].
Neste caso, podemos ver para todos os casos que tornam o antecedente da implicao verdadeiro, que o consequente tambm vai ser verdadeiro. Por outras palavras, no conseguimos encontrar um contra-exemplo que torne a definio de transitividade falsa.
Exerccio 9.4
Considere a seguinte f bf : x, y[(A(x)B(x, y)) A(y)]. Diga se ela verdadeira ou falsa
para cada uma das seguintes interpretaes. Se for falsa, apresente um contra-exemplo.
1. O domnio dos nmeros naturais, onde A(x) interpretado como x par e B(x, y)
interpretado como x igual a y.
2. O domnio dos nmeros naturais, onde A(x) interpretado como x par e B(x, y)
interpretado como x um inteiro divisor de y.
3. O domnio dos nmeros naturais, onde A(x) interpretado como x par e B(x, y)
interpretado como x um inteiro mltiplo de y.
4. O domnio dos booleanos {verdadeiro, f also}, onde A(x) interpretado como x
falso e B(x, y) interpretado como x igual a y.
Resposta:
1. O domnio dos nmeros naturais, onde A(x) interpretado como x par e B(x, y)
interpretado como x igual a y.
verdadeira.
2. O domnio dos nmeros naturais, onde A(x) interpretado como x par e B(x, y)
interpretado como x um inteiro divisor de y.
verdadeira.
3. O domnio dos nmeros naturais, onde A(x) interpretado como x par e B(x, y)
interpretado como x um inteiro mltiplo de y.
falsa. Por exemplo, x = 6 e y = 3: 6 par, mltiplo de 3, mas 3 no par.
4. O domnio dos booleanos {verdadeiro, f also}, onde A(x) interpretado como x falso e
B(x, y) interpretado como x igual a y.
verdadeira.
Exerccio 9.5
Considere a seguinte conceptualizao:
Universo de discurso = {_, `}
Conjunto de funes = {{(_, `)}, {(_, _), (`, _)}}
Conjunto de relaes = {{(_, _), (_, `), (`, `)}}
91
e o seguinte conjunto de frmulas: {P1 (f1 (a), b), P1 (f2 (a), b) P1 (b, f1 (a))}.
Diga se a seguinte interpretao modelo deste conjunto de frmulas:
I(a) 7 _
I(b) 7 `
I(f1 ) 7 {(_, `)}
I(f2 ) 7 {(_, _), (`, _)}
I(P1 ) 7 {(_, _), (_, `), (`, `)}
Resposta:
Uma interpretao modelo de um conjunto de frmulas sse satisfizer todas as frmulas desse
conjunto.
A interpretao satisfaz P1 (f1 (a), b) sse (I(f1 )(I(a)), I(b)) I(P1 ), ou seja, sse (I(f1 )(_), I(b))
I(P1 ), ou seja, sse (`, `) {(_, _), (_, `), (`, `)}, o que se verifica, logo esta fbf satisfeita por
esta interpretao.
A interpretao satisfaz P1 (f2 (a), b) P1 (b, f1 (a)) sse no satisfizer P1 (f2 (a), b) ou satisfizer
P1 (b, f1 (a)). Como (I(f2 )(I(a)), I(b)) = (_, `) {(_, _), (_, `), (`, `)}, satisfaz o antecedente,
logo, s satisfaz a implicao se tambm satisfizer o consequente. Como (I(b), I(f1 )(I(a))) =
(`, `) {(_, _), (_, `), (`, `)}, tambm satisfaz o consequente, logo satisfaz a implicao.
Como a interpretao satisfaz todas as frmulas do conjunto, modelo do conjunto.
Exerccio 9.6
Considere a seguinte conceptualizao C = (D, F, R):
D = {, , , }
F = {{(, )}, {(, )}, {(, , ), (, , )}}
R = {{(, )}, {(, )}, {(), (), (), ( )}}
e a seguinte interpretao:
I(a) =
I(b) =
I(c) =
I(d) =
I(f 1) = {(, )}
I(f 2) = {(, )}
I(R1) = {(, )}
I(R2) = {(, )}
I(R3) = {(), (), (), ( )}
92
I(a) =
I(b) =
I(c) =
I(c) =
I(d) = ~
I(f 1) = {(, ), (, )}
I(R1) = {(), (), ( )}
Resposta:
1. Uma interpretao para uma conceptualizao um modelo de um conjunto de frmulas
se satisfizer todas as frmulas desse conjunto, isto , se as tornar todas verdadeiras.
A fbf x, y[R3(x) R1(x, f 2(y))] satisfeita sse existir uma substituio {c1/x, c2/y},
em que c1 e c2 so constantes individuais, tal que I satisfaz R3(c1) R1(c1, f 2(c2)).
Sejam c1 = a e c2 = b. Neste caso, a fbf R3(a) R1(a, f 2(b)) satisfeita sse (I(a))
I(R3) e (I(a), I(f 2)(I(b))) I(R1), ou seja, sse () {(), (), (), ( )} e (, )
{(, )}. Como ambas as condies se verificam, a conjuno satisfeita para esta
substituio e a frmula quantificada existencialmente tambm satisfeita.
A fbf R2(f 1(a), d) R3(b) satisfeita sse R2(f 1(a), d) for satisfeita ou R3(b) for
satisfeita. A fbf R2(f 1(a), d) satisfeita sse (I(f 1)(I(a)), I(d)) I(R2), ou seja, sse
(, ) {(, )}, o que se verifica. Como um dos elementos da disjuno satisfeito,
a disjuno inicial satisfeita.
Como ambas as fbfs so satisfeitas, esta interpretao para esta conceptualizao modelo
deste conjunto de frmulas.
2. No pode ser uma interpretao para esta conceptualizao porque:
93
10
Sumrio:
2 Lgica
clssica
Representao
Representao
em
lgica
de primeira ordem
Resumo:
Resumo:
NaRepresentao
Representaode
deConhecimento
Conhecimentoaapassagem
passagemdo
domundo
mundoreal
realpara
paraaabase
basede
deconheconheNa
cimento
feita
por
seres
humanos.
Apenas
a
inferncia
feita
pelos
computadores.
cimento feita por seres humanos. Apenas a inferncia que feita pelos computadores.
Mundo
Modelo
abstrao
Base de Conhecimento
representao
inferncia computacional
tao escolhida.
Alguns documentos com exerccios e resumos sobre representao do conhecimento:
no satisfazveis as que nunca podem ser verdadeiras, independentemente da
interpretao escolhida.
Exercises for the practical classes of Knowledge Representation and Reasoning:
http://web.ist.utl.pt/acardoso/docs/2012-rcr-guiaPraticas.pdf
Do ponto
de vistapara
da RC,
as queprticas
interessam
so as satisfazveis,
pois so as que permitem
Exerccios
as aulas
de Representao
do Conhecimento
separarhttp://web.ist.utl.pt/acardoso/docs/2007-rc-guiaPraticas.pdf
os mundos que as satisfazem dos que no as satisfazem, e assim ajudar a definir
o mundo
que nos
interessa.
As vlidasdeso
usadas como
passos intermdios
nas pro Solues
de alguns
dos exerccios
Exerccios
de Representao
do Conhecimento
vas, servem
- Vol I para fazer dedues. As no satisfazveis no interessam nunca, pois nunca
podemhttp://web.ist.utl.pt/acardoso/docs/2007-rc-exerciciosResolvidos.
ser verdadeiras em nenhum mundo.
pdf
Uma conceptualizao
um triplo (D, F, R), em que D um conjunto de entidades, F um
conjunto de funes e R um conjunto de relaes.
Vantagens da utilizao da lgica como formalismo de Representao do Conhecimento:
94
10
Exerccio 10.1
Represente em lgica de primeira ordem cada uma das seguintes frases:
1. O Miau um gato castanho.
2. Os gatos so animais.
3. Nenhum gato um co.
4. Nem todos os gatos gostam de leite.
5. Os gatos no gostam de ces.
(Nenhum gato gosta de nenhum co.)
6. Existe um co de quem todos os gatos gostam.
(Todos os gatos gostam do mesmo co.)
7. Todos os gatos gostam de algum co.
(Pode ser um co diferente para cada gato.)
8. Se algum gato gostar do Rui, ento o Miau tambm gosta do Rui.
9. O Miau um siams ou um bobtail, mas no os dois simultaneamente.
(No pode usar o ou exclusivo.)
10. A cauda do Miau comprida.
11. Todos os gatos tm cauda.
Resposta:
1. O Miau um gato castanho.
Gato(M iau) Castanho(M iau)
2. Os gatos so animais.
x[Gato(x) Animal(x)]
3. Nenhum gato um co.
x[Gato(x) Cao(x)]
ou
(x[Gato(x) Cao(x)])
4. Nem todos os gatos gostam de leite.
x[Gato(x) Gosta(x, Leite)]
ou
x[Gato(x) Gosta(x, Leite)]
5. Os gatos no gostam de ces.
x, y[(Gato(x) Cao(y)) Gosta(x, y)]
ou
x, y[Gato(x) Cao(y) Gosta(x, y)]
6. Existe um co de quem todos os gatos gostam.
x[Cao(x) y[Gato(y) Gosta(y, x)]]
7. Todos os gatos gostam de algum co.
x[Gato(x) y[Cao(y) Gosta(x, y)]]
8. Se algum gato gostar do Rui, ento o Miau tambm gosta do Rui.
x[Gato(x) Gosta(x, Rui)] Gosta(M iau, Rui)
95
9. O Miau um siams ou um bobtail, mas no os dois simultaneamente.
(Siames(M iau) Bobtail(M iau)) (Siames(M iau) Bobtail(M iau)) ou
(Siames(M iau) Bobtail(M iau)) (Siames(M iau) Bobtail(M iau))
Se representar usando implicaes, ateno contrapositiva.
Ver a discusso da soluo do exerccio 2.3.1 dos exerccios resolvidos de Representao do
Conhecimento, acerca do BolaDeNeve, que co ou gato, mas no as duas coisas simultaneamente.
10. A cauda do Miau comprida.
Comprida(caudaDe(M iau))
11. Todos os gatos tm cauda.
x[Gato(x) T em(x, caudaDe(x))]
Exerccio 10.2
Suponha que N (x) representa que x um nmero, P (x) representa que x par,
I(x) representa que x mpar e M (x, y) representa que x maior que y. Traduza
as seguintes fbfs para linguagem comum. Se alguma delas no fizer sentido, explique
porqu.
1. x[N (x)]
2. x[I(x) N (x)]
3. x[N (x) P (x)]
4. x[N (x) P (x)]
5. x[I(x) P (x)]
6. x[P (x) y[I(y) M (y, x)]]
7. x[P (x) y[(P (y) x 6= y) M (y, x)]]
8. x[P (x) N (x)]
Resposta:
1. x[N (x)]
Existe pelo menos um nmero.
2. x[I(x) N (x)]
Todos os mpares so nmeros.
3. x[N (x) P (x)]
Nem todos os nmeros so pares.
4. x[N (x) P (x)]
Existe pelo menos um nmero que no par, ou nem todos os nmeros so pares, como a
anterior.
5. x[I(x) P (x)]
Os mpares no so pares.
6. x[P (x) y[I(y) M (y, x)]]
Para qualquer par, existe pelo menos um mpar que maior do que ele.
7. x[P (x) y[(P (y) x 6= y) M (y, x)]]
Existe um par que menor do que todos os outros pares.
96
10
97
11
Sumrio:
Unificao e resoluo em lgica de primeira ordem
Resumo:
Passos da passagem para a forma clausal na LPO:
1. Eliminao de : substituir todas as ocorrncias de por .
2. Reduo do domnio de : eliminao da dupla negao , utilizao das
leis de De Morgan ( ) ( ), ( ) ( ) e utilizao das
segundas leis de De Morgan x[(x)] x[(x)] e x[(x)] x[(x)].
3. Normalizao de variveis: mudar o nome de algumas das variveis de modo a que
cada ocorrncia de um quantificador esteja associada a um nico nome de varivel.
4. Eliminao dos quantificadores existenciais: substituir todas as variveis quantificadas existencialmente por constantes ou funes de Skolem, consoante no estejam ou estejam no mbito de quantificadores universais.
5. Converso para a forma Prenex normal: mover todas as ocorrncias de quantificadores universais para a esquerda da fbf.
6. Eliminao da quantificao universal: uma vez que as fbfs de origem no tinham
variveis livres, todas as variveis existentes na fbf aps os passos anteriores so
quantificadas universalmente, e como a ordem por que aparecem os quantificadores universais no importante, podemos eliminar a ocorrncia explcita dos
quantificadores universais e assumir que todas as variveis so quantificadas universalmente.
7. Obteno da forma conjuntiva normal: transformar a frmula numa conjuno de
disjunes usando a propriedade distributiva da disjuno ( ) ( )
( ).
8. Eliminao de : transformar a frmula num conjunto de clusulas (ou disjunes).
9. Eliminao de : transformar cada clusula num conjunto de literais.
Uma substituio um conjunto finito de pares ordenados {t1 /x1 , . . . , tn /xn } em que cada
xi uma varivel individual e cada ti um termo. Numa substituio, todas as variveis
individuais so diferentes e nenhuma das variveis individuais igual ao termo correspondente.
A unificao o processo que permite determinar se duas fbfs atmicas podem ser tornadas iguais atravs de substituies apropriadas para as suas variveis livres.
Sendo s1 = {t1 /x1 , . . . , tn /xn } e s2 = {u1 /y1 , . . . , um /ym } duas substituies, a composio
das substituies s1 e s2 , representada por s1 s2 , a substituio s tal que para qualquer
fbf , s = ( s1 ) s2 . A composio das substituies s1 e s2 obtm-se aplicando s2
98
11
99
Exerccio 11.1
Utilize o algoritmo de unificao para determinar quais dos seguintes conjuntos de fbfs
so unificveis, e, no caso de o serem, determine o unificador mais geral. Mostre todos
os passos intermdios usados nos clculos.
1. {P (a, x, x), P (a, b, c)}
2. {P (a, x, f (x)), P (x, y, z)}
3. {P (x, y), Q(x, y)}
4. {Colocou(x1 , SenhorAneis, y1 ), Colocou(M aria, x2 , topo(y2)),
Colocou(x3 , SenhorAneis, topo(M esaAzul))}
Resposta:
1. {P (a, x, x), P (a, b, c)}
Conjunto de fbfs
{P (a, x, x), P (a, b, c)}
{P (a, b, b), P (a, b, c)}
Conj. Desacordo
{x, b}
{b, c}
Substituio
{b/x}
no unificveis
Conj. Desacordo
{P, Q}
Substituio
{a/x}
{a/y}
{f (a)/z}
Substituio
no unificveis
Exerccio 11.2
Passe as seguintes fbfs da lgica de primeira ordem para a forma clausal.
1. x[A(x)] x, y[B(x) w[C(x, y, w)] w[D(w, y)]] x[E(x) F (x)]
2. x[(A(x) y[B(y) C(x, y)]) D(x)]
100
11
(d) Eliminao de : A(sk1 ) y, z[B(y) C(y, z, skf1 (y, z)) D(skf2 (y, z), z)] (E(sk2 )
F (sk2 ))
(e) Mover para esquerda: y, z[A(sk1 ) (B(y) C(y, z, skf1 (y, z)) D(skf2 (y, z), z))
(E(sk2 ) F (sk2 ))]
(f) Eliminao de : A(sk1 ) (B(y) C(y, z, skf1 (y, z)) D(skf2 (y, z), z)) (E(sk2 )
F (sk2 ))
(i) Eliminao de : {{A(sk1 )}, {B(y), C(y, z, skf1 (y, z)), D(skf2 (y, z), z)}, {E(sk2 ), F (sk2 )}}
(e) Mover para esquerda: x[(A(x) (B(x, skf1 (x)) C(skf1 (x)))) D(sk1 )]
(f) Eliminao de : (A(x) (B(x, skf1 (x)) C(skf1 (x)))) D(sk1 )
(i) Eliminao de : {{A(x), B(x, skf1 (x))}, {A(x), C(skf1 (x))}, {D(sk1 )}}
Exerccio 11.3
Considere o seguinte conjunto de clusulas: {{A(x), B(x), C(x)}, {A(x)}, {B(a)}, {A(y), C(y)}}.
101
1. Apresente uma demonstrao por refutao a partir desse conjunto.
2. Apresente uma demonstrao por refutao a partir desse conjunto, usando resoluo unitria.
3. Apresente uma demonstrao por refutao a partir desse conjunto, usando resoluo linear e {B(a)} como clusula inicial.
Resposta:
{A(y), C(y)}
{x/y}
{A(x), B(x)}
{A(x)}
{B(x)}
{B(a)}
{a/x}
{}
2. Demonstrao por refutao a partir do conjunto, usando resoluo unitria:
Na resoluo unitria usa-se sempre pelo menos uma clusula unitria (ou seja, s com um
literal). Neste caso, tambm resoluo linear.
{A(x)}
{A(y), C(y)}
{x/y}
{C(y)}
{A(x), B(x)}
{B(a)}
{a/x}
{A(a)}
{a/x}
{}
3. Demonstrao por refutao a partir do conjunto, usando resoluo linear e {B(a)} como
clusula inicial:
A resoluo linear comea pela clusula inicial e depois usa sempre um sucessor dessa
clusula nos passos subsequentes.
102
11
{B(a)}
{A(a), C(a)}
{A(y), C(y)}
{a/y}
{A(a)}
{A(x)}
{a/x}
{}
Exerccio 11.4
Demonstre, usando resoluo, o seguinte argumento:
({x, y, z[(R(x, y) R(y, z)) R(x, z)], R(a, b), R(b, c), R(c, d)}, R(a, d)).
Resposta:
Em primeiro lugar, necessrio passar as premissas e a negao da concluso para a forma clausal. Ficamos com o seguinte conjunto de clusulas:
{{R(x, y), R(y, z), R(x, z)}, {R(a, b)}, {R(b, c)}, {R(c, d)}, {R(a, d)}}.
Depois, necessrio aplicar resoluo at chegar a uma contradio, preferencialmente comeando com a negao da concluso.
{R(x, y), R(y, z), R(x, z)}
{R(a, d)}
{R(a, b)}
{R(b, c)}
{R(c, d)}
{a/x, b/z}
{R(b, d)}
{b/x, d/z}
{R(c, d)}
{}
Exerccio 11.5
Demonstre os argumentos do exerccio 8.1, usando resoluo.
Resposta:
Em cada caso, estamos a tentar provar que a concluso derivvel a partir das premissas do
argumento. Cada premissa (individualmente) e a concluso negada so passadas para a forma
clausal e tenta-se chegar a uma contradio (representada pela clusula vazia). Se conseguirmos,
porque impossvel todas as premissas serem verdadeiras e a concluso falsa, e por isso o
argumento vlido, o que significa que a concluso derivvel a partir das premissas.
103
1. ({x[F (x)]}, x[F (x)])
Passagem para a forma clausal de x[F (x)], x[F (x)]:
(a) Eliminao de : j est.
{F (y)}
{x/y}
{}
2. ({x[F (x) G(x)], x[F (x) H(x)]}, x[G(x) H(x)])
Passagem para a forma clausal de x[F (x) G(x)], x[F (x) H(x)], x[G(x) H(x)]:
(a) Eliminao de : x[F (x) G(x)], x[F (x) H(x)], x[G(x) H(x)]
(b) Reduo do domnio de : x[F (x) G(x)], x[F (x) H(x)], x[G(x) H(x)]
(c) Normalizao de variveis: x[F (x) G(x)], y[F (y) H(y)], z[G(z) H(z)]
{F (a)}
{H(a)}
{G(z), H(z)}
{a/x}
{a/z}
{G(a)}
{G(a)}
{}
Exerccio 11.6
Demonstre os teoremas do exerccio 8.2, usando resoluo.
Resposta:
Em cada caso, estamos a tentar provar que uma frmula teorema. Negamo-la, passamo-la para
a forma clausal, e tentamos chegar a uma contradio (representada pela clusula vazia) usando
resoluo. Se conseguirmos, porque impossvel a frmula ser falsa, e por isso tem que ser
sempre verdadeira, ou seja, um teorema.
104
11
{F (x), G(x)}
{G(a)}
{a/x}
{G(a)}
{}
2. (x[F (x) G(x)] x[G(x) H(x)]) x[F (x) H(x)]
Passagem para a forma clausal de
((x[F (x) G(x)] x[G(x) H(x)]) x[F (x) H(x)]):
(a) Eliminao de : ((x[F (x) G(x)] x[G(x) H(x)]) x[F (x) H(x)])
(b) Reduo do domnio de : (x[F (x) G(x)] x[G(x) H(x)]) x[F (x) H(x)]
(x[F (x) G(x)] x[G(x) H(x)]) x[F (x) H(x)]
(c) Normalizao de variveis: (x[F (x) G(x)] y[G(y) H(y)]) z[F (z) H(z)]
(e) Mover para esquerda: x, y[(F (x) G(x)) (G(y) H(y)) (F (a) H(a))]
(f) Eliminao de : (F (x) G(x)) (G(y) H(y)) (F (a) H(a))
{G(y), H(y)}
{F (a)}
{x/y}
{F (x), H(x)}
{a/x}
{H(a)}
{}
{H(a)}
105
3. (x[F (x) H(x)] y[F (y)]) z[H(z)]
Passagem para a forma clausal de ((x[F (x) H(x)] y[F (y)]) z[H(z)]):
(a) Eliminao de : ((x[F (x) H(x)] y[F (y)]) z[H(z)])
{F (a)}
{H(z)}
{a/x}
{H(a)}
{a/z}
{}
Exerccio 11.7
Demonstre os teoremas do exerccio 8.3, que correspondem a aplicaes das leis de De
Morgan para os quantificadores, usando resoluo.
Resposta:
1. x[F (x)] x[F (x)]
Passagem para a forma clausal de (x[F (x)] x[F (x)]):
(a) Eliminao de : (x[F (x)] x[F (x)])
{F (y)}
{a/y}
{}
106
11
{F (y)}
{a/y}
{}
3. x[F (x)] x[F (x)]
Passagem para a forma clausal de (x[F (x)] x[F (x)]):
(a) Eliminao de : (x[F (x)] x[F (x)])
{F (a)}
{a/x}
{}
4. x[F (x)] x[F (x)]
Passagem para a forma clausal de (x[F (x)] x[F (x)]):
(a) Eliminao de : (x[F (x)] x[F (x)])
107
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (x), F (a)}
{F (a)}
{a/x}
{}
Exerccio 11.8
Considere as seguintes afirmaes:
2. Para responder s perguntas, necessrio passar cada uma das frmulas correspondentes
s premissas do problema para a forma clausal.
{Animal(x), T emP elos(x), M amif ero(x)}
{U rso(x) (Animal(x) T emP elos(x))}
{U rso(x), Animal(x)}, {U rso(x), T emP elos(x)}
{Coelho(x), M amif ero(x)}
{U rso(Kenai)}
{Coelho(Bugsbunny)}
{Animal(Sylvester)}, {T emP elos(Sylvester)}
108
11
(a) Para saber se o Kenai mamfero, necessrio responder a uma questo do tipo verdadeiro ou falso. Neste caso, pretendemos saber se a clusula M amif ero(Kenai)
pode ser derivada a partir do conjunto de clusulas inicial. Uma vez que nem todas
as clusulas iniciais (ou premissas) so necessrias, vamos representar apenas as que
so usadas na prova.
{U rso(x), Animal(x)}
{U rso(Kenai)}
{Kenai/x}
{Kenai/x}
{Animal(Kenai)}
{T emP elos(Kenai)}
{Kenai/x}
{M amif ero(Kenai)}
Tambm podemos usar resoluo no formato de prova:
{U rso(x), Animal(x)}
{U rso(Kenai)}
{U rso(x), T emP elos(x)}
{Animal(x), T emP elos(x), M amif ero(x)}
{Animal(Kenai)}
{T emP elos(Kenai)}
{Animal(Kenai), M amif ero(Kenai)}
{M amif ero(Kenai)}
1
2
3
4
5
6
7
8
Prem
Prem
Prem
Prem
Res, (1, 2), {Kenai/x}
Res, (2, 3), {Kenai/x}
Res, (4, 6), {Kenai/x}
Res, (5, 7), {}
Na realidade, e uma vez que estamos a usar resoluo, o mais normal negar o que
se quer provar e tentar chegar a uma contradio. Assim, a maneira mais comum
de responder a esta questo usando resoluo seria atravs da seguinte prova por
reduo ao absurdo:
{M amif ero(Kenai)}
{Kenai/x}
{U rso(x), Animal(x)}
{Kenai/x}
{Kenai/x}
{U rso(Kenai)}
{U rso(Kenai)}
{}
(b) Para saber quem que tem plos, estamos interessados em saber quais so as instncias que fazem com que a fbf T emP elos(x) seja consequncia do conjunto de premissas. Neste caso, para alm de necessitarmos de transformar as premissas para a
forma clausal, teremos que adicionar a fbf x[T emP elos(x) Resposta(x)] (ou, na
forma clausal, {T emP elos(x), Resposta(x)}), que especifica quais so as respostas
desejadas.
109
{U rso(Kenai)}
{Kenai/x}
{T emP elos(Kenai)}
{T emP elos(Sylvester)}
{Kenai/x}
{Sylvester/x}
{Resposta(Kenai)}
{Resposta(Sylvester)}
1
2
3
4
5
6
7
Prem
Prem
Prem
Prem
Res, (1, 2), {Kenai/x}
Res, (4, 5), {Kenai/x}
Res, (3, 4), {Sylvester/x}
Convm notar que no conseguimos saber se o Bugsbunny tem plos. Ele um coelho
e os coelhos so mamferos, mas o que ns sabemos que os animais com plos so
mamferos e no que os mamferos so animais com plos. Na realidade, deveramos
ter representado esta implicao como uma equivalncia, se no fossem as excepes
dos golfinhos e baleias...
(c) Para saber quais so os mamferos, estamos interessados em saber quais so as instncias que fazem com que a fbf M amif ero(x) seja consequncia do conjunto de premissas. Neste caso, adicionamos a fbf x[M amif ero(x) Resposta(x)] (ou, na forma
clausal, {M amif ero(x), Resposta(x)}). Nesta rvore, abreviamos cada smbolo para
a primeira letra de cada palavra que o compe.
{U (x), A(x)}
{U (K)}
{U (x), T P (x)}
{K/x}
{K/x}
{A(K)}
{T P (K)}
{A(S)}
{K/x}
{S/x}
{A(K), M (K)}
{T P (S), M (S)}
{M (K)}
{M (S)}
{M (x), R(x)}
{T P (S)}
{C(B)}
{C(x), M (x)}
{K/x}
{S/x}
{B/x}
{R(K)}
{R(S)}
{M (B)}
{B/x}
{R(B)}
110
11
111
12
Sumrio:
Clusulas de Horn
Programas, objectivos, funo de seleco
Resoluo SLD
rvores SLD
Resumo:
Uma clusula uma disjuno de literais.
Uma clusula de Horn uma clusula que contm, no mximo, um literal positivo. Numa
clusula de Horn, o literal positivo (se existir) chamado a cabea da clusula e os literais
negativos (se existirem) so chamados o corpo da clusula.
A fbf (AB) C transformada na clusula {A, B, C}, que s tem um literal positivo
e por isso pode ser transformada na clusula de Horn C A, B, ou seja, a implicao
da fbf inicial transformada na implicao ao contrrio da clusula de Horn. Esta
clusula de Horn significa: para provar C, provar A e provar B.
Existem quatro tipos de clusulas de Horn:
1. Regras ou implicaes, correspondendo a clusulas em que tanto a cabea como o
corpo contm literais, por exemplo, C P1 , P2 .
2. Afirmaes ou factos, correspondendo a clusulas em que o corpo no contm literais
(ou seja, vazio) mas a cabea contm um literal, por exemplo, C .
3. Objectivos, correspondendo a clusulas em que a cabea no contm um literal (ou
seja, vazia) mas o corpo contm pelo menos um literal, por exemplo, P1 , P2 .
4. A clusula vazia, ou seja, 2.
As clusulas do tipo 1 e 2 (ou seja, as regras e as afirmaes, que tm cabea) tm o nome
de clusulas determinadas (do Ingls definite clauses).
Regra da resoluo: assumindo que o literal unifica com o literal i , sendo s o unificador mais geral destes dois literais, o caso geral da aplicao da regra da resoluo a
clusulas de Horn o seguinte:
m
n
n+1
1 , . . . , m
1 , . . . , i1 , i , i+1 , . . . , n
( 1 , . . . , i1 , 1 , . . . , m , i+1 , . . . , n ) s
Res, (m, n)
Em programao em lgica, um programa qualquer conjunto finito de clusulas determinadas e um objectivo corresponde a uma clusula que se pretende derivar a partir desse
programa. Num programa, o conjunto de todas as clusulas cuja cabea corresponde a
112
12
113
Exerccio 12.1
Demonstre os argumentos do exerccio 8.1, usando resoluo SLD e uma funo de seleco que escolhe o primeiro literal da clusula objectivo.
Notas: Como est a tentar demonstrar argumentos, pode fazer provas por refutao em
que algumas das clusulas correspondem negao da concluso do argumento. Uma
vez que a passagem para a forma clausal j foi feita na aula sobre resoluo, apresentamse com cada argumento as clusulas que lhe correspondem.
1. Argumento: ({x[F (x)]}, x[F (x)])
Clusulas: {{F (x)}, {F (y)}}
2. Argumento: ({x[F (x) G(x)], x[F (x) H(x)]}, x[G(x) H(x)])
Clusulas: {{F (x), G(x)}, {F (a)}, {H(a)}, {G(z), H(z)}}
Resposta:
1. Clusulas: {{F (x)}, {F (y)}}
Clusulas de Horn: F (x)
F (y)
Aplicao da resoluo SLD com o objectivo F (y):
F (y)
F (x)
{y/x}
A resposta ({y/x})|{y} =
Nota: a resposta sempre uma substituio para as variveis do objectivo.
2. Clusulas: {{F (x), G(x)}, {F (a)}, {H(a)}, {G(z), H(z)}}
Clusulas de Horn: G(x) F (x)
F (a)
H(a)
G(z), H(z)
Aplicao da resoluo SLD com o objectivo G(z), H(z):
G(z), H(z)
G(x) F (x)
{z/x}
F (z), H(z)
F (a)
{a/z}
H(a)
H(a)
Exerccio 12.2
Demonstre os teoremas do exerccio 8.2, usando resoluo SLD e uma funo de seleco
que escolhe o ltimo literal da clusula objectivo.
114
12
Notas: Como est a tentar provar se uma frmula um teorema, deve fazer provas por
refutao em que as clusulas correspondem negao da frmula inicial. Uma vez que
a passagem para a forma clausal j foi feita na aula sobre resoluo, apresentam-se com
cada frmula as clusulas que correspondem sua negao.
G(x) F (x)
{a/x}
F (a)
F (a)
H(y) G(y)
{a/y}
G(a)
G(x) F (x)
{a/x}
F (a)
F (a)
115
3. Clusulas: {{F (x), H(x)}, {F (a)}, {H(z)}}
Clusulas de Horn: H(x) F (x)
F (a)
H(z)
Aplicao da resoluo SLD com o objectivo H(z):
H(z)
H(x) F (x)
{z/x}
F (z)
F (a)
{a/z}
Exerccio 12.3
Considere o seguinte conjunto de clusulas:
Usando resoluo SLD e uma funo de seleco sua escolha, responda s seguintes
perguntas:
1. O Kenai mamfero?
2. Quem que tem plos?
3. Quais so os mamferos?
Resposta:
Para usar resoluo SLD, preciso transformar as clusulas dadas no enunciado em clusulas de
Horn.
M amif ero(x) Animal(x), T emP elos(x)
Animal(x) U rso(x)
T emP elos(x) U rso(x)
M amif ero(x) Coelho(x)
U rso(Kenai)
Coelho(Bugsbunny)
Animal(Sylvester)
T emP elos(Sylvester)
Vamos usar uma funo de seleco que escolhe para unificar o primeiro literal do objectivo.
116
12
1. Para sabermos se o Kenai mamfero, vamos aplicar resoluo SLD com o objectivo
M amif ero(Kenai).
M amif ero(Kenai)
{Kenai/x1}
Animal(x2) U rso(x2)
{Kenai/x2}
T emP elos(Kenai)
U rso(Kenai)
{Kenai/x3}
U rso(Kenai)
U rso(Kenai)
T emP elos(Sylvester)
{Sylvester/x}
U rso(x)
U rso(Kenai)
{Kenai/x}
3. Quais so os mamferos?
117
M amif ero(x)
M amif ero(x1) Animal(x1), T emP elos(x1)
{x/x1}
{x/x5}
Coelho(x)
Animal(x2) U rso(x2)
{x/x2}
Animal(Sylvester)
{Sylvester/x}
T emP elos(Sylvester)
U rso(Kenai)
{Kenai/x}
T emP elos(Kenai)
U rso(Sylvester)
impossvel
Coelho(Bugsbunny)
{Bugsbunny/x}
T emP elos(Sylvester)
U rso(Kenai)
U rso(Kenai)
Exerccio 12.4
Considere o seguinte conjunto de clusulas de Horn:
Usando uma rvore de resoluo SLD e uma funo de seleco que escolha para unificar
o ltimo literal do objectivo, mostre todas as solues para o seguinte objectivo: A(x).
No final, indique explicitamente as solues.
Resposta:
118
12
B(x), C(x)
C(x2) E(x2)
{x/x2}
C(a2)
{a2/x}
C(a3)
{a3/x}
B(x), E(x)
B(a2)
B(a3)
E(a1)
{a1/x}
B(x4) D(x4)
{a2/x4}
B(x5) D(x5)
{a3/x5}
B(a1)
D(a2)
D(a3)
B(x3) D(x3)
{a1/x3}
B(a1)
D(a3)
impossvel
D(a1)
impossvel
119
13
Sumrio:
Prolog
rvores de refutao em Prolog
Listas e operaes sobre listas
Resumo:
Um programa em Prolog constitudo por uma sequncia de frases declarativas escritas
em lgica, juntamente com um conjunto de indicaes procedimentais que controlam a
utilizao dessas frases declarativas. Por ser um conjunto e no uma sequncia de clusulas, a ordem interessa.
Termos
Constantes
tomos comeam com letra minscula, podem estar entre plicas, tomos especiais.
Nmeros inteiros ou reais.
Variveis comeam com maiscula ou _. Usam-se variveis annimas, representadas por _, quando se quer dizer que existe ali um argumento, mas ele
no vai interessar para a computao.
Compostos aplicao de uma funo aos seus argumentos.
Literais correspondem aplicao de um predicado ao nmero apropriado de argumentos. O Prolog tem overloading de operadores, isto , pode haver o mesmo
predicado com nmeros de argumentos diferentes e significados diferentes. Ex:
mae(X) significa que X me, mae(X,Y) significa que X a me de Y.
Clusulas (de Horn)
Afirmaes clusulas em que o corpo no contm literais.
Regras clusulas em que tanto a cabea como o corpo contm literais.
Objectivos clusulas em que a cabea no contm literais mas o corpo contm pelo menos um literal.
O Prolog usa uma estratgia de procura em profundidade com retrocesso e uma funo
de seleco que escolhe o primeiro literal do objectivo. Isto significa que a ordem das
clusulas e a ordem dos literais no corpo das clusulas influenciam a ordem pela qual as
respostas so encontradas.
O Prolog usa a closed world assumption, isto , tudo aquilo que no consegue provar
considerado falso. A resposta do Prolog a um objectivo que no se consegue provar
No.
Um objectivo que no contm variveis pergunta se ele uma consequncia lgica do
programa, e a resposta Yes ou No. Um objectivo contendo variveis pergunta se existem alguns valores para as variveis que faam com que o objectivo seja uma consequncia lgica do programa, e a resposta uma substituio para as variveis. Escrever ;
120
13
na interaco com o Prolog serve para perguntar se h mais alguma substituio que
satisfaa o objectivo.
possvel usar regras lgicas do tipo (AB) C atravs da utilizao de duas clusulas
de Horn C :- A e C :- B. Fazendo a passagem para a forma clausal,
(A B) C
(A B) C
(A B) C
(A C) (B C) duas clusulas de Horn.
No possvel usar regras do tipo A (B C) apenas com clusulas de Horn. Fazendo
a passagem para a forma clausal,
A (B C)
A B C uma clusula com dois literais positivos no de Horn.
A reduo de um objectivo por um programa a substituio de pelo corpo de
uma clusula de cuja cabea emparelhe com .
Listas
O primeiro argumento de uma lista tem um elemento e o segundo argumento recursivamente o resto da lista. A lista vazia representada por []. O termo .(X,Y), representado por [X|Y], uma lista com cabea X e resto Y. Exemplos de listas: [], [X], [X,Y],
[X|Xs], [X,Y|Ys]. Definio de listas em Prolog:
lista([]).
lista([_|Xs]) :- lista(Xs).
Interaco com o Prolog
consult(ficheiro).
[ficheiro].
[user].
;
(.., .. ; ..)
halt.
possvel incluir testes para os predicados no cdigo de um programa, em que se verifica se os resultados so aquilo que se est espera. Quando o resultado diferente do
indicado, o compilador escreve um aviso a indicar isso. Eu ainda no consegui fazer um
exemplo de uma directiva em que a resposta fosse No, por exemplo se no exemplo abaixo
X fosse 4.
/*
ultimo1(X, Xs) :- tem o valor verdadeiro se X for o ltimo
elemento da lista Xs.
/
*
ultimo1(X, [X]).
ultimo1(X, [_|Xs]) :- ultimo1(X, Xs).
:- ultimo1(X, [1, 2, 3]), X=3.
121
Exerccio 13.1
Considere o seguinte programa em Prolog:
mamifero(X) :- animal(X), tempelos(X).
animal(X) :- urso(X).
tempelos(X) :- urso(X).
mamifero(X) :- coelho(X).
urso(kenai).
coelho(bugsbunny).
animal(sylvester).
tempelos(sylvester).
Mostrando as rvores de refutao respectivas, explique o que que o Prolog responderia
s seguintes perguntas. Considere que so pedidas todas as solues em cada um dos
casos.
1. O Kenai mamfero?
2. Quem que tem plos?
3. Quais so os mamferos?
Resposta:
122
13
mamifero(X4) :- coelho(X4).
{kenai/X4}
animal(kenai), tempelos(kenai).
coelho(kenai).
animal(X2) :- urso(X2).
{kenai/X2}
impossvel
urso(kenai), tempelos(kenai).
urso(kenai).
tempelos(kenai).
tempelos(X3) :- urso(X3).
{kenai/X3}
urso(kenai).
urso(kenai).
A resposta true.
Como no enunciado diz para considerar que so pedidas todas as solues em cada um dos
casos, o Prolog ir explorar toda a rvore e dar a resposta true seguida da resposta false.
2. Para saber quem que tem plos, usamos o objectivo tempelos(X).
tempelos(X).
tempelos(X1) :- urso(X1).
tempelos(sylvester).
{X/X1}
{sylvester/X}
urso(X).
urso(kenai).
{kenai/X}
123
mamifero(X).
mamifero(X5) :- coelho(X5).
{X/X5}
animal(X), tempelos(X).
coelho(X).
animal(X2) :- urso(X2).
{X/X2}
animal(sylvester).
{sylvester/X}
urso(X), tempelos(X).
tempelos(sylvester).
urso(kenai).
{kenai/X}
tempelos(X4) :- urso(X4).
{sylvester/X4}
tempelos(kenai).
urso(sylvester)
tempelos(X3) :- urso(X3).
{kenai/X3}
impossvel
coelho(bugsbunny).
{bugsbunny/X}
tempelos(sylvester).
urso(kenai).
urso(kenai).
?- consult(~/cadeiras/lpp/13-14/exercicios/mamiferos.pl).
Warning: /Users/acardoso/cadeiras/lpp/13-14/exercicios/mamiferos.pl:4:
Clauses of mamifero/1 are not together in the source-file
Warning: /Users/acardoso/cadeiras/lpp/13-14/exercicios/mamiferos.pl:7:
Clauses of animal/1 are not together in the source-file
Warning: /Users/acardoso/cadeiras/lpp/13-14/exercicios/mamiferos.pl:8:
Clauses of tempelos/1 are not together in the source-file
% /Users/acardoso/cadeiras/lpp/13-14/exercicios/mamiferos.pl compiled 0.00 sec, 9 clau
true.
?- mamifero(kenai).
124
13
true ;
false.
?- tempelos(X).
X = kenai ;
X = sylvester.
?- mamifero(X).
X = kenai ;
X = sylvester ;
X = bugsbunny.
?- animal(X).
X = kenai ;
X = sylvester.
?- animal(bugsbunny).
false.
?- halt.
Process prolog finished
Exerccio 13.2
Considere definido da seguinte forma o predicado m(X, Xs):
m(X, [X|_]).
m(X, [_|Xs]) :- m(X, Xs).
Mostre as rvores de refutao para os seguintes objectivos, considerando que so pedidas todas as solues.
Resposta:
125
m(2,[1,2,3]).
m(X1,[_|Xs1]) :- m(X1,Xs1).
{2/X1, [2, 3]/Xs1}
m(2,[2,3]).
m(X2,[X2|_]).
{2/X2}
m(X3,[_|Xs3]) :- m(X3,Xs3).
{2/X3, [3]/Xs3}
m(2,[3]).
m(X4,[_|Xs4]) :- m(X4,Xs4).
{2/X4, []/Xs4}
m(2,[]).
impossvel
A resposta true.
Como no enunciado diz para considerar que so pedidas todas as solues em cada um dos
casos, o Prolog ir explorar toda a rvore e dar a resposta true seguida da resposta false.
2. m(X, [1, 2, 3]).
m(X,[1,2,3]).
m(X1,[X1|_]).
m(X2,[_|Xs2]) :- m(X2,Xs2).
{X/X1, 1/X1}
m(X,[2,3]).
m(X3,[X3|_]).
{X/X3, 2/X3}
m(X4,[_|Xs4]) :- m(X4,Xs4).
{X/X4, [3]/Xs4}
m(X,[3]).
m(X5,[X5|_]).
{X/X5, 3/X5}
m(X6,[_|Xs6]) :- m(X6,Xs6).
{X/X6, []/Xs6}
m(X,[]).
impossvel
Respostas: X = 1; X = 2; X = 3; e false.
126
13
Exerccio 13.3
(Adaptado de The Art of Prolog, de Leon Sterling e Ehud Shapiro.)
Defina os seguintes predicados que manipulam listas. Em caso de necessidade, em cada
alnea pode usar os predicados definidos nas alneas anteriores.
1. O predicado membro(Elemento, Lista), que tem o valor verdadeiro se Elemento
for um membro da lista Lista. Por exemplo, membro(2, [1, 2, 3]) tem o valor verdadeiro.
2. O predicado prefixo(Prefixo, Lista), que tem o valor verdadeiro se Prefixo
for um prefixo da lista Lista. Por exemplo, prefixo([1, 2], [1, 2, 3])
tem o valor verdadeiro.
3. O predicado sufixo(Sufixo, Lista), que tem o valor verdadeiro se Sufixo
for um sufixo da lista Lista. Por exemplo, sufixo([2, 3], [1, 2, 3]) tem
o valor verdadeiro.
4. O predicado sublista(Sub, Lista), que tem o valor verdadeiro se Sub for
uma sublista da lista Lista. Por exemplo, sublista([2, 3], [1, 2, 3, 4])
tem o valor verdadeiro.
5. O predicado junta(Xs, Ys, Zs), em que a lista Zs o resultado de concatenar
as listas Xs e Ys. Por exemplo, junta([1, 2], [3, 4], [1, 2, 3, 4]) tem
o valor verdadeiro.
6. Redefina os predicados membro, prefixo, sufixo e sublista em termos do
predicado junta.
7. O predicado seguidos(X, Y, Zs), que tem o valor verdadeiro se X e Y aparecerem seguidos na lista Zs. Por exemplo, seguidos(2, 3, [1, 2, 3]) tem o
valor verdadeiro.
8. O predicado ultimo(X, Xs), que tem o valor verdadeiro se X for o ltimo elemento da lista Xs. Por exemplo, ultimo(3, [1, 2, 3]) tem o valor verdadeiro.
9. O predicado inverte(Xs, Ys), que tem o valor verdadeiro se Ys for uma lista
que contm os elementos de Xs pela ordem inversa da qual eles aparecem na lista
original. Por exemplo, inverte([1, 2, 3], [3, 2, 1]) tem o valor verdadeiro.
10. O predicado comprimento(Xs, N), que tem o valor verdadeiro se N for o comprimento da lista Xs. Por exemplo, comprimento([a, 1], s(s(0))) tem o
valor verdadeiro.
11. O predicado repete(Xs, XsXs), que tem o valor verdadeiro se cada elemento
de Xs aparece repetido em XsXs. Por exemplo, repete([1, 2, 3], [1, 1,
2, 2, 3, 3]) tem o valor verdadeiro.
Resposta:
/********************************************************************************
Aula sobre listas
********************************************************************************/
127
/*
ultimo1(X, Xs) :- tem o valor verdadeiro se X for o ultimo elemento da lista Xs.
/
*
ultimo1(X, [X]).
ultimo1(X, [_|Xs]) :- ultimo1(X, Xs).
:- ultimo1(X, [1, 2, 3]), X=3.
/*
membro(Elemento, Lista) :- tem o valor verdadeiro se Elemento for
um membro da lista Lista.
*/
membro(X, [X|_]).
membro(X, [_|Ys]) :- membro(X, Ys).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
/*
prefixo(Prefixo, Lista) :- tem o valor verdadeiro se Prefixo for um
prefixo da lista Lista.
*/
prefixo([], _).
prefixo([X|Xs], [X|Ys]) :- prefixo(Xs, Ys).
%% ?- prefixo([1, 2], [1, 2, 3]).
128
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
13
true.
?- prefixo([1, 2], [2, 2, 3]).
false.
?- prefixo([], 5).
true.
?- prefixo(X, [1, 2, 3]).
X = [] ;
X = [1] ;
X = [1, 2] ;
X = [1, 2, 3] ;
false.
?- prefixo([1, 2], Y).
Y = [1, 2|_G251].
?- prefixo(X, Y).
X = [] ;
X = [_G250],
Y = [_G250|_G254] ;
X = [_G250, _G256],
Y = [_G250, _G256|_G260] ;
X = [_G250, _G256, _G262],
Y = [_G250, _G256, _G262|_G266] ;
X = [_G250, _G256, _G262, _G268],
Y = [_G250, _G256, _G262, _G268|_G272]
/*
sufixo(Sufixo, Lista) :- tem o valor verdadeiro se Sufixo for um
sufixo da lista Lista.
*/
sufixo(Xs, Xs).
sufixo(Xs, [_|Ys]) :- sufixo(Xs, Ys).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
129
%%
%%
%%
%%
Y
Y
Y
Y
=
=
=
=
[_G250,
[_G250,
[_G250,
[_G250,
_G253|X] ;
_G253, _G256|X] ;
_G253, _G256, _G259|X] ;
_G253, _G256, _G259, _G262|X]
/*
sublista(Sub, Lista) :- tem o valor verdadeiro se Sub for uma
sublista da lista Lista.
*/
%%% definicao recursiva
sublista(Xs, Ys) :- prefixo(Xs, Ys).
sublista(Xs, [_|Ys]) :- sublista(Xs, Ys).
%aqui nao podia ser prefixo, se fosse so considerava
%sublistas a comecar na primeira e segunda posicoes
%%% sufixo de um prefixo
sublista2(Xs, Ys) :- prefixo(Ps, Ys), sufixo(Xs, Ps).
%%% prefixo de um sufixo
sublista3(Xs, Ys) :- prefixo(Xs, Ss), sufixo(Ss, Ys).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
130
%%
%%
%%
%%
%%
%%
13
X
Y
X
Y
X
Y
=
=
=
=
=
=
[_G661,
[_G661,
[_G661,
[_G661,
[_G661,
[_G661,
_G667,
_G667,
_G667,
_G667,
_G667,
_G667,
_G673],
_G673|_G677] ;
_G673, _G679],
_G673, _G679|_G683] ;
_G673, _G679, _G685],
_G673, _G679, _G685|_G689]
/*
junta(Xs, Ys, Zs) :- a lista Zs e o resultado de concatenar as listas Xs e Ys.
/
*
junta([], Ys, Ys).
junta([X|Xs], Ys, [X|Zs]) :- junta(Xs, Ys, Zs).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
131
%% X = [_G270, _G276, _G282, _G288],
%% Z = [_G270, _G276, _G282, _G288|Y]
/*
Redefinir os predicados membro, prefixo, sufixo e sublista
em termos do predicado junta.
*/
membro2(X, Ys) :- junta(_, [X|_], Ys).
prefixo2(Xs, Ys) :- junta(Xs, _, Ys).
sufixo2(Xs, Ys) :- junta(_, Xs, Ys).
%%% prefixo de um sufixo
sublista4(Xs, AsXsBs) :- junta(_, XsBs, AsXsBs), junta(Xs, _, XsBs).
%%% sufixo de um prefixo
sublista5(Xs, AsXsBs) :- junta(AsXs, _, AsXsBs), junta(_, Xs, AsXs).
/*
seguidos(X, Y, Zs) :- tem o valor verdadeiro se X e Y aparecerem
seguidos na lista Zs.
*/
seguidos(X, Y, Zs) :- junta(_, [X, Y|_], Zs).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
/*
ultimo(X, Xs) :- tem o valor verdadeiro se X for o ultimo
elemento da lista Xs.
*/
ultimo(X, Xs) :- junta(_, [X], Xs).
%% ?- ultimo(3, [1, 2, 3]).
132
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
13
true ;
false.
?- ultimo(2, [1, 2, 3]).
false.
?- ultimo(X, [1, 2, 3]).
X = 3 ;
false.
?- ultimo(3, Y).
Y = [3] ;
Y = [_G238, 3] ;
Y = [_G238, _G244, 3] ;
Y = [_G238, _G244, _G250,
Y = [_G238, _G244, _G250,
true
?- ultimo(X, Y).
Y = [X] ;
Y = [_G253, X] ;
Y = [_G253, _G259, X] ;
Y = [_G253, _G259, _G265,
Y = [_G253, _G259, _G265,
3] ;
_G256, 3]
X] ;
_G271, X]
/*
inverte(Xs, Ys) :- tem o valor verdadeiro se Ys for uma lista que
contem os elementos de Xs pela ordem inversa da qual eles aparecem na
lista original.
*/
%%% versao inicial
inverteInicial([], []).
inverteInicial([X|Xs], Zs) :- inverteInicial(Xs, Ys), junta(Ys, [X], Zs).
%%% inverte com is --- nao funciona, pois o is deve ser usado com numeros
inverteIs([], []).
inverteIs([X|Xs], Zs) :- inverteIs(Xs, Ys), Zs is [X|Ys].
%%% versao com acumulador
inverte(Xs, Ys) :- inverte(Xs, [], Ys).
inverte([X|Xs], Acc, Ys) :- inverte(Xs, [X|Acc], Ys).
inverte([], Ys, Ys).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
break
exit
trace
133
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
abort
% Execution Aborted
?- inverteInicial(X, [3, 2, 1]).
X = [1, 2, 3]
?- inverteInicial([1, 2, 3], Y).
Y = [3, 2, 1].
?- inverteInicial(X, Y).
X = Y, Y = [] ;
X = Y, Y = [_G295] ;
X = [_G253, _G256],
Y = [_G256, _G253] ;
X = [_G253, _G256, _G259],
Y = [_G259, _G256, _G253] ;
X = [_G253, _G256, _G259, _G262],
Y = [_G262, _G259, _G256, _G253]
?- inverte([1, 2, 3], [3, 2, 1]).
true.
?- inverte([1, 1, 1], [3, 2, 1]).
false.
?- inverte(X, [3, 2, 1]).
ERROR: Out of local stack
?- inverte([1, 2, 3], Y).
Y = [3, 2, 1].
?- inverte(X, Y).
ERROR: Out of local stack
/*
comprimento(Xs, N) :- tem o valor verdadeiro se N for o comprimento da lista Xs.
/
*
comprimento([], 0).
comprimento([_|Xs], s(N)) :- comprimento(Xs, N).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
?- comprimento([], X).
X = 0.
?- comprimento([1, 2, 3], s(s(s(0)))).
true.
?- comprimento([1, 2, 3], s(s(0))).
false.
?- comprimento([1, 2, 3], X).
X = s(s(s(0))).
?- comprimento(X, s(s(s(0)))).
X = [_G250, _G253, _G256].
/*
repete(Xs, XsXs) :- que tem o valor verdadeiro se cada elemento de
Xs aparece repetido em XsXs.
*/
repete([], []).
repete([X|Xs], [X, X|Ys]) :- repete(Xs, Ys).
%%
%%
%%
%%
134
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
13
135
14
Sumrio:
Operadores pr-definidos
Acrescentar/remover clusulas
Inspeco da estrutura dos termos
Predicados solues-todas
Resumo:
Operadores pr-definidos
Operadores relacionais
= Predicado de unificao: <t1> = <t2> tem sucesso se t1 e t2 podem ser unificados. A unificao de duas variveis no instanciadas faz com que elas partilhem
a mesma representao interna.
\= Negao do predicado de unificao.
== Predicado de identidade: <t1> == <t2> tem sucesso se t1 e t2 so idnticos (sem instanciar variveis).
\== Negao do predicado de identidade, indica que dois termos tm que ser
diferentes.
Operaes numricas
<t1> + <t2> soma.
<t1> - <t2> subtraco.
-<t1> simtrico.
<t1> * <t2> multiplicao.
<t1> / <t2> diviso.
(/ <t1>) inverso.
<t1> ** <t2> potncia.
<t1> // <t2> diviso inteira.
<t1> mod <t2> resto da diviso inteira.
(round <t1>) arredondamento para o inteiro mais prximo.
(sqrt <t1>) raiz quadrada.
(abs <t1>) valor absoluto.
136
14
137
false.
?- retract(maisAlto(nuno, ana)).
true.
?- maisAlto(nuno, X).
X = maria.
?Inspeco da estrutura dos termos
integer(X), real(X), atom(X), compound(X)
number(X) o mesmo que integer(X) ou real(X).
atomic(X) o mesmo que atom(X) ou number(X).
var(Term), nonvar(Term)
Predicados solues-todas
Predicados solues-todas so predicados que retornam todas as instncias que so resposta de um objectivo.
findall(+Template, +Objectivo, -Saco) cria uma lista com as instanciaes
obtidas para Template fazendo retrocessos sucessivos sobre o Objectivo e unifica o
resultado com Saco. Tem sucesso com uma lista vazia se o Objectivo no tiver solues. equivalente ao bagog com todas as variveis usando o operador existencial (),
excepto no facto que o bagof falha quando no existem solues.
bagof(+Template, +Objectivo, -Saco) unifica Saco com as alternativas de
Template, se o Objectivo tiver variveis livres para alm das partilhadas com o Template.
A notao VariavelObjectivo diz ao bagof para no ligar a Varivel no Objectivo.
Falha se o Objectivo no tiver solues.
setof(+Template, +Objectivo, -Conjunto) equivalente ao bagof, mas ordena o resultado usando sort/2 para obter uma lista ordenada sem duplicados (um
conjunto ordenado).
138
14
Exerccio 14.1
Considere o seguinte programa para calcular o factorial de um nmero.
/*
factorial1(N, F) :- F e o factorial de N.
*/
factorial1(0, 1).
factorial1(N, F) :- N1 is N-1, factorial1(N1, F1), F is N*F1.
1. Qual a sua resposta ao objectivo factorial1(3, X)?
2. O que acontece se pedirmos uma segunda soluo? Escreva um programa que
resolva o problema.
3. Qual a sua resposta ao objectivo factorial1(X, 6)? Como resolver o problema?
Resposta:
1. ?- factorial1(3, X).
X = 6
2. ?- factorial1(3, X).
X = 6 ;
ERROR: Out of local stack
Neste caso, o programa entra em ciclo infinito. Este problema pode ser resolvido usando
uma outra definio para o factorial, por exemplo:
/*
factorial(N, F) :- F e o factorial de N.
/
*
factorial(N, F) :- factorial(N, 1, F).
factorial(N, T, F) :- N > 0, T1 is T*N, N1 is N-1, factorial(N1, T1, F).
factorial(0, F, F).
Com esta definio, o Prolog nem sequer permite que seja pedida outra soluo:
?- factorial(3, X).
X = 6.
?3. A resposta de ambos os programas a este objectivo um erro:
?- factorial1(X, 6).
ERROR: is/2: Arguments are not sufficiently instantiated
^ Exception: (8) _L136 is _G170-1 ? a
% Execution Aborted
?- factorial(X, 6).
ERROR: >/2: Arguments are not sufficiently instantiated
^ Exception: (10) _G173>0 ? a
% Execution Aborted
?Neste caso, se quisermos ter um programa que determina de que nmero que um valor
o factorial, temos que escrever outro programa especfico para o efeito, pois a utilizao do
is e dos operadores matemticos obriga a que a computao seja feita apenas num sentido.
139
Exerccio 14.2
Escreva o predicado comp(L, C), que tem o valor verdadeiro se C o comprimento da
lista L.
1. Gerando um processo recursivo.
2. Gerando um processo iterativo.
Resposta:
1. /*
comp(L, C) :- C e o comprimento da lista L.
*/
comp([], 0).
comp([_|Xs], C) :- comp(Xs, Cx), C is Cx+1.
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
O caso base aparece antes para dar uma resposta a comp(X, 2).
?- comp([], X).
X = 0.
?- comp([1, 2, 3], X).
X = 3.
?- comp([1, 2, 3], 5).
false.
?- comp(X, 2).
X = [_G241, _G244] ;
C-c C-c
Action (h for help) ? a
abort
% Execution Aborted
?-
2. /*
comp1(L, C) :- C e o comprimento da lista L.
Usando um acumulador.
*/
comp1(L, C) :- comp1(L, 0, C).
comp1([], Acc, Acc).
comp1([_|Xs], Acc, C) :- Acc1 is Acc+1, comp1(Xs, Acc1, C).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
O caso base aparece antes para dar uma resposta a comp1(X, 2).
?- comp1([], X).
X = 0.
?- comp1([1, 2, 3], X).
X = 3.
?- comp1([1, 2, 3], 5).
false.
?- comp1(X, 2).
X = [_G241, _G247] ;
ERROR: Out of global stack
?-
Exerccio 14.3
Escreva o predicado somalista(Xs, S), que tem o valor verdadeiro se S corresponde
soma de todos os elementos da lista de inteiros Xs.
140
14
2. /*
somalista(Xs, S) :- tem o valor verdadeiro se S corresponde
a soma de todos os elementos da lista de inteiros Xs.
Usando um acumulador.
/
*
somalista1(Xs, S) :- somalista1(Xs, 0, S).
somalista1([X|Xs], Acc, S) :- Acc1 is Acc + X, somalista1(Xs, Acc1, S).
somalista1([], S, S).
%%
%%
%%
%%
%%
%%
%%
Exerccio 14.4
Escreva o predicado remove(Xs, X, Ys), que tem o valor verdadeiro se Ys resulta de
remover todas as ocorrncias de X da lista Xs.
Resposta:
/*
remove(Xs, X, Ys) :- tem o valor verdadeiro se Ys resulta de
remover todas as ocorrencias de X da lista Xs.
*/
remove([X|Xs], X, Ys) :- remove(Xs, X, Ys).
remove([X|Xs], Z, [X|Ys]) :- X \= Z, remove(Xs, Z, Ys).
remove([], _, []).
%% ?- remove([], 3, X).
%% X = [].
141
%%
%%
%%
%%
%%
%%
%%
%%
?- remove([1,
X = [1, 3] ;
false.
?- remove([1,
X = [1, 2, 3,
?- remove([1,
false.
?-
2, 3, 2], 2, X).
2, 3, 2], 4, X).
2].
2, 3, 2], 2, [1]).
%%
%%
%%
%%
%%
?- removeErrado2([],
X = [].
?- removeErrado2([2,
X = [] ;
false.
?- removeErrado2([1,
false.
?- removeErrado2([1,
false.
?- removeErrado2([1,
false.
?-
3, X).
2, 2, 2], 2, X).
2, 3, 2], 2, X).
2, 3, 2], 4, X).
2, 3, 2], 2, [1, 3]).
Exerccio 14.5
Escreva o predicado escreveLista(Xs), que escreve todos os elementos da lista Xs,
um por linha, e a mensagem Fim da lista. no fim da lista.
Resposta:
/*
142
14
?- escreveLista([1, 2, 3]).
1
2
3
Fim da lista.
true.
?- escreveLista([ola, ola bom dia, "ola"]).
ola
ola bom dia
[111, 108, 97]
Fim da lista.
true.
?-
Exerccio 14.6
Suponha que queremos definir um predicado que permita indicar que uma pessoa um
av portugus de algum. Supondo que temos uma base de dados em Prolog com os predicados portugues(X) e avo(X,Y), podemos definir um predicado avoPortugues
de uma das seguintes maneiras:
Definio 1: avoPortugues1(X,Y) :- portugues(X), avo(X,Y).
Definio 2: avoPortugues2(X,Y) :- avo(X,Y), portugues(X).
Diga se alguma das definies mais eficiente do que a outra, em que condies, e explique porqu.
Resposta:
Em primeiro lugar convm notar que em termos lgicos as duas definies so equivalentes e
devem dar os mesmos resultados.
Se tanto X como Y estiverem instanciados, por exemplo se estivermos interessados em saber se
o Nuno um av portugus do Rui (avoPortugues(Nuno, Rui)), no h grandes diferenas
em termos de eficincia, pois so feitos os mesmos pedidos base de dados do Prolog.
Se X tiver um valor mas Y for varivel, por exemplo se estivermos interessados em saber de quem
que o Nuno um av portugus (avoPortugues(Nuno, Y)), a primeira ser mais eficiente
se o Nuno no for portugus porque no precisa de procurar os netos, e ambas so igualmente
eficientes se o Nuno for portugus.
Se X for varivel mas Y tiver um valor, por exemplo se estivermos interessados em saber quem
so os avs portugueses do Rui (avoPortugues(X, Rui), a segunda definio mais eficiente
do que a primeira. Na primeira definio, o Prolog vai emparelhar X com todos os portugueses
e s depois que vai verificar se cada um deles ou no av do Rui. Na segunda definio,
primeiro o Prolog determina quais so os avs do Rui e depois vai verificar se so portugueses.
Como o nmero de avs de algum muito menor do que o nmero de portugueses, a segunda
alternativa muito mais eficiente do que a primeira.
143
Se tanto X como Y forem variveis, convinha saber se h mais portugueses ou avs na base de
dados, e testar primeiro os que estiverem em menor nmero.
Se soubermos em que condies que o predicado vai ser chamado com mais frequncia, podemos escolher a implementao que melhor se adequa nossa aplicao.
Exerccio 14.7
Suponha que tem uma base de dados que indica as notas que os alunos tiveram nas vrias
disciplinas (nota(Nome, Disciplina, Nota)) e quais os alunos inscritos nas vrias
disciplinas (inscrito(Nome, Disciplina)).
Escreva um programa que permite lanar notas de alunos s disciplinas a que eles esto
inscritos e que determina a seguinte informao:
Lista dos alunos com pelo menos uma nota superior ou igual a um dado valor.
Mdia das notas de uma disciplina.
Mdia das notas de um aluno.
Resposta:
Ficheiro bdAlunos.pl
% Para poder usar assert, retract, um predicado tem que ser dynamic
:- dynamic nota/3.
:- dynamic inscrito/2.
/*
nota(Nome, Disciplina, Nota) :- o aluno chamado Nome fez a Disciplina
com a Nota indicada.
*/
nota(maria,
nota(maria,
nota(maria,
nota(maria,
nota(maria,
lp, 15).
fp, 16).
iaed, 13).
bd, 13).
comp, 17).
nota(pedro,
nota(pedro,
nota(pedro,
nota(pedro,
nota(pedro,
lp, 16).
fp, 15).
iaed, 14).
bd, 14).
comp, 16).
nota(nuno,
nota(nuno,
nota(nuno,
nota(nuno,
nota(nuno,
lp, 12).
fp, 13).
iaed, 15).
bd, 13).
comp, 15).
/*
inscrito(Nome, Disciplina) :- o aluno chamado Nome esta inscrito na
Disciplina.
*/
144
14
inscrito(maria, as).
inscrito(maria, es).
inscrito(pedro, as).
inscrito(pedro, es).
inscrito(pedro, qs).
Ficheiro alunos.pl
:- consult(bdAlunos).
/*
lancaNota(Aluno, Disciplina, Nota) :- lanca a Nota de um Aluno a uma Disciplina
em que ele esta inscrito.
*/
lancaNota(Aluno, Disciplina, Nota) :inscrito(Aluno, Disciplina),
retract(inscrito(Aluno, Disciplina)),
actualizaNota(Aluno, Disciplina, Nota);
write(Impossivel lancar nota porque ),
write(Aluno),
write( nao esta inscrito(a) a ),
write(Disciplina),
write(.).
/*
actualizaNota(Aluno, Disciplina, Nota) :- actualiza a Nota de um Aluno a uma
Disciplina.
*/
actualizaNota(Aluno, Disciplina, Nota) :nota(Aluno, Disciplina, NotaAnterior),
NotaAnterior >= Nota,
write(O aluno ja tinha uma nota melhor.);
retractall(nota(Aluno, Disciplina, _)),
%% o retractall nao falha, mesmo que nao exista uma nota anterior
assert(nota(Aluno, Disciplina, Nota)).
/*
listaAlunosNotaSuperiorA(Nota, ListaAlunos) :- determina a lista
dos alunos com pelo menos uma nota superior a um dado valor.
*/
listaAlunosNotaSuperiorA(Nota, ListaAlunos) :setof(Aluno, alunoComNota(Aluno, Nota), ListaAlunos).
%% usa-se setof porque nao se quer que os alunos aparecam repetidos
/*
alunoComNota(Aluno, Nota) :- o Aluno tem pelo menos uma nota
superior a Nota.
*/
alunoComNota(Aluno, Nota) :nota(Aluno, _, Nota2),
145
Nota2 >= Nota.
/*
escreveLista(Lista) :- escreve os elementos da Lista, um por linha.
/
*
escreveLista([X|Xs]) :- write(X), nl, escreveLista(Xs).
escreveLista([]) :- write(Fim da lista).
/*
mediaAluno(Aluno) :- determina a media das notas do Aluno.
/
*
mediaAluno(Aluno) :bagof(Nota, Disciplina^nota(Aluno, Disciplina, Nota), ListaNotas),
%% usa-se bagof porque todas as notas contam, mesmo que sejam repetidas
escreveMedia(ListaNotas, A media das notas do(a) , Aluno).
/*
mediaDisciplina(Disciplina) :- determina a media das notas dos alunos
que ja fizeram a disciplina.
*/
mediaDisciplina(Disciplina) :bagof(Nota, Nome^nota(Nome, Disciplina, Nota), ListaNotas),
escreveMedia(ListaNotas, A media das notas de , Disciplina).
/*
escreveMedia(Lista, Mensagem, Objecto) :- determina a media dos numeros
da lista e escreve-a.
/
*
escreveMedia(Lista, Mensagem, Objecto) :calculaMedia(Lista, Media),
write(Mensagem),
write(Objecto),
write( e ),
write(Media),
write(.),
nl.
/*
calculaMedia(Lista, Media) :- determina a media dos numeros da lista.
*/
calculaMedia(Lista, Media) :contaESoma(Lista, 0, 0, Elems, Soma),
Media is Soma/Elems.
/*
contaESoma(Lista, AccElems, AccSoma, Elems, Soma) :conta e soma os numeros da lista.
*/
contaESoma([X|Xs], AccElems, AccSoma, Elems, Soma) :AccElems1 is AccElems + 1,
146
14
AccSoma1 is AccSoma + X,
contaESoma(Xs, AccElems1, AccSoma1, Elems, Soma).
contaESoma([], AccElems, AccSoma, AccElems, AccSoma).
Exemplo de utilizao
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,928 bytes
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.4)
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
?- [alunos.pl].
% bdAlunos compiled 0.00 sec, 4,320 bytes
% alunos.pl compiled 0.00 sec, 11,768 bytes
true.
?- bagof(Nota, nota(maria, Disciplina, Nota), ListaNotas).
Disciplina = bd,
ListaNotas = [13] ;
Disciplina = comp,
ListaNotas = [17] ;
Disciplina = fp,
ListaNotas = [16] ;
Disciplina = iaed,
ListaNotas = [13] ;
Disciplina = lp,
ListaNotas = [15].
?- setof(Nota, nota(maria, Disciplina, Nota), ListaNotas).
Disciplina = bd,
ListaNotas = [13] ;
Disciplina = comp,
ListaNotas = [17] ;
Disciplina = fp,
ListaNotas = [16] ;
Disciplina = iaed,
ListaNotas = [13] ;
Disciplina = lp,
ListaNotas = [15].
?- findall(Nota, nota(maria, Disciplina, Nota), ListaNotas).
ListaNotas = [15, 16, 13, 13, 17].
?- bagof(Nota, Disciplina^nota(maria, Disciplina, Nota), ListaNotas).
ListaNotas = [15, 16, 13, 13, 17].
?- setof(Nota, Disciplina^nota(maria, Disciplina, Nota), ListaNotas).
ListaNotas = [13, 15, 16, 17].
?- findall(Nota, Disciplina^nota(maria, Disciplina, Nota), ListaNotas).
147
ERROR: fa_loop/5: Undefined procedure: (^)/2
ERROR:
^/2 can only appear as the 2nd argument of setof/3 and bagof/3
?- bagof(Nota, nota(maria, _, Nota), ListaNotas).
ListaNotas = [13] ;
ListaNotas = [17] ;
ListaNotas = [16] ;
ListaNotas = [13] ;
ListaNotas = [15].
?- setof(Nota, nota(maria, _, Nota), ListaNotas).
ListaNotas = [13] ;
ListaNotas = [17] ;
ListaNotas = [16] ;
ListaNotas = [13] ;
ListaNotas = [15].
?- findall(Nota, nota(maria, _, Nota), ListaNotas).
ListaNotas = [15, 16, 13, 13, 17].
?- bagof(Nota, nota(ana, _, Nota), ListaNotas).
false.
?- setof(Nota, nota(ana, _, Nota), ListaNotas).
false.
?- findall(Nota, nota(ana, _, Nota), ListaNotas).
ListaNotas = [].
?- listaAlunosNotaSuperiorA(16, ListaAlunos).
ListaAlunos = [maria, pedro].
?- lancaNota(pedro, xpto, 15).
Impossivel lancar nota porque pedro nao esta inscrito(a) a xpto.
true.
?- lancaNota(pedro, as, 15).
true
?- nota(pedro, as, X).
X = 15.
?- assert(inscrito(pedro, as)).
true.
?- lancaNota(pedro, as, 13).
O aluno ja tinha uma nota melhor.
true
?- nota(pedro, as, X).
X = 15.
?- setof((Nota, Disciplina), nota(nuno, Disciplina, Nota), ListaNotas).
ListaNotas = [ (12, lp), (13, bd), (13, fp), (15, comp), (15, iaed)].
?- bagof((Nota, Disciplina), nota(nuno, Disciplina, Nota), ListaNotas).
ListaNotas = [ (12, lp), (13, fp), (15, iaed), (13, bd), (15, comp)].
148
14
149
15
Sumrio:
Corte
Negao
Resumo:
Corte
O operador de corte (!) tem sempre sucesso e impede o retrocesso na rvore de refutao
para alm do ponto onde resolvido, comprometendo-se com todas as escolhas feitas
desde que o objectivo inicial unificou com a cabea da clusula onde o corte ocorre. Serve
para impedir que o Prolog explore ramos das rvores de refutao que se sabe que no
devem ser explorados.
Um corte elimina todas as clusulas abaixo dele. Um objectivo unificado com
uma clusula contendo um corte que teve sucesso no consegue produzir solues
usando clusulas que ocorram abaixo dessa clusula.
O corte elimina todas as solues alternativas para a conjuno de objectivos sua
esquerda. Por exemplo, uma conjuno seguida de um corte produzir apenas uma
soluo.
O corte no afecta os objectivos sua direita na clusula. Estes podem produzir
mais do que uma soluo em caso de retrocesso. No entanto, quando esta conjuno falha, a procura continua a partir da ltima alternativa anterior escolha da
clusula contendo o corte.
Os cortes verdes servem para expressar determinismo, por exemplo quando um programa
tem vrias clusulas que se sabe que so mutuamente exclusivas, isto , que quando o
fluxo de execuo passa um determinado teste no vai passar os testes das outras clusulas.
Os cortes vermelhos so usados para aumentar a eficincia dos programas, eliminando
solues alternativas que partida no se quer que sejam geradas. Mas alteram os resultados obtidos, e por isso devem ser usados ainda com mais cuidado.
Exemplos de corte
Se o Prolog encontra um corte numa regra, ele no vai retroceder nas escolhas que j fez
para o objectivo que est a provar. Isto ilustrado pelo programa seguinte:
a1(X, Y) :- b1(X), !, c1(Y).
b1(1).
b1(2).
b1(3).
c1(1).
c1(2).
c1(3).
150
15
151
c3(3).
d3(4).
O Prolog falha com o objectivo a3(X), apesar de poder resolver o objectivo com a segunda clusula, usando X = 4 e a ltima linha do programa, d3(4).. Mas o Prolog
tenta a primeira regra e quando encontra o corte tem que ignorar todas as alternativas
para a3(X). Neste caso, o objectivo a3(4) tambm falha, porque o Prolog tambm encontra o corte, uma vez que consegue provar b3(4). De seguida, tenta provar c3(4)
mas falha, mas como est comprometido com X = 4 por causa do corte no pode procurar mais alternativas. Se a linha b3(4) fosse retirada do programa, o Prolog falharia na
primeira regra, antes de encontrar o corte e poderia resolver o objectivo com a segunda
regra.
Negao
O corte pode ser usado para implementar a negao como falhano, em conjunto com o
fail, que falha sempre.
Suponhamos que se usava o programa seguinte para responder ao objectivo nao(G). A
primeira regra aplicada e tenta-se provar G. Se G tiver sucesso, o corte encontrado,
no so procuradas mais solues, e avaliado o fail, que falha sempre, logo nao(G)
falha; se G falhar, no se continua na primeira clusula (e por isso no se executa o corte)
e executa-se a segunda clusula, que tem sempre sucesso, e por isso nao(G) tem sucesso.
Neste programa, a ordem das clusulas importante.
/*
nao(X) :- nao se consegue provar X.
*/
nao(X) :- X, !, fail.
nao(_).
Neste programa, a terminao de nao(G) depende da terminao de G, isto , se G no
terminar, nao(G) pode ou no terminar, dependendo de ser ou no encontrada uma
soluo antes do ramo infinito.
Na realidade, o Prolog tem um predicado pr-definido not/1, que exprime uma forma
de negao. Este predicado tambm pode ser usado em Prolog como um operador,
usando \+, ou seja, not(G) o mesmo que \+ G. Usando o predicado pr-definido,
not(G) verdadeiro se o Prolog no conseguir provar G como verdadeiro dada a base
de dados actual. Quando o interpretador de Prolog encontra um objectivo da forma
not(G), tenta provar o objectivo G. Se o G conseguir ser provado, ento not(G) falha,
caso contrrio, not(G) tem sucesso.
Existem programas que poderiam falhar usando a negao como falhano, mas que
no terminam usando as regras de computao do Prolog. Por exemplo, o objectivo
not((p1(X), p2(X))) no termina relativamente ao programa seguinte, mas teria
sucesso se p2(X) fosse selecionado primeiro, pois isso daria origem a uma rvore finitamente falhada.
p1(s(X)) :- p1(X).
152
15
p2(a).
p3(a).
p4(b).
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
?- p1(X).
ERROR: Out of global stack
?- p1(a).
false.
?- p2(X).
X = a.
?- not((p1(X), p2(X))).
ERROR: Out of global stack
?- not((p2(X), p1(X))).
true.
?- not((p2(X), p3(X))).
false.
?- not((p2(X), p4(X))).
true.
?- not(p2(X)), not(p4(X)).
false.
?- p5(X).
ERROR: toplevel: Undefined procedure: p5/1 (DWIM could not correct goal)
?- not(p2(X)), not(p5(X)).
ERROR: toplevel: Undefined procedure: p5/1 (DWIM could not correct goal)
?- not((p2(X), p5(X))).
ERROR: toplevel: Undefined procedure: p5/1 (DWIM could not correct goal)
?-
Outro exemplo a relao de estudanteSolteiro, que define algum que no casado e estudante:
/*
estudanteSolteiro(X) :- tem sucesso quando X nao e casado e e estudante
*/
estudanteSolteiro(X) :- not(casado(X)), estudante(X).
estudante(rui).
casado(pedro).
%%
%%
%%
%%
%%
?- estudanteSolteiro(X).
false.
?- estudanteSolteiro(rui).
true.
153
%%
%% ?O objectivo estudanteSolteiro(X) falha com o programa anterior, apesar de X=rui
ser uma soluo implicada logicamente pelos factos conhecidos na base de conhecimento
e de o objectivo estudanteSolteiro(rui) ter sucesso. O problema ocorre porque
not(casado(X)) falha, uma vez que casado(X) tem a soluo X=pedro. Este problema pode ser evitado trocando a ordem das clusulas e garantindo que as variveis j
esto instanciadas quando usado o not.
154
15
Exerccio 15.1
Escreva um programa que determina o mnimo entre dois nmeros.
1. Usando Prolog puro.
2. Usando cortes.
Resposta:
1. /*
minimo(X, Y, Min) :- Min e o minimo dos numeros X e Y.
/
*
minimo(X, Y, X) :- X =< Y.
minimo(X, Y, Y) :- X > Y.
2. /*
minimo2(X, Y, Min) :- Min e o minimo dos numeros X e Y.
*/
minimo2(X, Y, X) :- X =< Y, !.
minimo2(X, Y, Y) :- X > Y, !.
O corte usado neste programa um corte verde, pois no altera as solues existentes, uma
vez que ambas as clusulas tm testes que so mutuamente exclusivos. O corte na segunda
clusula aparece apenas para ficar mais parecida com a primeira, mas no essencial.
Exerccio 15.2
Explique porque que o seguinte programa para o minimo3 no tem os resultados esperados.
/*
minimo3(X, Y, Min) :- Min e o minimo dos numeros X e Y.
*/
minimo3(X, Y, X) :- X =< Y, !.
minimo3(X, Y, Y).
Resposta:
Basta usar o objectivo minimo3(2, 5, 5), que tem sucesso, apesar de 5 no ser o mnimo dos
dois argumentos. O problema que este programa foi feito pensando que o terceiro argumento
no estaria unificado, e nesse caso funcionaria, mas no caso em que o terceiro argumento conhecido podemos obter resultados errados. O programa correcto o que estava na soluo do
exerccio anterior.
Concluso: nem sempre se podem eliminar condies que partida poderiam parecer redundantes, pois o programa pode dar resultados errados se for chamado com outros argumentos que no
os inicialmente esperados.
Exerccio 15.3
Escreva um programa em Prolog que funde duas listas ordenadas de inteiros, tendo
como resultado outra lista ordenada de inteiros, incluindo repeties. Por exemplo,
funde([1, 3, 5], [3, 7], [1, 3, 3, 5, 7]) tem o valor verdadeiro.
Resposta:
155
/*
funde(Xs, Ys, Zs) :- Zs e uma lista ordenada de inteiros obtida
atraves da fusao das listas ordenadas de inteiros Xs e Ys.
*/
funde([X|Xs], [Y|Ys], [X|Zs]) :X < Y, !, funde(Xs, [Y|Ys], Zs).
funde([X|Xs], [Y|Ys], [X, Y|Zs]) :X =:= Y, !, funde(Xs, Ys, Zs).
funde([X|Xs], [Y|Ys], [Y|Zs]) :X > Y, !, funde([X|Xs], Ys, Zs).
funde(Xs, [], Xs) :- !.
funde([], Ys, Ys) :- !.
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
Neste programa, o corte da terceira clusula no necessrio, mas est l para tornar o programa
mais simtrico e facilitar a sua leitura.
O seguinte programa, em que a primeira e a segunda clusula se juntam, tambm funcionaria.
funde2([X|Xs], [Y|Ys], [X|Zs]) :X =< Y, !, funde2(Xs, [Y|Ys], Zs).
funde2([X|Xs], [Y|Ys], [Y|Zs]) :X > Y, !, funde2([X|Xs], Ys, Zs).
funde2(Xs, [], Xs) :- !.
funde2([], Ys, Ys) :- !.
Exerccio 15.4
Em matemtica, um polinmio uma expresso construda a partir de uma ou mais variveis e constantes, usando apenas os operadores de adio, subtraco e multiplicao,
e expoentes inteiros positivos. Por exemplo, x**2-4*x+7 a representao de um polinmio em Prolog.
Considere o seguinte programa em Prolog para reconhecer polinmios.
/*
polinomio(Termo, X) :- Termo e um polinomio em X.
156
15
*/
polinomio(X, X).
polinomio(Termo, _) :number(Termo).
polinomio(Termo1+Termo2, X) :polinomio(Termo1, X), polinomio(Termo2, X).
polinomio(Termo1-Termo2, X) :polinomio(Termo1, X), polinomio(Termo2, X).
polinomio(Termo1*Termo2, X) :polinomio(Termo1, X), polinomio(Termo2, X).
polinomio(Termo1/Termo2, X) :polinomio(Termo1, X), number(Termo2).
polinomio(Termo**N, X) :integer(N), N >= 0, polinomio(Termo, X).
Altere-o, usando cortes verdes, de modo a eliminar ramos desnecessrios da rvore de
refutao.
Resposta:
/*
polinomio2(Termo, X) :- Termo e um polinomio em X.
Usa cortes verdes.
*/
polinomio2(X, X) :- !.
polinomio2(Termo, _) :number(Termo), !.
polinomio2(Termo1+Termo2, X) :!, polinomio2(Termo1, X), polinomio2(Termo2, X).
polinomio2(Termo1-Termo2, X) :!, polinomio2(Termo1, X), polinomio2(Termo2, X).
polinomio2(Termo1*Termo2, X) :!, polinomio2(Termo1, X), polinomio2(Termo2, X).
polinomio2(Termo1/Termo2, X) :!, polinomio2(Termo1, X), number(Termo2).
polinomio2(Termo**N, X) :!, integer(N), N >= 0, polinomio2(Termo, X).
%%
%%
%%
%%
%%
%%
%%
%%
%%
?- polinomio2(4, x).
true.
?- polinomio2(4*xy, xy).
true.
?- polinomio2(4*xy, x).
false.
?- polinomio2(4*xy+2*xy**4, xy).
true.
?-
Exerccio 15.5
Explique qual o problema com o corte no seguinte programa:
/*
157
membro3(X, L) :- X e um membro de L.
*/
membro3(X, [X|_]) :- !.
membro3(X, [_|Ys]) :- membro3(X, Ys).
Resposta:
O problema que este um corte vermelho, que altera o significado do programa. Quando quisermos usar o predicado membro3 para saber quais so os elementos de uma lista, apenas vamos
conseguir obter o primeiro, pois o corte elimina a possibilidade de fazer retrocesso e encontrar os
outros elementos.
A interaco seguinte ilustra alguns dos problemas:
%%
%%
%%
%%
%%
%%
%%
%%
%%
Exerccio 15.6
Escreva um programa separa(Numeros, Positivos, Negativos), que separa uma
lista de nmeros em duas listas, uma com os nmeros positivos e outra com os nmeros
negativos. Considere que o zero um nmero positivo. Por exemplo, separa([1, -2,
0, -3], [1, 0], [-2, -3]) tem o valor verdadeiro.
Resposta:
/*
separa(Numeros, Positivos, Negativos) :- Positivos contem os numeros
positivos da lista Numeros e Negativos contem os numeros negativos
da lista Numeros.
*/
separa([N | Resto], [N | Positivos], Negativos) :N >= 0, !, separa(Resto, Positivos, Negativos).
separa([N | Resto], Positivos, [N | Negativos]) :N < 0, !, separa(Resto, Positivos, Negativos).
separa([], [], []).
158
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
15
Exerccio 15.7
Escreva um programa ifThenElse(A, B, C), que caso A tenha sucesso avalia B e caso
A falhe avalia C.
Resposta:
/*
ifThenElse(A, B, C) :- caso A tenha sucesso avalia B
e caso A falhe avalia C.
/
*
ifThenElse(A, B, _) :- A, !, B.
ifThenElse(_, _, C) :- C.
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
159
Uma alternativa, usando ;, seria a seguinte:
/*
ifThenElse2(A, B, C) :- caso A tenha sucesso avalia B
e caso A falhe avalia C.
*/
ifThenElse2(A, B, C) :- A, !, B; C.
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
Exerccio 15.8
Considere o programa:
m(1).
m(2) :- !.
m(3).
Diga quais so todas as respostas do Prolog aos seguintes objectivos, considerando que o
utilizador escreve ; at esgotar todas as respostas:
1. ?- m(X).
2. ?- m(X), m(Y).
3. ?- m(X), !, m(Y).
4. ?- m(X), m(Y), !.
5. ?- m(1), m(2), m(3).
Resposta:
Interaco com o Prolog:
%%
%%
%%
%%
?- m(X).
X = 1 ;
X = 2.
?- m(X), m(Y).
160
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
15
X = Y, Y = 1 ;
X = 1,
Y = 2 ;
X = 2,
Y = 1 ;
X = Y, Y = 2.
?- m(X), !, m(Y).
X = Y, Y = 1 ;
X = 1,
Y = 2.
?- m(X), m(Y), !.
X = Y, Y = 1.
?- m(1), m(2), m(3).
true.
?-
rvores SLD:
1. ?- m(X).
m(X).
m(1).
{1/X}
m(2) :- !.
{2/X}
!.
sem retrocesso at
2. ?- m(X), m(Y).
161
m(X), m(Y).
m(1).
{1/X}
m(2) :- !.
{2/X}
m(Y).
!, m(Y).
m(1).
m(2) :- !.
{1/Y }
{2/Y }
sem retrocesso at
!.
m(Y).
sem retrocesso at
m(1).
m(2) :- !.
{1/Y }
{2/Y }
!.
sem retrocesso at
3. ?- m(X), !, m(Y).
m(X), !, m(Y).
m(1).
{1/X}
!, m(Y).
sem retrocesso at
m(Y).
m(1).
{1/Y }
m(2) :- !.
{2/Y }
!.
sem retrocesso at
4. ?- m(X), m(Y), !.
162
15
m(X), m(Y), !.
m(1).
{1/X}
m(Y), !.
m(1).
{1/Y }
!.
sem retrocesso at
m(1).
m(2), m(3).
m(2) :- !.
!, m(3).
sem retrocesso at
m(3).
m(3).
Exerccio 15.9
Considere o seguinte programa em Prolog.
d :- a.
d :- g.
a :- b(X), !, c(X).
a :- e.
b(1).
163
b(2).
c(2).
g.
e.
Construa a rvore de refutao para mostrar que d sucede atravs de g.
Resposta:
d.
d :- a.
d :- g.
a.
g.
a :- b(x1),!,c(x1).
g.
b(x),!,c(x).
b(1).
{1/x1}
!,c(1).
sem retrocesso at
c(1).
impossvel
Exerccio 15.10
Considere o seguinte programa:
p(X, Y) :- q(X, Y).
p(a, b).
q(c, d).
q(e, f).
q(X, Y) :- r(X), !, s(Y).
q(X, Y) :- t(X, Y).
r(e).
r(f).
s(g).
s(h).
164
15
t(i, j).
Diga quais so as respostas dadas pelo Prolog ao objectivo p(X, Y), considerando que
o utilizador escreve ; at esgotar todas as respostas.
Resposta:
Interaco com o Prolog:
?- p(X, Y).
X = c,
Y = d ;
X = e,
Y = f ;
X = e,
Y = g ;
X = e,
Y = h ;
X = a,
Y = b.
?rvore SLD:
p(X, Y).
p(a, b).
{a/X, b/Y }
q(X, Y).
q(c, d).
q(e, f).
{c/X, d/Y }
{e/X, f /Y }
{X/X2, Y /Y 2}
r(X), !, s(Y).
r(e).
{e/X}
!, s(Y).
sem retrocesso at
s(Y).
s(g).
s(h).
{g/Y }
{h/Y }
165
Exerccio 15.11
Considere o seguinte programa:
u(a).
u(b).
v(1).
v(2).
v(3).
w1(X, Y) :- !, u(X), v(Y).
w2(X, Y) :- u(X), !, v(Y).
w3(X, Y) :- u(X), v(Y), !.
Diga quais so as respostas dadas pelo Prolog aos objectivos w1(X, Y), w2(X, Y), e
w3(X, Y), considerando que o utilizador escreve ; at esgotar todas as respostas.
Resposta:
Interaco com o Prolog:
?- w1(X, Y).
X = a,
Y = 1 ;
X = a,
Y = 2 ;
X = a,
Y = 3 ;
X = b,
Y = 1 ;
X = b,
Y = 2 ;
X = b,
Y = 3.
?- w2(X, Y).
X = a,
Y = 1 ;
X = a,
Y = 2 ;
X = a,
Y = 3.
?- w3(X, Y).
X = a,
Y = 1.
?-
rvores SLD:
166
15
w1(X, Y).
!, u(X), v(Y).
sem retrocesso at
u(X), v(Y).
v(1).
{1/Y }
u(a).
u(b).
{a/X}
{b/X}
v(Y).
v(Y).
v(2).
{2/Y }
v(3).
{3/Y }
w2(X, Y).
u(X), !, v(Y).
u(a).
{a/X}
!, v(Y).
sem retrocesso at
v(Y).
v(1).
{1/Y }
v(2).
{2/Y }
v(3).
{3/Y }
v(1).
{1/Y }
v(2).
{2/Y }
v(3).
{3/Y }
167
w3(X, Y).
u(X), v(Y), !.
u(a).
{a/X}
v(Y), !.
v(1).
{1/Y }
!.
sem retrocesso at
Exerccio 15.12
Escreva um predicado de dois argumentos diferentes, que tem sucesso apenas quando
os seus dois argumentos no so o mesmo, isto , no so unificveis.
Resposta:
/*
diferentes(X, Y) :- tem sucesso quando X e Y sao diferentes.
*/
diferentes(X, X) :- !, fail.
diferentes(_, _).
Usando o not, pode ficar:
diferentes2(X, Y) :- not(X = Y).
Usando o diferente do Prolog, \=, pode ficar:
diferentes3(X, Y) :- X \= Y.
Exemplos de utilizao:
%%
%%
%%
%%
?- diferentes(a, b).
true.
?- diferentes(A, B).
false.
168
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
15
?- diferentes(1, 1).
false.
?- diferentes(1, 2-1).
true.
?- 1=2-1.
false.
?- 1=:=2-1.
true.
?- diferentes2(a, b).
true.
?- diferentes2(A, B).
false.
?- diferentes2(1, 1).
false.
?- diferentes2(1, 2-1).
true.
?- diferentes3(a, b).
true.
?- diferentes3(A, B).
false.
?- diferentes3(1, 1).
false.
?- diferentes3(1, 2-1).
true.
?-
Exerccio 15.13
Defina o conceito de duas listas serem disjuntas usando o not, partindo do princpio que
existe o predicado membro/2 que indica se um elemento membro de uma lista .
Resposta:
/*
disjuntas(X, Y) :- tem sucesso quando X e Y sao listas disjuntas.
/
*
disjuntas(Xs, Ys) :- not((membro(Z, Xs), membro(Z, Ys))).
%%
%%
%%
%%
%%
Exerccio 15.14
Considere o seguinte programa em Prolog.
pessoaAlta(X) :- not(baixa(X)), pessoa(X).
pessoa(eva).
pessoa(maria).
baixa(maria).
Qual a resposta do Prolog ao objectivo pessoaAlta(X)? Corresponde ao que estaria
intuitivamente correcto? Se no, explique como que poderia passar a corresponder.
169
Resposta:
A resposta do Prolog false, mas estariamos espera que fosse X = eva, at porque o objectivo
pessoaAlta(eva) tem sucesso. Para obtermos esta resposta, temos que garantir que o X j est
instanciado quando avaliado o not, o que podemos fazer trocando a ordem dos literais na
clusula:
pessoaAlta1(X) :- pessoa(X), not(baixa(X)).
Exemplos de utilizao:
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
?- pessoaAlta(X).
false.
?- pessoaAlta(eva).
true.
?- pessoaAlta(maria).
false.
?- pessoaAlta1(X).
X = eva ;
false.
?- pessoaAlta1(eva).
true.
?- pessoaAlta1(maria).
false.
?-
Exerccio 15.15
Considere o seguinte programa:
p1(s(X)) :- p1(X).
p2(a).
Diga qual a resposta do Prolog ao objectivo not((p1(X), p2(X))).
Resposta:
?- not((p1(X), p2(X))).
ERROR: Out of global stack
?-
Para este objectivo, o Prolog no termina, mas teria sucesso se p2(X) fosse selecionado primeiro,
por exemplo em not((p2(X), p1(X))), pois isso daria origem a uma rvore finitamente falhada.
?- not((p2(X), p1(X))).
true.
?-
Exerccio 15.16
Considere a seguinte base de conhecimento:
170
15
cao(bobi).
cao(fiel).
cao(guerreiro).
morde(guerreiro).
E as duas formas de representar que o Carlos gosta de todos os ces que no mordam.
Repare que em termos lgicos no existem diferenas entre as duas.
gosta1(carlos, X) :- cao(X), not(morde(X)).
gosta2(carlos, X) :- not(morde(X)), cao(X).
Diga qual a resposta do Prolog a cada um dos seguintes objectivos gosta1(carlos,
X) e gosta2(carlos, X). Se as respostas forem diferentes, explique a razo dessas
diferenas.
Resposta:
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
?- gosta1(carlos, X).
X = bobi ;
X = fiel ;
false.
?- gosta2(carlos, X).
false.
?- halt.
Process prolog finished
No primeiro caso, primeiro o Prolog vai tentar encontrar os ces e s depois de estarem instanciados que vai tentar provar que no mordem. Neste caso, os resultados so os esperados.
No segundo caso, a varivel X no est instanciada quando o Prolog vai tentar provar not(morde(X)),
e este objectivo falha porque existe algo que morde na base de conhecimento.
Convm notar que ambos os objectivos dariam origem a um erro se no existisse nada que mordesse nem nenhuma definio para o que significa morder na base de conhecimento, pois o predicado no estaria definido.