我试图在 Prolog 中总结一组向量。
我有用于总结一个向量中的元素的代码,但我不确定如何将其扩展到多个向量。
我有这个:
set_addtion([],0).
set_addtion([Head | Tail], TotalSum) :-
set_addtion(Tail, Sum1),
TotalSum is Head + Sum1.
我试图在 Prolog 中总结一组向量。
我有用于总结一个向量中的元素的代码,但我不确定如何将其扩展到多个向量。
我有这个:
set_addtion([],0).
set_addtion([Head | Tail], TotalSum) :-
set_addtion(Tail, Sum1),
TotalSum is Head + Sum1.
在 SWI Prolog 中,使用sum_list/2
andmaplist/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 的标准方法。
如果你需要处理嵌套列表——也许是一些树结构计算的结果——你可以使用这些内置函数:
sum_lists(Nested, Total) :-
flatten(Nested, List),
sum_list(List, Total).