A compreensão de regras - falso como resposta
-
14-11-2019 - |
Pergunta
Eu sou novo no Prólogo e eu estava só pensando que, por essa regra me dando resultado falso depois de um verdadeiro.
likes(1,banana).
likes(1,mango).
test :- likes(1,banana),likes(1,mango).
?- test.
true;
false.
Eu quero saber a razão por trás deste falso.
Solução
A forma de prólogo funciona é através da avaliação de consultas, até que uma falha por negação.
Aqui, você estabeleceu dois fatos:
likes(1, banana).
que diz "1 gosta de banana"
likes(1, mango).
que diz "1 gosta de manga"
Depois de ter estabelecido uma regra, que basicamente avalia como:
left_hand_side :- right_hand_side.
left_hand_side
se right_hand_side
Avaliação do estado como uma consulta tenta corresponder a fatos e retorna true
se ele pode, e falso se ele não pode corresponder.Uma observação importante é que, se especificado, prolog irá continuar a corresponder fatos enquanto as regras de avaliar a true
.
Então, vamos passo a passo através de test :- likes(1,banana),likes(1,mango).
Se test
é executado como uma consulta, o prolog tenta primeiro likes(1,banana)
o que é previamente estabelecido verdade, e é verdade.Em seguida, ele se move para likes(1,mango)
o que, novamente, é um fato, e é verdade.Prólogo que foi atingido o fim da regra, e saídas true
.
Neste ponto, se você não está procurando por mais jogos você pode cortar a consulta curto e verdadeiro.No entanto, se você estiver procurando mais (todos) corresponde, prolog backtracks e tenta avaliar a regra novamente, procurando por mais jogos.
No entanto, desde a sua regra é apenas a correspondência de "gosta de banana e gosta de manga" e nós já correspondidas likes(1,banana)
, quando prólogo backtracks e tenta avaliar likes(1,banana)
novamente, desde que já foi combinado antes, desta vez, não há outro fato (em outras palavras, o 1 não pode "como" banana mais de uma vez, a menos que tenha sido definido) para correspondência.Então, é onde o false
vem.
Em seu prólogo do interpretador você pode ser capaz de rastrear a execução de seu programa digitando trace.
em seguida, executar a sua consulta.Meu traço é dado abaixo:
| ?- trace
.
The debugger will first creep -- showing everything (trace)
(1 ms) yes
{trace}
| ?- test.
1 1 Call: test ?
2 2 Call: likes(1,banana) ?
2 2 Exit: likes(1,banana) ?
3 2 Call: likes(1,mango) ?
3 2 Exit: likes(1,mango) ?
1 1 Exit: test ?
true ? ;
1 1 Redo: test ?
2 2 Redo: likes(1,banana) ?
2 2 Fail: likes(1,banana) ?
1 1 Fail: test ?
(1 ms) no
{trace}
| ?-
Uma última coisa a se notar:Se, em vez de pressionar ;
no true ?
prompt, se eu tivesse pressionado <ENTER>
, o script teria terminado com apenas o true
.
Estou feliz que você fez esta pergunta porque ele me permitiu uma pequena atualização sobre o prolog, que eu realmente gosto, mas ainda não utilizado por um longo tempo.