我想知道是否可以使用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)
已经消失,而这不是我需要的。
答案 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).