2010-07-24 3 views
25

Ma base de connaissances SWI-Prolog contient les deux faits suivants:Pourquoi cette requête prologue est-elle à la fois vraie et fausse?

f(a,b). 
f(a,c). 

Maintenant, si je pose la requête

?- f(a,c). 
true. 

Mais

?- f(a,b). 
true ; 
false. 

Pourquoi f (a, b) à la fois vrai et faux? Cela arrive aussi quand il y a trois faits dans le KB. Si j'ajoute f (a, d). à la KB, alors f (a, d) est vrai (seulement), mais f (a, b) et f (a, c) sont à la fois vrai et faux. Que se passe-t-il, et que puis-je faire pour que Prolog réponde (uniquement) à ces requêtes?

+3

Bon sang, bonne question. –

Répondre

24

(Note: cette réponse est un peu une supposition)

comment Prolog Tenir compte détermine si f(a,c) est vrai ou non. Il vérifie la première règle, f(a,b), et ne trouve pas de correspondance, mais la deuxième règle, f(a,c) correspond. Par conséquent, f(a,c) est vrai. De plus, puisqu'il n'y a plus de règles pour f, il ne sert à rien de permettre un retour en arrière - il n'y a pas d'autres solutions possibles.

Considérez maintenant f(a,b). Prolog vérifie la première règle et trouve une correspondance. Par conséquent, f(a,b) est vrai. Cependant, toutes les règles n'ont pas été épuisées. Par conséquent, Prolog permettra à la recherche de continuer (si vous cliquez sur ;). Lorsque vous continuez la recherche et revenez en arrière, il va découvrir que les règles restantes, spécifiquement f(a,c), ne correspondent pas f(a,b). Par conséquent, le résultat est faux.

+11

Cette réponse est correcte. Dans Prolog, l'ordre dans lequel vos faits sont des règles est écrit détermine l'ordre dans lequel ils seront trouvés par une requête. Plus précisément, l'option 'backtrack' ";" dit essentiellement force le moteur de recherche à ignorer le résultat retourné et à répondre à la question "Y at-il d'autres réponses?". Donc, ce n'est pas que f (a, b) soit à la fois vrai et faux; mais plutôt que c'est vrai et si vous choisissez d'ignorer ce résultat, le moteur vous dira qu'il n'y a pas d'autres entrées de faits f (a, b). Pour le prouver, regardez ce qui se passe si vous ajoutez un deuxième fait f (a, b). – Assaf

+4

Ceci illustre également pourquoi vous devriez faire attention à l'ordre de vos arguments si vous êtes préoccupé par la performance. Si l'ordre des arguments dans le prédicat 'f' était retourné, cela ne serait pas arrivé parce que les arguments initiaux ne sont plus les mêmes, et donc ne laisse pas de point de choix. Cela se produit car la plupart des prologues effectuent l'indexation des arguments, ce qui permet d'anticiper les prédicats avec des arguments incompatibles dans l'espace de recherche. SWI Prolog indexe uniquement le premier argument par défaut, mais cela peut être modifié. – nedned

11

Juste en plus de la réponse de Michael Williamson. Si vous voulez dire Prolog arrêter de chercher des réponses après le premier coup réussi, puis utilisez la coupe (!):

?- f(a, b), !. 
true. 

?- f(a, c), !. 
true. 
Questions connexes