Académique Documents
Professionnel Documents
Culture Documents
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.
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
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
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
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
Linguagem Prolog
Exemplo f(X, g(X,a)) f g X a
Se corpo1 e corpo2 e ... e corpok so verdadeiros ento a cabea verdadeira. Fatos : k = 0 (omitir :- )
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
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).
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).
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
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/pat
No
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
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
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.
15
Linguagem Prolog
Recurso Relao ancestral
X Y parent ancestral
ancestral(X,Y) :- parent(X,Y).
Z1
Z1
Z2
Linguagem Prolog
Recurso Relao ancestral - Exemplo
?- ancestral(tom,liz). Yes ?- ancestral(tom,ann). Yes ?- ancestral(pam,jim). Yes
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).
...
...
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)
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]]).
Linguagem Prolog
Problema : Dada uma lista L, faa um programa que determine se um
certo elemento est presente ou no na lista.
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).
yes
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.
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 = [ ] ;
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.
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 :
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.
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
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.
cut
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
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
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.
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).
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,_)).
36