You are on page 1of 36

Programao em Lgica - PROLOG

Bibliografia:
Ivan Bratko, Delfim Torres

ECI, Amlcar Cardoso

PROLOG: PROgramao em LGica


A Lgica como linguagem de programao

Uma forma radicalmente diferente de


programar:
n

Programa:
conjunto de axiomas que descrevem os conhecimentos
e os pressupostos necessrios resoluo de um
problema

Problema
assero lgica a ser demonstrada (objectivo)

Execuo
demonstrao do objectivo com base no programa

ECI, Amlcar Cardoso

PROLOG - 1

Sintaxe e Significado de um
programa PROLOG
n

Clusulas de Horn
n

Frmulas da Lgica de Predicados de


Primeira Ordem que obedecem forma
geral
A 1 A2 An C

Programa em Prolog
n

Conjunto de expecificaes em Clusulas


de Horn

ECI, Amlcar Cardoso

PROLOG - 2

Notao
Lgica de Predicados

PROLOG

,
;
:

conjuno
disjuno
implicao

Exemplos

Ponto!

Jorge gosta de automveis e de avies


gosta_de(jorge, automoveis), gosta_de(jorge, avioes).

Sofia gosta de nadar no vero


gosta_de(sofia, nadar):- estacao_do_ano(verao).
Cabea
ECI, Amlcar Cardoso

Corpo
PROLOG - 3

Termos PROLOG

Termos
Objectos simples

Constantes
tomos

tomos

Variveis

Estruturas

Variveis

Constantes

ana

Manuel

helloWorld

Vila Real

x_25

::=

==>

<---->

Resultado

Objecto

_x13

Varivel annima: _

ECI, Amlcar Cardoso

PROLOG - 4

Termos PROLOG

Termos
Objectos simples

Constantes
tomos

Estruturas

Variveis

Constantes

Estruturas
data( 27, Fevereiro, 2008 )

functor

argumentos

aridade: n de argumentos
data/3 designa a estrutura de functor data e aridade 3

ECI, Amlcar Cardoso

PROLOG - 5

Adequao (matching)
n

Diz-se que dois termos se adequam se


so idnticos ou
existe uma instanciao para as variveis dos dois
termos que os torna idnticos

?-data(D,M,2008) = data(27,fev,A).
D = 27
M = fev
A = 2008
?-data(D,M,2008) = data(D1,fev,A).
D = D1
M = fev
A = 2008
?-data(D,M,2008) = data(27,fev,1997).
no
ECI, Amlcar Cardoso

?- data(D,M,2008) = data(D1, fev).


no
?- data(D,M,2008) = data(D1,fev,A),
data(D,M,A) = data(27,M,A1).
D = 27
D1 = 27
M = fev
A = 2008
A1 = 2008
PROLOG - 6

Listas
n

Lista:
n

Estrutura de dados que


Ou vazia
Ou composta por uma Cabea e uma Cauda,
sendo a Cauda uma lista

Exemplo:
[Cabea | Cauda]
[mesa | [jogo, livro] ]
[mesa, jogo, livro]
[mesa, jogo | [livro] ]

ECI, Amlcar Cardoso

PROLOG - 7

Listas
[a, b, c] = [a, b | [c]] = [a | [b, c]] = [a, b, c | [ ]]
? - [a, b | [c]] = [a | [b, c]].
Yes
? - [a, b, c] = [X | Y].
X=a
Y = [b, c]
? - [a, b, c] = [X, Y | Z]
X=a
Y=b
Z = [c]
ECI, Amlcar Cardoso

? - [a, b, c] = [X, Y, Z | T].


X=a
Y=b
Z=c
T=[]
? - [a, Y, c] = [X | [b, Z]].
X=a
Y=b
Z=c

PROLOG - 8

Operaes sobre Listas


n

? - member(b, [a, b, c]).


yes

member(X, L)
n

X membro de L

member(X, [X | Cauda]).
member(X, [Cabeca | Cauda]):member(X, Cauda).

? - member(X, [a, b]).


X=a;
X=b;
no

Ou:
member(X, [X | _ ]).
member(X, [ _ | Cauda]):member(X, Cauda).

? - member([b, c], [a, [b, c], d]).


yes
Varivel annima

ECI, Amlcar Cardoso

PROLOG - 9

Operaes sobre Listas


n

append(L1, L2, L)
n

L a concatenao
de L1 com L2
[X | L1]

