web-dev-qa-db-fra.com

Quelle est la différence entre == et = dans Prolog?

Quelqu'un peut-il expliquer la différence entre le == et le = opérateur à Prolog? Je le sais X = Y signifie que X s'unifie avec Y et est vrai si X s'unifie déjà avec Y ou peut être fait, mais je ne comprends pas en quoi cela diffère de ==.

Suivi: Cela (voir Réponse acceptée) est logique. Encore une question, est-ce qu'il y a jamais une situation où X \= Y est vrai et X \== Y est faux (ou vice-versa)? C'est-à-dire, X \= Y tester s'ils ne peuvent pas être unifiés ou s'ils ne le sont pas actuellement?

30
JohnS

L'opérateur = "dans Prolog est en fait un prédicat (avec notation infixe) =/2 qui réussit lorsque les deux termes sont unifiés. Ainsi X = 2 Ou 2 = X Reviennent à la même chose, un objectif d'unifier X avec 2.

L'opérateur == diffère en ce qu'il ne réussit que si les deux termes sont déjà identiques sans autre unification. Ainsi, X == 2 N'est vrai que si la variable X avait précédemment reçu la valeur 2.

Ajouté: Il est intéressant de voir ce qui se passe lorsque "non" est mélangé à ces objectifs, selon le commentaire de JohnS ci-dessous. Voir le Nice ensemble d'exemples dans l'Amzi! Documentation Prolog.

\= Signifie que les deux termes ne peuvent pas être unifiés, c'est-à-dire que l'unification échoue. Comme pour toutes les applications de négation comme échec, "non unifié" n'entraîne (et ne peut pas) entraîner une unification entre les termes.

\== Signifie que les deux termes ne sont pas identiques. Ici aussi, aucune unification n'a lieu même si cela réussit.

Enfin, réfléchissez à ce que not(not(X = Y)) fera. Le but intérieur réussit si X et Y (qui peuvent être des termes arbitraires) peuvent être unifiés, tout comme la double négation de cela. Cependant, envelopper le but intérieur à l'intérieur de la double négation produit un objectif qui réussit si les deux termes peuvent être unifiés mais sans unifier ces termes.

Il est laissé comme exercice au lecteur de se demander si not(not(X == Y)) a une utilité similaire.

33
hardmath

= signifie unification, cela signifie qu'il essaiera de lier les variables libres pour les faire correspondre aux autres membres. par exemple: A = h(X) transformera A en terme h(X) si A est libre, et échouera si A est lié à dis 5. l'unification est géniale parce que vous pouvez faire des correspondances avec elle, par exemple:

X-Y:Z = 5-[a, b, c]:y

te donnera

X = 5, Y = [a, b, c] and Z = y

parce que prolog essaie de faire correspondre X-Y: Z à l'expression 5- [a, b, c]: y. C'est très utile.

Notez que l'unification est utilisée lorsque vous appelez un prédicat et que certaines techniques s'ensuivent: disons que vous voulez renvoyer la valeur d'un accumulateur dans un prédicat récursif, vous pouvez le faire:

recursive_predicate([], Accumulator, Accumulator).
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff.

la première clause tentera d'unifier les troisième et deuxième arguments, donc si le troisième est libre, il a maintenant la même valeur que le second.

== est égalité sans essayer de lier les variables.

5
m09