list_sum([], 0).
list_sum([Head | Tail], TotalSum) :-
list_sum(Tail, Sum1),
Total = Head + Sum1.
Run Code Online (Sandbox Code Playgroud)
此代码返回true.如果我替换Total = Head + Sum1为Total 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)
此代码仅在一个方向上起作用 - 这意味着 - 它不允许您生成具有该特定总和的列表.但由于这些列表的集合是无限的,所以无论如何这都是不实际的.
请注意,在您的过程的第二个子句中,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替换这两项.
小智 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)