L1

L2
L3

append([ ], L, L).
append([X | L1], L2, [X | L3]):append(L1, L2, L3).
? - append([a, b], [1, 2], L).
L = [a, b, 1, 2]

[X | L3]
ECI, Amlcar Cardoso

PROLOG - 10

Operaes sobre Listas


n
Predicado
Reversvel

Decomposio de
Listas:

? - append(_, [ X, c, Y | _ ],
[a, b, c, d, e, f]).
X=b
Y=d

? - append(L1, L2, [a, b, c]).


L1 = [ ]
L2 = [a, b, c] ;
L1 = [a]
L2 = [b, c] ;

L1 = [a, b, c]
L2 = [ ] ;
no
ECI, Amlcar Cardoso

Pesquisa de Padres:

Membro de Lista:
member1(X, L):append( _ , [ X | _ ], L).

X membro de L se fr possvel
decompor L em duas listas de forma
a que X seja a cabea da segunda

PROLOG - 11

Operaes sobre Listas


n

delete(X, L, Ld)
n

Ld a lista que
resulta de se retirar
X de L

insert(X, L, Li)
n

Li a lista que
resulta de se inserir
X em L

delete(X, [X | L], L).


delete(X, [Y | L], [Y | L1]):delete(X, L, L1).

insert(X, L, Li):delete(X, Li, L).

? - delete(a, [a, b, a, a], L).


L = [b, a, a] ;
L = [a, b, a] ;
L = [a, b, a]
ECI, Amlcar Cardoso

PROLOG - 12

Operaes sobre Listas


n

permutation(L, Lp)
n

Lp uma
permutao de L

L
1

Permuta L...

L1
2

ECI, Amlcar Cardoso

insere X em L1

permutation([ ], [ ]).
permutation([X | L], P) :permutation(L, L1),
insert(X, L1, P).
?- permutation([a,b,c], L).
L = [a, b, c] ;
L = [b, a, c] ;
L = [b, c, a] ;
L = [a, c, b] ;
L = [c, a, b] ;
L = [c, b, a] ;
no
PROLOG - 13

Permutao: esboo procedimental


call permutation([a, b, c], L)
call permutation([b, c], L)
call permutation([c], L)
call permutation([], L)
L=[]
exit permutation([], [])
call insert(c, [], L)
L=[c]
exit insert(c, [], [c])
exit permutation([c], [c])
call insert(b, [c], L)
L=[b, c]
exit insert(b, [c], [b, c])
exit permutation([b, c], [b, c])
call insert(a, [b, c], L)
L=[a, b, c]
exit insert(a, [b, c], [a, b, c])
exit permutation([a, b, c], [a, b, c])

ECI, Amlcar Cardoso

permutation([ ], [ ]).
permutation([X | L], P) :permutation(L, L1),
insert(X, L1, P).

1 Soluo
PROLOG - 14

Permutao: esboo procedimental


redo permutation([a, b, c], [a, b, c])
redo insert(a, [b, c], [a, b, c]) L=[b, a, c]
exit insert(a, [b, c], [b, a, c])
exit permutation([a, b, c], [b, a, c])
redo permutation([a, b, c], [b, a, c])
redo insert(a, [b, c], [b, a, c]) L=[b, c, a]
exit insert(a, [b, c], [b, c, a])
exit permutation([a, b, c], [b, c, a])
redo permutation([a, b, c], [b, c, a])
redo insert(a, [b, c], [b, c, a])
fail insert(a, [b, c], L)
redo permutation([b, c], [b, c])
redo insert(b, [c], [b, c])
L=[c, b]
exit insert(b, [c], [c, b])
exit permutation([b, c], [c, b])
call insert(a, [c, b], L)
L=[a, c, b]
exit insert(a, [c, b], [a, c, b])
exit permutation([a, b, c], [a, c, b])
ECI, Amlcar Cardoso

2 Soluo

permutation([ ], [ ]).
permutation([X | L], P) :permutation(L, L1),
insert(X, L1, P).

3 Soluo

4 Soluo
PROLOG - 15

Significados de uma Clusula


P:- Q, R.
n

Significado declarativo:

P verdade se Q e R forem verdade


de Q e R deduz-se P

Significado procedimental:

para resolver P, resolver primeiro o Q e depois R


para satisfazer P, satisfazer primeiro Q e depois R

ECI, Amlcar Cardoso

