Sie sind auf Seite 1von 131

Exerccios de Lgica para Programao

Ana Cardoso-Cachopo

Maio de 2014
CONTEDO 1

Contedo

1 Argumentos e Validade 3

2 Lgica Proposicional Sistema de Deduo Natural 12

3 Lgica Proposicional Tabelas de Verdade 23

4 Lgica Proposicional Resoluo 27

5 Lgica Proposicional BDDs 38

6 Lgica Proposicional OBDDs 44

7 Lgica Proposicional SAT 51

8 Lgica de Primeira Ordem Sistema de Deduo Natural 57

9 Lgica de Primeira Ordem Sistema Semntico 63

10 Lgica de Primeira Ordem Representao 69

11 Lgica de Primeira Ordem Resoluo 72

12 Programao em Lgica Resoluo SLD; rvores SLD 83

13 Prolog rvores de Refutao; Listas 89

14 Prolog Operadores Pr-definidos 103

15 Prolog Corte; Negao 114


2 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 proposici-
onal 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 respos-
tas 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 com-
pilao 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.
3

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:

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.
4 1 ARGUMENTOS E VALIDADE

1. Peregrino Cinzento Gandalf


Mithrandir Gandalf
Peregrino Cinzento Mithrandir

(a) Diagrama de Venn, prova directa:


Para Peregrino Cinzento ser Gandalf, ambos tm que ser representados pelo mesmo
ponto. Para Mithrandir ser Gandalf, ambos tm que ser representados pelo mesmo
ponto. Logo, impossvel que Peregrino Cinzento no seja Mithrandir. Assim, o
argumento vlido.
PC
M
G

(b) Diagrama de Venn, prova por reduo ao absurdo:


Para Peregrino Cinzento no ser Mithrandir, tm que ser representados por pontos
diferentes. Para Peregrino Cinzento ser Gandalf, ambos tm que ser representados
pelo mesmo ponto. Para Mithrandir ser Gandalf, ambos tm que ser representados
pelo mesmo ponto. Como Gandalf no pode ser representado simultaneamente por
dois pontos diferentes, impossvel ter simultaneamente a concluso falsa e todas as
premissas verdadeiras, o que significa que o argumento vlido.
PC M

G G

(c) Forma do argumento, prova directa:


Para Peregrino Cinzento ser Gandalf, tm que ser iguais P C = G. Para Mithrandir
ser Gandalf, tm que ser iguais G = M . Logo, P C = G = M e pela transitividade da
igualdade, impossvel que Peregrino Cinzento no seja igual a Mithrandir. Assim, o
argumento vlido.
(d) Forma do argumento, prova por reduo ao absurdo:
Para Peregrino Cinzento no ser Mithrandir, tm que ser diferentes P C 6= M . Para
Peregrino Cinzento ser Gandalf, tm que ser iguais P C = G. Para Mithrandir ser Gan-
dalf, tm que ser iguais M = G. Temos P C 6= M, P C = G, M = G. Como Gandalf
no pode ser diferente de si mesmo, impossvel ter simultaneamente a concluso
falsa e todas as premissas verdadeiras, o que significa que o argumento vlido.
(e) Pelo algoritmo do livro:
Palpite: o argumento vlido.
Resoluo: tentar encontrar uma prova. A prova pode ser qualquer uma das apresen-
tadas anteriormente.
Concluso: como conseguimos encontrar uma prova, o argumento sabido vlido.

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

(a) Diagrama de Venn, prova directa:


Para Mithrandir ser um feiticeiro, o conjunto dos feiticeiros tem que o conter. Para
Mithrandir ser Gandalf, ambos tm que ser representados pelo mesmo ponto. Logo,
Gandalf tambm est obrigatoriamente contido no conjunto dos feiticeiros. Assim, o
argumento vlido.
5

Feiticeiros

(b) Diagrama de Venn, prova por reduo ao absurdo:


Para Gandalf no ser feiticeiro, no pode estar contido no conjunto dos feiticeiros.
Para Mithrandir ser um feiticeiro, o conjunto dos feiticeiros tem que o conter. Para
Mithrandir ser Gandalf, ambos tm que ser representados pelo mesmo ponto. Como
Gandalf no pode ser representado simultaneamente por dois pontos diferentes,
impossvel ter simultaneamente a concluso falsa e todas as premissas verdadeiras, o
que significa que o argumento vlido.
Feiticeiros

G G

(c) Forma do argumento, prova directa:


Para Mithrandir ser um feiticeiro, F eiticeiro(M ). Para Mithrandir ser Gandalf M =
G. Logo, possvel substituir M por G na primeira frmula e temos F eiticeiro(G), o
que faz com que seja impossvel ter a concluso falsa, ou seja, F eiticeiro(G). Assim,
o argumento vlido.

(d) Forma do argumento, prova por reduo ao absurdo:


Para Gandalf no ser feiticeiro, temos F eiticeiro(G). Para Mithrandir ser um feiti-
ceiro, temos F eiticeiro(M ). Para Mithrandir ser Gandalf M = G e por isso, F eiticeiro(G).
Como isto contraditrio com primeira frmula, impossvel ter simultaneamente a
concluso falsa e todas as premissas verdadeiras, o que significa que o argumento
vlido.

(e) Pelo algoritmo do livro:


Palpite: o argumento vlido.
Resoluo: tentar encontrar uma prova. A prova pode ser qualquer uma das apresen-
tadas anteriormente.
Concluso: como conseguimos encontrar uma prova, o argumento sabido vlido.

3. Os orcs so feios
Os orcs so feios

(a) Diagrama de Venn, prova directa:


Para os orcs serem feios, o conjunto que os representa tem que estar contido no con-
junto que representa os feios. Para a concluso ser falsa, necessrio que os orcs no
sejam feios, isto , que no estejam contidos no conjunto dos feios. Como isto im-
possvel dada a primeira frase, o argumento vlido.
6 1 ARGUMENTOS E VALIDADE

Feios

Orcs

(b) Diagrama de Venn, prova por reduo ao absurdo:


Vamos supr que os orcs no so feios, isto , que o conjunto que os representa no
est contido no conjunto que representa os feios. Posto isto, possvel ter a premissa
verdadeira, isto , que os orcs sejam feios, ou seja, que estejam contidos no conjunto
dos feios? Como impossvel que o conjunto dos orcs esteja contido e no esteja
contido no conjunto dos feios, o argumento vlido.
Feios

Orcs Orcs

(c) Forma do argumento, prova directa:


Para os orcs serem feios, temos (x)[Orc(x) F eio(x)]. Logo, impossvel termos a
concluso falsa, ou seja (x)[Orc(x) F eio(x)]. Assim, o argumento vlido.
(d) Forma do argumento, prova por reduo ao absurdo:
Vamos supr que a concluso falsa, isto , que (x)[Orc(x) F eio(x)]. Neste caso,
impossvel que a premissa (x)[Orc(x) F eio(x)] seja verdadeira. 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 apresen-
tadas anteriormente.
Concluso: como conseguimos encontrar uma prova, o argumento sabido vlido.

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

(a) Diagrama de Venn, prova directa:


Para Nemo ser um peixe, tem que estar contido no conjunto dos peixes. Para Dori ser
um peixe, tem que estar contida no conjunto dos peixes. Pode ser igual ou diferente
do Nemo. Logo, possvel ter todas as premissas verdadeiras e a concluso falsa, isto
7

, Nemo no ser Dori. Assim, o argumento no vlido.


Peixes

Nemo

Dori

(b) Diagrama de Venn, prova por reduo ao absurdo:


Vamos supr que a concluso falsa, isto , que Nemo no Dori. possvel que
ambos sejam peixes? Sim, no h nada que impea o conjunto dos peixes de conter os
dois. Logo, como possvel ter simultaneamente todas as premissas verdadeiras e a
concluso falsa, o argumento no vlido.
Peixes

Nemo

Dori

(c) Forma do argumento, prova directa:


Para Nemo ser peixe, temos P eixe(N emo). Para Dori ser peixe, temos P eixe(Dori).
Nada nos impede de ter N emo 6= Dori. Logo, como possvel ter simultaneamente
todas as premissas verdadeiras e a concluso falsa, o argumento no vlido.
(d) Forma do argumento, prova por reduo ao absurdo:
Vamos supr que a concluso falsa, isto , que N emo 6= Dori. possvel que ambos
sejam peixes? Sim, no h nada que impea de ter simultaneamente P eixe(N emo) e
P eixe(Dori). Logo, como possvel ter simultaneamente todas as premissas verda-
deiras e a concluso falsa, o argumento no vlido.
(e) Pelo algoritmo do livro:
Palpite: o argumento no vlido.
Resoluo: tentar encontrar um contra-argumento, isto , um argumento com a mesma
forma mas que ns saibamos que invlido.
2 um nmero
5 um nmero
25
Ns sabemos que 2 no 5, logo, este argumento tem todas as premissas verdadeiras
e a concluso falsa, por isso no vlido.
Concluso: como conseguimos encontrar um contra-argumento, o argumento sa-
bido invlido.
Nota: O argumento seguinte tambm no vlido, apesar de ter as mesmas premissas
mas a concluso ser a negao da concluso do anterior. Neste caso, para provar a sua in-
validade deveramos escolher representar o N emo e a Dori no mesmo ponto. O que isto
significa que por sabermos que ambos so peixes no podemos ter a certeza que so o
mesmo nem que so diferentes.
Nemo um peixe
Dori um peixe
Nemo no Dori
8 1 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 con-
junto que representa os vegetarianos, embora os carnvoros e os vegetarianos se pos-
sam 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

