具有重复元素的两个列表的交集

Intersection of two lists with duplicate elements

我正在定义一个 intersection 谓词,它接受两个列表,允许重复的元素。这是我目前所拥有的。

intersection([], _, []).
intersection([H1|T1], L2, [H1|R]) :- m_member(H1, L2), intersection(T1, L2, R).
intersection([_|T1], L2, R) :- intersection(T1, L2, R).

但是,在以下情况下:

intersection([a,b,b,a],[c,b,b,c,e,f], S).

谓词调用returns [b, b]。我想 return [b] 代替。有什么指点吗?

获得[X|A]B的交集D的可能解决方案是:

  • 作为归纳假设,假设AB的交集是C(不重复)。
  • 因此:
    • 如果XC的成员或X不是B的成员,则D等于C
    • 否则,D等于[X|C]
% inter(++Set1, ++Set2, -Set3)

  inter([], _, []).
  inter([X|A], B, D) :-
     inter(A, B, C),
     (   (   memberchk(X, C)
         ;   \+ memberchk(X, B) )
     ->  D = C
     ;   D = [X|C]   ).

示例:

?- inter([a,b,b,a], [c,b,b,c,e,f], S).
S = [b].