1

Prolog で一連のベクトルを合計しようとしています。

要素を 1 つのベクトルに合計するためのコードがありますが、それを複数のベクトルに拡張する方法がわかりません。

私はこれを持っています:

set_addtion([],0).   
set_addtion([Head | Tail], TotalSum) :-
  set_addtion(Tail, Sum1),
  TotalSum is Head + Sum1.
4

2 に答える 2

2

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 を達成するための標準的な方法です。

于 2013-02-10T07:26:55.363 に答える
1

ネストされたリストを処理する必要がある場合(おそらくツリー構造の計算の結果)、次のビルトインを使用して行うことができます。

sum_lists(Nested, Total) :-
   flatten(Nested, List),
   sum_list(List, Total).
于 2013-02-10T11:37:24.917 に答える