PROLOG - 16

Significado Declarativo de um
Programa
Um objectivo G verdadeiro ( consequncia lgica do programa)
se e s se:
existe uma clusula C no programa tal que
existe uma instncia I de C tal que
a) a cabea de I idntica a G e
b) todos os objectivos no corpo de I so verdadeiros
n

Exemplo de um programa:

Quais as respostas?

mortal(X):- humano(X).

? - mortal(socrates).

humano(socrates).

? - mortal(X).

humano(aristoteles).

? - mortal(Professor de ECI).

ECI, Amlcar Cardoso

PROLOG - 17

Significado Procedimental de um
Programa
n

Um programa:

dark(X)?

big(bear).
small(cat).
black(X)?

brown(bear).
black(cat).
dark(Z):- black(Z).
dark(Z):- brown(Z).

dark(X), big(X)

dark(Z):- black(Z).
X=Z
black(X), big(X)

dark(X)?

dark(Z):- brown(Z).
X=Z
brown(X), big(X)
black(X)?

black(cat).
X = cat
big(cat)

fail

brown(bear).
X = bear
big(bear)
big(bear)?

black(cat)?

fail

yes

Resposta: X = bear
ECI, Amlcar Cardoso

PROLOG - 18

Programao declarativa em
Prolog
Uma abordagem
1 Construir o programa de forma declarativa
2 Analisar programa sob o ponto de vista
procedimental
3 Efectuar alteraes se necessrio
n

Exemplo:
n

o problema do macaco e da banana

ECI, Amlcar Cardoso

PROLOG - 19

O Problema do Macaco e da Banana


n
n
n
n
n

Macaco porta da sala


Banana pendurada no centro da sala
Macaco s chega banana se trepar num
banco
H um banco junto janela
O macaco pode:
n deslocar-se pelo cho, empurrar o banco
para qualquer ponto da sala, subir ao
banco, apanhar a banana (se estiver em
cima do banco, no centro da sala!)

ECI, Amlcar Cardoso

PROLOG - 20

O Mundo Macaco
n

Descrio de uma situao:


situacao(Pm, Ch, Pb, B)
n

onde:
Pm o ponto da sala onde est o macaco
Pb o ponto da sala onde est o banco
Ch diz-nos se o macaco est no cho ou em
cima do banco
B diz-nos se o macaco apanhou a banana

ECI, Amlcar Cardoso

PROLOG - 21

O Mundo Macaco
n

Objectivo:
situacao( _, _, _, tem)

Aces (que permitem transitar entre situaes):


Apanhar banana
n Subir ao banco
n Empurrar o banco
n Andar de um ponto para outro
n

ECI, Amlcar Cardoso

PROLOG - 22

O Mundo Macaco
n

Representao para as Aces:


passo( Si, Accao, Sf)

Aco de apanhar banana:


passo(
situacao(centro, sobre-banco, centro, nao_tem),
apanha_banana,
situacao(centro, sobre-banco, centro, tem)).

ECI, Amlcar Cardoso

PROLOG - 23

O Mundo Macaco
n

Aco de subir ao banco:


passo(situacao(Pm, no_chao, Pm, H),
sobe_banco,
situacao(Pm, sobre-banco, Pm, H)).

Aco de empurrar o banco:


passo(situacao(P1, no_chao, P1, H),
empurra_banco(P1, P2),
situacao(P2, no_chao, P2, H)).

ECI, Amlcar Cardoso

PROLOG - 24

O Mundo Macaco
n

Aco de andar de um lado para o


outro:
passo(situacao(P1, no_chao, Pc, H),
anda(P1, P2),
situacao(P2, no_chao, Pc, H)).

ECI, Amlcar Cardoso

PROLOG - 25

O Programa
n

Predicado cumpre_obj(S):
n

Verdade quando possvel ao macaco


apanhar a banana partindo da situao S

