Question

Je suis nouveau dans Prolog et je pensais juste que pourquoi cette règle me donnait un faux résultat après un vrai.

likes(1,banana).
likes(1,mango).

test :- likes(1,banana),likes(1,mango).

?- test.  
true;  
false.

Je veux connaître la raison derrière ce faux.

Était-ce utile?

La solution

Le fonctionnement du Prolog est d'évaluer les requêtes jusqu'à un échec par négation.

Ici, vous avez établi deux faits:

likes(1, banana). qui dit "Je aime la banane"

likes(1, mango). qui dit "je aime la mangue"

Vous avez ensuite établi une règle, qui évalue essentiellement comme:

left_hand_side :- right_hand_side. left_hand_side si right_hand_side

L'évaluation de la règle en tant que requête essaie de faire correspondre les faits et les retours true Si cela peut, et faux s'il ne peut pas correspondre. Une chose importante à noter est que, s'il est spécifié, Prolog continuera de faire correspondre les faits tant que les règles évaluent à true.

Alors passons à travers test :- likes(1,banana),likes(1,mango).

Si test est géré comme une requête, Prolog essaie d'abord likes(1,banana) qui est un fait précédemment établi et est vrai. Ensuite, il passe à likes(1,mango) Ce qui, encore une fois, est un fait et est vrai. Prolog a ensuite atteint la fin de la règle et des sorties true.

À ce stade, si vous ne recherchez pas plus de matchs, vous pouvez couper la requête court et vous avoir vrai. Cependant, si vous cherchez plus de matchs (tous), Prolog revenir en arrière et essaie d'évaluer à nouveau la règle, à la recherche de plus de correspondances.

Cependant, puisque votre règle ne correspond qu'à "aime la banane et les aime la mangue" et que nous avons déjà égalé likes(1,banana), lorsque Prolog recouvre et essaie d'évaluer likes(1,banana) Encore une fois, comme nous l'avons déjà jumelé avant, cette fois il n'y a pas d'autre fait (en d'autres termes, je ne peux pas "aimer" la banane plus d'une fois, à moins que cela ne soit défini) pour correspondre. C'est donc là que le false vient de.

Dans votre interprète Prolog, vous pourrez peut-être retracer l'exécution de votre programme en tapant trace. puis exécutez votre requête. Ma trace est donnée ci-dessous:

| ?- 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}
| ?-

Une dernière chose à noter: si, au lieu d'appuyer sur ; au true ? Invite, avais-je pressé <ENTER>, le script aurait terminé avec seulement le true.

Je suis content que vous ayez posé cette question parce que cela m'a permis un minuscule rafraîchissement sur Prolog, ce que j'aime vraiment mais que je n'ai pas utilisé depuis longtemps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top