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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top