(b) Diagrama de Venn, prova por reduo ao absurdo:


Vamos supr que o Bruce um tubaro, o que significa que tem que estar contido no
conjunto que representa os tubares. Para os tubares serem carnvoros, o conjunto
que representa os tubares tem que estar contido no conjunto que representa os carn-
voros. Para os tubares no serem vegetarianos, o conjunto que representa os tubares
no pode estar contido no conjunto que representa os vegetarianos. Para o Bruce ser
vegetariano, tem que estar contido no conjunto que representa os vegetarianos. Isto
impossvel, uma vez que ele um tubaro e os tubares no so vegetarianos. Logo,
como impossvel ter simultaneamente todas as premissas verdadeiras e a concluso
falsa, o argumento vlido.
Carnvoros Vegetarianos

Tubares

Bruce

(c) Forma do argumento, prova directa:


Para os tubares serem carnvoros, temos (x)[T ubarao(x) Carnivoro(x)]. Para
os tubares no serem vegetarianos, temos (x)[T ubarao(x) V egetariano(x)].
Para o Bruce ser vegetariano, temos V egetariano(Bruce). Dadas estas premissas,
obrigatrio que a concluso seja verdadeira, pois se ela fosse falsa e tivssemos
T ubarao(Bruce) ele no seria vegetariano e teramos um a contradio. Logo, o argu-
mento e vlido.
(d) Forma do argumento, prova por reduo ao absurdo:
Vamos supr que a concluso falsa, ou seja, que o Bruce um tubaro T ubarao(Bruce).
Para os tubares serem carnvoros, temos (x)[T ubarao(x) Carnivoro(x)]. Para
os tubares no serem vegetarianos, temos (x)[T ubarao(x) V egetariano(x)].
Para o Bruce ser vegetariano, temos V egetariano(Bruce). Isto impossvel, uma vez
que ele um tubaro e os tubares no so vegetarianos e por isso tambm temos
9

V egetariano(Bruce) que d uma contradio. Logo, como impossvel ter simulta-


neamente 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 apresen-
tadas 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

(b) Diagrama de Venn, prova por reduo ao absurdo:


Vamos supr que a concluso falsa, isto , que os tubares no so animais. poss-
vel que os peixes sejam animais? Sim, no h nada que impea o conjunto dos peixes
de estar contido no conjunto dos animais. Logo, como possvel ter simultaneamente
todas as premissas verdadeiras e a concluso falsa, o argumento no vlido.
Animais

Peixes Tubaroes

(c) Forma do argumento, prova directa:


Para os peixes serem animais, temos (x)[P eixe(x) Animal(x)]. Nada nos impede
de ter (x)[T ubarao(x) Animal(x)]. Logo, como possvel ter simultaneamente
todas as premissas verdadeiras e a concluso falsa, o argumento no vlido.
(d) Forma do argumento, prova por reduo ao absurdo:
Vamos supr que a concluso falsa, isto , que (x)[T ubarao(x) Animal(x)].
possvel que os peixes sejam animais, isto , (x)[P eixe(x) Animal(x)]? Sim, no
h nada que nos impea de ter simultaneamente estas duas frmulas. Logo, como
possvel ter simultaneamente todas as premissas verdadeiras e a concluso falsa, o
argumento no vlido.
(e) Pelo algoritmo do livro:
Palpite: o argumento no vlido.
Resoluo: tentar encontrar um contra-argumento, isto , um argumento com a mesma
10 1 ARGUMENTOS E VALIDADE

forma mas que ns saibamos que invlido.


Os peixes so animais
Os nmeros so animais
Ns sabemos que os nmeros no so animais, logo, este argumento tem todas as pre-
missas verdadeiras e a concluso falsa, por isso no vlido.
Concluso: como conseguimos encontrar um contra-argumento, o argumento sa-
bido invlido.

Exerccio 1.2
Sempre que for possvel, d exemplos de argumentos vlidos e invlidos com:

As premissas verdadeiras e a concluso verdadeira;

As premissas verdadeiras e a concluso falsa;

As premissas falsas e a concluso verdadeira;

As premissas falsas e a concluso falsa.

Resposta:

(prem, concl) Argumento Vlido Argumento Invlido


Os pares so inteiros Os pares so mltiplos de 2
(Verd, Verd) Os pares so inteiros Os mltiplos de 2 so pares

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

As bicicletas so casas Os patins so animais


(Falsas, Falsa) As bicicletas so casas 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
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.

(prem, concl) Argumento Vlido Argumento Invlido


Os pares so inteiros
Os inteiros so nmeros
(Verd, Verd) Os inteiros so nmeros
Os reais so nmeros
Os pares so nmeros

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

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))

5. ({}, ((A B) (B C)) (A C))

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

6 B I, (2, (4, 5))

7 B E, 6
8 (A A) B I, (1, 7)
13

3. ({A B, B A}, A) argumento

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))

4. ({A}, B (A B)) argumento

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.

1. (A (B C)) ((A B) (A C))

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))

10. (A (B C)) ((A B) (A C))

11. ((A B) (A C)) (A (B C))

12. ((A B) A) A

Resposta:

1. (A (B C)) ((A B) (A C))

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

7 A I, (3, (5, 6))

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

7 B I, (3, (6, 5))

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

7 (A B) I, (2, (6, 5))


8 (A B) (A B) I, (1, 7)
16 2 LGICA PROPOSICIONAL SISTEMA DE DEDUO NATURAL

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 I, (2, (5, 6))


8 ((A B) B) A I, (1, 7)

7. (A A) A

1 A A Hip

2 A Hip

3 A A Rei, 1

4 A E, (2, 3)

5 A I, (2, (2, 4))


6 (A A) A I, (1, 5)

8. (A B) (B A)

1 AB Hip

2 A Hip

3 BA I, 2

4 B Hip

5 BA I, 4

6 BA E, (1, (2, 3), (4, 5))


7 (A B) (B A) I, (1, 6)
17

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

8 A (B C) E, (2, (3, 4), (5, 7))

9 C Hip

10 BC I, 9

11 A (B C) I, 10

12 A (B C) E, (1, (2, 8), (9, 11))


13 ((A B) C) (A (B C)) I, (1, 12)

10. (A (B C)) ((A B) (A C))

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

12 (A B) (A C) E, (1, (4, 7), (8, 11))


13 (A (B C)) ((A B) (A C)) I, (1, 12)
18 2 LGICA PROPOSICIONAL SISTEMA DE DEDUO NATURAL

11. ((A B) (A C)) (A (B C))

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 C) E, (1, (2, 6), (7, 11))


13 ((A B) (A C)) (A (B C)) I, (1, 12)

12. ((A B) A) A

1 (A B) A Hip

2 AB Hip

3 A E, 2

4 A Hip

5 A Rep, 4

6 A E, (1, (2, 3), (4, 5))


