prolog中不使用成员函数求两个集合的交集

prolog中不使用成员函数求两个集合的交集,prolog,Prolog,我正在处理一个函数,它接受两个集合并返回它们的交集。但是,我不想在代码中使用成员函数。以下是成员函数: member( X, [ X | T ] ). member( X, [ _ | T ] ) :- member( X, T ). 以下是我目前掌握的情况: set_int(_,[],_). set_int([H|T],[H|T1],[H|T2]) :- set_int(T,T1,T2). set_int(T,[X|T1],T2) :

我正在处理一个函数,它接受两个集合并返回它们的交集。但是,我不想在代码中使用成员函数。以下是成员函数:

member( X, [ X | T ] ).
member( X, [ _ | T ] ) :- member( X, T ).
以下是我目前掌握的情况:

     set_int(_,[],_).   
     set_int([H|T],[H|T1],[H|T2]) :-
           set_int(T,T1,T2).
     set_int(T,[X|T1],T2) :-
           set_int(T,T1,T2). 

请帮我解释一下我的逻辑

如果您编写
set_int
来处理第一学期的3种情况(一个空列表、一个元素列表和比它更长的列表),您可以有效地使用
set_int([a],B,[a])
来代替
成员(a,B)

我认为只有在您的集合已排序的情况下,您才能处理成员(或等效的)。有了这样的假设,我们可以只比较人头:

set_int([X|Xs], [Y|Ys], Is) :-
    X @< Y,
    !, set_int(Xs, [Y|Ys], Is).
set_int([X|Xs], [Y|Ys], Is) :-
    X @> Y,
    !, set_int([X|Xs], Ys, Is).
set_int([Z|Xs], [Z|Ys], [Z|Is]) :-
    !, set_int(Xs, Ys, Is).
set_int(_, _, []).
set|int([X|Xs],[Y|Ys],Is):-
X,Y,,
!, set_int(Xs,[Y | Ys],Is)。
set|int([X|Xs],[Y|Ys]为):-
X,Y,,
!, set|int([X | Xs],Ys,Is)。
set|int([Z|Xs]、[Z|Ys]、[Z|Is]):-
!, set_int(Xs,Ys,Is)。
设置_int(u,,[])。