我想知道是否可以使用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)
已经消失了,这不是我需要的.
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
留给读者作为练习.