3

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

最初の引数が整数のリストであり、2番目の引数が最初のリストの各整数に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でアキュムレータを使用するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

4

アンサレスは、ベースケースを改良する必要があるという点で正しいです。しかし、あなたはまたあなたのappend電話で物事を非常に非効率的にしています。Prologでは、統一の力に慣れるのに少し時間がかかりますが、たとえば、この場合、結果リストをすぐに設定するのに役立ちます。次のことを試してください。

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

それが本当にすべてです。E12番目の引数のパターンをすぐに配置することで、結果リストの最初の要素がすでに作成されています。残りの要素Rsは、再帰中に作成されます。非常に典型的なPrologパターン。

于 2010-11-22T08:55:01.937 に答える
1

addone([],[]).NewRを[]に接続するには、再帰の下部を指定する必要があります。

于 2010-11-22T08:50:12.303 に答える