7

我想知道是否可以在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)已经消失了,这不是我需要的。

4

2 回答 2

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留给读者作为练习。

于 2011-11-23T18:20:43.113 回答
1

如果您不介意进一步排序重复项,这个简单的添加可以防止它们被删除。

compareSecond(Delta, n(_, A, _), n(_, B, _)):-
    A == B;
    compare(Delta, A, B).
于 2012-01-08T18:39:34.600 回答