从Prolog中的列表中删除重复值

时间:2013-03-16 23:54:28

标签: list prolog

这是一个重复值的情况,我没有找到解决方案。

假设我们有以下列表:

List = [
    (A, B),
    (A, C),
    (B, A),
    (B, C),
    (C, A),
    (C, B)
].

重复元素将是一个在其包中具有完全相同值的元素 - 顺序无关紧要。

因此,删除重复项后,列表将如下所示:

List = [
    (A, B),
    (A, C),
    (B, C),
].

我将如何做到这一点?

2 个答案:

答案 0 :(得分:0)

这是一种直截了当的方式(但并没有真正充分利用内置谓词):

% 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)] 

答案 1 :(得分:0)

编写一个谓词same/2,以识别两个元素何时相同,与订单无关。

编写一个谓词member_same/2(如member/2,但等号替换为same/2),检查一个元素是否是列表的成员,无论如何排序。

然后使用member_same/2编写谓词以删除重复项。

BTW,您需要以小写形式写出常量,大写则用于变量。这可能会导致很多混乱,因为统一的变量可以变得相等。