2016-07-28 36 views
3
die letzten beiden Elemente einer Liste in Prolog

Ich versuche, das folgende Prädikat in Prolog zu schreiben, während nicht Verwendung von append/3 machen:umkehren

lastTwoReversed(List, ListOf2) 

was genau ist erfolgreich, wenn ListOf2 die letzte und die zweite enthält bis zum letzten Elemente von List in dieser Reihenfolge (dh umgekehrt).

Allerdings weiß ich nicht, wo ich anfangen soll. Jede Hilfe wird geschätzt. wie so bestehend aus zwei Elementen

Antwort

3

Verwenden Sie einfach das eingebaute in Prädikat reverse/2:

last_two_reversed([A,B|T],[Y,X]) :- 
    reverse([A,B|T],[Y,X|_]). 

Dies wird ausschließlich für Listen nicht weniger als zwei Elemente. Eine vernünftige Sache zu tun wäre, um es erfolgreich mit diesen beiden zusätzlichen Regeln zu machen:

last_two_reversed([],[]). 
last_two_reversed([H],[H]). 
+2

Diese Version kostet Platz proportional zur Länge der Liste. – false

4

Sie können ein einfaches rekursive Prädikat mit einem Basisfall Pattern-Matching auf einer Liste schreiben:

last_two_reversed([X,Y],[Y,X]). 

Da diese Hausaufgaben ist wahrscheinlich, ich denke, es ist am besten, wenn Sie versuchen, das schreiben rekursive Klausel selbst.

1

Zuerst sollte das Prädikat fehlschlagen oder mit einer leeren Liste oder Liste mit nur einem Element Erfolg haben?
In der mathematischen Logik sollte das Prädikat true mit einer leeren Liste und einer Liste mit einem Element zurückgeben, da es keine letzten und vorletzten Elemente gibt, die rückgängig gemacht werden können.

Also, wenn Sie mit leerer oder einem Elemente Liste erfolgreich sein wollen, sollten Sie zuerst mit Start:

lastTwoReversed([],[]). 
    lastTwoReversed([X],[X]). 

(sonst nicht die oben genannten Regeln schreiben). Als Basis sollten Sie schreiben:

lastTwoReversed([X,Y],[Y,X]).

und schließlich für die Liste der Länge 3 oder höher:

lastTwoReversed([X,Y,Z|T],[X|T1]):-lastTwoReversed([Y,Z|T],T1). 

Beachten Sie, dass wir schreiben [X, Y, Z | T] für Liste angeben, mit 3 oder mehr Elemente, so dass nicht der Fall ist Entsprechen Sie den vorherigen Regeln.