Ambiente de programação lógica \alert{pura}
- Ordem de resolução de cláusulas é indeterminada
- As combinações poderiam ser testadas \alert{em paralelo}
Em Prolog, a resolução é \alert{determinista}
- De cima para baixo
- Da esquerda para a direita
Podemos afetar o desempenho do motor de inferência
- Reordenar as cláusulas para otimizar um tipo de consulta
- Colocar as cláusulas mais “verdadeiras” primeiro
Laços infinitos podem ser evitados
Motor de Inferência
- Faz uma busca exaustiva para encontrar todas as verdades
- Ao encontrar falso, faz um retrocesso, e continua
pais(brasil).
cidade(brasilia).
capital(brasil, brasilia).
capital(brasil, brasilia).
capital_pais(X,Y) :- pais(X), cidade(Y), capital(X,Y).
Pergunta: capital_pais(brasil,X).
nos traz o que? ./corta_01.pl
Operador !
retorna sempre verdadeiro, mas desabilita retrocesso anterior.
Vejamos o caso do arquivo: ./corta_02.pl
Um exemplo geral
a, b, !, c, d
Se a
e b
são verdade, mas c
não, tudo é falso, ou seja
o corte pode ser utilizado para explicitar que
não vale a pena reavaliar a
e b
Desvantagens do operador de corte?
- Influência do modelo imperativo
- Analogia ao uso de
goto
Prolog é impuro pois tem resolução determinista
- Reordernar cláusulas
- Utilizar o corte para controlar o processo de busca
Principal razão: Eficiência