从列表中选取偶数

pick up even numbers from a list

定义规则 filterevens(LST0, LST1)。此规则描述了列表 LST0 如何与列表 LST1 相关联,后者仅由 LST0 的偶数元素组成。

我需要从列表中选取偶数,我得到了这个:

filterevens([],[]).
filterevens([H|T],R):-
    (  0 is mod(H,2) 
    -> R = [H|T2]
    ;  R = T2
    ),
    filterevens(T,T2).

当输入为

?- filterevens( [2,4] ,A).

它可以给我正确的答案。但如果我尝试

?- filterevens(A,[2,4]).

它会导致错误。那么我应该怎么做才能在一个规则中同时完成这两项操作?

在没有 ; 的情况下完整地写出案例足以让它在基本案例中工作:

filterevens([], []).

filterevens([H|T], [H|TEvens]):-
    0 is H mod 2,
    filterevens(T, TEvens).

filterevens([H|T], TEvens):-
    M is H mod 2,
    dif(M, 0),
    filterevens(T, TEvens).

然后:

?- filterevens(A, [2,4]).
A = [2, 4]

一般情况下,A可以是任意长度[1,2,1,4][1,1,1,1,1,2,4],生成所有可能的列表,24作为唯一的偶数数字会更难。如果可以限制列表的成员,则可以使用 clpfd 库构建一些东西,例如到“1 到 1,000 之间的正整数”。