質問
プロローグを学習しながら、
、私はアキュムレータを使用して、次のような問題を解決しようとしています:
は、最初の引数の整数のリストであり、その第二引数最初のリスト内の各整数値に1を加えた整数のリストである述語をaddone2 /書き込み。たとえば、クエリ
addone([1,2,7,2],X).
べきギブ
X = [2,3,8,3].
私は、次のコードを作成しました
addone([], _).
addone([E|Tail], [R|Rs]) :-
NewE is E+1,
append([R|Rs], [NewE], NewRs),
addone(Tail, NewRs).
しかし、それは働いていません。なぜ誰かが私に言うことはできますか?だから、どのように私はPrologでアキュムレータを使用していますか?
ありがとうございます。
解決
antharesはあなたのベースケースを洗練しなければならないことが正しいです。しかし、あなたはまた、あなたのappend
呼び出しで非常に非効率的なものを作っています。プロローグでは、統一の力に慣れるには時間がかかりますが、例えば、この場合には、それはあなたがすぐに結果のリストを設定するのに役立ちます。次のことを試してください:
addone([E|Tail], [E1|Rs]) :-
E1 is E+1,
addone(Tail, Rs).
それにあり、本当にすべてです。。すぐに第二引数のパターンでE1
を配置することで、あなたはすでにあなたの結果リストの最初の要素を作成しました。残りの要素のRs
は、再帰中に作成されます。非常に典型的なPrologのパターンます。
他のヒント
あなたの再帰の下部には、[]
と接続するためのNewRsでaddone([],[]).
する必要があります 所属していません StackOverflow