3. Árvore de Busca - Definição
Uma árvore de busca de uma meta G com relação a um programa
P é definido como:
→ A Raiz da árvore é a meta G
→ Nós são metas (conjuntivas) no qual uma delas foi
selecionada.
→ Há uma aresta levando de cada nó(N) para cada cláusula no
programa que unifica com a meta selecionada
→ Cada ramos da árvore é uma computação da meta G pelo
programa P.
→ Folhas das árvores são Nós de sucesso onde as metas vazias
são encontradas ou nós de falha quando não se pode
continuar (mais reduções)
→ Nós de sucesso mostram o sucesso de uma computação a
partir da raiz.
Obs: Existem N possı́veis árvores para uma dada meta.
3/13
5. Árvore de Busca com Múltiplos Caminhos de Sucesso
Fonte: Shapiro, Sterling. The Art of Prolog
5/13
6. Árvore de Busca com Infinitos (Não Termina)
Fonte: Shapiro, Sterling. The Art of Prolog
6/13
7. Prolog Puro
O conceito de prolog puro está associado ao fato de que as ordens
das cláusulas afeta o resultado da computação, ou seja existe uma
sutil diferença entre um programa lógico e um programa em prolog.
7/13
8. Duas decisões importantes
→ Polı́tica de escolha das metas a serem reduzidas
→ Polı́tica de escolha das cláusulas a serem processadas
Estas polı́ticas também são influenciadas pelo fato de o
interpretador rodar ou não de forma paralela.
8/13
9. Rastreamento de um programa prolog (TRACE/DEBUG)
pai(abraão,isaque).
pai(arão,ló).
pai(arão,milca).
pai(arão,iscá).
homem(isaque).
homem(ló).
mulher(milca).
mulher(iscá).
filho(X,Y) :- pai(Y,X), homem(X).
filha(X,Y) :- pai(Y,X), mulher(X).
9/13
10. META
Suponha que nossa meta seja : filho(X,arão).
a sequência de execução seria :
→ filho(X,arão)
→ pai(arão,X) : { X = ló }
→ homem(ló) : True (V)
→ Saı́da : X = ló
→ Continuar ;
→ pai(arão,X) : { X = milca }
→ homem(milca) : False (F)
→ Continuar ;
→ pai(arão,X) : { X = iscá }
→ homem(iscá) : False (F)
→ Continuar ;
→ Sem mais soluções
→ fim
10/13
12. Caso 2 - Append
Seja o nosso programa para adicionar uma lista na outra.
append([],Ys,Ys).
append([X | Xs],Ys,[X | Zs]) :- append(Xs,Ys,Zs).
Seja a meta: append(X,Y,[a,b,c])
12/13