Von Neumann 秩

可以直接阅读本章,也可以通过阅读指南和依赖地图选择其他路线。

阅读指南 · 依赖地图

集合的秩是其所有成员之秩的后继的并;用记号说,计算定理 rank-computerank x 等同于 rankStep x (λ y _ → rank y)。本章证明秩的四条性质:rank-mono 说秩沿隶属关系严格增长,rank-ord 说秩总是序数,rank-upper 给出秩包含于某序数的有条件结论,rank-fix 说秩固定每个序数。

此处不需要任何外部的序数类型:秩取值于层级自身,而递归依据正则性所保证的成员关系良基性进行。因此本章每条定理都不需要排中律参数。

秩直接定义在累积层级 V ℓ 的载体 S 中。成员关系 x ∈ˢ y 是命题值的,而正则性保证这条成员关系良基。因此,成员归纳原理 ∈-induction 可以利用每个成员处已经定义的值,在当前集合处定义一个 S 中的值。

{-# OPTIONS --cubical --safe --guardedness #-}

open import Base.Prelude

module L.Rank { : Level} where

open import FOL.ZFStructure using ( module hPropStructure )

对秩而言,集合处的值要汇集其所有成员之秩的后继。sucV 与小索引并正好表达这一构造。递归得到的成员秩一旦是序数,suc-ordsetUnion-ord 就证明汇集后的值仍是序数;在处理序数自身时,mem-ord 再给出其成员的序数性。

open import V.Hierarchy {}
  using ( 𝒮ᵥ; extensionalV; ∈-induction; ∈-induction-compute )
open import V.Model {} using ( union-family-in; union-family-out; ∈sucV-elim; self∈sucV )
open import L.Constructible {} using ( IsOrd )
open import L.Ordinal {} using ( suc-ord; setUnion-ord; mem-ord )

这里的索引确实是小的。每个集合 x 都有小成员类型 ⟪ x ⟫ 及其到 S 的嵌入 ⟪ x ⟫↪,而 ∈ₛ⟪ x ⟫↪ m 证明所表示的集合属于 x。反过来,给定成员关系证明,∈-asFiber 返回一个索引以及所表示集合与该成员相等的路径。这两个方向把沿成员关系的递归与取并所需的小族连接起来。

open import Cubical.Functions.Logic using ( ⇔toPath )
import Cubical.HITs.PropositionalTruncation as PT
open import Cubical.HITs.CumulativeHierarchy.Base using ( sett )
open import Cubical.HITs.CumulativeHierarchy.Properties
  using ( ∈∈ₛ; ∈-asFiber; ⟪_⟫; ⟪_⟫↪; ∈ₛ⟪_⟫↪_ )

于是递归步可以直接读成数学构造:取成员组成的小族,把每个成员换成其递归所得秩的后继,再对这一族取并。下一节把这个构造写成 rankStep,并给出它的计算路径

open import Cubical.HITs.CumulativeHierarchy.Constructions
  using ( ⋃_; module InfinitySet )
open InfinitySet using ( sucV )

open hPropStructure 𝒮ᵥ

递归

步进取 x 的各成员之秩的后继的并。递归调用跑在成员的类型上,而计算法则作为路径命题性地成立、而非定义性地成立,这正是后文证明所用的形式。

递归方程说:要对集合 x 求秩,就对每个成员求秩,再取其后继的并。形式上,被取并的族以成员的小类型 ⟪ x ⟫ 为索引,故 ⋃ (sett ⟪ x ⟫ …) 是一次合法的小并;嵌入 ⟪ x ⟫↪ 把索引 m 变成实际的集合 ⟪ x ⟫↪ m,而辅助 mem 提供该嵌入集合确实是 x 的成员的证明,这正是递归调用 rec 所要求的。注意步进函数的形状:它经函数 rec 接收递归值,而不直接调用 rank,这使它能充当 ∈-induction 的步进。

rankStep : (x : S)  (∀ y  y ∈ᵗ x  S)  S
rankStep x rec =  (sett  x   m  sucV (rec ( x ⟫↪ m) (mem m))))
  where
  mem : (m :  x )   x ⟫↪ m ∈ᵗ x
  mem m = ∈∈ₛ {a =  x ⟫↪ m} {b = x} .snd (∈ₛ⟪ x ⟫↪ m)

秩本身就是把成员归纳用在这个步进上:∈-induction rankStep 把步进函数变成整个 S 上的全定义族。定义标记为 opaque,以免检查器展开其中的良基消去子。取而代之可用的是计算法则 rank-compute,它把递归方程作为命题路径暴露出来:rank x 有一条到 rankStep x (λ y _ → rank y)路径,即同一条方程、但每次递归调用都由 rank 自身填充。后续证明按这条路径改写,而不直接化简 rank

