从列表中选取偶数
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]
,生成所有可能的列表,2
,4
作为唯一的偶数数字会更难。如果可以限制列表的成员,则可以使用 clpfd
库构建一些东西,例如到“1 到 1,000 之间的正整数”。
定义规则 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]
,生成所有可能的列表,2
,4
作为唯一的偶数数字会更难。如果可以限制列表的成员,则可以使用 clpfd
库构建一些东西,例如到“1 到 1,000 之间的正整数”。