在Prolog中计算序列号列表的和

在Prolog中计算序列号列表的和,prolog,Prolog,我有一个Prolog的家庭作业,我就是解不出来 我有一个Prolog谓词listsum(L,S),如果L是一个序列号列表,S是这个列表的和,它将成功 因此,代码必须像这样响应这些查询: ?- listsum(L,6). L = [1, 2, 3] ; false. ?- listsum(L,45). L = [1, 2, 3, 4, 5, 6, 7, 8, 9] ; false. ?- listsum(L,46). false. 正如您所见,只有通过选择从1开始的序列号才能“生成”总和,那么总

我有一个Prolog的家庭作业,我就是解不出来

我有一个Prolog谓词listsum(L,S),如果L是一个序列号列表,S是这个列表的和,它将成功

因此,代码必须像这样响应这些查询:

?- listsum(L,6).
L = [1, 2, 3] ;
false.
?- listsum(L,45).
L = [1, 2, 3, 4, 5, 6, 7, 8, 9] ;
false.
?- listsum(L,46).
false.
正如您所见,只有通过选择从1开始的序列号才能“生成”总和,那么总和才能为真。我们可以使用我之前完成的作业中的谓词:

fromTill(X,X,[X]):-!.
fromTill(L,H,[L|Xs]):-
    integer(L),
    integer(H),
    L=<H,
    Z is L+1,
    fromTill(Z,H,Xs).

fromTill(L,H,[L|Xs]):-
    integer(L),
    integer(H),
    L>=H,
    Z is L-1,
    fromTill(Z,H,Xs).
所以我不知道从哪里开始这项任务。我的第一个想法是使用累加器来确定列表的总和。然后,fromTill谓词将确定列表是否是顺序的,该列表将包含在最终listSum预指示中。 到目前为止,我有这个,但我不知道下一步要去哪里:

listsumAcc([], 0).
listsumAcc([H|T], N):-
    listsumAcc(T, N1),
    N is N1 + H.

如果你能帮我,请告诉我!非常感谢。

这能回答您的问题吗?
listsumAcc([], 0).
listsumAcc([H|T], N):-
    listsumAcc(T, N1),
    N is N1 + H.