如何在Prolog中保存偶数?

时间:2018-11-09 22:24:20

标签: prolog

我试图通过去除奇数来保持偶数,但是接缝有问题。

keepeven([], []).
keepeven([X|Xs], Even) :- 0 is X mod 2, keepeven(Xs, [Even|X]).

我尝试过:

keepeven([], []).
keepeven([X|Xs], [X|Even]) :- 0 is X mod 2, keepeven(Xs, Even).

我想念一些东西。 :/

我应该从

keepeven([1,2,3,4,5], Even).
Even = [2,4].

但是我只是失败了。

1 个答案:

答案 0 :(得分:1)

  

我想念一些东西。 :/

是的,您缺少数字为 odd 的情况,因为在这种情况下0 is X mod 2将失败,但是Prolog无法回溯到“删除”该元素的另一个子句。

例如,我们可以添加一个额外的子句:

keepeven([], []).
keepeven([X|Xs], [X|Even]) :- 0 is X mod 2, keepeven(Xs, Even).
keepeven([X|Xs], Even) :- 1 is X mod 2, keepeven(Xs, Even).

或使用if-then-else子句:

keepeven([], []).
keepeven([X|Xs], R) :-
    (  0 is X mod 2
    -> R = [X|Even]
    ;  R = Even),
    keepeven(Xs, Even).