Frage

Ich bin neu in Prolog und habe gerade darüber nachgedacht, warum diese Regel mir nach einem wahren Ergebnis ein falsches Ergebnis liefert.

likes(1,banana).
likes(1,mango).

test :- likes(1,banana),likes(1,mango).

?- test.  
true;  
false.

Ich möchte den Grund für diese Falschmeldung wissen.

War es hilfreich?

Lösung

Die Funktionsweise von Prolog besteht darin, Abfragen so lange auszuwerten, bis sie durch Negation fehlschlagen.

Hier haben Sie zwei Fakten festgestellt:

likes(1, banana). wo steht: „1 mag Banane“

likes(1, mango). wo steht: „1 mag Mango“

Dann haben Sie eine Regel aufgestellt, die im Wesentlichen wie folgt auswertet:

left_hand_side :- right_hand_side. left_hand_side Wenn right_hand_side

Die Auswertung der Regel als Abfrage versucht, Fakten und Ergebnisse abzugleichen true wenn es möglich ist, und false, wenn es nicht übereinstimmen kann.Es ist wichtig zu beachten, dass prolog, falls angegeben, weiterhin Fakten abgleicht, solange die Regeln dies zulassen true.

Gehen wir also durch test :- likes(1,banana),likes(1,mango).

Wenn test Wird als Abfrage ausgeführt, prolog versucht es zuerst likes(1,banana) Das ist eine zuvor festgestellte Tatsache und wahr.Dann geht es weiter likes(1,mango) was wiederum eine Tatsache und wahr ist.Prolog hat dann das Ende der Regel erreicht und gibt aus true.

Wenn Sie an dieser Stelle nicht nach weiteren Übereinstimmungen suchen, können Sie die Abfrage abkürzen und einfach „true“ angeben.Wenn Sie jedoch nach mehr (allen) Übereinstimmungen suchen, prolog Rückschritte und versucht, die Regel erneut auszuwerten und nach weiteren Übereinstimmungen zu suchen.

Da Ihre Regel jedoch nur mit „mag Banane und mag Mango“ übereinstimmt, haben wir bereits eine Übereinstimmung gefunden likes(1,banana), wenn Prolog einen Rückzieher macht und eine Auswertung versucht likes(1,banana) Auch hier gibt es, da wir es bereits vorher abgeglichen haben, dieses Mal keinen weiteren Fakt (mit anderen Worten: 1 kann eine Banane nicht mehr als einmal „liken“, es sei denn, dies wurde definiert), mit dem eine Übereinstimmung erzielt werden kann.Da ist also das false kommt von.

In Ihrem Prolog-Interpreter können Sie möglicherweise die Ausführung Ihres Programms durch Eingabe verfolgen trace. Führen Sie dann Ihre Abfrage aus.Meine Spur ist unten angegeben:

| ?- trace
.
The debugger will first creep -- showing everything (trace)

(1 ms) yes
{trace}
| ?- test.
      1    1  Call: test ? 
      2    2  Call: likes(1,banana) ? 
      2    2  Exit: likes(1,banana) ? 
      3    2  Call: likes(1,mango) ? 
      3    2  Exit: likes(1,mango) ? 
      1    1  Exit: test ? 

true ? ;
      1    1  Redo: test ? 
      2    2  Redo: likes(1,banana) ? 
      2    2  Fail: likes(1,banana) ? 
      1    1  Fail: test ? 

(1 ms) no
{trace}
| ?-

Eine letzte Sache noch zu beachten:Wenn, anstatt zu drücken ; Bei der true ? prompt, hätte ich gedrückt <ENTER>, wäre das Skript nur mit dem beendet worden true.

Ich bin froh, dass Sie diese Frage gestellt haben, denn sie ermöglichte mir eine kleine Auffrischung von Prolog, das mir wirklich gefällt, das ich aber schon lange nicht mehr verwendet habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top