1

我试图在 Prolog 中总结一组向量。

我有用于总结一个向量中的元素的代码,但我不确定如何将其扩展到多个向量。

我有这个:

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

2 回答 2

2

在 SWI Prolog 中,使用sum_list/2andmaplist/3这是一个简单的组合:

sum_vectors(Vectors,Sum):-
  maplist(sum_list,Vectors,Sums),
  sum_list( ... , ... ).           % fill in the blanks!

这是假设这Vectors是一个数字列表的列表。


关于您的代码 - 它不是tail-recursive。编写 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 回答