我试图在Prolog中总结一组向量。
我有一个代码来汇总一个向量中的元素,但我不知道如何将它扩展到多个向量。
我有这个:
set_addtion([],0).
set_addtion([Head | Tail], TotalSum) :-
set_addtion(Tail, Sum1),
TotalSum is Head + Sum1.
答案 0 :(得分:2)
在SWI Prolog中,sum_list/2
和maplist/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).