List Prolog-在列表中查找偶数元素

List Prolog-在列表中查找偶数元素,list,recursion,prolog,List,Recursion,Prolog,我想在Prolog中编写一个规则,返回给定列表中的偶数元素。例如: 偶数_元素[1,2,3,4],Result将返回结果:[2,4] 以下是我到目前为止的情况: % This is my base case. even_elements([H|T], Result) :- (0 is mod(H,2) -> Result = [H|T] ; Result = T). % This is my recursion. even_elements([H|T], [H|NT]) :- even

我想在Prolog中编写一个规则,返回给定列表中的偶数元素。例如: 偶数_元素[1,2,3,4],Result将返回结果:[2,4]

以下是我到目前为止的情况:

% This is my base case.
even_elements([H|T], Result) :- (0 is mod(H,2) -> Result = [H|T] ; Result = T). 

% This is my recursion.
even_elements([H|T], [H|NT]) :- even_elements(T, NT).

基本情况下工作正常,并消除第一个元素,如果它是奇数;但是递归并没有改变任何事情。任何关于如何完成递归的提示都值得赞赏。

列表处理中的基本情况通常是处理空列表。事实上,我们可以这样写:

even_elements([], []).
对于递归情况,我们可以从基本情况中使用很多,我们仍然需要做的唯一一件事就是在列表的尾部递归,因此:

even_elements([H|T], Result) :-
    (  0 is mod(H,2)
    -> Result = [H|T2]
    ;  Result = T2
    ),
    even_elements(T, T2).
然后我们可以使用以下方法进行过滤:

even_elements(L, R) :-
    include(even, L, R).
这就给了我们:

?- even_elements([1,4,2,5], R).
R = [4, 2].

列表处理中的基本情况通常处理空列表。事实上,我们可以这样写:

even_elements([], []).
对于递归情况,我们可以从基本情况中使用很多,我们仍然需要做的唯一一件事就是在列表的尾部递归,因此:

even_elements([H|T], Result) :-
    (  0 is mod(H,2)
    -> Result = [H|T2]
    ;  Result = T2
    ),
    even_elements(T, T2).
然后我们可以使用以下方法进行过滤:

even_elements(L, R) :-
    include(even, L, R).
这就给了我们:

?- even_elements([1,4,2,5], R).
R = [4, 2].

虽然威廉的答案更具可读性,但我还是从中找到了这个解决方案:

even_elements(L1,L2):-findall(X,(member(X,L1), X mod 2=:=0),L2).

虽然威廉的答案更具可读性,但我还是从中找到了这个解决方案:

even_elements(L1,L2):-findall(X,(member(X,L1), X mod 2=:=0),L2).

基本情况看起来不像基本情况。基本情况看起来不像基本情况。