Beruflich Dokumente
Kultur Dokumente
Ana Cardoso-Cachopo
Maio de 2014
CONTEDO 1
Contedo
1 Argumentos e Validade 3
Prefcio
1 Argumentos e Validade
Exerccio 1.1
Usando apenas a informao que est explcita, diga, justificando, se os seguintes argu-
mentos so vlidos ou so invlidos:
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.
4 1 ARGUMENTOS E VALIDADE
G G
Nota: todas as justificaes anteriores para a validade deste argumento poderiam ser usa-
das da mesma maneira para o argumento seguinte, pois no dependem das entidades men-
cionadas.
Peregrino Cinzento Pato Donald
Pato Donald Super Homem
Peregrino Cinzento Super Homem
2. Mithrandir um feiticeiro
Mithrandir Gandalf
Gandalf um feiticeiro
Feiticeiros
G G
3. Os orcs so feios
Os orcs so feios
Feios
Orcs
Orcs Orcs
Nota: todas as justificaes anteriores para a validade deste argumento poderiam ser usa-
das da mesma maneira para o argumento seguinte, pois no dependem do significado das
palavras usadas nem da opinio do leitor acerca dos orcs.
Os orcs so lindos
Os orcs so lindos
4. Nemo um peixe
Dori um peixe
Nemo Dori
Nemo
Dori
Nemo
Dori
5. Os tubares so carnvoros
Os tubares no so vegetarianos
O Bruce vegetariano
O Bruce no tubaro
Tubares Bruce
Tubares
Bruce
Peixes Tubaroes
Peixes Tubaroes
Exerccio 1.2
Sempre que for possvel, d exemplos de argumentos vlidos e invlidos com:
Resposta:
Os inteiros so nmeros
(Verd, Falsa) Impossvel Os nmeros so inteiros
As estrelas so pessoas
Os astros so estrelas
(Falsas, Verd) As pessoas irradiam luz
As estrelas so astros
As estrelas irradiam luz
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
11
Para os argumentos invlidos, sabemos que um argumento com a seguinte forma no vlido:
Os As so Bs
Os Cs so Bs
A C
Agora, s preciso encontrar exemplos de proposies com o valor de verdade pedido, de ma-
neira a que o argumento satisfaa estas formas.
Os inteiros so nmeros
(Verd, Falsa) Impossvel Os animais so nmeros
Os inteiros so pessoas
Os animais so nmeros
(Falsas, Verd) As pessoas so nmeros
Os inteiros so nmeros
Os inteiros so nmeros
Os inteiros so pessoas
Os animais so nmeros
(Falsas, Falsa) As pessoas so plantas
Os carros so nmeros
Os inteiros so plantas
12 2 LGICA PROPOSICIONAL SISTEMA DE DEDUO NATURAL
Exerccio 2.1
(JPM) Demonstre os seguintes teoremas e argumentos usando o sistema de deduo na-
tural 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))
Resposta:
1. A (B A) teorema
1 A Hip
2 B Hip
3 A Rei, 1
4 BA I, (2, 3)
5 A (B A) I, (1, 4)
2. (A A) B teorema
1 A A Hip
2 B Hip
3 A A Rei, 1
4 A E, 3
5 A E, 3
7 B E, 6
8 (A A) B I, (1, 7)
13
1 AB Prem
2 B A Prem
3 A Hip
4 AB Rei, 1
5 B E, (3, 4)
6 B A Rei, 2
7 A E, (5, 6)
8 A I, (3, (3, 7))
1 A Prem
2 B Hip
3 A Rei, 1
4 AB I, (3, 2)
5 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
2 AB E, 1
3 BC E, 1
4 A Hip
5 AB Rei, 2
6 B E, (4, 5)
7 BC Rei, 3
8 C E, (6, 7)
9 AC I, (4, 8)
10 ((A B) (B C)) (A C) I, (1, 9)
Exerccio 2.2
Demonstre os seguintes teoremas usando o sistema de deduo natural da lgica propo-
sicional.
2. ((A (A B)) A) B
3. (A B) (B A)
14 2 LGICA PROPOSICIONAL SISTEMA DE DEDUO NATURAL
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))
12. ((A B) A) A
Resposta:
1 A (B C) Hip
2 AB Hip
3 A Hip
4 AB Rei, 2
5 B E, (3, 4)
6 A (B C) Rei, 1
7 BC E, (3, 6)
8 C E, (5, 7)
9 AC I, (3, 8)
10 (A B) (A C) I, (2, 9)
11 (A (B C)) ((A B) (A C)) I, (1, 10)
2. ((A (A B)) A) B
1 (A (A B)) A Hip
2 A (A B) E, 1
3 A E, 1
4 AB E, (3, 2)
5 B E, (3, 4)
6 ((A (A B)) A) B I, (1, 5)
15
3. (A B) (B A)
1 AB Hip
2 B Hip
3 A Hip
4 AB Rei, 1
5 B E, (3, 4)
6 B Rei, 2
8 B A I, (2, 7)
9 (A B) (B A) I, (1, 8)
4. (B A) (A B)
1 B A Hip
2 A Hip
3 B Hip
4 B A Rei, 1
5 A E, (3, 4)
6 A Rei, 2
8 B E, 7
9 AB I, (2, 8)
10 (B A) (A B) I, (1, 9)
5. (A B) (A B)
1 AB Hip
2 A B Hip
3 AB Rei, 1
4 A E, 3
5 B E, (4, 2)
6 B E, 3
6. ((A B) B) A
1 (A B) B Hip
2 A Hip
3 (A B) B Rei, 1
4 AB E, 3
5 B E, (2, 4)
6 B E, 3
7. (A A) A
1 A A Hip
2 A Hip
3 A A Rei, 1
4 A E, (2, 3)
8. (A B) (B A)
1 AB Hip
2 A Hip
3 BA I, 2
4 B Hip
5 BA I, 4
9. ((A B) C) (A (B C))
1 (A B) C Hip
2 AB Hip
3 A Hip
4 A (B C) I, 3
5 B Hip
6 BC I, 5
7 A (B C) I, 6
9 C Hip
10 BC I, 9
11 A (B C) I, 10
1 A (B C) Hip
2 A E, 1
3 BC E, 1
4 B Hip
5 A Rei, 2
6 AB I, (5, 4)
7 (A B) (A C) I, 6
8 C Hip
9 A Rei, 2
10 AC I, (9, 8)
11 (A B) (A C) I, 10
1 (A B) (A C) Hip
2 AB Hip
3 A E, 2
4 B E, 2
5 BC I, 4
6 A (B C) I, (3, 5)
7 AC Hip
8 A E, 7
9 C E, 7
10 BC I, 9
11 A (B C) I, (8, 10)
12. ((A B) A) A
1 (A B) A Hip
2 AB Hip
3 A E, 2
4 A Hip
5 A Rep, 4
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:
19
1. (A B) (A B)
1 (A B) Hip
2 A Hip
3 AB I, 2
4 (A B) Rei, 1
6 B Hip
7 AB I, 6
8 (A B) Rei, 1
10 A B I, (5, 9)
11 (A B) (A B) I, (1, 10)
2. (A B) (A B)
ou
1 A B Hip 1 A B Hip
2 A E, 1 2 A E, 1
3 B E, 1 3 B E, 1
4 AB Hip 4 AB Hip
5 A Hip 5 A Hip
6 A B Hip 6 A Rep, 5
7 A Rei, 5 7 B Hip
8 A Rei, 2 8 A Hip
10 B Hip 10 B Rei, 7
12 B Rei, 10 12 A E, 11
3. (A B) (A B)
1 (A B) Hip
2 (A B) Hip
3 A Hip
4 A B I, 3
5 (A B) Rei, 2
7 A E, 6
8 B Hip
9 A B I, 8
10 (A B) Rei, 2
12 B E, 11
13 AB I, (7, 12)
14 (A B) Rei, 1
16 A B E, 15
17 (A B) (A B) I, (1, 16)
4. (A B) (A B)
21
ou
1 A B Hip 1 A B Hip
2 A Hip 2 AB Hip
3 AB Hip 3 A E, 2
4 A E, 3 4 B E, 2
5 A Rei, 2 5 A B Rei, 1
7 B Hip 7 B Hip
8 AB Hip 8 A Rei, 3
9 B E, 8 9 A Rei, 6
m Rei, n n
I o Hip
.. ..
. .
n Hip
.. .. p
. .
r Hip
m
.. ..
k I, (n, m) . .
E s
n m E, (n, (o, p), (r, s))
.. ..
. . I
m
.. ..
. .
n Hip
k E, (n, m)
.. ..
I . .
n
.. .. m
. . .. ..
m . .
.. ..
. .
k I, (n, m) k
l I, (n, (m, k))
E
n
..
..
. .
m E, n
23
Exerccio 3.1
Para cada uma das seguintes fbfs, diga, justificando, se satisfazvel, falsificvel, tauto-
lgica 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:
Para provar que uma frmula satisfazvel, podemos parar de procurar assim que encontrar-
mos 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 satis-
fazvel. 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 tautol-
gica, 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 contra-
ditrias, trocando satisfazer por no satisfazer e vice-versa.
Exerccio 3.2
Considere o seguinte conjunto de frmulas:
Resposta:
1.
H M P HP M P H M modelo?
V V V V V V S
V V F F F V N
V F V V V V S
V F F F V V N
F V V V V V S
F V F V F V N
F F V V V F N
F F F V V F N
Exerccio 3.3
Considere a seguinte tabela de verdade. Diga a que conectiva lgica corresponde a fun-
o f .
P Q f (P, Q)
V V V
V F F
F V F
F F F
Resposta:
Exerccio 3.4
Usando o sistema semntico da lgica proposicional, mostre que {A, B} |= (A B).
Resposta:
Para uma interpretao satisfazer {A, B}, A e B tm que ser ambos falsos. Assim, (A B) tam-
bm 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 apresen-
tando 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 poss-
veis 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 B (A B) A B (A B) (A B)
V V F F V
V F F F V
F V F F V
F F V V V
A B (A B) A B (A B) (A B)
V V F F V
V F V V V
F V V V V
F F V V V
26 3 LGICA PROPOSICIONAL TABELAS DE VERDADE
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))
(b) Reduo do domnio de : A ((B C) (C D))
A ((B C) (C D))
(c) Obteno da forma conjuntiva normal: A ((B (C D)) (C (C D)))
(A(B (C D)))(A(C (C D)))
(A B C D) (A C D)
(d) Eliminao de : {A B C D, A C D}
(e) Eliminao de : {{A, B, C, D}, {A, 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) Reduo do domnio de : A (B A)
A (B A)
A B A
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A, B, A}
(e) Eliminao de : {{A}, {B}, {A}}
Aplicao do princpio da resoluo:
{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.
28 4 LGICA PROPOSICIONAL RESOLUO
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.
2. (A A) B teorema
Passagem para a forma clausal de ((A A) B):
{}
(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}}
{A}
{}
{A}
{}
{A, C}
{C}
{}
Exerccio 4.3
Demonstre os teoremas do exerccio 2.2 usando resoluo.
Resposta:
{B}
{A, C}
{C}
{}
ou
{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):
{B}
{}
3. (A B) (B A)
Passagem para a forma clausal de ((A B) (B A)):
31
{A}
{}
4. (B A) (A B)
Passagem para a forma clausal de ((B A) (A B)):
{B}
{}
5. (A B) (A B)
Passagem para a forma clausal de ((A 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) Reduo do domnio de : ((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}
{}
7. (A A) A
Passagem para a forma clausal de ((A A) A):
(a) Eliminao de : ((A A) A)
(b) Reduo do domnio de : (A A) A
A A
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A, A}
(e) Eliminao de : {{A}, {A}}
Aplicao do princpio da resoluo:
{A} {A}
{}
8. (A B) (B A)
Passagem para a forma clausal de ((A B) (B A)):
(a) Eliminao de : ((A B) (B A))
(b) Reduo do domnio de : (A B) (B A)
(A B) B A
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A B, B, A}
33
{A}
{}
9. ((A B) C) (A (B C))
Passagem para a forma clausal de (((A B) C) (A (B C))):
{B, C}
{C}
{}
{C, A}
{A}
{}
{C, A}
{A}
{}
Nota: aqui tambm no foi necessrio usar todas as premissas para chegar a uma contradi-
o. 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):
{}
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) Reduo do domnio de : (A B) (A B)
(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}
{A}
{}
2. (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}
{A}
{}
36 4 LGICA PROPOSICIONAL RESOLUO
3. (A B) (A B)
Passagem para a forma clausal de ((A B) (A B)):
(d) Eliminao de : {A B, A, B}
{B}
{}
4. (A B) (A B)
Passagem para a forma clausal de ((A B) (A B)):
(d) Eliminao de : {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:
37
{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.
38 5 LGICA PROPOSICIONAL BDDS
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
Q Q
F F F V
2.
P P
Q Q Q
Q Q
F F F V F V F V
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:
39
P Q R f (P, Q, R)
V V V V
V V F F
V F V F
V F F F
F V V V
F V F F
F F V V
F F F F
3. O BDD teria a mesma forma se tivesse escolhido outra ordenao para os ns?
Justifique, mostrando o novo BDD reduzido.
4. Com base nos BDDs reduzidos, diga quais so os modelos de f (P, Q, R) e compare-
os com os obtidos pela observao da tabela de verdade.
Resposta:
1.
P
Q Q
R R R R
F V F V F F F V
2.
P
Q Q
R R R R
F V
R1
40 5 LGICA PROPOSICIONAL BDDS
P P
Q Q Q
R R
F V F V
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
P P
Q Q Q Q
F F F F V V F V
R1
R R
P P P
Q Q Q Q Q
F V F V
R2
Nota: para a mesma tabela de verdade, temos 2 BDDs reduzidos diferentes!
4. Seguindo o caminho desde a raz de cada BDD at ao n V , observa-se que, para f (P, Q, R)
ser verdadeira, existem duas possibilidades: P , Q, R so todos verdadeiros; ou P falso e
R verdadeiro (neste caso, no interessa o valor de Q). Como seria de esperar, a concluso
a mesma, observando o primeiro BDD, o segundo BDD ou a tabela de verdade.
Exerccio 5.3
Usando BDDs, prove que as seguintes frmulas, correspondentes s leis de De Morgan,
so tautologias.
(A B) (A B)
41
(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
B B
V V V V V V V
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
B
B B
C
C C C C
F F F F F F F V F V
R
2. = B C
42 5 LGICA PROPOSICIONAL BDDS
B
B
C
C C
F V V V F V
R
3. = (A B C) (B C)
A
F V
4. = (A B C) (B C)
43
V F
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.
44 6 LGICA PROPOSICIONAL OBDDS
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
4
A
0 3
B B
0 0 0 2
C C C C
0 0 0 0 0 0 0 1
F F F F F F F V
4
A
3
B
2
C
0 1
F V
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
45
3
B
3
B
2
C
2 1
C C
0 1 1 1 0 1
F V V V F V
3. = (A B) D
4
A
2 3
B B
2 2 2 1
D D D D
0 1 0 1 0 1 1 1
F V F V F V V V
4
A
3
B
2
D
0 1
F 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.
46 6 LGICA PROPOSICIONAL OBDDS
1. = (A B C) (B C)
Para determinar o OBDD de , vamos calcular aplica(, o , o ).
A
B
B
C
C
F V
F V
=
A
B B B
F C C C
F V F V F V
= =
F B
C C
F V
F V F V
= =
F C
F V
F V
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
47
inconsistentes.
2. = (A B C) (B C)
C V
F V
=
B
C V V
V =
F V F
=
C
F V V V
= =
V F
V F
Tal como seria de esperar, este OBDD corresponde ao BDD de trocando V por F e
vice-versa.
A
B
B
C
C
V F
F V
=
A
B B B
F C C C
V F F V V F
= =
B B
C C C
F F
V F F V
V F
= =
C C
V F F V
B B
C C
V F
3. = (B C) (A B) D
A
B
B
C
D
F V
F V
=
A
B B B
D
C C D
F V
F V F V F V
= =
B B
C D D C D V V
V =
F V F V F V F V F V V
= = =
C V C
D D D D
F V F V
F V F V F V F V
= = = =
D V D V
F V F V
F V
Que ainda pode ser reduzido, uma vez que ambos os arcos do n A apontam para o mesmo
n B.
B
F V
51
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 nega-
es:
(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
7:F
3:V
8:F
4:V 4: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 testemu-
nha 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.
52 7 LGICA PROPOSICIONAL SAT
1:V
2:V 2:V
3:V
Esta frmula no satisfazvel porque existem duas marcas contraditrias para B, ou seja,
a frmula corresponde a uma contradio.
1:V
2:F
A B C
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.
53
A B C D E
Resposta:
1:V
2:V 2:V
11:F
3:F
4:V 12T:V
10:F
5:V 5:V
6:V 8:V
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.
Exerccio 7.4
Considere o seguinte conjunto de clusulas: {{A, B}, {B, A}, {B}}. Aplique o algo-
ritmo DP e caso a frmula seja satisfazvel, indique uma testemunha.
1. Usando a ordem A B;
2. Usando a ordem B A.
54 7 LGICA PROPOSICIONAL SAT
Resposta:
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 sa-
tisfazvel, indique uma testemunha.
Resposta:
Baldes iniciais:
bC : {C, A}, {A, D, C}, {C, E}
bE : {E}
bD : {D, B}
bA :
bB :
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
55
Exerccio 7.6
Considere a seguinte frmula ((A B) (A C)) (A D).
Determine se ela satisfazvel e se for indique uma testemunha, usando:
Resposta:
1:V
2:V 2:V
3:F 4:F
5T:V 8T:F
11T:F
6T:V 9T:F
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 consis-
tentes, 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:
56 7 LGICA PROPOSICIONAL SAT
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 tes-
temunha; 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.
57
Exerccio 8.1
Demonstre os seguintes argumentos, usando o sistema de deduo natural da lgica de
primeira ordem:
Resposta:
4 F (x0 ) E, 3
6 F (x0 ) G(x0 ) E, 5
7 G(x0 ) E, (4, 6)
8 H(x0 ) E, 3
10 x[G(x) H(x)] I, 9
11 x[G(x) H(x)] E, (2, (3, 10))
Exerccio 8.2
(JPM) Demonstre os seguintes teoremas, usando o sistema de deduo natural da lgica
de primeira ordem:
Resposta:
58 8 LGICA DE PRIMEIRA ORDEM SISTEMA DE DEDUO NATURAL
2 F (a) E, 1
4 F (a) G(a) E, 3
5 G(a) E, (2, 4)
6 (F (a) x[F (x) G(x)]) G(a) I, (1, 5)
3 x[G(x) H(x)] E, 1
4 x0 F (x0 ) Hip
6 F (x0 ) G(x0 ) E, 5
7 G(x0 ) E, (4, 6)
9 G(x0 ) H(x0 ) E, 8
10 H(x0 ) E, (7, 9)
3 y[F (y)] E, 1
4 x0 F (x0 ) Hip
6 F (x0 ) H(x0 ) E, 5
7 H(x0 ) E, (4, 6)
8 z[H(z)] I, 7
Exerccio 8.3
Demonstre os seguintes teoremas, que correspondem a aplicaes das leis de De Mor-
gan para os quantificadores, usando o sistema de deduo natural da lgica de primeira
ordem.
Resposta:
3 x0 F (x0 ) Hip
4 x[F (x)] I, 3
7 F (x0 ) E, 6
11 x[F (x)] E, 10
12 x[F (x)] x[F (x)] I, (1, 11)
ou
9 F (x0 ) Rei, 4
2 x0 F (x0 ) Hip
3 x[F (x)] I, 2
3 x0 F (x0 ) Hip
5 F (x0 ) E, 4
6 F (x0 ) Rei, 3
Prem E
n Prem
n
Hip
o Hip
n Hip .. ..
. .
n+1 ...
p
Rep
n r Hip
.. ..
. . .. ..
m Rep, n . .
Rei s
n m E, (n, (o, p), (r, s))
.. ..
. .
I
m Rei, n n Hip
.. ..
I . .
n Hip m
.. .. .. ..
. . . .
m k
k I, (n, m) l I, (n, (m, k))
E E
n
..
..
n
..
.. . .
. .
m E, n
m
.. ..
. . I
k E, (n, m)
I n x0
n
..
.. .. ..
. . . .
m
.. .. m (x0 )
. .
k I, (n, m) m+1 x[(x)] I, (n, m)
E E
n x[(x)]
n
.. ..
..
.
..
.
. .
m E, n m (t) E, n
ou I
n
.. ..
n
.. (t)
..
. . . .
m E, n m x[(x)] I, n
I E
n
..
..
. . n x[(x)]
m I, n m x0 (x0 ) Hip
ou .. ..
n . .
.. ..
. .
m I, n k
k+1 E, (n, (m, k))
63
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))
4. Estrela(es) F lor(f q)
5. x[Estrela(x)]
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.
64 9 LGICA DE PRIMEIRA ORDEM SISTEMA SEMNTICO
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 satis-
fizer ((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 sa-
tisfeito o consequente tambm , qualquer que seja a substituio considerada, a fbf inicial
satisfeita.
Exerccio 9.2
Considere a seguinte conceptualizao C = (D, F, R):
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)
(d) x[P ar(x)]
(e) x[Impar(valor(x))]
3. Diga, justificando, se o seguinte poderia ser uma interpretao para esta conceptu-
alizao. Se no puder, indique todas as razes para no poder.
I(a) 7 X
65
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:
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:
2. Uma relao reflexiva sse satisfizer x, y[Rel(x, y) (Rel(x, x) Rel(y, y))]. Nota: a de-
finio 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 sim-
trica 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 ver-
dadeiro, que o consequente tambm vai ser verdadeiro. Por outras palavras, no consegui-
mos 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.
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:
e o seguinte conjunto de frmulas: {P1 (f1 (a), b), P1 (f2 (a), b) P1 (b, f1 (a))}.
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.
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) = {(), (), (), ( )}
2. Explique porque que o seguinte no pode ser uma interpretao para esta con-
ceptualizao, mencionando todos os erros que foram cometidos.
68 9 LGICA DE PRIMEIRA ORDEM SISTEMA SEMNTICO
I(a) =
I(b) =
I(c) =
I(c) =
I(d) = ~
I(f 1) = {(, ), (, )}
I(R1) = {(), (), ( )}
Resposta:
Exerccio 10.1
Represente em lgica de primeira ordem cada uma das seguintes frases:
2. Os gatos so animais.
Resposta:
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)]
5. x[I(x) P (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.
71
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.
Resposta:
Uma forma de verificar se o unificador mais geral est bem calculado saber que quando se aplica
essa substituio a cada uma das fbfs do conjunto inicial deve ter como resultado, em apenas um
passo, a fbf do conjunto final.
Exerccio 11.2
Passe as seguintes fbfs da lgica de primeira ordem para a forma clausal.
73
Resposta:
Exerccio 11.3
Considere o seguinte conjunto de clusulas: {{A(x), B(x), C(x)}, {A(x)}, {B(a)}, {A(y), C(y)}}.
2. Apresente uma demonstrao por refutao a partir desse conjunto, usando reso-
luo unitria.
3. Apresente uma demonstrao por refutao a partir desse conjunto, usando reso-
luo linear e {B(a)} como clusula inicial.
Resposta:
{x/y}
{B(x)} {B(a)}
{a/x}
{}
{x/y}
{x/y}
{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.
75
{a/x}
{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 clau-
sal. 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 come-
ando 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}
{b/y}
{R(b, d)}
{b/x, d/z}
{c/y}
{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.
76 11 LGICA DE PRIMEIRA ORDEM RESOLUO
{x/y}
{}
{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.
77
{a/x}
{G(a)}
{}
{x/y}
{F (x), H(x)}
{a/x}
{H(a)}
{}
78 11 LGICA DE PRIMEIRA ORDEM RESOLUO
{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:
{a/y}
{}
79
{a/y}
{}
{a/x}
{}
{a/x}
{}
Exerccio 11.8
Considere as seguintes afirmaes:
Resposta:
2. Para responder s perguntas, necessrio passar cada uma das frmulas correspondentes
s premissas do problema para a forma clausal.
(a) Para saber se o Kenai mamfero, necessrio responder a uma questo do tipo ver-
dadeiro 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)} {U rso(x), T emP elos(x)}
{Kenai/x} {Kenai/x}
{Kenai/x}
{M amif ero(Kenai)}
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)} {Animal(x), T emP elos(x), M amif ero(x)}
{Kenai/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 ins-
tncias que fazem com que a fbf T emP elos(x) seja consequncia do conjunto de pre-
missas. 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.
82 11 LGICA DE PRIMEIRA ORDEM RESOLUO
{Kenai/x}
{Kenai/x} {Sylvester/x}
{Resposta(Kenai)} {Resposta(Sylvester)}
Tambm podemos usar resoluo no formato de prova:
1 {U rso(Kenai)} Prem
2 {U rso(x), T emP elos(x)} Prem
3 {T emP elos(Sylvester)} Prem
4 {T emP elos(x), Resposta(x)} Prem
5 {T emP elos(Kenai)} Res, (1, 2), {Kenai/x}
6 {Resposta(Kenai)} Res, (4, 5), {Kenai/x}
7 {Resposta(Sylvester)} 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 ins-
tncias que fazem com que a fbf M amif ero(x) seja consequncia do conjunto de pre-
missas. 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}
{K/x} {S/x}
{M (K)} {M (x), R(x)} {M (S)} {C(B)} {C(x), M (x)}
{B/x}
{R(B)}
83
Exerccio 12.1
Demonstre os argumentos do exerccio 8.1, usando resoluo SLD e uma funo de selec-
o 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, apresentam-
se com cada argumento as clusulas que lhe correspondem.
Resposta:
{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}
{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.
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.
Resposta:
{a/x}
F (a) F (a)
{a/y}
{a/x}
F (a) F (a)
{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?
3. Quais so os mamferos?
Resposta:
Para usar resoluo SLD, preciso transformar as clusulas dadas no enunciado em clusulas de
Horn.
Vamos usar uma funo de seleco que escolhe para unificar o primeiro literal do objectivo.
86 12 PROGRAMAO EM LGICA RESOLUO SLD; RVORES SLD
1. Para sabermos se o Kenai mamfero, vamos aplicar resoluo SLD com o objectivo
M amif ero(Kenai).
{Kenai/x1}
{Kenai/x2}
T emP elos(Kenai) T emP elos(x3) U rso(x3)
{Kenai/x3}
U rso(Kenai) U rso(Kenai)
Para saber quem que tem plos, que uma pergunta que pode ter vrias respostas, vamos
usar rvores SLD, para garantir que encontramos todas as respostas possveis.
T emP elos(x)
U rso(x)
U rso(Kenai)
{Kenai/x}
Nota: quando h duas variveis para unificar, a varivel do objectivo substitui a varivel
do programa que estamos a utilizar, pois isto facilita a composio das substituies para
encontrar as respostas; quando existe uma constante e uma varivel, a constante substitui
sempre a varivel, como seria de esperar.
3. Quais so os mamferos?
87
M amif ero(x)
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:
88 12 PROGRAMAO EM LGICA RESOLUO SLD; RVORES SLD
A(x)
B(x), C(x)
D(a1)
impossvel
Exerccio 13.1
Considere o seguinte programa em Prolog:
1. O Kenai mamfero?
3. Quais so os mamferos?
Resposta:
90 13 PROLOG RVORES DE REFUTAO; LISTAS
mamifero(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.
tempelos(X).
urso(X).
urso(kenai).
{kenai/X}
mamifero(X).
tempelos(kenai). urso(sylvester)
tempelos(X3) :- urso(X3).
{kenai/X3} impossvel
urso(kenai).
urso(kenai).
Exemplo de uma interaco com o Prolog em que se consulta um ficheiro com este programa e se
fazem algumas perguntas.
?- 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).
92 13 PROLOG RVORES DE REFUTAO; LISTAS
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.
Exerccio 13.2
Considere definido da seguinte forma o predicado m(X, Xs):
m(X, [X|_]).
m(X, [_|Xs]) :- m(X, Xs).
Resposta:
m(2,[1,2,3]).
m(X1,[_|Xs1]) :- m(X1,Xs1).
{2/X1, [2, 3]/Xs1}
m(2,[2,3]).
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(X,[2,3]).
m(X,[3]).
m(X,[]).
impossvel
Respostas: X = 1; X = 2; X = 3; e false.
94 13 PROLOG RVORES DE REFUTAO; LISTAS
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.
8. O predicado ultimo(X, Xs), que tem o valor verdadeiro se X for o ltimo ele-
mento 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 verda-
deiro.
10. O predicado comprimento(Xs, N), que tem o valor verdadeiro se N for o com-
primento 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
********************************************************************************/
95
/*
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).
/*
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).
%% 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).
%% Y = [_G250, _G253|X] ;
%% Y = [_G250, _G253, _G256|X] ;
%% Y = [_G250, _G253, _G256, _G259|X] ;
%% Y = [_G250, _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
/*
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).
/*
Redefinir os predicados membro, prefixo, sufixo e sublista
em termos do predicado junta.
*/
membro2(X, Ys) :- junta(_, [X|_], Ys).
/*
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).
%% 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, 3] ;
%% Y = [_G238, _G244, _G250, _G256, 3]
%% true
%% ?- ultimo(X, Y).
%% Y = [X] ;
%% Y = [_G253, X] ;
%% Y = [_G253, _G259, X] ;
%% Y = [_G253, _G259, _G265, X] ;
%% Y = [_G253, _G259, _G265, _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.
*/
%%% 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].
%% 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).
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.
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.
?-
?- 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
?-
104 14 PROLOG OPERADORES PR-DEFINIDOS
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.
Exerccio 14.2
Escreva o predicado comp(L, C), que tem o valor verdadeiro se C o comprimento da
lista L.
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).
%% 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
%% ?-
105
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.
Resposta:
1. /*
somalista(Xs, S) :- tem o valor verdadeiro se S corresponde
a soma de todos os elementos da lista de inteiros Xs.
* /
somalista([X|Xs], S) :- somalista(Xs, S1), S is S1+X.
somalista([], 0).
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).
106 14 PROLOG OPERADORES PR-DEFINIDOS
%% ?- remove([], 3, X).
%% X = [].
%% ?- remove([1, 2, 3, 2], 2, X).
%% X = [1, 3] ;
%% false.
%% ?- remove([1, 2, 3, 2], 4, X).
%% X = [1, 2, 3, 2].
%% ?- remove([1, 2, 3, 2], 2, [1]).
%% false.
%% ?-
%% ?- removeErrado2([], 3, X).
%% X = [].
%% ?- removeErrado2([2, 2, 2, 2], 2, X).
%% X = [] ;
%% false.
%% ?- removeErrado2([1, 2, 3, 2], 2, X).
%% false.
%% ?- removeErrado2([1, 2, 3, 2], 4, X).
%% false.
%% ?- removeErrado2([1, 2, 3, 2], 2, [1, 3]).
%% false.
%% ?-
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.
107
Resposta:
/*
escreveLista(Xs) :- escreve todos os elementos da lista Xs,
um por linha.
*/
escreveLista([X|Xs]) :- write(X), nl, escreveLista(Xs).
escreveLista([]) :- write(Fim da lista.), nl.
%% ?- 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 pre-
dicados portugues(X) e avo(X,Y), podemos definir um predicado avoPortugues
de uma das seguintes maneiras:
Diga se alguma das definies mais eficiente do que a outra, em que condies, e expli-
que porqu.
Resposta:
Em primeiro lugar convm notar que em termos lgicos as duas definies so equivalentes e
devem dar os mesmos resultados.
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,
108 14 PROLOG OPERADORES PR-DEFINIDOS
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.
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, pode-
mos 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.
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.
*/
/*
inscrito(Nome, Disciplina) :- o aluno chamado Nome esta inscrito na
Disciplina.
*/
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
110 14 PROLOG OPERADORES PR-DEFINIDOS
superior a Nota.
* /
alunoComNota(Aluno, Nota) :-
nota(Aluno, _, Nota2),
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) :-
111
Exemplo de utilizao
?- [alunos.pl].
% bdAlunos compiled 0.00 sec, 4,320 bytes
% alunos.pl compiled 0.00 sec, 11,768 bytes
true.
?- listaAlunosNotaSuperiorA(16, ListaAlunos).
ListaAlunos = [maria, pedro].
?- assert(inscrito(pedro, as)).
true.
ListaNotas = [ (12, lp), (13, bd), (13, fp), (15, comp), (15, iaed)].
?- mediaAluno(nuno).
A media das notas do(a) nuno e 13.6.
true.
?- mediaDisciplina(iaed).
A media das notas de iaed e 14.
true.
?- halt.
Exerccio 15.1
Escreva um programa que determina o mnimo entre dois nmeros.
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 es-
perados.
/*
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 co-
nhecido 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 redundan-
tes, 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.
115
Resposta:
/*
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.
Exerccio 15.4
Em matemtica, um polinmio uma expresso construda a partir de uma ou mais va-
riveis 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 poli-
nmio em Prolog.
/*
polinomio(Termo, X) :- Termo e um polinomio em X.
* /
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).
/*
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:
117
/*
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 qui-
sermos 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.
O segundo objectivo apenas tem uma soluo que corresponde ao primeiro elemento da lista,
quando deveria ter 3 solues.
No quarto objectivo, conseguimos ter essa soluo porque quando chamamos o membro3 o X j
est unificado com 2 e s na chamada recursiva ao membro3 que vai unificar com o segundo
elemento da lista.
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([], [], []).
118 15 PROLOG CORTE; NEGAO
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.
/*
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), !.
Resposta:
%% ?- m(X).
%% X = 1 ;
120 15 PROLOG CORTE; NEGAO
%% X = 2.
%% ?- m(X), m(Y).
%% 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). m(2) :- !.
{1/X} {2/X}
!.
sem retrocesso at
2. ?- m(X), m(Y).
121
m(X), m(Y).
m(1). m(2) :- !.
{1/X} {2/X}
m(Y). !, m(Y).
m(1). m(2) :- !.
{1/Y } {2/Y } sem retrocesso at
!. m(Y).
m(1). m(2) :- !.
sem retrocesso at {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). m(2) :- !.
{1/Y } {2/Y }
!.
sem retrocesso at
4. ?- m(X), m(Y), !.
122 15 PROLOG CORTE; NEGAO
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).
123
b(2).
c(2).
g.
e.
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:
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:
?- 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).
q(X, Y).
r(X), !, s(Y).
r(e).
{e/X}
!, s(Y).
sem retrocesso at
s(Y).
s(g). s(h).
{g/Y } {h/Y }
125
Exerccio 15.11
Considere o seguinte programa:
u(a).
u(b).
v(1).
v(2).
v(3).
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:
?- 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:
126 15 PROLOG CORTE; NEGAO
w1(X, Y).
!, u(X), v(Y).
sem retrocesso at
u(X), v(Y).
u(a). u(b).
{a/X} {b/X}
v(Y). v(Y).
w2(X, Y).
u(X), !, v(Y).
u(a).
{a/X}
!, v(Y).
sem retrocesso at
v(Y).
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(_, _).
diferentes3(X, Y) :- X \= Y.
Exemplos de utilizao:
%% ?- diferentes(a, b).
%% true.
%% ?- diferentes(A, B).
%% false.
128 15 PROLOG CORTE; NEGAO
%% ?- 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.
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:
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).
?- 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 fa-
lhada.
?- not((p2(X), p1(X))).
true.
?-
Exerccio 15.16
Considere a seguinte base de conhecimento:
130 15 PROLOG CORTE; NEGAO
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).
%% 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 instanci-
ados 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 mor-
desse nem nenhuma definio para o que significa morder na base de conhecimento, pois o pre-
dicado no estaria definido.