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
?