2017-02-13 13 views
0

Ich wundere mich, warum das member/2 Prädikat von Prolog mehrere Alternativen liefert (via Backtracking ?!), wenn True bereits für die Ausgabe vereinheitlicht wurde.Prolog: true/false Ausgabe des Mitglieds Prädikat?

Zum Beispiel member(1, [1,2,3]). liefert die folgende Ausgabe:

true ; 
false. 

Warum member return false, nachdem es bereits, dass das Atom 1 ist in der Tat ein Mitglied der [1,2,3] Liste herausgefunden?

Noch mehr verwirrend für mich ist die folgende Ausgabe:

?- member(1, [1,2,3,1]). 
true ; 
true. 
+0

welche Prolog-Implementierung verwenden Sie? –

+0

Ich benutze Swi-Prolog. – daniel451

+0

Eine Verbesserung ist ['memberd/2'] (http://stackoverflow.com/a/21971885/772868). – false

Antwort

5

In Ihrem ersten Beispiel, können Sie es fragen member(1,[1,2,3]). zu beweisen; da es kann, meldet es true. Wenn Sie ; eingeben, möchten Sie einen anderen Weg finden, diese Abfrage zu beweisen. da es nicht möglich ist, meldet es false.

Im zweiten Fall ist die erste true, weil es einen der 1 in der Liste gefunden hat; das zweite ist, weil es das zweite gefunden hat. Wenn Sie wieder ; getroffen hätten, wäre es mit false zurückgekommen, da es keine anderen Möglichkeiten gab, die Abfrage zu beweisen. (Hinweis: Wie @WillNess darauf hinweist, haben Sie nicht wirklich die Möglichkeit, ; erneut zu treffen; dies ist wahrscheinlich auf die Implementierung von member zurückzuführen, so dass Prolog weiß, dass es keine verbleibenden Alternativen gibt. Wenn die Liste nicht mit einem endet 1, Sie wären in der Lage, ; wieder zu treffen.)