Prolog で一連のベクトルを合計しようとしています。
要素を 1 つのベクトルに合計するためのコードがありますが、それを複数のベクトルに拡張する方法がわかりません。
私はこれを持っています:
set_addtion([],0).
set_addtion([Head | Tail], TotalSum) :-
set_addtion(Tail, Sum1),
TotalSum is Head + Sum1.
Prolog で一連のベクトルを合計しようとしています。
要素を 1 つのベクトルに合計するためのコードがありますが、それを複数のベクトルに拡張する方法がわかりません。
私はこれを持っています:
set_addtion([],0).
set_addtion([Head | Tail], TotalSum) :-
set_addtion(Tail, Sum1),
TotalSum is Head + Sum1.
SWI Prolog では、sum_list/2
とを使用maplist/3
した単純な構成です。
sum_vectors(Vectors,Sum):-
maplist(sum_list,Vectors,Sums),
sum_list( ... , ... ). % fill in the blanks!
Vectors
これは、数値のリストのリストであると想定しています。
あなたのコードに関して - それは末尾再帰ではありません。TR であるコードを記述する方がはるかに優れています。スタックの使用は一定になります。TR を達成するには、通常、すぐにできることを後回しにしないことを意味します。ここでは、 が見つかるHead
まで ,の追加を遅らせていますSum1
が、リストの残りの部分がすべて消費されるまではずっと後になります。
Head
しかし、すぐに追加できるものは何ですか? そうですね、 を持ちSumSoFar
、それに を追加することができます。次に、この新しい変数はアキュムレータとして機能し、その初期値は -0
です。アキュムレータ変換は、TR を達成するための標準的な方法です。
ネストされたリストを処理する必要がある場合(おそらくツリー構造の計算の結果)、次のビルトインを使用して行うことができます。
sum_lists(Nested, Total) :-
flatten(Nested, List),
sum_list(List, Total).