Umsetzung der "Letzte" in Prolog

Ich versuche, ein Gefühl für die Prolog-Programmierung durch Ulle Endriss' lecture notes. Wenn meine Lösung zu einer übung verhält sich nicht wie erwartet, ich finde es schwer, eine gute Erklärung. Ich denke, das hat zu tun mit meinem wackeligen verstehen, wie Prolog-Ausdrücke ausgewertet werden.

Übung 2.6 auf Seite 20 Anrufe für eine rekursive Implementierung eines Prädikats last1 verhält sich wie die built-in-Prädikat last. Mein Versuch lautet wie folgt:

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

Gibt es die richtige Antwort, aber für Listen mit mehr als einem element, die ich habe, um das Semikolon, um die Abfrage zu beenden. Dies macht last1 unterscheidet sich von der integrierten last.

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

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

Wenn ich schalten Sie die Reihenfolge, in der ich erklärte, die Regel und die Tatsache, dann Brauch ich den Schlüssel in die Semikolon in beiden Fällen.

Ich glaube, ich weiß, warum Prolog denkt, dass last1 vielleicht noch eine weitere Lösung (also das Semikolon). Ich vorstellen, es folgt die Reihenfolge für die Evaluierung

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

Scheint zu zeigen, dass ich Aussehen sollte für ein Weg, um zu vermeiden matching Rest mit []. Egal, ich habe keine Erklärung, warum die Umschaltung der Reihenfolge der Deklaration hätte irgendeinen Effekt.

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

Frage 2: Wie kann ich implementieren Sie ein Prädikat last1 die nicht von der integrierten last?

Schreibe einen Kommentar