Vous êtes sur la page 1sur 36

Linguagem Prolog

Prolog uma linguagem de programao utilizada para resoluo de problemas que envolvem objetos e relaes entre objetos. Exemplos

Jos possui um livro. O carro vermelho. Duas pessoas so irms se ambas so do sexo feminino e possuem os mesmos pais.

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
Programar em Prolog consiste de : Declarar alguns fatos sobre os objetos e suas relaes. So declaraes sempre verdadeiras; Definir algumas regras sobre os objetos e suas relaes. Declaraes que so verdadeiras dada que uma condio acontece; Fazer perguntas sobre os objetos e suas relaes. Queremos saber o que verdadeiro. Exemplo Objetos : pam, tom, bob, liz, ann, pat, jim. Relao : female, male, parent, father, mother

parent

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
female(pam). female(liz). female(ann). female(pat). male(tom). male(bob). male(jim). father(tom,bob). father(tom,liz). father(bob,ann). father(bob,pat). mother(pam,bob). mother(pat,jim).

Fatos
parent

parent(pam,bob). parent(tom,bob). parent(tom,liz). parent(bob,ann). parent(bob,pat). parent(pat,jim).


Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
female(pam). female(liz). female(ann). female(pat). male(tom). male(bob). male(jim).

parent(pam,bob). parent(tom,bob). parent(tom,liz). parent(bob,ann). parent(bob,pat). parent(pat,jim). father(X,Y) :- male(X), parent(X,Y). mother(X,Y) :- female(X), parent(X,Y).

Fatos

Regras

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog

Termos - tomos : ann , bob, x_25, inteligncia_artificial, Tom, Joo Carlos, ... - Nmeros : 156, -97, 3.14, -0.67, ... - Variveis : X , L1 , Casa , _12, _bob, ... - Varivel Annima : _ - Objetos Estruturados ou Estruturas : father(X,Y), p(g(Z),a), ...
functor(objeto1, objeto2,..., objeton) functor

objeto1 Exemplo p(a,g(f,t)) a f p g t

objeto2 ... objeton parent(tom,liz) parent tom liz

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
Exemplo f(X, g(X,a)) f g X a

Clusulas Prolog cabea :- corpo1 , corpo2 , , corpok , k 0.

Se corpo1 e corpo2 e ... e corpok so verdadeiros ento a cabea verdadeira. Fatos : k = 0 (omitir :- )

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
Consultas
female( female(pam). pam). female( female(liz). liz). female( female(ann). ann). female( female(pat). pat). male(tom). male(bob). male(jim ). male(jim). parent( parent(pam,bob). pam,bob). parent(tom,bob). parent(tom,bob). parent(tom,liz). parent(tom,liz). parent(bob,ann). parent(bob,ann). parent(bob,pat). parent(bob,pat). parent( parent(pat,jim). pat,jim). father(tom,bob). father(tom,bob). father(tom,liz). father(tom,liz). father(bob,ann). father(bob,ann). father(bob,pat). father(bob,pat). mother( mother(pam,bob). pam,bob). mother( mother(pat,jim). pat,jim).

?- female(liz). Yes ?- male(ann). No ?- parent(bob,pat), mother(pam,bob). Yes ?- parent(X,Y). X = pam Y = bob ; X = tom Y = bob ; X = tom Y = liz ; X = bob Y = ann ; X = bob Y = pat ; X = pat Y = jim ;
Prolog - Joo C. P. da Silva - 2008

?- parent(X,_). X = pam ; X = tom ; X = tom ; X = bob ; X = bob ; X = pat ; No

Linguagem Prolog
Matching Dois termos S e T casam (matching) nos seguintes casos :
1. 2. 3. Se S e T so constantes se representam o mesmo objeto; Se S uma varivel e T qualquer coisa ; Se S e T so estruturas, ento eles casam somente se : a. S e T possuem o mesmo functor principal, e b. Todos os componentes correspondentes casam. Exemplo sum(2). sum(3). sum(X+Y).

?- sum(2). ?- sum(X). ?- sum(5). ?- sum(2+3). ?- s(2).


