Prolog中列表中元素的总和

10 list prolog

list_sum([], 0).
list_sum([Head | Tail], TotalSum) :-
    list_sum(Tail, Sum1),
    Total = Head + Sum1.
Run Code Online (Sandbox Code Playgroud)

此代码返回true.如果我替换Total = Head + Sum1Total is Head + Sum1,则它将返回该值.但是我应该用它替换它以获得如下结果:

?- list_sum([1,2,0,3], Sum).
Sum = 1+2+0+3 ; % not to return value 6!!!
Run Code Online (Sandbox Code Playgroud)

Rok*_*alj 24

答案很简单:

sum_list([], 0).
sum_list([H|T], Sum) :-
   sum_list(T, Rest),
   Sum is H + Rest.
Run Code Online (Sandbox Code Playgroud)

此代码仅在一个方向上起作用 - 这意味着 - 它不允许您生成具有该特定总和的列表.但由于这些列表的集合是无限的,所以无论如何这都是不实际的.


gus*_*bro 9

请注意,在您的过程的第二个子句中,TotalSum永远不会被实例化.在咨询您的代码时,您应该已经收到口译员的警告.

这是我的建议:

list_sum([Item], Item).
list_sum([Item1,Item2 | Tail], Total) :-
    list_sum([Item1+Item2|Tail], Total).
Run Code Online (Sandbox Code Playgroud)

第一个子句处理基本情况,当列表中只剩下一个元素时,就是你的结果.

第二个子句涉及递归步骤.它抓取列表的前两项并执行递归调用,用新术语Item1 + Item2替换这两项.

  • 基本情况不应该是空列表吗? (2认同)
  • 首先,应该有一个算术赋值,“is/2”而不是“+”。如果列表为空 - 这将失败而不是返回 0。 (2认同)

小智 6

该计划是

list_sum([],0).

list_sum([Head|Tail], TotalSum):-
list_sum(Tail, Sum1),
TotalSum is Head+Sum1.
Run Code Online (Sandbox Code Playgroud)

现在如果查询是

?- list_sum([1,2,3,4], Sum).
Run Code Online (Sandbox Code Playgroud)

答案是

Sum = 10
Run Code Online (Sandbox Code Playgroud)