Predsort/3 like msort/2

8
我希望您能够在不丢失重复值的情况下使用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)已经不存在了,而我所需要的不是它。

2个回答

5

predsort会去除重复项,但它将决定哪些元素是重复项留给比较谓词。如果第二个参数相等,请修改您的compareSecond谓词以比较其接收到的functor的第一个和第三个参数。

或者,切换到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

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

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

这个可以工作,但是你需要在predsort()后添加一个cut()。否则,你将会从OR运算符得到其他结果。 - Kevin Van Ryckegem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接