List 如何使用prolog生成理想列表?

List 如何使用prolog生成理想列表?,list,prolog,List,Prolog,我的目标是,如果对应的数字是奇数,则将1放入列表,否则将0放入列表 even(X):- 0 is mod(X,2). odd(X):- 1 is mod(X,2). %This is used to determine even or odd. determine([X|Xs],L):- even(X),append(L,0,K), determine(Xs,K). determine([X|Xs],L):- odd(X),append(L,1,K). det

我的目标是,如果对应的数字是奇数,则将1放入列表,否则将0放入列表

even(X):- 0 is mod(X,2).
odd(X):- 1 is mod(X,2).
%This is used to determine even or odd.

determine([X|Xs],L):-
    even(X),append(L,0,K),
    determine(Xs,K).

determine([X|Xs],L):-
    odd(X),append(L,1,K).
    determine(Xs,K).
理想的输出是:

determine([1,2,3,4,5],K).
K=[1,0,1,0,1].

我知道我目前的方法是非常错误的,但我想不出一个主意。

有几种方法,这里我给你们展示两种。第一个是最简单的(无需使用
append/2
):

或者,您可以更紧凑地使用
maplist/3

?- maplist(even_odd,[1,2,3,4,5],L).
L = [1, 0, 1, 0, 1]

如果要使用谓词
奇数
偶数
,则 这是一个可能的解决方案:

determine([], []).

determine([H|T], [1|T2]) :-
    odd(H),
    determine(T,T2).

determine([H|T], [0|T2]) :-
    even(H),
    determine(T,T2).
不过,我更喜欢这样:

determine2([], []).

determine2([H|T], [R|T2]) :-
    R is mod(H,2),
    determine2(T,T2).
determine2([], []).

determine2([H|T], [R|T2]) :-
    R is mod(H,2),
    determine2(T,T2).