“良序是满足以下条件的全序 ((X,\preceq)):每个非空子集 (A\subseteq X) 都存在最小元素 (a 0\in A),即”
形式陈述
偏序
偏序的自反性、反对称性和传递性仍然保留。全可比性本身不够:在含两个不同元素的集合上,让所有元素都彼此相关,虽然满足全可比性,却违反反对称性。
定义严格关系
三歧性中的“恰有一个”分成两部分:全可比性保证至少一个成立,反对称性排除两个严格方向同时成立,严格关系的定义又排除它们与相等同时成立。非严格形式使用自反性,严格形式使用非自反性;不能要求严格关系也满足
直觉
全序承诺“任意挑出两个元素,都能确定先后或相等”,并且比较结果前后一致。它没有承诺相邻位置、固定间隔或某种距离。整数中
将任务依赖关系补成执行次序,是从偏序走向全序的典型过程。两项互不依赖的任务原本不可比,排定日程时可以任选一个先执行;这个额外方向来自排程选择,而不是新发现了一条依赖。保留所有原有比较的全序称为原偏序的线性扩张。
例子与边界
逐坐标序与字典序
在
因此
字符串字典序还需要约定真前缀的位置,通常令短前缀在前。即使字母表有限且有序,全体有限字符串的字典序也未必是良序:在
端点、相邻与良序
整数通常次序没有最小元和最大元;区间
良序要求每个非空子集都有最小元。自然数的通常次序是良序,整数和实数的通常次序不是。另一个独立问题是稠密性:有理数和实数的通常次序都稠密,只有后者具有上确界完备性。全可比、良序、稠密和完备描述的是不同结构,不能互相替代。
这些条件在存在性问题中各有用途。稠密线性序的量词消去把“存在元素高于全部有限下界、低于全部有限上界”化成每个下界小于每个上界;稠密性填补双侧空隙,无端点性处理只有单侧界的情况。整数在
集合的包含序通常不是全序,例如
排序键相同,不等于对象相同
按成绩给学生排序,两个不同学生可能成绩相同。如果把“成绩不大于”直接当作学生集合上的非严格序,那么两个不同学生会双向可比,违反反对称性。它给出的是全预序;先按相同成绩形成商集,再在等价类之间比较,才能得到全序。
程序库常使用严格弱序:比较中的“互不小于”定义同一组,组之间全序排列。要给每个对象唯一位置,可以再加入唯一 ID 作为第二排序键;稳定排序则保留同键元素的原输入次序,二者解决的问题不同。
特殊数值也会破坏普通比较的三歧性。例如浮点 NaN 与数值做普通大小、相等比较时,三个方向可能都不成立。需要在业务比较规则中明确排除它,或指定它属于哪个排序组,而不是从“数值类型”推断已有全序。
推论与应用
有限集合能真正排成一列
每个非空有限全序集都有唯一最小元。证明可以维护当前最小者:加入新元素时,全可比性允许选择两者中较小的一个,传递性保证它仍不大于此前全部元素。唯一性来自反对称性。类似地存在唯一最大元;反复取出最小元,就能把整个集合按严格递增顺序列完。
这个论证还解释比较算法为何不能容忍“剪刀、石头、布”式循环:即使每对对象都有胜负,缺少传递性也会让当前最小者失去一致意义。全可比性只负责每次能比较,传递性负责局部比较能够组成整体次序。
有限 DAG 的拓扑排序给依赖偏序选择线性扩张。每次从当前没有未完成前驱的任务中选一个,便得到合法次序;多个任务同时可选时,不同选择可以产生不同而同样正确的排序。
二分查找还需要比全序更多的条件:数据已经按该比较排序,或待判定谓词沿序单调,并且可以访问中间位置。全序提供比较语言,存储结构与单调性才支持“丢弃一半候选”的步骤。良序定理则讨论能否为任意集合另选一个良序,并不把已有的全序自动变为良序。
参考资料
- Jeremy Avigad、Joseph Hua、Robert Y. Lewis、Floris van Doorn,Logic and Proof, §13.1–13.2:全序、严格序、端点与稠密性。
- Eric Lehman、F. Thomson Leighton、Albert R. Meyer,Mathematics for Computer Science,2015,§2.4、§9.5–9.9:良序、拓扑排序、线性序与乘积序。
- Python 文档,Sorting Techniques:稳定排序、多个排序键与特殊值的处理。这里的库行为用于说明实现契约,不作为全序定义。