Prolog 列表序言中的和

Prolog 列表序言中的和,prolog,Prolog,我试图在prolog中获得sum+输入列表,但到目前为止没有成功 sum([], 0). sum([H|T], [N]):- sum(T, X), N is X + H. 输入 这导致 N = [3] 我想要达到的目标 N = [3,1,2] 假设sum(Xs,Ys)应该构建列表Ys=[sum | Xs],其中sum是列表Xs项的总和,您可以执行以下操作: sum(Xs, [Sum|Xs]) :- sum_rec(Xs, Sum). sum_rec([], 0).

我试图在prolog中获得sum+输入列表,但到目前为止没有成功

sum([], 0).
sum([H|T], [N]):-
    sum(T, X),
    N is X + H.
输入

这导致

N = [3]
我想要达到的目标

N = [3,1,2]
假设
sum(Xs,Ys)
应该构建列表
Ys=[sum | Xs]
,其中
sum
是列表
Xs
项的总和,您可以执行以下操作:

sum(Xs, [Sum|Xs]) :-
    sum_rec(Xs, Sum).

sum_rec([], 0).
sum_rec([X|Xs], Sum):-
    sum_rec(Xs, PartialSum),
    Sum is X + PartialSum.
更好的方法是使用累加器来计算列表
Xs
项的总和:

better_sum(Xs, [Sum|Xs]) :-
    better_sum(Xs, 0, Sum).

better_sum([], Acc, Acc).
better_sum([X|Xs], Acc, Sum) :-
    NewAcc is Acc + X,
    better_sum(Xs, NewAcc, Sum).
结果:

?- sum([1,2], L).
L = [3, 1, 2].

?- better_sum([1,2], L).
L = [3, 1, 2].

?- sum([3,2,7,5], L).
L = [17, 3, 2, 7, 5].

?- better_sum([3,2,7,5], L).
L = [17, 3, 2, 7, 5].
假设
sum(Xs,Ys)
应该构建列表
Ys=[sum | Xs]
,其中
sum
是列表
Xs
项的总和,您可以执行以下操作:

sum(Xs, [Sum|Xs]) :-
    sum_rec(Xs, Sum).

sum_rec([], 0).
sum_rec([X|Xs], Sum):-
    sum_rec(Xs, PartialSum),
    Sum is X + PartialSum.
更好的方法是使用累加器来计算列表
Xs
项的总和:

better_sum(Xs, [Sum|Xs]) :-
    better_sum(Xs, 0, Sum).

better_sum([], Acc, Acc).
better_sum([X|Xs], Acc, Sum) :-
    NewAcc is Acc + X,
    better_sum(Xs, NewAcc, Sum).
结果:

?- sum([1,2], L).
L = [3, 1, 2].

?- better_sum([1,2], L).
L = [3, 1, 2].

?- sum([3,2,7,5], L).
L = [17, 3, 2, 7, 5].

?- better_sum([3,2,7,5], L).
L = [17, 3, 2, 7, 5].