Ausrufezeichen im Prolog

8

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

    
ron 25.02.2013, 11:13
quelle

3 Antworten

18

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.

    
0605002 25.02.2013, 11:23
quelle
12

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:

  1. Prolog sucht nach dem gesuchten Prädikat ( relax (SOMEVARIABLE unifizierbar mit S)) in unserem Beispiel).
  2. Prolog findet das Prädikat relax (X). Variablen X und S sind jetzt gebunden.
  3. Prolog beginnt mit der Auswertung von Klauseln:
    • Sound (X)
      • Prolog durchsucht die Datei nach Fakten, die erfüllt Sound (X).
      • es findet die Tatsache Sound (time3). und vereinheitlicht es mit unseren Variablen X = S = time3.
    • !
      • Prolog fährt mit der nächsten clausule fort, die Operator ist! also wird er nicht hinter diesem Operator zurückgehen.
    • Sonne (X)
      • Prolog durchsucht die Datei nach der Tatsache, die Sonne (X) erfüllt. X ist bereits gebunden, also sucht es nach sun (time3) , was nicht der Fall ist existiert.
  4. Fazit
    • zu diesem Zeitpunkt, wenn es keine gab! Der Operator Prolog würde ( backtrack ) zu Sound (X) zurückkehren und die Variable X = S als X = S = time1 neu zuweisen. Was schließlich zu wahr führen würde, da fact sun (time1) existiert.
    • Prolog gibt false zurück, weil er Relax (S) für keine Regel finden konnte.

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.

    
Smarty77 03.04.2016 16:35
quelle
4

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.

    
Junuxx 25.02.2013 11:23
quelle

Tags und Links