prolog中最后两项清单的总和

时间:2016-05-09 18:59:58

标签: list prolog

我试图找出最后两项清单总和的代码。 我现在得到的只是返回列表最后一项的函数:

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

2 个答案:

答案 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)

在SWI-Prolog中,你可以写

last_two(Xs, S) :- append(_, [U,V], Xs), plus(U,V,S).
例如

?- last_two([_,U,3],10).
U = 7