List Prolog-在列表中查找偶数元素
我想在Prolog中编写一个规则,返回给定列表中的偶数元素。例如: 偶数_元素[1,2,3,4],Result将返回结果:[2,4] 以下是我到目前为止的情况: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
% 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).
基本情况看起来不像基本情况。基本情况看起来不像基本情况。