首先,您可以“否定”Prolog 原子。我们就这样称呼它吧atom_neg/2
(这是一个愚蠢的名字,但无论如何它做了一些愚蠢的事情):
atom_neg(A, NK) :-
atom_codes(A, Cs),
maplist(negate, Cs, NCs),
append(NCs, [0], NK).
negate(X, N) :- N is -X.
我并不是说这样做是可行的,但显然,这是可能的。
全排序是一种弱排序,也是一个关键函数f在一组上T连同总订购r在 的共域上f, define弱排序wr(x, y)r(f(x), f(y)).
(该上下文中函数的共域是函数返回值的域。)
我可能完全错了,但是关系的存在需要一个键的存在:你可以根据另一个关系来定义一个关系,但最终你必须比较也可以单独存在的东西:键。
这里的重点是,关键是不需要在同一个域中作为我们想要排序的东西,并且为对象定义了弱排序(关系)相同的域。 Prolog 在这里做了一些奇怪的事情:它定义了术语的标准顺序对于所有可能的条款。 Prolog 也没有正确的“类型”或“域”概念。我的直觉告诉我,对不属于同一域的东西进行排序根本没有多大用处,但 Prolog 显然不同意。
不能为以下两种情况定义关键函数:
- 比较谓词保持其自己的状态;
- 您有“不透明”对象(例如,在 C 中定义),它们提供比较函数,但不提供关键函数。
无论哪种方式,predsort
可能有用:没有人愿意atom_neg/2
威尔·尼斯的解决方案。然而,它目前有一个严重的缺陷:它不允许进行稳定的排序。 SWI-Prolog 已经可以这样使用 https://stackoverflow.com/questions/28076715/possible-behaviors-of-predsort-3,所需要做的就是将当前行为添加到规范和文档中predsort/3
.