Predsort / 3喜欢msort / 2

时间:2011-11-23 18:09:05

标签: prolog swi-prolog

我想知道是否可以使用predsort/3而不会丢失重复值?如果没有,我该如何对这个术语列表进行排序?

当前排序功能:

compareSecond(Delta, n(_, A, _), n(_, B, _)):-
        compare(Delta, A, B).

结果:

predsort(compareSecond, [n(3, 1, 5), n(0, 0, 0), n(8, 0, 9)], X).
X = [n(0, 0, 0), n(3, 1, 5)].

你知道,那个词n(8,0,9)已经消失,而这不是我需要的。

2 个答案:

答案 0 :(得分:5)

predsort 删除重复项,但会将其留给比较谓词来定义哪些元素是重复项。如果第二个参数比较相等,则调整你的compareSecond谓词以比较它接收的仿函数的第一个和第三个参数。

或者,切换到msort

?- maplist(swap_1_2, [n(3, 1, 5), n(0, 0, 0), n(8, 0, 9)], Swapped),
|    msort(Swapped, SortedSwapped),
|    maplist(swap_1_2, Sorted, SortedSwapped).
% snip
Sorted = [n(0, 0, 0), n(8, 0, 9), n(3, 1, 5)] .

swap_1_2的定义作为练习留给读者。

答案 1 :(得分:1)

如果您不打算进一步对重复项进行排序,这种简单的添加可以防止它们被删除。

compareSecond(Delta, n(_, A, _), n(_, B, _)):-
    A == B;
    compare(Delta, A, B).