Ordinals are linearly ordered

任两个序数,或一者属于另一者,或二者相等。这是人人对序数的期待,也是本书关于它们最后要证的东西。这里同时是可构造宇宙第一次花费经典逻辑的地方,所以值得把原因说清楚。

迄今关于序数的一切都是闭包:零是序数,后继是,并是,上界存在。闭包陈述在建造;它们从不需要判定任何东西。三歧要判定。给定两个彼此之间不假设任何关系的序数,它要回答三种互斥情形中的哪一种成立,而没有任何构造能从这些数据产出那个答案:该陈述蕴含排中律。所以本章把排中律取作模块参数,采用第零部定下的打包形式,而此后每个消费它的章节都在每个导入处可见地继承这个参数。

来自环境层级的两样材料使证明比教科书版本更短。正则性给出良基归纳,而且要用两次,两个自变量各一次。外延性意味着互相包含就是相等,故相等那一情形无须另行处理。于是排中律供应的恰好只有一件事:判定一个序数是否包含于另一个,以及在不包含时,取出一个见证失败的成员。

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

open import Base.Prelude
open import Base.Truth
open import Base.Classical using ( LEM )

module L.Ordinal.Linear { : Level} (lem : LEM (ℓ-suc )) where

open import FOL.ZFStructure using ( module hPropStructure )
open import V.Hierarchy {} using ( 𝒮ᵥ; extensionalV; regularityV )
open import L.Constructible {} using ( IsOrd )
open import L.Ordinal {} using ( mem-ord )

open import Cubical.Data.Sum using ( _⊎_; inl; inr )
open import Cubical.Functions.Logic using ( ⇔toPath )
import Cubical.Data.Empty as Empty
import Cubical.HITs.PropositionalTruncation as PT
open PT using ( ∣_∣₁; ∥_∥₁ )
import Cubical.Induction.WellFounded as WF

open TruthAlgebra (hPropAlgebra (ℓ-suc ))
open hPropStructure 𝒮ᵥ

包含,及其失败的见证

包含逐点写出,并打包成命题,好让排中律能直接施于其上:对住得高一层宇宙的载体量化,正是第零部把这个接口逐层级陈述的原因。互相包含给出相等,由层级的外延性。

_⊆ᵇ_ : S  S  Type (ℓ-suc )
A ⊆ᵇ B = (x : S)   x ∈ˢ A    x ∈ˢ B 

⊆ᵇ-prop : (A B : S)  hProp (ℓ-suc )
⊆ᵇ-prop A B = (A ⊆ᵇ B) , isPropΠ  x  isPropΠ  _  snd (x ∈ˢ B)))

ext-⊆ᵇ : {A B : S}  A ⊆ᵇ B  B ⊆ᵇ A  A  B
ext-⊆ᵇ {A} {B} s₁ s₂ = extensionalV  x  ⇔toPath (s₁ x) (s₂ x))

这里是真正经典的那一步。从包含失败出发,证明需要一个见证它的成员,而从「并非每个成员都在 B 中」过渡到「某个成员不在 B 中」不构造。排中律直接判定那个存在陈述:若没有这样的见证,则逐个成员判定下来,每个成员终究都在 B 中。

¬⊆ᵇ→witness : (A B : S)  (A ⊆ᵇ B  Empty.⊥)
              Σ[ a  S ] ( a ∈ˢ A  × ( a ∈ˢ B   Empty.⊥)) ∥₁
¬⊆ᵇ→witness A B ¬sub = decide (lem Witness)
  where
  Witness : hProp (ℓ-suc )
  Witness =  Σ[ a  S ] ( a ∈ˢ A  × ( a ∈ˢ B   Empty.⊥)) ∥₁
          , PT.isPropPropTrunc
  decide :  Witness   ( Witness   Empty.⊥)   Witness 
  decide (inl wit)  = wit
  decide (inr ¬wit) = Empty.rec (¬sub sub)
    where
    sub : A ⊆ᵇ B
    sub x x∈A = at (lem (x ∈ˢ B))
      where
      at :  x ∈ˢ B   ( x ∈ˢ B   Empty.⊥)   x ∈ˢ B 
      at (inl x∈B)  = x∈B
      at (inr ¬x∈B) = Empty.rec (¬wit  x , (x∈A , ¬x∈B) ∣₁)

