Prolog 预排序/3与msort/2类似

Prolog 预排序/3与msort/2类似,prolog,swi-prolog,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)]. 结果: compareSecon

我想知道是否可以在不丢失重复值的情况下使用
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)].
结果:

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)
已经不存在了,这不是我需要的。

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

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

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

这是可行的,但您需要在预排序后添加剪切。=>predsort()!。否则,您将从OR运算符获得其他结果。