8

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
Matching
Operador = ?- X = Y. (tente fazer com que X case com Y) Exemplo ?- a(b,C,d(e,F,g(h,i,J))) = a(B,c,d(E,f,g(H,i,j))) . C=c F=f J=j B=b E=e H=h Exemplos ?- ps(A,1) = ps(1,2). ?- int(X,Y,Z) = int(X1,Y1,Z1). ?- let(C) = wo(let).

?- nou(alp) = alp. ?- teste = teste. ?- f(X,X) = f(a,b).


9

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
Operadores Aritmticos
+, - , * , / * e / precedem + e Exemplo : x + y * z equivale a (x + (y * z)) ou +(x,*(y,z)) Exemplo ?- X = 3 + 5. X=3+5 ?- X is 3 + 5. X=8

Comparaes : = , \= , < , > , =< , >=

Prolog - Joo C. P. da Silva - 2008

10

Linguagem Prolog
Consultas
?- parent(X,Y), parent(Y,Z). X/pam,Y/bob
parent( parent(pam,bob). pam,bob). parent(tom,bob). parent(tom,bob). parent(tom,liz). parent(tom,liz). parent(bob,ann). parent(bob,ann). parent( parent(pat,jim). pat,jim). parent(bob,pat). parent(bob,pat).

...
X/tom,Y/bob ?- parent(bob,Z). X/tom,Y/liz ?- parent(bob,Z).

X/bob,Y/pat ?- parent(pat,Z).

?- parent(liz,Z).

Z/jim X = bob Y = pat Z = jim

Z/ann X = pam Y = bob Z = ann

Z/pat

Z/ann Z/pat X = tom Y = bob Z = ann X = tom Y = bob Z = pat

No

X = pam Y = bob Z = pat

Prolog - Joo C. P. da Silva - 2008

11

Linguagem Prolog
Significado Procedural
Seja L = {G1, G2,..., Gm} uma lista de objetivos que devem ser executados. - L vazia : sucesso - Procure a primeira clusula C da forma : H :- B1,...,Bn. tal que a cabea de C case com G1 (primeiro objetivo de L).
Se tal clusula no existe: falha.

- Renomeie as variveis em C, obtendo a clsula C da forma H :- B1,...,Bn tal que as variveis que aparecem em C so diferentes das variveis que aparecem em L. - Case G1 com H, e considere S como o conjunto de substituies usadas neste casamento. - Substitua G1 por B1,...,Bn , obtendo L = {B1,...,Bn, G2,..., Gm}. - Aplique a substituio S em L, obtendo L = {B1,...,Bn, G2,..., Gm}.
Prolog - Joo C. P. da Silva - 2008 12

Linguagem Prolog
Consultas
?- parent(tom,Y), parent(Y,jim). Y / bob ?- parent(bob,jim). Y / liz ?- parent(liz,jim).
parent( parent(pam,bob). pam,bob). parent(tom,bob). parent(tom,bob). parent(tom,liz). parent(tom,liz). parent(bob,ann). parent(bob,ann). parent( parent(pat,jim). pat,jim). parent(bob,pat). parent(bob,pat).

No

No ?- parent(tom,_), parent(_,jim). _ / bob ?- parent(_,jim). _ / pat Yes


Prolog - Joo C. P. da Silva - 2008 13

Linguagem Prolog
Consultas
female( female(pam). pam). female( female(liz). liz). female( female(ann). ann). female( female(pat). pat). male(tom). male(bob). male(jim ). male(jim). parent( parent(pam,bob). pam,bob). parent(tom,bob). parent(tom,bob). parent(tom,liz). parent(tom,liz). parent(bob,ann). parent(bob,ann). parent(bob,pat). parent(bob,pat). parent( parent(pat,jim). pat,jim). father(X,Y) father(X,Y) ::- male(X), parent(X,Y). parent(X,Y). mother(X,Y) mother(X,Y) ::- female(X), female(X), parent(X,Y). parent(X,Y).

?- father(bob,ann).
X / bob , Y / ann

?- male(bob), parent(bob,ann).

?- parent(bob,ann). Yes

