2010-07-24 10 views
25

Meine SWI-Prolog Wissensbasis enthält die folgenden zwei Tatsachen:Warum ist diese Prologabfrage sowohl wahr als auch falsch?

f(a,b). 
f(a,c). 

Nun, wenn ich die Abfrage

?- f(a,c). 
true. 

Aber

?- f(a,b). 
true ; 
false. 

Warum ist f (a, b) darstellen beides wahr und falsch? Dies geschieht auch, wenn drei Fakten in der KB vorhanden sind. Wenn ich f anhefte (a, d). zu KB, dann ist f (a, d) wahr (nur), aber f (a, b) und f (a, c) sind sowohl wahr als auch falsch. Was passiert und was kann ich tun, damit Prolog (nur) diesen Fragen entspricht?

+3

Verdammt, gute Frage. –

Antwort

24

(Anmerkung: diese Antwort ist so etwas wie eine Vermutung)

Überlegen Sie, wie Prolog bestimmt, ob f(a,c) wahr ist oder nicht. Es überprüft die erste Regel, f(a,b), und findet keine Übereinstimmung, aber die zweite Regel, entspricht. Daher ist f(a,c) wahr. Da es für f keine Regeln mehr gibt, hat es keinen Sinn, eine Rückverfolgung zuzulassen - es gibt keine anderen möglichen Lösungen.

Jetzt betrachten f(a,b). Prolog überprüft die erste Regel und findet eine Übereinstimmung. Daher ist f(a,b) wahr. Allerdings sind nicht alle Regeln ausgeschöpft. Daher ermöglicht Prolog die Fortsetzung der Suche (wenn Sie ; drücken). Wenn Sie mit der Suche und der Zurückverfolgung fortfahren, wird festgestellt, dass die verbleibenden Regeln, insbesondere f(a,c), nicht mit f(a,b) übereinstimmen. Daher ist das Ergebnis falsch.

+11

Diese Antwort ist korrekt. In Prolog bestimmt die Reihenfolge, in der Ihre Fakten Regeln sind, die Reihenfolge, in der sie durch eine Abfrage gefunden werden. Genauer gesagt, die Option "Zurückverfolgen" ";" Im Wesentlichen sagt er der Abfrage-Engine, das zurückgegebene Ergebnis zu verwerfen und die Frage "Gibt es irgendwelche * andere * Antworten?" zu beantworten. Also ist es nicht so, dass f (a, b) sowohl wahr als auch falsch ist; Aber es ist wahr, und wenn Sie dieses Ergebnis ignorieren, wird die Engine Ihnen sagen, dass es keine anderen f (a, b) -Fakten gibt. Um das zu beweisen, schau was passiert, wenn du eine zweite f (a, b) Tatsache hinzufügst. – Assaf

+4

Dies zeigt auch, warum Sie die Reihenfolge Ihrer Argumente beachten sollten, wenn Sie an der Leistung interessiert sind. Wenn die Reihenfolge der Argumente im Prädikat "f" umgedreht wurde, wäre dies nicht passiert, weil die Anfangsargumente nicht mehr die gleichen sind und daher keinen Auswahlpunkt übriglassen. Dies geschieht, weil die meisten Prologs die Indizierung von Argumenten durchführen, wodurch Prädikate mit inkompatiblen Argumenten im voraus aus dem Suchraum gelöscht werden können. SWI Prolog indexiert standardmäßig nur das erste Argument, dies kann jedoch geändert werden. – nedned

11

Nur neben Michael Williamsons Antwort. Wenn Sie möchten, Prolog sagen, nach dem ersten erfolgreichen Treffer der Suche nach Antworten zu stoppen, verwenden Sie dann den Schnitt (!):

?- f(a, b), !. 
true. 

?- f(a, c), !. 
true.