Problem mit Akkumulatoren in prolog
-
27-09-2019 - |
Frage
Während Prolog zu lernen, ich versuche, das folgende Problem zu lösen, Akkumulatoren mit:
Write ein Prädikat addone2 ??/ deren erste Argument ist eine Liste von ganzen Zahlen und deren zweiten Argument die Liste von ganzen Zahlen von 1 Zugabe in der ersten Liste auf jede ganze Zahl erhalten wird. Zum Beispiel kann die Abfrage
addone([1,2,7,2],X).
geben sollte
X = [2,3,8,3].
Ich habe den folgenden Code:
addone([], _).
addone([E|Tail], [R|Rs]) :-
NewE is E+1,
append([R|Rs], [NewE], NewRs),
addone(Tail, NewRs).
Aber es funktioniert nicht. Kann mir jemand sagen, warum? Also, wie kann ich mit Akkumulatoren in Prolog?
Danke!
Lösung
Anthares ist richtig, dass Sie Ihren Basisfall verfeinern müssen. Allerdings machen Sie auch Dinge sehr ineffizient mit Ihrem append
Anruf. In Prolog, dauert es einige Zeit, um die Macht der Vereinigung gewöhnen, aber zum Beispiel in diesem Fall hilft es Ihnen sofort Ihre Ergebnisliste einzurichten. Versuchen Sie Folgendes:
addone([E|Tail], [E1|Rs]) :-
E1 is E+1,
addone(Tail, Rs).
Das ist wirklich alles dort ist zu ihm. Durch sofort E1
in Ihrem zweiten Argument der Muster platzieren, haben Sie bereits den ersten Teil Ihrer Ergebnisliste erstellt. Die übrigen Elemente Rs
werden während der Rekursion erstellt werden. Ein sehr typisches Prolog Muster.
Andere Tipps
Die Unterseite Ihrer Rekursion soll addone([],[]).
um NewRs sein wird verbunden mit dem []