ISO-Prolog提供了sort/2
和keysort/2
,它们依赖于项序(7.2),通常称为“标准项序”。
使用不同序列的常见方法是将该列表的每个元素El
映射到一些对XKey-El
的列表上,然后对该列表进行排序,最后投影键。例如,考虑如何用sort/2
(请参阅实现说明)表示keysort/2
。
在许多情况下,这种方法比使用依赖于用户定义顺序的通用实现特定排序谓词更快,如SWI的predsort(C_3, List, SortedList)
或SICStus的samsort(O_2, List, SortedList)
。
我的问题可以简化为:
是否存在使用
predsort/3
或samsort/3
无法替换的排序情况,需要使用映射、sort/2
和投影?1
为了清晰起见,最好遵循有限地、地面术语。因为无限地面术语没有总的字典序,因此需要将其扩展为有限地面术语; 此外,鉴于ISO/IEC 13211-1:1995的7.2.1,不清楚比较具有两个不同变量的情况如何进行,因为这涉及实现相关性:
7.2.1 变量
如果变量
X
和Y
不相同,则X
term_precedesY
将取决于实现,但在创建排序列表(7.1.6.5,8.10.3.1 j)期间,排序顺序应保持不变。因此,不清楚
predsort/3
是否仍然符合排序列表的创建条件。清楚的是,在sort/2
和keysort/2
期间,排序顺序保持不变。
1 感谢@WillNess指出,该投影至少还包括
reverse/2
——或任何线性变换。这也意味着可以实现具有重复项和唯一项的结果(类似于keysort/2
的实现方法)。
keysort
在具有_等效_元素的列表排列上也会产生不同的结果,例如keysort([a-b,a-c], Sorted)
和keysort([a-c,a-b], Sorted)
,尽管等价性是可传递的。 - user1812457predsort/3
一起使用!因此,您将获得准随机结果。相比之下,另一种方法也会给出类似的随机结果。 - false