opaque
  rank : S  S
  rank = ∈-induction rankStep

  rank-compute : (x : S)  rank x  rankStep x  y _  rank y)
  rank-compute = ∈-induction-compute rankStep

秩沿成员关系严格增长

定理 rank-mono 说:若 x ∈ˢ y,则 rank x ∈ˢ rank y。它直接来自定义之并的形状:rank y 是以 y 的成员 w 为索引的后继 sucV (rank w) 之并,故只需把 rank x 表为其中某个后继的成员。命题中完全不出现 IsOrd 假设。

给定 x ∈ˢ y,目标是 rank x ∈ˢ rank y。先用 rank-computerank y 展开一次:目标变成属于并 ⋃ (sett ⟪ y ⟫ (λ m → sucV (rank (⟪ y ⟫↪ m))))。于是只需把 rank x 表为某个族元、即某成员 wsucV (rank w) 的成员;self∈sucVrank x 放进它自身的后继,union-family-in 再把它提升进并,包括沿计算路径的传输。

rank-mono : (x y : S)   x ∈ˢ y    rank x ∈ˢ rank y 
rank-mono x y x∈y = subst  w   rank x ∈ˢ w ) (sym (rank-compute y))
  (union-family-in  y   m  sucV (rank ( y ⟫↪ m))) (fib .fst) (rank x)
    (subst  w   rank x ∈ˢ sucV (rank w) ) (sym (fib .snd)) (self∈sucV (rank x))))
  where

剩下的部分是并的族元所用的索引从何而来。函数 ∈-asFiber 把给定的证明 x∈y 转换为嵌入 ⟪ y ⟫↪ 的一个纤维:一个对,其第一分量 fib .fst⟪ y ⟫ 中的一个索引,第二分量 fib .snd 是说被索引的集合等于 x路径。代码正是沿这条路径传输,使得后继中的隶属谈的是 rank x 自身。

  fib = ∈-asFiber {a = x} {b = y} x∈y

秩是序数

一次成员归纳。先用 rank-compute 展开一次;归纳假设给出每个成员的秩是序数,封闭引理 suc-ord 给出每个后继是序数,封闭引理 setUnion-ord 给出这一族序数之并仍是序数。

命题对所有集合量化,故证明是以 λ A → IsOrd (rank A) 为谓词的成员归纳。归纳假设对 A 的每个成员 y 给出「rank y 是序数」的证书。由于 rank-compute A 在命题意义下把 rank A 等同于步进所得,目标可沿计算路径 rank-compute A 传输 IsOrd 而达成,剩下只需证步进所得的并是序数。

rank-ord : (A : S)  IsOrd (rank A)
rank-ord = ∈-induction {P = λ A  IsOrd (rank A)} step
  where
  step : (A : S)  (∀ y  y ∈ᵗ A  IsOrd (rank y))  IsOrd (rank A)
  step A IH = subst IsOrd (sym (rank-compute A))

最后一步组合两个封闭事实。每个族元 sucV (rank (⟪ A ⟫↪ m)) 是某序数的后继,故由 suc-ord 是序数,其输入证书由归纳假设与辅助 mem 供给。随后 setUnion-ord 保证序数的小索引并仍是序数。从假设到结论的链条是:若成员的秩是序数,则集合的秩也是序数。

    (setUnion-ord  A   m  sucV (rank ( A ⟫↪ m)))
       m  suc-ord (IH ( A ⟫↪ m) (mem m))))
    where
    mem : (m :  A )   A ⟫↪ m ∈ᵗ A
    mem m = ∈∈ₛ {a =  A ⟫↪ m} {b = A} .snd (∈ₛ⟪ A ⟫↪ m)

界住秩

若一个集合的每个成员的秩都属于某序数,则该集合的秩包含于该序数:定义之并的每个成员都落在某个成员之秩的后继中,传递性给出所需包含。序数的不动点性质与可构造层中的秩界都用这条论证。

所述是逐点包含而非严格隶属:在 IsOrd β 与「每个成员秩 rank y 严格属于 β」的假设下,结论是 rank A 的每个成员都属于 β。证明从定义之并的形状出发消去。属于该并经 union-family-out 给出仅仅一个索引 m 使 x ∈ˢ s m;由于目标 x ∈ˢ β 是命题,对这个截断做消去是合法的,随后 ∈sucV-elim 把在后继 s m = sucV (rank (⟪ A ⟫↪ m)) 中的隶属分成两种情形。

rank-upper : (A β : S)  IsOrd β
            ((y : S)   y ∈ˢ A    rank y ∈ˢ β )
            (x : S)   x ∈ˢ rank A    x ∈ˢ β 