7 ((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:
19

1. (A B) (A B)

1 (A B) Hip

2 A Hip

3 AB I, 2

4 (A B) Rei, 1

5 A I, (2, (3, 4))

6 B Hip

7 AB I, 6

8 (A B) Rei, 1

9 B I, (6, (7, 8))

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

9 (A B) I, (6, (7, 8)) 9 B Rei, 3

10 B Hip 10 B Rei, 7

11 A B Hip 11 A I, (8, (10, 9))

12 B Rei, 10 12 A E, 11

13 B Rei, 3 13 A E, (4, (5, 6), (7, 12))

14 (A B) I, (11, (12, 13)) 14 A Rei, 2

15 (A B) E, (4, (5, 9), (10, 14)) 15 (A B) I, (4, (13, 14))


16 (A B) (A B) I, (1, 15)
16 A B Rei, 1

17 (A B) I, (4, (16, 15))


18 (A B) (A B) I, (1, 17)
20 2 LGICA PROPOSICIONAL SISTEMA DE DEDUO NATURAL

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

6 A I, (3, (4, 5))

7 A E, 6

8 B Hip

9 A B I, 8

10 (A B) Rei, 2

11 B I, (8, (9, 10))

12 B E, 11

13 AB I, (7, 12)

14 (A B) Rei, 1

15 (A B) I, (2, (13, 14))

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

6 (A B) I, (3, (4, 5)) 6 A Hip

7 B Hip 7 B Hip

8 AB Hip 8 A Rei, 3

9 B E, 8 9 A Rei, 6

10 B Rei, 7 10 B I, (7, (8, 9))

11 (A B) I, (8, (9, 10)) 11 B Hip

12 (A B) E, (1, (2, 6), (7, 11)) 12 B Rep, 11


13 (A B) (A B) I, (1, 12)
13 B E, (5, (6, 10), (11, 12))

14 (A B) I, (2, (4, 13))


15 (A B) (A B) I, (1, 14)
Lgica Proposicional Sistema de Deduo Natural
Prem E
n
.. ..
n Prem . .
m E, n
Hip
ou
n Hip
n
.. ..
. .
m E, n
n+1 ...
I
Rep n
.. ..
n
.. .. . .
. . m I, n
m Rep, n ou
Rei n
.. ..
. .
n m I, n
.. ..
. . E

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

3 Lgica Proposicional Tabelas de Verdade

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:

Satisfazvel Falsificvel Tautolgica


Se tiver pelo menos Contraditria
Se tiver pelo menos Se tiver todas as Se tiver todas as in-
Frmula uma interpretao uma interpretao interpretaes Verda- terpretaes Falsas.
Verdadeira. Falsa. deiras.
A Sim Sim No No
A A No Sim No Sim
A A Sim No Sim No
(A B) (A B) Sim No Sim No
(A B) (A B) Sim Sim No No

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:

{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 con-


sequncias lgicas.
24 3 LGICA PROPOSICIONAL TABELAS DE VERDADE

Resposta:

Considerando que: H representa Homem, M representa M ulher e P representa P essoa.

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

Um modelo de um conjunto de frmulas uma interpretao que satisfaz todas as fbfs


desse conjunto, isto , que as torna todas verdadeiras. Assim, os modelos deste conjunto
de frmulas correspondem s interpretaes que atribuem a Homem, M ulher e P essoa os
valores das colunas respectivas, nas linhas em que o valor da ltima coluna S.
Convm notar que num dos modelos temos como consequncia lgica Homem M ulher,
pois no foi dito nada que o impedisse.
2. As consequncias lgicas de um conjunto de frmulas so as frmulas que tm o valor V
em qualquer modelo do conjunto. Assim, P essoa consequncia lgica deste conjunto,
porque tem o valor V em todos os modelos do conjunto.
Intuitivamente, uma vez que temos Homem M ulher, faz sentido que P essoa seja con-
sequncia lgica do conjunto.
3. Para este novo conjunto, s interessa a metade inferior da tabela, em que Homem tem o
valor F . O modelo o que est assinalado na coluna direita. As consequncias lgicas
deste novo conjunto so infinitas e incluem:
As frmulas que esto no conjunto: Homem, Homem P essoa, M ulher P essoa,
Homem M ulher,
as frmulas atmicas s quais a interpretao atribui o valor verdadeiro: M ulher e
P essoa,
todas as frmulas derivveis a partir das frmulas anteriores: M ulher P essoa,
M ulher Boneca, Homem M ulher, etc.,
todos os teoremas da lgica proposicional: A (B A), (A A) B, A A, etc.
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 fun-
o 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.


25

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

Cada frmula tem sempre o valor verdadeiro independentemente da valorao de A e de B, por


isso so tautologias.
27

4 Lgica Proposicional Resoluo

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 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}}
29

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))


(b) Reduo do domnio de : (((A B) (B C)) (A C))
(((A B) (B C)) (A C))
(A B) (B C) (A C)
(A B) (B C) A C
(A B) (B C) A C
(c) Obteno da forma conjuntiva normal: j est.
(d) Eliminao de : {A B, B C, A, C}
(e) Eliminao de : {{A, B}, {B, C}, {A}, {C}}

Aplicao do princpio da resoluo:


{A, B} {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)))


(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)
(A (B C)) (A B) (A C)
(c) Obteno da forma conjuntiva normal: (A B C) (A B) A C
(d) Eliminao de : {A B C, A B, A, C}
(e) Eliminao de : {{A, B, C}, {A, B}, {A}, {C}}
30 4 LGICA PROPOSICIONAL RESOLUO

Aplicao do princpio da resoluo:


{A, B, C} {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)


(b) Reduo do domnio de : ((A (A B)) A) B
((A (A B)) A) B
(c) Obteno da forma conjuntiva normal: (A A B) A B
(d) Eliminao de : {A A B, A, B}
(e) Eliminao de : {{A, B}, {A}, {B}}

Aplicao do princpio da resoluo:


{A, B} {A} {B}

{B}

{}

3. (A B) (B A)
Passagem para a forma clausal de ((A B) (B A)):
31

(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}}
32 4 LGICA PROPOSICIONAL RESOLUO

Aplicao do princpio da resoluo:


{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

(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:


34 4 LGICA PROPOSICIONAL RESOLUO

{A} {B, C} {A, B} {A, C}

{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))
(d) Eliminao de : {A, B A, A C, B C, A B, A C}
(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 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):

(a) Eliminao de : (((A B) A) A)


(b) Reduo do domnio de : ((A B) A) A
((A B) A) A
(c) Obteno da forma conjuntiva normal: (A A) (B A) A
(d) Eliminao de : {A, B A, A}
(e) Eliminao de : {{A}, {B, A}, {A}}
35

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) 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)):

(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:
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

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

1. Represente a rvore de deciso correspondente.

2. Mostre o BDD reduzido correspondente rvore anterior, apresentando e justifi-


cando todos os passos.

3. Com base no BDD reduzido, diga quais so os modelos de f (P, Q) e compare-os


com os obtidos pela observao da tabela de verdade.

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

1. Represente a rvore de deciso correspondente.

2. Mostre o BDD reduzido correspondente rvore anterior, apresentando e justifi-


cando todos os passos.

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

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

Reconstruindo o resultado atravs das chamadas recursivas ao aplica, obtm-se o OBBD:

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)

Para determinar o OBBD de , necessrio primeiro determinar o OBBD de , que


equivalente a V . Assim, para determinar o OBDD desta frmula, vamos calcular
aplica(, o , aplica(, o , V )).

Comecemos por calcular aplica(, o , V ).

C V

F V
=
B

C V V
V =
F V F
=
C

F V V V
= =
V F

Reconstruindo o resultado atravs das chamadas recursivas ao aplica, obtm-se o OBBD:

V F

Tal como seria de esperar, este OBDD corresponde ao BDD de trocando V por F e
vice-versa.

Para determinar o OBBD de podemos agora calcular aplica(, o , o ).


48 6 LGICA PROPOSICIONAL OBDDS

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

Reconstruindo o resultado atravs das chamadas recursivas ao aplica, obtm-se o OBBD:

B B

C C

V F

3. = (B C) (A B) D

Para determinar o OBDD de , vamos calcular aplica(, o , o ).


49

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

Reconstruindo o resultado atravs das chamadas recursivas ao aplica, obtm-se o OBBD:


50 6 LGICA PROPOSICIONAL OBDDS

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

7 Lgica Proposicional SAT

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

3:V 5:F 6:F 9:V


A B C D

Esta frmula satisfazvel e uma testemunha I(A) = V , I(B) = F , I(C) = F e I(D) = 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

3:V 4:F 5:V


A B C

Esta frmula no satisfazvel porque existem duas marcas contraditrias para B, ou seja,
a frmula corresponde a uma contradio.

2. Se tivessemos a negao da frmula inicial, ((A B) (B (B C))), o DAG seria o


seguinte. Neste caso, apenas seria possvel rotular os dois primeiros ns com o algoritmo
de propagao de marcas. Assim, seria necessrio usar o algoritmo de teste de ns para
tentar encontrar uma testemunha.

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:

Este DAG corresponde frmula ((A B) (B C)) (C (D E)).

1:V

2:V 2:V

11:F
3:F

4:V 12T:V
10:F

5:V 5:V

6:V 8:V

6:V 7:F 9:V 13T:V 13T:V


A B C D 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 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:

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 sa-
tisfazvel, 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} {A, D, E}
bD : {D, B} {A, D}
bA : {B, A}
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:

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 2:V

3:F 4:F

5T:V 8T:F
11T:F

6T:V 9T:F

6T:V 7T:F 10T:V 12T:V


A B C D

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

8 Lgica de Primeira Ordem Sistema de Deduo Natural

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:

1. ({x[F (x)]}, x[F (x)])


1 x[F (x)] Prem
2 F (a) E, 1
3 x[F (x)] I, 2

2. ({x[F (x) G(x)], x[F (x) H(x)]}, x[G(x) H(x)])

1 x[F (x) G(x)] Prem


2 x[F (x) H(x)] Prem
3 x0 F (x0 ) H(x0 ) Hip

4 F (x0 ) E, 3

5 x[F (x) G(x)] Rei, 1

6 F (x0 ) G(x0 ) E, 5

7 G(x0 ) E, (4, 6)

8 H(x0 ) E, 3

9 G(x0 ) H(x0 ) I, (7, 8)

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:

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:
58 8 LGICA DE PRIMEIRA ORDEM SISTEMA DE DEDUO NATURAL

1. (F (a) x[F (x) G(x)]) G(a)

