Liste Länge, einlegen element
Ich versuche, ein Programm zu schreiben in Prolog, die das einfügen eines Elementes in eine bestimmte position, also z.B.
?- ins(a, [1,2,3,4,5], 3, X).
X = [1,2,a,3,4,5].
Ich habe den folgenden code:
ins(X,[H|T],P,OUT) :-
length([T3],P),
concatenate(X,[H],T),
ins(...).
Das problem ist, dass es das einfügen von element X
im index von hinten (ich weiß auch wo das problem ist -> die length([T3],P)
ist offensichtlich die Länge der Liste zurück nicht aus dem Kopf) . Ich war versucht sich zu erinnern, wie viel Elemente habe ich abgeschnitten und legen Sie X
wenn "Anzahl der cut-off-Elemente" = P
, aber ich kann nicht wirklich schreiben, dass in Prolog. Irgendwelche Ideen?
InformationsquelleAutor Johnzzz | 2012-04-08
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Prädikat schlägt fehl, wenn Pos = 0 oder Pos - > Länge(Liste) + 1
InformationsquelleAutor Alexander Serebrenik
Lassen was Sie hier wollen. Zum Beispiel könnten Sie sagen: "ich will mein split input
List
nachPosition - 1
Elemente, so dass ich legen Sie ein neues element".Eine direkte übersetzung mit
append/3
(DCG wäre besser, btw):Oder man könnte sagen: "ich will gehen durch die Elemente meiner
List
Position - 1
mal ohne nichts berühren und dann einfügenElement
und dann nicht berühren, wieder nichts".Dieser Zeit die direkte übersetzung wäre:
konnte Sie auch erklären: "Meine Eingabe
List
ist eine Liste gleich meineResult
außer es war nicht meineElement
alsPosition
th-element." und erkennen, dass, wenn Sie verwenden swi-prolog, ein Prädikat, löst dies sofort:Bottom line ist: sagen, was das problem ist klar und die Lösung sollte in einfachen Worten.
InformationsquelleAutor m09
TL;DR: einfügen Element
E
an positionI1
in die ListeEs0
, brauchen wir nicht zu schreiben, rekursiven code.Stattdessen können wir delegieren die Arbeit (und die sorgen darum, es richtig, auch!) zur vielseitigen Hilfs-Prädikate, von denen alle sind Teil der Prolog-Prolog. Definieren
ins_/4
wir schreiben:Beachten Sie, dass
maplist(any_thing, Es, [_|Es0])
entsprichtsame_length(Es, [_|Es0])
.Beispiel Abfragen1,2,3 mit GNU Prolog version 1.4.4 (64-bit):
Lasst uns nicht vergessen, über die Allgemeine Abfrage!
Fair enumeration aller Lösungen, OK!
EDIT:
Ich wiederholte die Allgemeine Abfrage mit
ins3/4
definiert@m09 in seiner Antwort auf SWI-Prolog 7.3.11 und SICStus Prolog 4.3.2 (beide verfügen über die Bibliothek Prädikat
nth1/4
).Ich war überrascht zu sehen, die zugrunde liegenden Implementierungen von
nth1/4
weisen unterschiedliche prozedurale Semantik (w.r.t. "fair " enumeration"). Sehen Sie selbst!Fußnote 1: Alle Beispiel-Abfragen, die oben gezeigt kündigen universell.
Fußnote 2: Die Antworten der GNU-Prolog-toplevel haben schon Recht-gedruckt ein wenig.
Fußnote 3: Der code oben dargestellt ist, verwendet ist, keine zusätzliche Bibliothek Prädikate sind erforderlich.
InformationsquelleAutor repeat
Die Abfrage
?- ins_(a,[1,2,3,4,5],3,[1,2,a,3,4,5]).
ausfällt, sollte es gelingen. OTOH die Abfrage?- ins_(a,[1,2,3,4,5],3,[1,2,a,4,5]).
gelingt, sollte es scheitern. Um den Fehler zu beheben, müssen Sie löschen genau 4 Zeichen:)InformationsquelleAutor 尾崎隆大