rank-upper A β  bound x hx = PT.rec (snd (x ∈ˢ β))
   { (m , hm)  ∈sucV-elim (snd (x ∈ˢ β)) hm

后继的两种情形正是序数性发挥作用之处。若 x 属于 rank (⟪ A ⟫↪ m),则因 β 传递且该秩已在 β 中,x 也在 β 中:这是分支 oβ .fst h (below m)。若 x 直接等于 rank (⟪ A ⟫↪ m),第二支沿该路径传输界 below m。两种情形的结论都落在 x ∈ˢ βunion-family-out 给出的索引与证明位于命题截断中;由于目标 x ∈ˢ β 是命题,PT.rec 可以逐个处理其中的 (m , hm),而不选择一个全局索引。

     h   .fst h (below m))
     q  subst  w   w ∈ˢ β ) (sym q) (below m)) })
  (union-family-out  A  s x
    (subst  w   x ∈ˢ w ) (rank-compute A) hx))
  where

s 就是递归方程中的后继之秩的族,把索引 m 映到 sucV (rank (⟪ A ⟫↪ m))。事实 below m 是把假设 bound 作用于被嵌入成员 ⟪ A ⟫↪ m 及其成员证明,得到 rank (⟪ A ⟫↪ m) ∈ˢ β。整个引理因此不依赖任何归纳:按计算法则改写一次,拆开并,让序数的传递性吸收后继。

  s :  A   S
  s m = sucV (rank ( A ⟫↪ m))
  below : (m :  A )   rank ( A ⟫↪ m) ∈ˢ β 
  below m = bound ( A ⟫↪ m)
    (∈∈ₛ {a =  A ⟫↪ m} {b = A} .snd (∈ₛ⟪ A ⟫↪ m))

序数是自身的秩

仍是成员归纳,而这次的证明是 rank AA 之间的一次外延。从左到右:rank A 的元素落在某个成员之秩的后继里面,而依归纳假设那个秩就是该成员,故该元素或就是该成员,或属于它,两种情形都经传递性属于 A。从右到左:A 的成员是自身的秩,故属于该秩的后继,而那是并的一支。

定理说秩固定每个序数,以路径而非等价的形式。归纳以把序数性假设与结论打包在一起的谓词 λ A → IsOrd A → rank A ≡ A 设立,因为步进确实需要它:要比较 rank A 与 A,必须知道序数 A 的成员本身也是序数。于是步进在收到递归等式 rank y ≡ y 之外,还收到证书 IsOrd A,并返回在 A 处的等式。

rank-fix : (A : S)  IsOrd A  rank A  A
rank-fix = ∈-induction {P = λ A  IsOrd A  rank A  A} step
  where
  step : (A : S)  (∀ y  y ∈ᵗ A  IsOrd y  rank y  y)
        IsOrd A  rank A  A

等式本身来自 extensionalV,它把逐点的隶属等价变成集合的路径⇔toPath 打包两个方向。被比较的两个集合保持不展开。向前的方向 toA 不是别的,正是取 β = Arank-upper:作用在成员秩上的序数界就是 A 自身,而界定假设由归纳假设当场构造。

  step A IH ordA = extensionalV  x  ⇔toPath (toA x) (fromA x))
    where
    toA : (x : S)   x ∈ˢ rank A    x ∈ˢ A 
    toA = rank-upper A A ordA
       y hy  subst  w   w ∈ˢ A )

两个方向都依赖同一事实 mem-ord:序数 A 的成员仍是序数,故归纳假设适用于它。对 toArank-upper 要求的假设是 rank y ∈ˢ A;由归纳假设 rank y ≡ y 且已给 y ∈ˢ A,传输即可落位。对 fromA,方向相反:rank-mono x A x∈A 给出 rank x ∈ˢ rank A,而归纳假设的路径 rank x ≡ x 把它传输成 x ∈ˢ rank A。至此所有材料齐备,路径 rank A ≡ A 随之成立。

        (sym (IH y hy (mem-ord {A = A} ordA y hy))) hy)

    fromA : (x : S)   x ∈ˢ A    x ∈ˢ rank A 
    fromA x x∈A = subst  w   w ∈ˢ rank A )
      (IH x x∈A (mem-ord {A = A} ordA x x∈A)) (rank-mono x A x∈A)

小结

rank 以序数度量每个集合 (rank-ord),并固定序数自身 (rank-fix),二者表明它是与每个序数一致的序数值度量。两个证明都是正则性上的成员归纳,故本章不引入任何额外假设。它给出沿成员关系严格增长的序数值度量,以及被测集合本身为序数时所需的不动点律。