1 F (a) x[F (x) G(x)] Hip

2 F (a) E, 1

3 x[F (x) G(x)] 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)

2. (x[F (x) G(x)] x[G(x) H(x)]) x[F (x) H(x)]

1 x[F (x) G(x)] x[G(x) H(x)] Hip

2 x[F (x) G(x)] E, 1

3 x[G(x) H(x)] E, 1

4 x0 F (x0 ) Hip

5 x[F (x) G(x)] Rei, 2

6 F (x0 ) G(x0 ) E, 5

7 G(x0 ) E, (4, 6)

8 x[G(x) H(x)] Rei, 3

9 G(x0 ) H(x0 ) E, 8

10 H(x0 ) E, (7, 9)

11 F (x0 ) H(x0 ) I, (4, 10)

12 x[F (x) H(x)] I, (4, 11)


13 (x[F (x) G(x)] x[G(x) H(x)]) x[F (x) H(x)] I, (1, 12)

3. (x[F (x) H(x)] y[F (y)]) z[H(z)]

1 x[F (x) H(x)] y[F (y)] Hip

2 x[F (x) H(x)] E, 1

3 y[F (y)] E, 1

4 x0 F (x0 ) Hip

5 x[F (x) H(x)] Rei, 2

6 F (x0 ) H(x0 ) E, 5

7 H(x0 ) E, (4, 6)

8 z[H(z)] I, 7

9 z[H(z)] E, (3, (4, 8))


10 (x[F (x) H(x)] y[F (y)]) z[H(z)] I, (1, 9)
59

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.

1. x[F (x)] x[F (x)]

2. x[F (x)] x[F (x)]

3. x[F (x)] x[F (x)]

4. x[F (x)] x[F (x)]

Resposta:

1. x[F (x)] x[F (x)]

1 x[F (x)] Hip

2 x[F (x)] Hip

3 x0 F (x0 ) Hip

4 x[F (x)] I, 3

5 x[F (x)] Rei, 2

6 F (x0 ) I, (3, (4, 5))

7 F (x0 ) E, 6

8 x[F (x)] I, (3, 7)

9 x[F (x)] Rei, 1

10 x[F (x)] I, (2, (8, 9))

11 x[F (x)] E, 10
12 x[F (x)] x[F (x)] I, (1, 11)

2. x[F (x)] x[F (x)]


60 8 LGICA DE PRIMEIRA ORDEM SISTEMA DE DEDUO NATURAL

ou

1 x[F (x)] Hip 1 x[F (x)] Hip

2 x0 F (x0 ) Hip 2 x[F (x)] Hip

3 x[F (x)] Hip 3 x[F (x)] Rei, 1

4 F (x0 ) E, 3 4 x0 F (x0 ) Hip

5 F (x0 ) Rei, 2 5 x[F (x)] Rei, 2

6 x[F (x)] I, (3, (4, 5)) 6 F (x0 ) E, 5

7 x[F (x)] E, (1, (2, 6)) 7 x[F (x)] Hip


8 x[F (x)] x[F (x)] I, (1, 7)
8 F (x0 ) Rei, 6

9 F (x0 ) Rei, 4

10 x[F (x)] I, (7, (8, 9))

11 x[F (x)] E, (3, (4, 10))

12 x[F (x)] Rei, 1

13 x[F (x)] I, (2, (12, 11))


14 x[F (x)] x[F (x)] I, (1, 13)

3. x[F (x)] x[F (x)]

1 x[F (x)] Hip

2 x0 F (x0 ) Hip

3 x[F (x)] I, 2

4 x[F (x)] Rei, 1

5 F (x0 ) I, (2, (3, 4))

6 x[F (x)] I, (2, 5)


7 x[F (x)] x[F (x)] I, (1, 6)
61

4. x[F (x)] x[F (x)]

1 x[F (x)] Hip

2 x[F (x)] Hip

3 x0 F (x0 ) Hip

4 x[F (x)] Hip

5 F (x0 ) E, 4

6 F (x0 ) Rei, 3

7 x[F (x)] I, (4, (5, 6))

8 x[F (x)] E, (2, (3, 7))

9 x[F (x)] Rei, 1

10 x[F (x)] I, (2, (9, 8))


11 x[F (x)] x[F (x)] I, (1, 10)
Lgica de Primeira Ordem Sistema de Deduo Natural

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

9 Lgica de Primeira Ordem Sistema Semntico

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.
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):

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)
(d) x[P ar(x)]
(e) x[Impar(valor(x))]

2. Diga que alteraes faria na conceptualizao para os resultados serem os intuiti-


