具有重复元素的两个列表的交集
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
的可能解决方案是:
- 作为归纳假设,假设
A
和B
的交集是C
(不重复)。
- 因此:
- 如果
X
是C
的成员或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].
我正在定义一个 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
的可能解决方案是:
- 作为归纳假设,假设
A
和B
的交集是C
(不重复)。 - 因此:
- 如果
X
是C
的成员或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].