2017-03-07 4 views
1

Offensichtlich muss true = not(not(true)) falsch sein, weil = versucht, das Atom true mit dem Begriff zu vereinheitlichen (ohne den Begriff zu bewerten), was falsch ist, da die Begriffe nicht identisch sind.Prolog: warum ist wahr == nicht (nicht (wahr)) -> falsch?

Allerdings dachte ich == wirklich vergleicht was auch immer ausgewertet wird. Also, ich dachte, true == not(not(true)) sollte true == true, genau wie (für arithmetische Operatoren) 4 =:= 2 + 2 würde 4 =:= 4 auswerten und True zurückgeben.

... aber das ist, was ich in SWI-Prolog erhalten:

?- true == not(not(true)). 
false. 

Was ich falsch zu bekommen?

+2

Sie haben 'not (not (false))' an einer Stelle und 'not (not (true))' in anderen verwendet. War das absichtlich? – user2357112

+0

Nein, ein Tippfehler. Sry. Behoben. – daniel451

Antwort

1

(==)/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.

+0

Eher '(==)/2' – false

+0

@false in der Tat, ich war ein bisschen faul. – lurker

+1

Noch faul, ich meine die runden Klammern herum, sonst ist es ein Token '== /' – false

Verwandte Themen