List 在prolog中添加列表元素

List 在prolog中添加列表元素,list,prolog,List,Prolog,所以我对prolog很陌生,我必须把列表中的所有元素加起来 listSum([],0). listSum([Head|Tail], Sum) :- listSum(Tail,TailSum), Sum is Head + TailSum. 我们的目标是使这个尾部递归,我想知道这是否是一个比这个更好的方法 listSum([],0). listSum(List, Sum) :- listSum(List,Sum,0). listSum([H|T], Sum, S) :- S1 is S+H, l

所以我对prolog很陌生,我必须把列表中的所有元素加起来

listSum([],0).
listSum([Head|Tail], Sum) :- listSum(Tail,TailSum), Sum is Head + TailSum.
我们的目标是使这个尾部递归,我想知道这是否是一个比这个更好的方法

listSum([],0).
listSum(List, Sum) :- listSum(List,Sum,0).
listSum([H|T], Sum, S) :- S1 is S+H, listSum(T, Sum, S1).
listSum([], Sum, S) :- Sum is S.
或者这样做完全可以吗?只是想看看是否有任何明显的方法来改进我遗漏的上述代码


谢谢。

我觉得这个很好。通过不做不必要的事情,你可以节省一些写作时间。首先,从两个不同的位置得到0;从一个地方得到就足够了。此外,“输出”参数应该排在所有其他参数之后

list_sum(L, S) :-
    list_sum(L, 0, S).
然后,在基本情况下,您不需要
is/2

list_sum([], S, S).
list_sum([X|Xs], S0, S) :-
    S1 is S0 + X,
    list_sum(Xs, S1, S).
当然,您可以决定在尾部递归定义中实际保存一个步骤:

list_sum([], 0).
list_sum([X|Xs], S) :-
    list_sum(Xs, X, S).

list_sum([], S0, S) :- S is S0.
list_sum([X|Xs], S0, S) :-
    S1 is S0 + X,
    list_sum(Xs, S1, S).
您应该认识到,第二个版本是:

list_sum([], 0).
list_sum([X|Xs], S) :-
    foldl(add, Xs, X, S).

add(X, Y, S) :- S is X+Y.
或者,甚至直接:

list_sum(List, Sum) :- foldl(add, List, 0, Sum).