Prolog中一组向量的总和

时间:2013-02-09 23:09:31

标签: prolog

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

我有一个代码来汇总一个向量中的元素,但我不知道如何将它扩展到多个向量。

我有这个:

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

2 个答案:

答案 0 :(得分:2)

在SWI Prolog中,sum_list/2maplist/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的标准方法。

答案 1 :(得分:1)

如果你需要处理嵌套的列表 - 可能是一些树形结构计算的结果 - 你可以使用这些内置函数:

sum_lists(Nested, Total) :-
   flatten(Nested, List),
   sum_list(List, Total).