Prolog: die Überprüfung, ob etwas ist das Letzte Element in der Liste?
Ich bin neu in prolog und bin im Grunde beim schreiben eine Klausel, die würde als true ausgewertet werden, wenn ein bestimmtes Element ist das Letzte Element in einer gegebenen Liste. Hier ist, was ich habe:
last(X,[Y|X]).
last(X,[Y|Z]) :- last(X,Z).
Ich dachte, dies würde den trick tun, aber wenn ich Frage prolog:
?- last(c,[a,b,c]).
Prolog gibt false zurück. Ich habe versucht, die folgende Abfrage, um zu sehen, was Prolog denkt, sollte passen meine definition von Letzte:
?- last(c,X).
X = [_G530|c] ;
X = [_G530, _G533|c] ;
X = [_G530, _G533, _G536|c]
So, was ich bin nicht sicher, warum das " | " - symbol ist immer noch in der Liste?
Update: last([c],[a,b,c]) erzeugt das gewünschte Verhalten. Allerdings bin ich mir nicht sicher, warum mein 1. argument muss eine Liste?
InformationsquelleAutor user3295806 | 2014-02-11
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie vielleicht diese:
Den
|
bezeichnet einen 'Schwanz' oder 'den rest der Liste.'Mit
?- last(c,X).
Prolog erzeugt Listen (entsprechend der ersten definition), die c als letztes Element.Wenn Sie die Abfrage
?- last(c,[a,b,c]).
gibt false zurück, weil Sie nicht definiert ein Fall für eine Liste nur ein Element[X]
oder[X|[]]
. Also es schlägt fehl, wenn die Liste kürzer als zwei Elemente.Jedoch
last([c],[a,b,c])
gelingt, weil Sie bekommen[b|_29]
oder was auch immer mit der Angabe, dass der Schwanz Teil könnte jede Liste. Damit es "_29', '[c]', die Befriedigung der ersten definition wielast([c],[b|[c]]).
denken Sie Daran, dass eine nichtleere Liste in Prolog ist eigentlich ein paar das erste Listenelement (head) und eine Liste von den rest (tail). In der Regel geschrieben als [head|tail].last(X,[_|Z]) :- last(X,Z).
Wahr. Vor allem, wenn Warnungen verwirren könnte ein Anfänger.
InformationsquelleAutor traitor
Warum nicht der Ansicht, die Dinge aus einem grammatikalischen Blickwinkel. Also, was ist das Letzte element in einer Liste?
2 ?- last(X, [1,2,3]). <br/> X = 3 ; <br/> false.
. Ist diese zu erwarten?hmm. Ich erwartet, dass es sollte deterministisch sein, aber jetzt, dass ich versuche, ich kann es nicht machen, also ohne die Verwendung einer Schnitt -
last(X,[_|B]):- B=[_|_],!, last(X,B).
,last(X,[X]):- !.
. dies ist unerwartet.Lasst uns nicht verwirren logischen Determinismus, der mit einem Beton-performance-Funktion. Mit ! wie Sie angeben, sind Sie Einbußen bei der logischen Vollständigkeit für "Leistung".
last(X,[X|Xs])
gelingen sollte, für unendlich viele Antworten.aha, ich sehe. so ist es angeboren. danke.
Clevere Nutzung ! könnte möglich sein, aber es ist ein Alptraum, und der Aufwand definitiv nicht Wert. Nach allem: Es ist ein single-choice-zeigen Sie, was überflüssig ist. Es wäre etwas anderes, wenn es wäre, wie viele choicepoints, wie Elemente in der Liste. Das wäre ernst, in der Tat. Die Prolog-Konvention zu setzen, die rekursive Regel Letzte vermeidet das manchmal.
InformationsquelleAutor false
Warum nicht einfach Anhängen?
http://www.swi-prolog.org/pldoc/man?predicate=append/3
InformationsquelleAutor Dylon Dickinson
Weil der Schwanz einer Liste ist die Liste selbst.
Einer Liste in Prolog kann man als
[H | T]
, woH
ist das erste element (den Kopf), undT
(der Schwanz) ist eine Liste von allen anderen Elementen.Ihre Liste
[a, b, c]
ist eigentlich[a | [b | [c | [] ] ] ]
wenn Sie zerlegen es (der Letzte Schwanz wird immer nur eine leere Liste):So, wenn Sie an den Punkt gelangen, wo Sie gefragt werden, ob
last(c, [b, c])
, dass zersetzt, umlast(c, [b|[c]])
, das ist der Grund, warum die erste Klausel kann nicht instanziiert werden, weilX
können nicht beidec
und[c]
. Das ist, warum es hat arbeiten, wenn Sie gefragtlast([c],[a,b,c])
.Den version vorgeschlagen, die von alpha funktioniert, weil es berücksichtigt das:
InformationsquelleAutor SQB