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!

War es hilfreich?

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 []

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top