cumpre_obj(situacao( _, _, _, tem).
cumpre_obj(S1):passo(S1, Accao, S2),
cumpre_obj(S2).
Desenvolvimento de forma declarativa
ECI, Amlcar Cardoso

PROLOG - 26

Todo o programa
cumpre_obj(situacao( _, _, _, tem).
cumpre_obj(S1):passo(S1, Accao, S2),
cumpre_obj(S2).
passo(situacao(centro, sobre-banco, centro, nao_tem),
apanha_banana, situacao(centro, sobre-banco, centro, tem)).
passo(situacao(Pm, no_chao, Pm, H),
sobe_banco, situacao(Pm, sobre-banco, Pm, H)).
passo(situacao(P1, no_chao, P1, H),
empurra_banco(P1, P2), situacao(P2, no_chao, P2, H)).
passo(situacao(P1, no_chao, Pc, H),
anda(P1, P2), situacao(P2, no_chao, Pc, H)).
ECI, Amlcar Cardoso

PROLOG - 27

Leitura procedimental do
programa
?- cumpre_obj(situacao(porta, no_chao, janela, nao_tem)).
situacao(porta, no_chao, janela, nao_tem)
apanha_banana

sobe_banco

falha

empurra_banco(P1, P2)

falha

anda(porta, P2)

falha

situacao(P2, no_chao, janela, nao_tem)


apanha_banana
falha

sobe_banco

retrocesso

situacao(janela, sobre_banco, janela, nao_tem)


sobe_banco

anda(janela, P2)

falha

falha

apanha_banana
falha

empurra_banco(janela, P2)

empurra_banco(janela, P2)
falha

ECI, Amlcar Cardoso

PROLOG - 28

Leitura procedimental do
programa
?- cumpre_obj(situacao(porta, no_chao, janela, nao_tem)).
situacao(porta, no_chao, janela, nao_tem)
apanha_banana
falha

sobe_banco

empurra_banco(P1, P2)

falha

anda(porta, P2)

falha

situacao(P2, no_chao, janela, nao_tem)


empurra_banco(janela, P2)

P2 = janela

situacao(P2, no_chao, P2, nao_tem)


apanha_banana
falha

sobe_banco
situacao(P2, sobre_banco, P2, nao_tem)
apanha_banana

P2 = centro

situacao(centro, sobre_banco, centro, tem)


ECI, Amlcar Cardoso

PROLOG - 29

Leitura Procedimental
n

Com as clusulas pela ordem


apresentada, o programa prefere:
n
n
n
n

1: apanhar a banana
2: subir ao banco
3: empurrar o banco
4: andar
E se a aco Andar estivesse em primeiro lugar?

ECI, Amlcar Cardoso

PROLOG - 30

Leitura Procedimental
Se a aco Andar estivesse em primeiro lugar,
o Prolog no conseguia encontrar uma soluo :-(
n

E com as clusulas por esta ordem?...


n
n
n
n

1: empurrar o banco
2: apanhar a banana
3: subir ao banco
4: andar

Alterao da ordem das clusulas:


n
n

Programa declarativamente correcto


mas procedimentalmente incorrecto!

ECI, Amlcar Cardoso

PROLOG - 31

Leitura Procedimental
n

Como fazer?
Construir o programa de forma declarativa
n Procurar, no entanto, colocar em primeiro
lugar as clusulas com cabea mais
prxima de uma soluo final
n Se necessrio, reordenar posteriormente
as clusulas
n

ECI, Amlcar Cardoso

PROLOG - 32

Depurao (debugging)
n

Modelo da Caixa de 4 Portas:


call

fail
Programa

exit

ECI, Amlcar Cardoso

redo

PROLOG - 33

Depurao (debugging)
n

Ex.:
dia_bonito:- quente.
dia_bonito:- esta_sol, nao_ha_vento.
quente:- temp(T), T > 20.
nao_ha_vento:- vel_vento(V), V<5.
esta_sol. temp(15).
vel_vento(3).
dia_bonito
c

c
temp

c
e
c

e
ECI, Amlcar Cardoso

c
e

<
quente

esta_sol

c
e

vel_vento
<
nao_ha_vento
PROLOG - 34

Depurao (debugging)
dia_bonito
c
c
temp
e
c

r
f
<
quente

e
?- debug.
yes
??- dia_bonito.
call: dia_bonito
call: quente
call: temp(T)
exit: temp(15)
call: 15 > 20
fail: 15 > 20
redo: temp(T)
fail: temp(T)
fail: quente
ECI, Amlcar Cardoso

c
e
c c
e
c
e

esta_sol
vel_vento
<
nao_ha_vento

call: esta_sol
exit: esta_sol
call: nao_ha_vento
call: vel_vento(V)
exit: vel_vento(3)
call: 3 < 5
exit: 3 < 5
exit: nao_ha_vento
exit: dia_bonito
yes
PROLOG - 35

You might also like