在Prolog中没有重复元素的两个列表的交集

nof*_*aki 7 list prolog duplicates

我需要编写一个程序来查找两个列表的交集.我不能使用剪切,结果列表中不应该有任何重复的元素.

这是我的代码:

intersection([],_,[]).
intersection([X|Xs],Y,[X|Zs]) :-
    member(X,Y),
    intersection(Xs,Y,Zs).
intersection([_|Xs],Y,Zs) :-
    intersection(Xs,Y,Zs).
Run Code Online (Sandbox Code Playgroud)

当我运行以下查询时,我得到以下答案:

?- intersection([a,b,c,a],[a,v,c],L).
L = [a, c, a] ;
L = [a, c] ;            % <---------- this is only answer I want to get
L = [a, a] ;
L = [a] ;
L = [c, a] ;
L = [c] ;
L = [a] ;
L = [].
Run Code Online (Sandbox Code Playgroud)

我能做什么?我想得到L = [a,c]什么别的......你能帮忙吗?

rep*_*eat 6

在我对相关问题" 2个列表的交集和并集 "的回答中,我提出了逻辑上纯的谓词list_list_intersectionSet/3.它应该符合您对T的要求!

这是一个刷新版本list_list_intersectionSet/3,它基于:

开始了:

list_list_intersectionSet([]     ,_ ,[]).
list_list_intersectionSet([A|As0],Bs,Cs0) :-
   if_(memberd_t(A,Bs), Cs0 = [A|Cs], Cs0 = Cs),
   tfilter(dif(A),As0,As), 
   list_list_intersectionSet(As,Bs,Cs).
Run Code Online (Sandbox Code Playgroud)

让我们看看它在行动!

?- list_list_intersectionSet([a,b,c,a],[a,v,c],L).
L = [a,c].
Run Code Online (Sandbox Code Playgroud)