Was ist der Unterschied zwischen == und = in Prolog?

  • Kann jemand in Prolog den Unterschied zwischen dem Operator == und dem Operator = erklären? Ich weiß, dass X = Y bedeutet, dass X mit Y vereinigt ist und wahr ist, wenn X bereits mit Y vereinigt wird oder gemacht werden kann, aber ich verstehe nicht, wie sich dies von == unterscheidet

    Follow-up: Das (siehe Akzeptierte Antwort) ist sinnvoll. Eine weitere Frage: Gibt es jemals eine Situation, in der X \= Y wahr ist und X \== Y falsch ist (oder umgekehrt)? Das heißt, prüft X \= Y, ob sie nicht vereinheitlicht werden können oder aktuell nicht vereinheitlicht sind?

    26 May 2015
    hardmath
2 answers
  • Der Operator "=" in Prolog ist eigentlich ein Prädikat (mit Infix-Notation) = / 2 , das erfolgreich ist, wenn die beiden Terme vereinheitlicht sind. Somit ist X = 2 oder 2 = X dasselbe, ein Ziel, X mit 2 zu vereinheitlichen.

    Der Operator == "" unterscheidet sich nur dadurch, dass die beiden Begriffe sind bereits ohne weitere Vereinheitlichung identisch. X == 2 ist also nur dann wahr, wenn der Variablen X zuvor der Wert 2 zugewiesen wurde.

    Hinzugefügt: Es ist interessant, durchzuarbeiten, was passiert Wenn "nicht" in diese Ziele eingemischt wird, lesen Sie den Kommentar von JohnS. Sehen Sie sich die schönen Beispiele in der Amzi an! Prolog-Dokumentation.

    \= bedeutet, dass die beiden Begriffe nicht vereinheitlicht werden können, d. H. Die Vereinheitlichung schlägt fehl. Wie bei allen Anwendungen der Negation als Fehlschlag führt "nicht vereinheitlicht" nicht zu einer Vereinheitlichung der Begriffe.

    \== bedeutet, dass die beiden Begriffe nicht identisch sind. Auch hier findet keine Vereinheitlichung statt, auch wenn dies gelingt.

    Abschließend überlegen Sie, was not(not(X = Y)) tun wird. Das innere Ziel ist erfolgreich, wenn X und Y (die willkürliche Ausdrücke sein können) vereinheitlicht werden können. Dies gilt auch für die doppelte Negation. Das Einschließen des inneren Ziels in die doppelte Negation führt jedoch zu einem Ziel, das erfolgreich ist, wenn die beiden Begriffe vereinheitlicht werden können, jedoch ohne diese Begriffe zu vereinen .

    Dem Leser bleibt es eine Übung, darüber nachzudenken, ob not(not(X == Y)) ein ähnliches Programm hat.

    22 November 2011
    hardmath
  • = steht für Vereinheitlichung. Dies bedeutet, dass versucht wird, die freien Variablen zu binden, damit sie mit den anderen Mitgliedern übereinstimmen. Zum Beispiel: A = h (X) verwandelt A in die Ausdruck h (X), wenn A frei ist und fehlschlägt, wenn A dazu verpflichtet ist, 5 zu sagen. Die Vereinigung ist großartig, weil Sie damit Pattern-Matching durchführen können, zum Beispiel:

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

    gibt Ihnen

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

    weil Prolog versucht, XY: Z an den Ausdruck 5- [a, b, c] anzupassen: y. Es ist sehr nützlich.

    Beachten Sie, dass bei der Vereinheitlichung Unification verwendet wird Rufen Sie ein Prädikat auf, und einige Techniken folgen: Wenn Sie den Wert eines Akkumulators in einem rekursiven Prädikat zurückgeben möchten, können Sie Folgendes tun:

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

    Die erste Klausel versucht, das dritte und zweite Argument zu vereinheitlichen. Wenn das dritte Argument frei ist, hat es jetzt denselben Wert wie das zweite.

    == ist Gleichheit, ohne zu versuchen, die Variablen zu binden.

    22 November 2011
    m09mkll