2010-11-22 11 views
3

Beim Lernen Prolog, ich versuche, das folgende Problem zu lösen, Akkumulatoren mit:Problem mit Akkumulatoren in Prolog

ein Prädikat addone2 ​​Schreiben/deren ersten Argument ist eine Liste von ganzen Zahlen, und die zweite Argument, das die Liste der ganzen Zahlen, die durch Addieren von 1 zu jeder ganzen Zahl in der ersten Liste erhalten werden. 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 verwende ich Akkumulatoren in Prolog?

Danke!

Antwort

4

Anthares zu verbinden ist richtig, dass müssen Sie Ihren Basisfall verfeinern. Allerdings machen Sie auch Dinge sehr ineffizient mit Ihren append Anrufe. In Prolog dauert es einige Zeit, um sich an die Kraft der Vereinigung zu gewöhnen, aber in diesem Fall hilft es Ihnen beispielsweise, Ihre Ergebnisliste sofort einzurichten. Versuchen Sie Folgendes:

addone([E|Tail], [E1|Rs]) :- 
    E1 is E+1, 
    addone(Tail, Rs). 

Das ist wirklich alles da ist es. Indem Sie sofort E1 in das Muster Ihres zweiten Arguments einfügen, haben Sie bereits das erste Element Ihrer Ergebnisliste erstellt. Die restlichen Elemente Rs werden während der Rekursion erstellt. Ein sehr typisches Prolog-Muster.

+0

Danke für Ihre Hilfe Frank! Habe jetzt nicht über diesen "Trick" ohne Verwendung der Liste append. Auch dank Anthares zur Korrektur meines Basecases! –

+0

Danke Frank! Dieser Trick ist nicht offensichtlich und sehr praktisch! – ProfVersaggi

1

Die Unterseite Ihrer Rekursion addone([],[]). um NewRs sein sollte mit den []