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;内层假设比较 A 与 b,三种结果各自都把 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,读者读导入即可判断一条定理是否经典。下一章把这个比较花在它被需要的那个问题上:哪些序数出现在塔的哪个阶段。