O documento apresenta exemplos de recursividade em Prolog, incluindo recursividade normal, iterativa e acumulador. Também mostra o uso de corte (!) para podar a árvore de busca e melhorar a eficiência, destacando a diferença entre corte verde e corte vermelho. Por fim, explica brevemente tipos, predicados meta-lógicos e extra-lógicos em Prolog.
6. Acumulador
Observem bem como funciona o acumulador em prolog.
contar(0,0).
?contar(N,K):-N>0, N1 is N -1, write(N1), contar(N1,K).
contar(50,X)
contar(0,0).
contar(N,J):-N>0, N1 is N - 1, J1 is J + 1, write(J1),
contar(N1,J1).
?contar(50,0)
6/19
8. CUT - !
Podando a árvore de busca evitando o backtrack.
max(A, B, A) : −A >= B.
max(A, B, B) : −A < B.
Vamos abri-lo no SWI ligando o trace.
Observemos quantas iterações foram feitas.
Em Python:
if A >= B :
return A
if A < B :
return B
8/19
9. CUT - !
Agora vamos fazer uma pequena modificação e verificar com trace.
Vejamos o exemplo.
maior(X, Y , X) : −X >= Y , !.
maior(X, Y , Y ).
Vamos abri-lo no SWI ligando o trace. Observemos quantas
iterações foram feitas.
Em Python:
if A >= B :
return A
else:
return B
9/19
10. CUT - !
Usando a disjunção explı́cita no prolog teremos
maior(X, Y , Z) : −X >= Y , !, Z is X; Z is Y .
10/19
11. CUT - !
Uso do Cut não é obrigatório em muitos casos.
11/19
12. GREEN CUT X RED CUT
O dito Green cut que não altera o significado (meaning) do
programa. Usado apenas para melhorar a eficiência do mesmo. Ao
contrário do Red Cut que altera o significado do programa.
Ex.
Red Cut
maior(X, Y , X) : −X >= Y , !.
maior(X, Y , Y ).
Green Cut
maior(X, Y , X) : −X >= Y , !.
maior(X, Y , Y ) : −X < Y , !.
12/19
13. Red Cut - Significado Incorreto
Até aqui estava tudo bem, mas o Red Cut na verdade tornou este
programa incorreto.
maior(X, Y , X) : −X >= Y , !.
maior(X, Y , Y ).
Vejamos o que acontece se usarmos metas sem variáveis. Tipo
maior(21,20,20). Veja o que acontece.
13/19
15. Negação - fail
fail é uma meta que sempre falha em prolog. Costumeiramente
usada com cut. Vejamos um exemplo de uso:
dif (X, X) : −!, fail.
dif ( , ) : −!.
15/19
16. Cutting
Vamos dar um ”cut”aqui no curso pra mostrar mais algumas
particularidades dos ambientes prolog.
16/19
17. Tratamentos de Tipos - types - em prolog
atom, integer, number, functor — verifique a sua distribuição
17/19
18. Predicados Meta Lógicos
Predicados para usados em controle lógico dos programas.
Exs.
var(X) - Verifica se um termo é uma variável.
nonvar(X) - Faz o contrário.
unify(X,Y). - Realiza a unificação.
etc.
18/19
19. Predicados Extra Lógicos
Predicados relacionados a funções não lógicas (E/S por exemplo).
write() - Escreve no terminal.
getc() ou read() - Lê arquivos ou textos do terminal.
etc...
19/19