这是我没有找到解决方案的重复值的情况。
假设我们有以下列表:
List = [
(A, B),
(A, C),
(B, A),
(B, C),
(C, A),
(C, B)
].
重复元素将是在其包中具有完全相同值的元素 - 顺序无关紧要。
因此,删除重复项后,列表将如下所示:
List = [
(A, B),
(A, C),
(B, C),
].
我该怎么做呢?
编写一个谓词same/2
来识别两个元素何时相同,而与顺序无关。
编写一个谓词member_same/2
(如member/2
,但用 代替等式same/2
)检查元素是否是列表的成员,而不考虑顺序。
然后编写一个谓词来删除重复项,使用member_same/2
.
顺便说一句,你需要用小写写常量,大写是变量。这可能会导致很多混乱,因为不同的变量可以通过统一变得相等。
这是一种直接的方式(但这并没有真正充分利用内置谓词):
% an item is sorted when the two terms are in standard order of terms
% note that you use @< and @> when you are comparing things that aren't numbers
sortitem((A, B), Item) :-
(A @< B,
Item = (A, B));
(A @> B,
Item = (B, A)).
% a list of items is sorted when each of the individual item's terms are sorted (but we
% don't care if the items themselves are in order)
sortlistitems([], []).
sortlistitems([H|T], List) :-
sortitem(H, HSorted),
sortlistitems(T, TSorted),
List = [HSorted|TSorted].
% sorting with sort/2 removes duplicates and puts the items in order
removeduplicateitems(X, Y) :-
sortlistitems(X, XSorted),
sort(XSorted, Y).
测试:
?- removeduplicateitems([(a, b), (a, c), (b, a), (b, c),(c, a),(c, b)], X).
X = [ (a, b), (a, c), (b, c)]