我试图找出最后两项清单总和的代码。 我现在得到的只是返回列表最后一项的函数:
last_two([],false).
last_two([H|[]],H).
last_two([_|T], P) :- last_two(T,P).
返回此内容应该是什么样的:
?- last_two([4,5,6,3,6,1,7,3],T).
T = 10
?- last_two([4,5,6,3,6,1,4,5],T).
T = 9
答案 0 :(得分:4)
(谁发明了这样的问题?)
:- use_module(library(clpfd)).
last_two(Xs, S) :-
phrase(( ..., [X,Y] ), Xs),
S #= X+Y. % or S is X+Y.
... --> [] | [_], ... .
有更快的解决方案,但我认为上面是最容易理解的 - 在您了解DCG之后。
您建议使用false
和默认值。我对此有点怀疑。为什么false
为空列表?但对于单一列表,有效0
?在Prolog中,我们可能会失败。
:- use_module(library(clpfd)).
last_two(Xs, S) :-
last_two(Xs, 0, 0, S).
last_two([], A, B, S) :-
S #= A+B.
last_two([B|Bs], _, A, S) :-
last_two(Bs, A, B, S).
答案 1 :(得分:1)
last_two(Xs, S) :- append(_, [U,V], Xs), plus(U,V,S).
例如
?- last_two([_,U,3],10).
U = 7