Prolog - Joo C. P. da Silva - 2008

14

Linguagem Prolog
Significado Declarativo
Um objetivo G verdadeiro se e somente se existe uma clusula C no programa que possui uma instncia I tal que : (i) a cabea de I idntica a C; (ii) todos os objetivos no corpo de I so verdadeiros.

Prolog - Joo C. P. da Silva - 2008

15

Linguagem Prolog
Recurso Relao ancestral
X Y parent ancestral

ancestral(X,Y) :- parent(X,Y).

Z1

ancestral(X,Y) :- parent(X,Z1), parent(Z1,Y).

Z1

Z2

ancestral(X,Y) :- parent(X,Z1), parent(Z1,Z2), parent(Z2,Y).


Prolog - Joo C. P. da Silva - 2008 16

Linguagem Prolog
Recurso Relao ancestral - Exemplo
?- ancestral(tom,liz). Yes ?- ancestral(tom,ann). Yes ?- ancestral(pam,jim). Yes

ancestral(X,Y) :- parent(X,Y). ancestral(X,Y) :- parent(X,Z1), parent(Z1,Y). ancestral(X,Y) :- parent(X,Z1), parent(Z1,Z2), parent(Z2,Y).


Prolog - Joo C. P. da Silva - 2008 17

Linguagem Prolog
Recurso Relao ancestral - Exemplo
?- ancestral(tom,liz). Yes ?- ancestral(tom,ann). Yes ?- ancestral(pam,jim). Yes ?- ancestral(pam,karl). No ancestral(X,Y) :- parent(X,Y). ancestral(X,Y) :- parent(X,Z1), parent(Z1,Y). ancestral(X,Y) :- parent(X,Z1), parent(Z1,Z2), parent(Z2,Y).
Prolog - Joo C. P. da Silva - 2008 18

Linguagem Prolog
Recurso
parent ancestral

ancestral(X,Y) :- parent(X,Y).

...

...

ancestral(X,Y) :- parent(X,Z), ancestral(Z,Y).

Prolog - Joo C. P. da Silva - 2008

19

Linguagem Prolog
Listas
Seqncia ordenada de elementos. Exemplos [1,3,5,7] [linguagem, de, programacao, prolog] [ [1,5,7] , [a,b,c,d],f(a), 1998] [ ] (Lista Vazia)

Estrutura : [Head | Tail], onde Head o primeiro elemento da lista e


Tail o resto da lista Lista [a,b,c] [] [[o,gato],pula] [o,[gato,pula]] [o,[gato,pula],alto] [X + Y, x + y] Head a [o,gato] o o X+Y
Prolog - Joo C. P. da Silva - 2008

Tail [b,c] [pula] [[gato,pula]] [[gato,pula],alto] [x + y]


20

Linguagem Prolog
Exemplo p([1,2,3]). p([o,gato,pulou,[sobre,a,caixa]]). ?- p([X | Y]). Exemplo ?- Lista1 = Lista2. Lista1 [X,Y,Z] [cat] [X,Y | Z] [[o,Y] | Z] [ouro | T] [vale , horse] Lista2 [john,likes,fish] [X | Y] [mary, likes, wine] [[X,hare],[is,here]] [ouro,norfolk] [horse,X]
21

?- p([_, _, _, [ _ | X]]).

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
Problema : Dada uma lista L, faa um programa que determine se um
certo elemento est presente ou no na lista.

member(X,Y) : verdade se o termo representado por X um membro


da lista representada por Y. Exemplos ?- member(3,[1,2,3,4,5]). yes ?- member(6,[1,2,3,4,5]). no ?- member([3,4],[1,2,3,5,[3,4,5],[3,4]]). yes

Prolog - Joo C. P. da Silva - 2008

22

Linguagem Prolog
Programa
X um membro da lista que tem X como cabea member(X,[X|_]). X um membro da lista se X um membro da cauda da lista member(X,[ _ |Y]) :- member(X,Y).

Exemplos ?- member(c,[a,b,c,d,e]). 2 ?- member(c,[b,c,d,e]). 2 ?- member(c,[c,d,e]). 1

