質問

プロローグを学習しながら、

、私はアキュムレータを使用して、次のような問題を解決しようとしています:

  

は、最初の引数の整数のリストであり、その第二引数最初のリスト内の各整数値に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([],[]).する必要があります
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top