vamente esperados. Que mudanas que isso implicaria na interpretao?

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:

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.
2. Para os resultados serem os intuitivamente esperados, alterava as interpretaes de P ar e
Impar: I(P ar) 7 {(X), (C), (D), (M ), (10), (100), (500), (1000)} e I(Impar) 7 {(I), (V ), (1), (5)},
fazendo tambm as correspondentes alteraes na conceptualizao.
3. No poderia ser uma interpretao para esta conceptualizao por cinco razes:
a mesma constante da linguagem (a) tem duas interpretaes diferentes, o que no
pode acontecer;
a constante d tem como valor 20, que no faz parte de D;
f 1 no uma funo, pois tem 2 tuplos em que o primeiro elemento V ;
f 1 no corresponde a nenhum dos elementos da conceptualizao;
a interpretao de R1 no corresponde a nenhuma das relaes da conceptualizao,
pois falta-lhe o ltimo tuplo (M ) para corresponder primeira relao da conceptua-
lizao.

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)}.
66 9 LGICA DE PRIMEIRA ORDEM SISTEMA SEMNTICO

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.

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 = {{(_, _), (_, `), (`, `)}}
67

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) = {(), ( ), (), ( )}

1. Diga, justificando, se esta interpretao para esta conceptualizao um modelo do


seguinte conjunto de frmulas: {x, y[R3(x)R1(x, f 2(y))], R2(f 1(a), d)R3(b)}.

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:

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:
A constante c tem duas interpretaes diferentes.
A interpretao da constante d no pertence ao domnio da conceptualizao.
A funo f 1 tem dois resultados diferentes quando o seu argumento .
A interpretao da funo f 1 no pertence ao conjunto de funes da conceptualiza-
o.
A interpretao da relao R1 no pertence ao conjunto de relaes da conceptualiza-
o.
69

10 Lgica de Primeira Ordem Representao

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)]]
70 10 LGICA DE PRIMEIRA ORDEM REPRESENTAO

8. Se algum gato gostar do Rui, ento o Miau tambm gosta do Rui.


x[Gato(x) Gosta(x, Rui)] Gosta(M iau, Rui)
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 simulta-
neamente.
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.
71

7. x[P (x) y[(P (y) x 6= y) M (y, x)]]


Existe um par que menor do que todos os outros pares.
8. x[P (x) N (x)]
Esta proposio no tem utilidade, pois basta existir um elemento do domnio que no
satisfaa o predicado P (x) para ela ser verdadeira. Est aqui porque um erro que aparece
muito frequentemente nos testes.
72 11 LGICA DE PRIMEIRA ORDEM RESOLUO

11 Lgica de Primeira Ordem Resoluo

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 Conj. Desacordo Substituio
{P (a, x, x), P (a, b, c)} {x, b} {b/x}
{P (a, b, b), P (a, b, c)} {b, c} no unificveis
2. {P (a, x, f (x)), P (x, y, z)}
Conjunto de fbfs Conj. Desacordo Substituio
{P (a, x, f (x)), P (x, y, z)} {a, x} {a/x}
{P (a, a, f (a)), P (a, y, z)} {a, y} {a/y}
{P (a, a, f (a)), P (a, a, z)} {f (a), z} {f (a)/z}
{P (a, a, f (a))}
O unificador mais geral {f (a)/z, a/y, a/x}.
3. {P (x, y), Q(x, y)}
Conjunto de fbfs Conj. Desacordo Substituio
{P (x, y), Q(x, y)} {P, Q} no unificveis
4. {Colocou(x1 , SenhorAneis, y1 ), Colocou(M aria, x2 , topo(y2)), Colocou(x3 , SenhorAneis, topo(M esaAzul))}
Conjunto de fbfs Conj. Desacordo Substituio
{C(x1 , SA, y1 ), C(M, x2 , t(y2)), C(x3 , SA, t(M A))} {x1 , M, x3 } {M/x1 }, {M/x3 }
{C(M, SA, y1 ), C(M, x2 , t(y2)), C(M, SA, t(M A))} {SA, x2 } {SA/x2 }
{C(M, SA, y1 ), C(M, SA, t(y2)), C(M, SA, t(M A))} {y1 , t(y2 ), t(M A)} {t(y2 )/y1 }
{C(M, SA, t(y2 )), C(M, SA, t(M A))} {y2 , M A} {M A/y2 }
{C(M, SA, t(M A))}
O unificador mais geral {M A/y2 , t(M A)/y1 , SA/x2 , M/x1 , M/x3 }.
Nota1: Na primeira linha da tabela foram aplicados dois passos do algoritmo de unificao.
Nota2: No UMG t(M A)/y1 e no t(y2 )/y1 por causa da composio de substituies.

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

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)]

3. x[A(x) y[B(x, y) C(y)]] x[D(x)]

Resposta:

1. x[A(x)] x, y[B(x) w[C(x, y, w)] w[D(w, y)]] x[E(x) F (x)]


(a) Eliminao de : j est.
(b) Reduo do domnio de : j est.
(c) Normalizao de variveis: x[A(x)] y, z[B(y) w[C(y, z, w)] v[D(v, z)]]
u[E(u) F (u)]
(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 ))
(g) Obteno da forma conjuntiva normal: j est.
(h) 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 )}}
2. x[(A(x) y[B(y) C(x, y)]) D(x)]
(a) Eliminao de : x[(A(x) y[B(y) C(x, y)]) D(x)]
(b) Reduo do domnio de : x[A(x) y[B(y) C(x, y)] D(x)]
x[A(x) y[B(y) C(x, y)] D(x)]
(c) Normalizao de variveis: j est.
(d) Eliminao de : j est.
(e) Mover para esquerda: x, y[A(x) B(y) C(x, y) D(x)]
(f) Eliminao de : A(x) B(y) C(x, y) D(x)
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {A(x) B(y) C(x, y) D(x)}
(i) Eliminao de : {{A(x), B(y), C(x, y), D(x)}}
3. x[A(x) y[B(x, y) C(y)]] x[D(x)]
(a) Eliminao de : x[A(x) y[B(x, y) C(y)]] x[D(x)]
(b) Reduo do domnio de : j est.
(c) Normalizao de variveis: x[A(x) y[B(x, y) C(y)]] z[D(z)]
(d) Eliminao de : x[A(x) (B(x, skf1 (x)) C(skf1 (x)))] D(sk1 )
(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 )
(g) Obteno da forma conjuntiva normal: (A(x)B(x, skf1 (x)))(A(x)C(skf1 (x)))
D(sk1 )
(h) Eliminao de : {A(x) B(x, skf1 (x)), A(x) C(skf1 (x)), D(sk1 )}
(i) Eliminao de : {{A(x), B(x, skf1 (x))}, {A(x), C(skf1 (x))}, {D(sk1 )}}
74 11 LGICA DE PRIMEIRA ORDEM RESOLUO

Exerccio 11.3
Considere o seguinte conjunto de clusulas: {{A(x), B(x), C(x)}, {A(x)}, {B(a)}, {A(y), C(y)}}.

1. Apresente uma demonstrao por refutao a partir desse conjunto.

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:

1. Demonstrao por refutao a partir do conjunto:


Uma demonstrao por refutao uma demonstrao de {} a partir do conjunto de clu-
sulas dado.
{A(x), B(x), C(x)} {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), C(x)}

{x/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.
75

{B(a)} {A(x), B(x), C(x)}

{a/x}

{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 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}

{R(a, y), R(y, d)}

{b/y}

{R(b, d)}

{b/x, d/z}

{R(b, y), R(y, d)}

{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

1. ({x[F (x)]}, x[F (x)])


Passagem para a forma clausal de x[F (x)], x[F (x)]:
(a) Eliminao de : j est.
(b) Reduo do domnio de : x[F (x)], x[F (x)]
(c) Normalizao de variveis: x[F (x)], y[F (y)]
(d) Eliminao de : j est.
(e) Mover para esquerda: j est.
(f) Eliminao de : F (x), F (y)
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (x), F (y)}
(i) Eliminao de : {{F (x)}, {F (y)}}
Aplicao do princpio da resoluo:
{F (x)} {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)]
(d) Eliminao de : x[F (x) G(x)], F (a) H(a), z[G(z) H(z)]
(e) Mover para esquerda: j est.
(f) Eliminao de : {F (x) G(x)}, {F (a) H(a)}, {G(z) H(z)}
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (x) G(x), {F (a), H(a), G(z) H(z)}
(i) Eliminao de : {{F (x), G(x)}, {F (a)}, {H(a)}, {G(z), H(z)}}
Aplicao do princpio da resoluo:
{F (x), G(x)} {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.
77

1. (F (a) x[F (x) G(x)]) G(a)


Passagem para a forma clausal de ((F (a) x[F (x) G(x)]) G(a)):
(a) Eliminao de : ((F (a) x[F (x) G(x)]) G(a))
(b) Reduo do domnio de : (F (a) x[F (x) G(x)]) G(a)
F (a) x[F (x) G(x)] G(a)
(c) Normalizao de variveis: j est.
(d) Eliminao de : j est.
(e) Mover para esquerda: x[F (a) (F (x) G(x)) G(a)]
(f) Eliminao de : F (a) (F (x) G(x)) G(a)
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (a), F (x) G(x), G(a)}
(i) Eliminao de : {{F (a)}, {F (x), G(x)}, {G(a)}}
Aplicao do princpio da resoluo:
{F (a)} {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)]
(d) Eliminao de : (x[F (x) G(x)] y[G(y) H(y)]) (F (a) H(a))
(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) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (x) G(x), G(y) H(y), F (a), H(a)}
(i) Eliminao de : {{F (x), G(x)}, {G(y), H(y)}, {F (a)}, {H(a)}}
Aplicao do princpio da resoluo:
{F (x), G(x)} {G(y), H(y)} {F (a)} {H(a)}

{x/y}

{F (x), H(x)}

{a/x}

{H(a)}


{}
78 11 LGICA DE PRIMEIRA ORDEM RESOLUO

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)])
(b) Reduo do domnio de : (x[F (x)H(x)]y[F (y)])z[H(z)])
x[F (x) H(x)] y[F (y)] z[H(z)])
(c) Normalizao de variveis: j est.
(d) Eliminao de : x[F (x) H(x)] F (a) z[H(z)])
(e) Mover para esquerda: x, z[(F (x) H(x)) F (a) H(z)]
(f) Eliminao de : (F (x) H(x)) F (a) H(z)
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (x) H(x), F (a), H(z)}
(i) Eliminao de : {{F (x), H(x)}, {F (a)}, {H(z)}}
Aplicao do princpio da resoluo:
{F (x), H(x)} {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)])
(b) Reduo do domnio de : x[F (x)] x[F (x)]
x[F (x)] x[F (x)]
(c) Normalizao de variveis: x[F (x)] y[F (y)]
(d) Eliminao de : F (a) y[F (y)]
(e) Mover para esquerda: y[F (a) F (y)]
(f) Eliminao de : F (a) F (y)
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (a), F (y)}
(i) Eliminao de : {{F (a)}, {F (y)}}
Aplicao do princpio da resoluo:
{F (a)} {F (y)}

{a/y}

{}
79

2. 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)])
(b) Reduo do domnio de : x[F (x)] x[F (x)]
x[F (x)] x[F (x)]
(c) Normalizao de variveis: x[F (x)] y[F (y)]
(d) Eliminao de : F (a) y[F (y)]
(e) Mover para esquerda: y[F (a) F (y)]
(f) Eliminao de : F (a) F (y)
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (a), F (y)}
(i) Eliminao de : {{F (a)}, {F (y)}}
Aplicao do princpio da resoluo:
{F (a)} {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)])
(b) Reduo do domnio de : x[F (x)] x[F (x)]
x[F (x)] x[F (x)]
(c) Normalizao de variveis: x[F (x)] y[F (y)]
(d) Eliminao de : x[F (x)] F (a)
(e) Mover para esquerda: x[F (x) F (a)]
(f) Eliminao de : F (x) F (a)
(g) Obteno da forma conjuntiva normal: j est.
(h) Eliminao de : {F (x), F (a)}
(i) Eliminao de : {{F (x)}, {F (a)}}
Aplicao do princpio da resoluo:
{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)])
(b) Reduo do domnio de : x[F (x)] x[F (x)]
x[F (x)] x[F (x)]
(c) Normalizao de variveis: x[F (x)] y[F (y)]
(d) Eliminao de : x[F (x)] F (a)
(e) Mover para esquerda: x[F (x) F (a)]
(f) Eliminao de : F (x) F (a)
80 11 LGICA DE PRIMEIRA ORDEM RESOLUO

(g) Obteno da forma conjuntiva normal: j est.


(h) Eliminao de : {F (x), F (a)}
(i) Eliminao de : {{F (x)}, {F (a)}}

Aplicao do princpio da resoluo:


{F (x)} {F (a)}

{a/x}

{}

Exerccio 11.8
Considere as seguintes afirmaes:

Os animais com plos so mamferos.


Os ursos so animais com plos.
Os coelhos so mamferos.
O Kenai um urso.
O Bugsbunny um coelho.
O Sylvester um animal com plos.

1. Represente-as em lgica de primeira ordem.

2. Usando resoluo, responda s seguintes perguntas:

(a) O Kenai mamfero?


(b) Quem que tem plos?
(c) Quais so os mamferos?

Resposta:

1. Em lgica de primeira ordem, ficam:

x[(Animal(x) T emP elos(x)) M amif ero(x)]


x[U rso(x) (Animal(x) T emP elos(x))]
x[Coelho(x) M amif ero(x)]
U rso(Kenai)
Coelho(Bugsbunny)
Animal(Sylvester) T emP elos(Sylvester)

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)}
81

(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}

{Animal(Kenai)} {T emP elos(Kenai)} {Animal(x), T emP elos(x), M amif ero(x)}

{Kenai/x}

{Animal(Kenai), M amif ero(Kenai)}


{M amif ero(Kenai)}

Tambm podemos usar resoluo no formato de prova:

1 {U rso(x), Animal(x)} Prem


2 {U rso(Kenai)} Prem
3 {U rso(x), T emP elos(x)} Prem
4 {Animal(x), T emP elos(x), M amif ero(x)} Prem
5 {Animal(Kenai)} Res, (1, 2), {Kenai/x}
6 {T emP elos(Kenai)} Res, (2, 3), {Kenai/x}
7 {Animal(Kenai), M amif ero(Kenai)} Res, (4, 6), {Kenai/x}
8 {M amif ero(Kenai)} 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)} {Animal(x), T emP elos(x), M amif ero(x)}

{Kenai/x}

{Animal(Kenai), T emP elos(Kenai)} {U rso(x), Animal(x)}

{Kenai/x}

{U rso(Kenai), T emP elos(Kenai)} {U rso(x), T emP elos(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

{U rso(Kenai)} {U rso(x), T emP elos(x)}

{Kenai/x}

{T emP elos(Kenai)} {T emP elos(x), Resposta(x)} {T emP elos(Sylvester)}

{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}

{A(K)} {T P (K)} {A(x), T P (x), M (x)} {A(S)} {T P (S)}

{K/x} {S/x}

{A(K), M (K)} {T P (S), M (S)}


{M (K)} {M (x), R(x)} {M (S)} {C(B)} {C(x), M (x)}

{K/x} {S/x} {B/x}

{R(K)} {R(S)} {M (B)}

{B/x}

{R(B)}
83

12 Programao em Lgica Resoluo SLD; rvores SLD

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.

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)

A resposta ({z/x} {a/z} )|{z} = {a/z}


84 12 PROGRAMAO EM LGICA RESOLUO SLD; RVORES SLD

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.

1. (F (a) x[F (x) G(x)]) G(a)


{{F (a)}, {F (x), G(x)}, {G(a)}}

2. (x[F (x) G(x)] y[G(y) H(y)]) z[F (z) H(z)]


{{F (x), G(x)}, {G(y), H(y)}, {F (a)}, {H(a)}}

3. (x[F (x) H(x)] y[F (y)]) z[H(z)]


{{F (x), H(x)}, {F (a)}, {H(z)}}

Resposta:

1. Clusulas: {{F (a)}, {F (x), G(x)}, {G(a)}}


Clusulas de Horn: F (a)
G(x) F (x)
G(a)
Aplicao da resoluo SLD com o objectivo G(a):
G(a) G(x) F (x)

{a/x}

F (a) F (a)

A resposta ({a/x} )|{} =


2. Clusulas: {{F (x), G(x)}, {G(y), H(y)}, {F (a)}, {H(a)}}
Clusulas de Horn: G(x) F (x)
H(y) G(y)
F (a)
H(a)
Aplicao da resoluo SLD com o objectivo H(a):
H(a) H(y) G(y)

{a/y}

G(a) G(x) F (x)

{a/x}

F (a) F (a)

A resposta ({a/y} {a/x} )|{} =


85

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}

A resposta ({z/x} {a/z})|{z} = {a/z}

Exerccio 12.3
Considere o seguinte conjunto de clusulas:

{Animal(x), T emP elos(x), M amif ero(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)}

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.
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).

M amif ero(Kenai) M amif ero(x1) Animal(x1), T emP elos(x1)

{Kenai/x1}

Animal(Kenai), T emP elos(Kenai) Animal(x2) U rso(x2)

{Kenai/x2}

U rso(Kenai), T emP elos(Kenai) U rso(Kenai)


T emP elos(Kenai) T emP elos(x3) U rso(x3)

{Kenai/x3}

U rso(Kenai) U rso(Kenai)

A resposta ({Kenai/x1} {Kenai/x2} {Kenai/x3} )|{} =

2. Quem que tem plos?

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)

T emP elos(x1) U rso(x1) T emP elos(Sylvester)


{x/x1} {Sylvester/x}

U rso(x)

U rso(Kenai)
{Kenai/x}

Temos duas respostas: {Kenai/x} e {Sylvester/x}, ou seja, o Sylvester e o Kenai tm


plos.

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)

M amif ero(x1) Animal(x1), T emP elos(x1) M amif ero(x5) Coelho(x5)


{x/x1} {x/x5}

Animal(x), T emP elos(x) Coelho(x)

Animal(x2) U rso(x2) Animal(Sylvester) Coelho(Bugsbunny)


{x/x2} {Sylvester/x} {Bugsbunny/x}

U rso(x), T emP elos(x) T emP elos(Sylvester)

U rso(Kenai) T emP elos(x4) U rso(x4) T emP elos(Sylvester)


{Kenai/x} {Sylvester/x4}

T emP elos(Kenai) U rso(Sylvester)

T emP elos(x3) U rso(x3)


{Kenai/x3} impossvel

U rso(Kenai)

U rso(Kenai)

Temos trs respostas: {Kenai/x}, {Sylvester/x} e {Bugsbunny/x}, ou seja, o Kenai, o


Sylvester e o Bugsbunny so mamferos.

Exerccio 12.4
Considere o seguinte conjunto de clusulas de Horn:

A(x) B(x), C(x)


B(x) D(x)
C(x) E(x)
B(a1)
E(a1)
C(a2)
C(a3)
D(a3)

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)

A(x1) B(x1), C(x1)


{x/x1}

B(x), C(x)

C(x2) E(x2) C(a2) C(a3)


{x/x2} {a2/x} {a3/x}

B(x), E(x) B(a2) B(a3)

E(a1) B(x4) D(x4) B(x5) D(x5)


{a1/x} {a2/x4} {a3/x5}

B(a1) D(a2) D(a3)

B(x3) D(x3) B(a1) D(a3)


{a1/x3} impossvel

D(a1)

impossvel

Este objectivo tem duas solues: {a3/x} e {a1/x}.


89

13 Prolog rvores de Refutao; Listas

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:
90 13 PROLOG RVORES DE REFUTAO; LISTAS

1. Para sabermos se o Kenai mamfero, usamos o objectivo mamifero(kenai).

mamifero(kenai).

mamifero(X1) :- animal(X1), tempelos(X1). mamifero(X4) :- coelho(X4).


{kenai/X1} {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}

Temos duas respostas: X = kenai e X = sylvester.

3. Para saber quais so os mamferos, usamos o objectivo mamifero(X).


91

mamifero(X).

mamifero(X1) :- animal(X1), tempelos(X1). mamifero(X5) :- coelho(X5).


{X/X1} {X/X5}

animal(X), tempelos(X). coelho(X).

animal(X2) :- urso(X2). animal(sylvester). coelho(bugsbunny).


{X/X2} {sylvester/X} {bugsbunny/X}

urso(X), tempelos(X). tempelos(sylvester).

urso(kenai). tempelos(X4) :- urso(X4). tempelos(sylvester).


{kenai/X} {sylvester/X4}

tempelos(kenai). urso(sylvester)

tempelos(X3) :- urso(X3).
{kenai/X3} impossvel

urso(kenai).

urso(kenai).

Temos trs respostas: X = kenai, X = sylvester e X = bugsbunny.

Exemplo de uma interaco com o Prolog em que se consulta um ficheiro com este programa e se
fazem algumas perguntas.

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.6.1)


Copyright (c) 1990-2013 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).

?- 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.

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 pedi-


das todas as solues.

1. m(2, [1, 2, 3]).

2. m(X, [1, 2, 3]).

Resposta:

1. m(2, [1, 2, 3]).


93

m(2,[1,2,3]).

m(X1,[_|Xs1]) :- m(X1,Xs1).
{2/X1, [2, 3]/Xs1}

m(2,[2,3]).

m(X2,[X2|_]). m(X3,[_|Xs3]) :- m(X3,Xs3).


{2/X2} {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} {X/X2, [2, 3]/Xs2}

m(X,[2,3]).

m(X3,[X3|_]). m(X4,[_|Xs4]) :- m(X4,Xs4).


{X/X3, 2/X3} {X/X4, [3]/Xs4}

m(X,[3]).

m(X5,[X5|_]). m(X6,[_|Xs6]) :- m(X6,Xs6).


{X/X5, 3/X5} {X/X6, []/Xs6}

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.

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 va-
lor 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 apare-


cerem 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 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).

:- 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).

%% ?- membro(1, [1, 2, 3]).


%% true ;
%% false.
%% ?- membro([2], [1, [2], a]).
%% true ;
%% false.
%% ?- membro(a, [1, b, 3]).
%% false.
%% ?- membro(X, [1, 2, 3]).
%% X = 1 ;
%% X = 2 ;
%% X = 3 ;
%% false.
%% ?- membro(1, Y).
%% Y = [1|_G236] ;
%% Y = [_G235, 1|_G239] ;
%% Y = [_G235, _G238, 1|_G242] ;
%% Y = [_G235, _G238, _G241, 1|_G245] ;
%% Y = [_G235, _G238, _G241, _G244, 1|_G248] ;
%% Y = [_G235, _G238, _G241, _G244, _G247, 1|_G251] ;
%% Y = [_G235, _G238, _G241, _G244, _G247, _G250, 1|_G254]
%% ?- membro(X, Y).
%% Y = [X|_G251] ;
%% Y = [_G250, X|_G254] ;
%% Y = [_G250, _G253, X|_G257] ;
%% Y = [_G250, _G253, _G256, X|_G260] ;
%% Y = [_G250, _G253, _G256, _G259, X|_G263] ;
%% Y = [_G250, _G253, _G256, _G259, _G262, X|_G266] ;
%% Y = [_G250, _G253, _G256, _G259, _G262, _G265, X|_G269]

/*
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]).


96 13 PROLOG RVORES DE REFUTAO; LISTAS

%% 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).

%% ?- sufixo([2, 3], [1, 2, 3]).


%% true ;
%% false.
%% ?- sufixo([2, 3], [1, 2, 2]).
%% false.
%% ?- sufixo(5, 5).
%% true ;
%% false.
%% ?- sufixo(X, [1, 2, 3]).
%% X = [1, 2, 3] ;
%% X = [2, 3] ;
%% X = [3] ;
%% X = [] ;
%% false.
%% ?- sufixo([2, 3], Y).
%% Y = [2, 3] ;
%% Y = [_G247, 2, 3] ;
%% Y = [_G247, _G250, 2, 3] ;
%% Y = [_G247, _G250, _G253, 2, 3] ;
%% Y = [_G247, _G250, _G253, _G256, 2, 3] ;
%% Y = [_G247, _G250, _G253, _G256, _G259, 2, 3]
%% ?- sufixo(X, Y).
%% X = Y ;
%% Y = [_G250|X] ;
97

%% 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

%%% 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).

%% ?- sublista([2, 3], [1, 2, 3, 4]).


%% true ;
%% false.
%% ?- sublista([2, 3], [1, 2, 2, 4]).
%% false.
%% ?- sublista(X, [1, 2, 3, 4]).
%% X = [] ;
%% X = [1] ;
%% X = [1, 2] ;
%% X = [1, 2, 3] ;
%% X = [1, 2, 3, 4] ;
%% X = [] ;
%% X = [2] ;
%% X = [2, 3] ;
%% X = [2, 3, 4] ;
%% X = [] ;
%% X = [3] ;
%% X = [3, 4] ;
%% X = [] ;
%% X = [4] ;
%% X = [] ;
%% false.
%% ?- sublista([2, 3], Y).
%% Y = [2, 3|_G251] ;
%% Y = [_G247, 2, 3|_G254] ;
%% Y = [_G247, _G250, 2, 3|_G257] ;
%% Y = [_G247, _G250, _G253, 2, 3|_G260] ;
%% Y = [_G247, _G250, _G253, _G256, 2, 3|_G263]
%% ?- sublista(X, Y).
%% X = [] ;
%% X = [_G661],
%% Y = [_G661|_G665] ;
%% X = [_G661, _G667],
%% Y = [_G661, _G667|_G671] ;
98 13 PROLOG RVORES DE REFUTAO; LISTAS

%% X = [_G661, _G667, _G673],


%% Y = [_G661, _G667, _G673|_G677] ;
%% X = [_G661, _G667, _G673, _G679],
%% Y = [_G661, _G667, _G673, _G679|_G683] ;
%% X = [_G661, _G667, _G673, _G679, _G685],
%% Y = [_G661, _G667, _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).

%% ?- junta([1, 2], [3, 4], [1, 2, 3, 4]).


%% true.
%% ?- junta([1, 2], [3, 3], [1, 2, 3, 4]).
%% false.
%% ?- junta([1, 2], [3, 4], Z).
%% Z = [1, 2, 3, 4].
%% ?- junta([1, 2], Y, [1, 2, 3, 4]).
%% Y = [3, 4].
%% ?- junta(X, [3, 4], [1, 2, 3, 4]).
%% X = [1, 2] ;
%% false.
%% ?- junta(X, Y, [1, 2, 3, 4]).
%% X = [],
%% Y = [1, 2, 3, 4] ;
%% X = [1],
%% Y = [2, 3, 4] ;
%% X = [1, 2],
%% Y = [3, 4] ;
%% X = [1, 2, 3],
%% Y = [4] ;
%% X = [1, 2, 3, 4],
%% Y = [] ;
%% false.
%% ?- junta(X, [3, 4], Z).
%% X = [],
%% Z = [3, 4] ;
%% X = [_G267],
%% Z = [_G267, 3, 4] ;
%% X = [_G267, _G273],
%% Z = [_G267, _G273, 3, 4] ;
%% X = [_G267, _G273, _G279],
%% Z = [_G267, _G273, _G279, 3, 4] ;
%% X = [_G267, _G273, _G279, _G285],
%% Z = [_G267, _G273, _G279, _G285, 3, 4]
%% ?- junta(X, Y, Z).
%% X = [],
%% Y = Z ;
%% X = [_G270],
%% Z = [_G270|Y] ;
%% X = [_G270, _G276],
%% Z = [_G270, _G276|Y] ;
%% X = [_G270, _G276, _G282],
%% Z = [_G270, _G276, _G282|Y] ;
99

%% 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).

%% ?- seguidos(1, 2, [1, 2, 3]).


%% true ;
%% false.
%% ?- seguidos(1, 2, [2, 2, 3]).
%% false.
%% ?- seguidos(1, Y, [1, 2, 3]).
%% Y = 2 ;
%% false.
%% ?- seguidos(X, Y, [1, 2, 3]).
%% X = 1,
%% Y = 2 ;
%% X = 2,
%% Y = 3 ;
%% false.
%% ?- seguidos(X, Y, Z).
%% Z = [X, Y|_G271] ;
%% Z = [_G273, X, Y|_G271] ;
%% Z = [_G273, _G279, X, Y|_G271] ;
%% Z = [_G273, _G279, _G285, X, Y|_G271] ;
%% Z = [_G273, _G279, _G285, _G291, X, Y|_G271]

/*
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]).


100 13 PROLOG RVORES DE REFUTAO; LISTAS

%% 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.
*/

%%% 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).

%% ?- inverteInicial([1, 2, 3], [3, 2, 1]).


%% true.
%% ?- inverteInicial([1, 1, 1], [3, 2, 1]).
%% false.
%% ?- inverteInicial(X, [3, 2, 1]).
%% X = [1, 2, 3] ;
%% C-c C-c
%% Action (h for help) ? h
%% Options:
%% a: abort b: break
%% c: continue e: exit
%% g: goals t: trace
%% h (?): help
%% Action (h for help) ? a:
101

%% 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).

%% ?- repete([1, 2], [1, 1, 2, 2]).


%% true.
%% ?- repete([1, 2], [1, 2]).
%% false.
102 13 PROLOG RVORES DE REFUTAO; LISTAS

%% ?- repete([1, 2], Y).


%% Y = [1, 1, 2, 2].
%% ?- repete(X, [1, 1, 2, 2]).
%% X = [1, 2].
%% ?- repete(X, [1, 1, 2]).
%% false.
%% ?- repete(X, Y).
%% X = [], Y = [] ;
%% X = [_G256],
%% Y = [_G256, _G256] ;
%% X = [_G256, _G265],
%% Y = [_G256, _G256, _G265, _G265] ;
%% X = [_G256, _G265, _G274],
%% Y = [_G256, _G256, _G265, _G265, _G274, _G274] ;
%% X = [_G256, _G265, _G274, _G283],
%% Y = [_G256, _G256, _G265, _G265, _G274, _G274, _G283, _G283]
103

14 Prolog Operadores Pr-definidos

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
?-
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.

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
%% ?-
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.

1. Gerando um processo recursivo.

2. Gerando um processo iterativo.

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).

%% ?- somalista([1, 2, 3, 4], X).


%% X = 10.
%% ?- somalista([1, -22, 3*4, 4], X).
%% X = -5.
%% ?- somalista([1, -22, 3*4, 4], 4).
%% false.
%% ?-
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).

%% ?- somalista1([1, 2, 3, 4], X).


%% X = 10.
%% ?- somalista1([1, -22, 3*4, 4], X).
%% X = -5.
%% ?- somalista1([1, -22, 3*4, 4], 4).
%% false.
%% ?-

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([X|Xs], Z, [X|Ys]) :- X \= Z, remove(Xs, Z, Ys).


remove([], _, []).

%% ?- 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.
%% ?-

%% A condicao X \= Z e necessaria senao dava varias solucoes como


%% resposta, em que removia todas, todas menos uma, todas menos duas,
%% ..., ate nao remover nenhuma das ocorrencias de X. Por exemplo,

removeErrado([X|Xs], X, Ys) :- removeErrado(Xs, X, Ys).


removeErrado([X|Xs], Z, [X|Ys]) :- removeErrado(Xs, Z, Ys).
removeErrado([], _, []).

%% ?- removeErrado([1, 2, 3, 2], 2, X).


%% X = [1, 3] ;
%% X = [1, 3, 2] ;
%% X = [1, 2, 3] ;
%% X = [1, 2, 3, 2].
%% ?-

%% Na segunda clausula e necessario adicionar X ao resultado na cabeca


%% e nao no corpo da clausula porque se o fizesse no corpo nunca iria
%% emparelhar com o caso base da recursao. Ou seja, a lista do
%% resultado nao seria vazia quando a lista inicial o fosse (so dava o
%% resultado certo nos casos em que este correspondesse a lista vazia).

removeErrado2([X|Xs], X, Ys) :- removeErrado2(Xs, X, Ys).


removeErrado2([X|Xs], Z, Ys) :- X \= Z, removeErrado2(Xs, Z, [X|Ys]).
removeErrado2([], _, []).

%% ?- 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:

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 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 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,
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.

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, lp, 15).


nota(maria, fp, 16).
nota(maria, iaed, 13).
nota(maria, bd, 13).
nota(maria, comp, 17).

nota(pedro, lp, 16).


nota(pedro, fp, 15).
nota(pedro, iaed, 14).
nota(pedro, bd, 14).
nota(pedro, comp, 16).

nota(nuno, lp, 12).


nota(nuno, fp, 13).
nota(nuno, iaed, 15).
nota(nuno, bd, 13).
nota(nuno, comp, 15).
109

/*
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

conta e soma os numeros da lista.


* /
contaESoma([X|Xs], AccElems, AccSoma, Elems, Soma) :-
AccElems1 is AccElems + 1,
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].
112 14 PROLOG OPERADORES PR-DEFINIDOS

?- setof(Nota, Disciplina^nota(maria, Disciplina, Nota), ListaNotas).


ListaNotas = [13, 15, 16, 17].

?- findall(Nota, Disciplina^nota(maria, Disciplina, Nota), ListaNotas).


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).


113

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)].

?- setof(Nota, Disciplina^nota(nuno, Disciplina, Nota), ListaNotas).


ListaNotas = [12, 13, 15].

?- bagof(Nota, Disciplina^nota(nuno, Disciplina, Nota), ListaNotas).


ListaNotas = [12, 13, 15, 13, 15].

?- mediaAluno(nuno).
A media das notas do(a) nuno e 13.6.
true.

?- bagof(Nota, Aluno^nota(Aluno, iaed, Nota), ListaNotas).


ListaNotas = [13, 14, 15].

?- mediaDisciplina(iaed).
A media das notas de iaed e 14.
true.

?- halt.

Process prolog finished


114 15 PROLOG CORTE; NEGAO

15 Prolog Corte; Negao

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 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) :- !.

%% ?- funde([1, 3], [2], X).


%% X = [1, 2, 3].
%% ?- funde([1, 3, 5], [2, 3, 7], X).
%% X = [1, 2, 3, 3, 5, 7].
%% ?- funde(X, Y, [1, 2, 3, 3, 5, 7]).
%% ERROR: </2: Arguments are not sufficiently instantiated
%% Exception: (6) funde(_G229, _G230, [1, 2, 3, 3, 5, 7]) ? a
%% % Execution Aborted
%% ?- funde([1, 3, 3], Y, [1, 2, 3, 3, 5, 7]).
%% ERROR: </2: Arguments are not sufficiently instantiated
%% Exception: (7) funde([1, 3, 3], _G242, [1, 2, 3, 3, 5, 7]) ? a
%% % Execution Aborted
%% ?- funde(X, [1, 3, 3], [1, 2, 3, 3, 5, 7]).
%% ERROR: >/2: Arguments are not sufficiently instantiated
%% Exception: (7) funde(_G241, [1, 3, 3], [1, 2, 3, 3, 5, 7]) ? a
%% % Execution Aborted
%% ?-

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 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.

Considere o seguinte programa em Prolog para reconhecer polinmios.


116 15 PROLOG CORTE; NEGAO

/*
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).

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:
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.

A interaco seguinte ilustra alguns dos problemas:

%% ?- membro3(2, [1, 2, 3]).


%% true.
%% ?- membro3(X, [1, 2, 3]).
%% X = 1.
%% ?- membro3(X, [1, 2, 3]), X=2.
%% false.
%% ?- X=2, membro3(X, [1, 2, 3]).
%% X = 2.
%% ?-

O primeiro objectivo d o resultado esperado.

O segundo objectivo apenas tem uma soluo que corresponde ao primeiro elemento da lista,
quando deveria ter 3 solues.

No terceiro objectivo a resposta false, quando existe a soluo X = 2.

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

%% ?- separa([1, -2, 5, -3], P, N).


%% P = [1, 5],
%% N = [-2, -3].
%% ?- separa([1, -2, 5, -3], [1], N).
%% false.
%% ?- separa([1, -2, 5, -3], [], N).
%% false.
%% ?- separa([1, -2, 5, -3], [1, 5], N).
%% N = [-2, -3].
%% ?- separa([1, -2, 5, -3], P, []).
%% false.
%% ?- separa([1, -2, 5, -3], P, [-2]).
%% false.
%% ?- separa([1, -2, 5, -3], P, [-2, -3]).
%% P = [1, 5].
%% ?- separa(X, [0, 3, 4], [-2, -1]).
%% X = [0, 3, 4, -2, -1] ;
%% false.
%% ?- separa(X, P, [-2, -1]).
%% ERROR: >=/2: Arguments are not sufficiently instantiated
%% Exception: (7) separa(_G220, _G221, [-2, -1]) ? a
%% % Execution Aborted
%% ?- separa(X, [0, 3, 4], N).
%% X = [0, 3, 4],
%% N = [] ;
%% ERROR: </2: Arguments are not sufficiently instantiated
%% ?-

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.

%% ?- ifThenElse(2=:=1+1, writeln(avaliei B), writeln(avaliei C)).


%% avaliei B
%% true.
%%
%% ?- ifThenElse(2==1+1, writeln(avaliei B), writeln(avaliei C)).
%% avaliei C
%% true.
%%
%% ?- ifThenElse(2=:=1+1, 2==1+1, writeln(avaliei C)).
%% false.
%%
%% ?-
119

Convm notar que neste programa a ordem das clusulas relevante.

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.

%% ?- ifThenElse2(2=:=1+1, writeln(avaliei B), writeln(avaliei C)).


%% avaliei B
%% true.
%%
%% ?- ifThenElse2(2==1+1, writeln(avaliei B), writeln(avaliei C)).
%% avaliei C
%% true.
%%
%% ?- ifThenElse2(2=:=1+1, (writeln(avaliei B), fail), writeln(avaliei C)).
%% avaliei B
%% false.
%%
%% ?- ifThenElse2(2=:=1+1, 2==1+1, writeln(avaliei C)).
%% false.
%%
%% ?-

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 ;
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

5. ?- m(1), m(2), m(3).


m(1), m(2), m(3).

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.

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).
124 15 PROLOG CORTE; NEGAO

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(X1, Y1) :- q(X1, Y1). p(a, b).


{X/X1, Y /Y 1} {a/X, b/Y }

q(X, Y).

q(c, d). q(e, f). q(X2, Y2) :- r(X2), !, s(Y2).


{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 }
125

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:
126 15 PROLOG CORTE; NEGAO

w1(X, Y).

w1(X1, Y1) :- !, u(X1), v(Y1).


{X/X1, Y /Y 1}

!, u(X), v(Y).

sem retrocesso at

u(X), v(Y).

u(a). u(b).
{a/X} {b/X}

v(Y). v(Y).

v(1). v(2). v(3). v(1). v(2). v(3).


{1/Y } {2/Y } {3/Y } {1/Y } {2/Y } {3/Y }

w2(X, Y).

w2(X1, Y1) :- u(X1), !, v(Y1).


{X/X1, Y /Y 1}

u(X), !, v(Y).

u(a).
{a/X}

!, v(Y).

sem retrocesso at

v(Y).

v(1). v(2). v(3).


{1/Y } {2/Y } {3/Y }
127

w3(X, Y).

w3(X1, Y1) :- u(X1), v(Y1), !.


{X/X1, Y /Y 1}

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.
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))).

%% ?- disjuntas([a, b, c], [1, 2, 3]).


%% true.
%% ?- disjuntas([1, 2, c], [a, 2, 4]).
%% false.
%% ?-

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.
129

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 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) :- 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 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.

Das könnte Ihnen auch gefallen