Predsort/3喜欢msort/2

Tra*_*ac3 7 prolog swi-prolog

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

当前排序功能:

compareSecond(Delta, n(_, A, _), n(_, B, _)):-
        compare(Delta, A, B).
Run Code Online (Sandbox Code Playgroud)

结果:

predsort(compareSecond, [n(3, 1, 5), n(0, 0, 0), n(8, 0, 9)], X).
X = [n(0, 0, 0), n(3, 1, 5)].
Run Code Online (Sandbox Code Playgroud)

你看,这个词n(8,0,9)已经消失了,这不是我需要的.

Fre*_*Foo 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)] .
Run Code Online (Sandbox Code Playgroud)

其定义swap_1_2留给读者作为练习.