next up previous
Next: About this document ...


Programação Prolog



Programação Prolog



Programação Prolog: A Linguagem - Sintaxe



Programação Prolog: A Linguagem - Sintaxe



Programação Prolog: Exemplo simples


parent(C,M,F) :- mother(C,M),father(C,F).

mother(john,ann).
mother(mary,ann).
father(mary,fred).
father(john,fred).    female(mary).

Consulta: 

?- female(mary),parent(mary,M,F),parent(john,M,F).



Programação Prolog: Exemplo simples - observações



Árvore de Execução para exemplo simples

3#3



Programação Prolog: Outras estruturas de Dados



Programação Prolog: igualdades de listas

[X,Y,Z] = [john,likes,fish] X=john, Y=likes, Z=fish
[cat] = [X4#4Y] X=cat, Y=[]
[] = [X4#4Y] sempre falha!!!



Programação Prolog: Árvores



Programação Prolog: obtenção de múltiplas soluções



Backtracking - Exemplo


avo_ou_avo'(X,Y) :- pai_ou_mae(X,Z), pai_ou_mae(Z,Y).

pai_ou_mae(jane,charles).
pai_ou_mae(john,mary).
pai_ou_mae(fred,jane).
pai_ou_mae(jane,john).

consulta: ?- avo_ou_avo'(jane,mary).



Backtracking - Árvore de execução do Exemplo


5#5



O Operador de Corte - ! ( cut)



O Operador de Corte - comentários sobre exemplos



Alguns Predicados Pré-definidos



Alguns Predicados Pré-definidos



Entrada de Novas cláusulas



Outros predicados pré-definidos



Manipulação de Listas



Manipulação de Listas



Manipulação de Listas



Manipulação de Listas



Manipulação de Listas



Manipulação de Listas



Manipulação de Listas



Árvore Binária: Busca e Inserção



Dicionário binário ordenado


/* chave foi encontrada ou e' inserida */
lookup(K,arvbin(K,_,_,I),I).
/* chave ainda nao foi encontrada, pode estar na
   sub-arvore da esquerda, se for menor do que
   a chave corrente, ou na sub-arvore da direita,
   se for maior do que a chave corrente.
*/
lookup(K,arvbin(K1,E,_,I1),I) :-
     K < K1, lookup(K,E,I).
lookup(K,arvbin(K1,_,D,I1),I) :-
     K > K1, lookup(K,D,I).



Meta-interpretador Prolog para Prolog



Meta-interpretador Prolog para Prolog


/* a interpretacao do termo basico true 
   deve ser sempre satisfeita (axioma)
*/
interp(true).
/* a interpretacao de uma conjuncao e'
   satisfeita, se a interpretacao de cada
   termo/literal da conjuncao for satisfeita
*/
interp((G1,G2)) :- 
      interp(G1),
      interp(G2).
/* a interpretacao de uma disjuncao e'
   satisfeita, se pelo menos uma interpretacao 
   de alguma disjuncao for satisfeita
*/
interp((G1;G2)) :- 
      interp(G1);
      interp(G2).
/* a interpretacao de um literal simples
   e' satisfeita, se o literal existir no
   programa e seu antecedente for satisfeito
*/
interp(G) :-
      clause(G,B),
      interp(B).



Busca em Grafos



Busca em Grafos



Busca em Grafos



Busca em Grafos



Busca em Grafos: Programa


/* Chegar de A a Z, retornando caminho percorrido P,
   comecando de um caminho vazio
*/
path(A,Z,P) :- path1(A,Z,[],P).

/* Se ja' cheguei ao destino, parar a busca e incluir
   destino na lista contendo o caminho percorrido */
path1(Z,Z,L,[Z|L]).

/* Se ainda nao cheguei no destino, encontrar caminho
   parcial de A para Y, verificar se este caminho
   e' valido (isto e', ja' passei por Y antes?). Se for
   um caminho valido, adicionar `a lista contendo o
   caminho parcial e continuar a busca a partir de Y
*/
path1(A,Z,L,P) :-
      (conectado(A,Y);    /* encontra caminho parcial */
       conectado(Y,A)),   /* de A para Y ou de Y para A */
      \+ member(Y,L),     /* verifica se ja passei por Y */
      path1(Y,Z,[Y|L],P). /* encontra caminho parcial de */
                          /* Y a Z */





next up previous
Next: About this document ...
Ines de Castro Dutra
2000-01-10