yes

?- member(c,[3,a,4]). 2 ?- member(c,[a,4]). 2 ?- member(c,[4]). 2 ?- member(c,[ ]).

x no
Prolog - Joo C. P. da Silva - 2008 23

Linguagem Prolog
Concatenao append(L1,L2,L3) : L3 uma lista formada pela concatenao das listas L1 e L2. Exemplos append ([a,b],[c,d],[a,b,c,d]) verdadeiro. append ([a,b],[c,d],[a,b,a,c,d]) falso. Lista vazia [ ] concatenada com qualquer lista L, resulta em L. Se o primeiro argumento uma lista no-vazia, ento ele tem uma cabea e uma cauda ([X|L1]). Logo, [X|L3] a concatenao de [X|L1] e L2 se L3 a concatenao de L1 e L2.

Prolog - Joo C. P. da Silva - 2008

24

Linguagem Prolog
Programa append([ ], L, L). append([X|L1], L2, [X|L3]) :- append(L1,L2,L3). Consulta ?- append(L1, L2, [a,b,c]).
L1 = [ ] L1 = [a] L1 = [a,b] L1 = [a,b,c] L2 = [a,b,c] ; L2 = [b,c] ; L2 = [c] ; L2 = [ ] ;

Como podemos programar a relao member usando a relao append ?

X membro de uma lista L se L pode ser decomposto em duas listas, de modo que X a cabea da segunda lista
Prolog - Joo C. P. da Silva - 2008 25

Linguagem Prolog
Acrescentando um Elemento add(X, L, [X|L]) : [X|L] uma lista obtida quando
acrescentamos o elemento X na lista L.

Eliminando um Elemento del(X, L, L1) : L1 a lista obtida a partir de L retirando-se o


elemento X. Casos (a) Se X a cabea da lista L, ento L1 a cauda de L : del(X, [X|Tail],Tail). (b) Se X est na cauda de L, ento devemos retir-lo de l : del(X,[Y|Tail],[Y|Tail1]) :- del(X, Tail, Tail1). Exemplo ?- del(a, [a,b,a,a], L). L = [b,a,a] , L = [a,b,a] , L = [a,b,a].

Prolog - Joo C. P. da Silva - 2008

26

Linguagem Prolog
Permutao perm(L1,L2) : L2 uma permutao da lista L1.
Casos : (a) Se a primeira lista vazia, ento a segunda lista deve tambm ser vazia. (b) Se a primeira lista no vazia, ento ela da forma [X|L] e uma permutao dela pode ser construda : primeiro permute L, obtendo L1 e ento coloque X em qualquer posio em L1.

Programa :

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


Prolog - Joo C. P. da Silva - 2008 27

Linguagem Prolog
Backtracking

Regra 1 : se X < 3 ento Y = 0. Regra 2 : se 3 =< X < 6 ento Y = 2. Regra 3 : se X >= 6 ento Y = 4. Programa : Relao Binria f(X,Y) f(X,0) :- X < 3. f(X,2) :- 3 =< X, X < 6. f(X,4) :- 6 =< X.

Prolog - Joo C. P. da Silva - 2008

28

Linguagem Prolog
Consulta : ?- f(1,Y), 2 < Y.
?- f(1,Y) , 2 < Y. R1 (Y=0) ?- 1 < 3 , 2 < 0. R2 (Y=2) ?- 3 =< 1 , 1 < 6 , 2 < 2. No ?- 2 < 0. No R3 (Y=4) ?- 6 =< 1 , 2 < 4. No

Prolog - Joo C. P. da Silva - 2008

29

Linguagem Prolog
CUT
Evita o backtracking a partir do ponto em que ! aparece. f(X,0) :- X < 3,!. f(X,2) :- 3 =< X, X < 6,!. f(X,4) :- 6 =< X.

Consulta : ?- f(1,Y) , 2 < Y.


?- f(1,Y) , 2 < Y R1 (Y=0) ?- 1 < 3 , ! , 2 < 0 ?- ! , 2 < 0 Tenta retornar mas no passa do ponto marcado por '!'. Os demais ramos da ?- 2 < 0 rvore no so gerados. No

