(==)/2
nicht vergleichen, was auch immer ausgewertet wird. Es bewertet seine Argumente nicht. Es ist nur erfolgreich, wenn die Argumente bereits zu übereinstimmenden Termen instanziiert sind.
in Prolog, not(not(true))
ist eine Verbindung Begriff, der der Begriff not/1
mit einem einzigen Argumente ist, not(true)
, selbst ein Begriff not/1
von einem Argumente ist, die aus dem Begriff true/0
die keine Argumente haben. Es hat keinen Wert. Es wird nicht einmal "ausgeführt", außer in bestimmten Kontexten. In Prolog ist das Prädikat not/1
erfolgreich, wenn das Argument fehlschlägt, und es schlägt fehl, wenn das Argument erfolgreich ist. Dies ist nicht der Wert oder Funktionsergebnis, aber ein Verhalten. Das setzt voraus, dass es in einem Kontext wie die folgenden erscheint:
not(not(true)),
write('This will be written out because not(not(true)) succeeded'), nl.
Der Ausdruck true == not(not(true))
in Prolog ist eine Verbindung, Begriff, das entspricht:
'=='(true, not(not(true)))
In diesem Zusammenhang wird not(not(true))
nicht ausgewertet. Prolog übt zuerst den Äquivalenzoperator (==)/2
aus, was erfolgreich ist, wenn seine Argumente auf denselben Ausdruck instanziiert werden. Sind die Begriffe true
und not(not(true))
in Prolog gleich (oder gleichwertig)? Nein sind sie nicht. Einer ist ein einfacher Begriff ohne Argumente (true/0
). Der andere ist ein zusammengesetzter Begriff: ein Begriff mit einem Argument, das selbst ein Begriff mit einem Argument ist. Somit schlägt die (==)/2
hier fehl.
Beachten Sie, dass (=:=)/2
ist ganz anders. Es ist ein Operator, der Ergebnisse arithmetischer Ausdrücke vergleicht. Die Argumente müssen auswertbare arithmetische Ausdrücke sein, und (=:=)/2
wird gelingen, wenn sie zum selben Ergebnis ausgewertet werden, und es wird fehlschlagen, wenn sie dies nicht tun.
Sie haben 'not (not (false))' an einer Stelle und 'not (not (true))' in anderen verwendet. War das absichtlich? – user2357112
Nein, ein Tippfehler. Sry. Behoben. – daniel451