Angesichts der folgenden Fakten und Prädikate:
%Vor% Beim Ausführen von relax(S).
würde ich erwarten, S=time1
aufgrund der !
zu erhalten, die besagt (korrigiere mich, wenn ich falsch liege), dass, wenn 'X' erfüllt ist, dann das Zurückverfolgen stoppen.
Hier ist die Spur:
%Vor% Warum überprüft Prolog auch sun(time1)
, obwohl es das Ausrufezeichen erfüllt hat, nachdem es von sound(X)
erfüllt wurde (weil sound(time1)
eine Tatsache ist).
Grüße
Das !
-Zeichen verhindert das Zurückverfolgen der Klauseln rechts von ihm nach links, es ist wie ein Einwegtor, so dass es nicht über den Schnitt hinaus zurückläuft.
Wenn sound(time1)
wahr ist, wird die nächste Klausel sun(time1)
ausgewertet, und nur dann wird prolog finden, dass sun(time1)
ist false
(durch Durchsuchen der Wissensbasis weiß es nicht wirklich ) dass es eine Tatsache ist).
Dann wird prolog wegen des Schnitts die Werte time2
und time3
in der ersten Klausel nicht ausprobieren.
Mehr über cut:
Prolog wertet die Klauseln eines Prädikats von links nach rechts aus. Es bindet einen Wert an eine Variable im ganz links stehenden Satz. Wenn die Klausel true
lautet, wird die nächste Klausel angezeigt. Wenn es false
ist, versucht prolog andere Werte.
Wenn eine der Klauseln nicht mit irgendeinem Wert erfüllt werden kann, wäre dies false
, und dies gilt auch für das gesamte Prädikat (weil die Klauseln durch UND verknüpft sind).
Das Ganze funktioniert als Tiefen-Traversierung eines Baumes, wobei die Klauseln die Knoten sind und die Kanten verschiedene Werte ihrer Variablen darstellen. Wenn die Traversierung eine Klausel als false
findet, kehrt sie zu ihrer vorhergehenden Klausel zurück und versucht einen anderen Wert.
Hier kommt der Schnitt. Wenn Sie einen Schnitt ( !
) zwischen zwei Klauseln einfügen, würde dies bedeuten, dass, wenn die Klausel nach false
ist, das Ausprobieren neuer Werte NUR WENN die Auswertung NACH dem Schnitt ausgeführt wird . Das bedeutet, dass die Werte der vor dem Schnitt verwendeten Variablen gesperrt sind und nicht geändert werden können, wenn die Auswertung den Schnitt schneidet.
Um das noch deutlicher zu machen, wenn jemand noch immer Schwierigkeiten damit hat, wie der Ausrufungsoperator funktioniert ( wie ich ), hier ein Beispiel:
%Vor% Wenn Sie in diesem Beispiel Prolog nach ?-relax(S).
fragen, führt dies zu false . Wir können Prolog so beschreiben:
Im Gegensatz dazu habe ich in 4. ohne gesagt! Operator führt zu Erfolg .
%Vor%Fühlen Sie sich frei, mich zu korrigieren, wenn ich mich irgendwann irre.
Es wird immer noch versuchen, den Rest der Regel zu erfüllen, es wird einfach nicht vor dem Ausrufezeichen zurückverfolgen. Das heißt, wenn sun(X)
fehlschlägt, wird es nicht zurückverfolgt und versucht, ein anderes Objekt mit sound(X)
abzugleichen, kann diese Regel jedoch nicht vollständig erfüllen.
Tags und Links prolog