cut

Prolog - Joo C. P. da Silva - 2008

30

Linguagem Prolog
Consulta : ?- f(7,Y).
- Regra 1 : 7 < 3 falha, backtracking. (! no alcanado) - Regra 2 : 3 =< 7 sucesso, mas 7 < 6 falha, backtracking. - Regra 3 : 6 =< 7 sucesso. - Resposta : Y = 4. Programa reformulado : Se X < 3 ento Y = 0 Caso contrrio, Se X < 6 ento Y = 2 Caso contrrio, Y = 4. f(X,0) :- X < 3, !. f(X,2) :- X < 6, !. f(X,4). Obtm as mesmas respostas do anterior mas mais eficiente. f(X,0) :- X < 3. f(X,2) :- X < 6. f(X,4). Produz mltiplas solues algumas das quais incorretas.
31

Prolog - Joo C. P. da Silva - 2008

Linguagem Prolog
Consulta : ?- f(1,Y).
Programa com cut : - Casa f(1,Y) com a cabea da regra 1 (f(X,0)) : X = 1, Y = 0. - (1 < 3) satisfeito e o cut atingido. - Resposta Y = 0. - Nenhum outro casamento tentado. Programa sem cut : - Casa f(1,Y) com a cabea da regra 1 (f(X,0)) : X = 1, Y = 0. - (1 < 3) satisfeito. - Resposta Y = 0. - Casa f(1,Y) com a cabea da regra 2 (f(X,2)) : X = 1, Y = 2. - (2 < 6) satisfeito. - Resposta Y = 2. - Casa f(1,Y) com a cabea da regra 3 (fato : f(X,4)) : X = 1, Y = 4. - Resposta Y = 4. - No temos mais regras/fatos com que casar f(1,Y). - Resposta : no.
Prolog - Joo C. P. da Silva - 2008 32

Linguagem Prolog
member(X,[X | _ ]). member(X,[ _ | L]) :- member(X,L). ?- member(X,[a,b,c]). 1 2 X=a ?- member(X,[b,c]). 1 2 X=b ?- member(X,[c]). 1 2 X=c ?- member(X,[ ]). no

member1(X,[X | _ ]) :- !. member1(X,[ _ | L]) :- member1(X,L). ?- member1(X,[a,b,c]). 1 X=a


Prolog - Joo C. P. da Silva - 2008 33

Linguagem Prolog
Objetivo G casa com H onde : H :- B1, B2, , Bm, !, , Bn. Encontra ! : - O sistema j encontrou alguma soluo para B1, B2, , Bm. Executa ! : - As solues correntes para B1, B2, , Bm ficam fixas e todas as alternativas so descartadas. - Outras clusulas que casam com G tambm so descartadas.

Prolog - Joo C. P. da Silva - 2008

34

Linguagem Prolog
Exemplo Jogadores = {a,b,c,d} Categorias = {vencedor, lutador, perdedor} Fatos : vencer(a,b). vencer(c,a). vencer(d,b). Perguntas : Quem so vencedores, lutadores e perdedores ?

Se X venceu algum e perdeu para algum ento X um lutador c.c. se X venceu algum ento X um vencedor c.c. X um perdedor Programa :
categ(X,lutador) :- vencer(X,_), vencer(_,X), !. categ(X,vencedor) :- vencer(X,_), !. categ(X,perdedor) :- vencer(_,X).

Prolog - Joo C. P. da Silva - 2008

35

Linguagem Prolog
not(GOAL) ou \+(GOAL) verdadeiro se GOAL no verdadeiro. Se GOAL bem sucedido ento not(GOAL) falha ; c.c. not(GOAL) bem sucedido. not(P) :- P, !, fail. not(P). Exemplo categ(X,lutador) :- vencer(X,_), vencer(_,X). categ(X,vencedor) :- vencer(X,_), not(vencer(_,X)). categ(X,perdedor) :- vencer(_,X), not(vencer(X,_)).

Prolog - Joo C. P. da Silva - 2008

36

Vous aimerez peut-être aussi