我试图通过去除奇数来保持偶数,但是接缝有问题。
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].
但是我只是失败了。
答案 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).