三歧

沿成员关系的双重归纳,两个自变量各一次,叶子处由排中律判定两个包含关系。若二者都成立,两个序数相等。若 A 包含于 B 而反之不然,取 B 中一个在 A 之外的成员 b;内层假设比较 Ab,三种结果各自都把 A 放进 B:在 b 之下故经传递性在 B 之下、等于 b 故是成员、或属于 A 而与 b 的取法矛盾。余下那一情形是镜像,由外层假设判定。

Tri : S  S  Type (ℓ-suc )
Tri A B =  A ∈ˢ B   ((A  B)   B ∈ˢ A )

ord-tri : (A : S)  IsOrd A  (B : S)  IsOrd B  Tri A B
ord-tri = WF.WFI.induction regularityV {P = P} stepA
  where
  P : S  Type (ℓ-suc )
  P A = IsOrd A  (B : S)  IsOrd B  Tri A B

  stepA : (A : S)  (∀ A'   A' ∈ˢ A   P A')  P A
  stepA A IHA ordA =
    WF.WFI.induction regularityV {P = λ B  IsOrd B  Tri A B} stepB
    where
    stepB : (B : S)  (∀ B'   B' ∈ˢ B   IsOrd B'  Tri A B')
           IsOrd B  Tri A B
    stepB B IHB ordB = decide (lem (⊆ᵇ-prop A B)) (lem (⊆ᵇ-prop B A))
      where
      fromB : Σ[ b  S ] ( b ∈ˢ B  × ( b ∈ˢ A   Empty.⊥))   A ∈ˢ B 
      fromB (b , (b∈B , ¬b∈A)) = at (IHB b b∈B (mem-ord {A = B} ordB b b∈B))
        where
        at : Tri A b   A ∈ˢ B 
        at (inl A∈b)       = ordB .fst A∈b b∈B
        at (inr (inl A≡b)) = subst  w   w ∈ˢ B ) (sym A≡b) b∈B
        at (inr (inr b∈A)) = Empty.rec (¬b∈A b∈A)

      fromA : Σ[ a  S ] ( a ∈ˢ A  × ( a ∈ˢ B   Empty.⊥))   B ∈ˢ A 
      fromA (a , (a∈A , ¬a∈B)) =
        at (IHA a a∈A (mem-ord {A = A} ordA a a∈A) B ordB)
        where
        at : Tri a B   B ∈ˢ A 
        at (inl a∈B)       = Empty.rec (¬a∈B a∈B)
        at (inr (inl a≡B)) = subst  w   w ∈ˢ A ) a≡B a∈A
        at (inr (inr B∈a)) = ordA .fst B∈a a∈A

      decide : (A ⊆ᵇ B)  ((A ⊆ᵇ B)  Empty.⊥)
              (B ⊆ᵇ A)  ((B ⊆ᵇ A)  Empty.⊥)  Tri A B
      decide (inl A⊆B) (inl B⊆A) = inr (inl (ext-⊆ᵇ A⊆B B⊆A))
      decide (inl A⊆B) (inr ¬B⊆A) =
        inl (PT.rec (snd (A ∈ˢ B)) fromB (¬⊆ᵇ→witness B A ¬B⊆A))
      decide (inr ¬A⊆B) _ =
        inr (inr (PT.rec (snd (B ∈ˢ A)) fromA (¬⊆ᵇ→witness A B ¬A⊆B)))

小结

ord-tri 比较任意两个序数,而本书为它付出一份排中律实例,取作模块参数,因而在下游每一章的类型中可见。这正是奠基部分为使其可审计而搭建的那道边界:无一处 postulate,读者读导入即可判断一条定理是否经典。下一章把这个比较花在它被需要的那个问题上:哪些序数出现在塔的哪个阶段。