Implementierung von "last" in Prolog

Ich versuche, ein Gefühl für Prolog-Programmierung zu bekommen, indem ich durch Ulle Endriss gehe.Vorlesungsnotizen. Wenn sich meine Lösung für eine Übung nicht wie erwartet verhält, fällt es mir schwer, eine gute Erklärung zu geben. Ich denke, das hängt mit meinem unsicheren Verständnis der Art und Weise zusammen, wie Prolog Ausdrücke bewertet.

Übung 2.6 auf Seite 20 fordert eine rekursive Implementierung eines Prädikatslast1 welches sich wie das eingebaute Prädikat verhältlast. Mein Versuch ist wie folgt:

last1([_ | Rest], Last) :- last1(Rest, Last).
last1([Last], Last).

Es gibt die richtige Antwort, aber für Listen mit mehr als einem Element muss ich das Semikolon eingeben, um die Abfrage zu beenden. Das machtlast1 unterscheidet sich von der eingebautenlast.

?- last1([1], Last).
Last = 1.

?- last1([1, 2], Last).
Last = 2 ;
false.

Wenn ich die Reihenfolge ändere, in der ich die Regel und die Tatsache deklariert habe, muss ich in beiden Fällen das Semikolon eingeben.

Ich glaube ich weiß warum Prolog das denktlast1 kann eine weitere Lösung haben (also das Semikolon). Ich stelle mir vor, es folgt der Bewertungsreihenfolge

last1([1, 2], Last).
==>  last1([2], Last).
==>  last1([], Last).    OR    Last = 2.
==>  false    OR    Last = 2.

Das scheint darauf hinzudeuten, dass ich nach einem Weg suchen sollte, um Übereinstimmungen zu vermeidenRest mit[]. Egal, ich habe keine Erklärung, warum eine Änderung der Reihenfolge der Deklaration überhaupt Auswirkungen haben sollte.

Frage 1: Was ist die richtige Erklärung für das Verhalten vonlast1?

Frage 2: Wie kann ich ein Prädikat implementieren?last1 welches vom eingebauten nicht zu unterscheiden istlast?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage