基本公理

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

阅读指南 · 依赖地图

造集合运算怎样提升到可构造宇宙中?一个集合属于 L,当且仅当它能呈现为某个序数层 Lset σ 的可定义子集。本章反复使用同一思路:找出一个容纳所需输入的序数层,在该层上写出外延为目标集合的公式,再在周遭集合层级中证明相应的外延等式。

闭包引理 defSet→isL 完成这一过程。给定序数 σ,若仅仅存在一条外延为 x 的一元公式,𝒟ₒ-intro 便认出 xLset σ 的可定义子集,𝒟ₒ→isL 再把它放入 L。恒等式 Lset (sucV σ) ≡ 𝒟ₒ (Lset σ) 说明了层计算:下一层恰由当前层的可定义子集组成。打包后的集合 LsetS𝒟ₒS 把这两个集合给成载体 S 的元素。

本章以此在 L 中构造空集、无序对与并。外延性利用传递性,把关于可构造成员的一致性推广到所有周遭成员;正则性则递归限制层级的可及性证明。若两个输入需要公共层,bound2 会给出共同的严格上界,而无须比较原来的两层。

设定固定一个宇宙层级 ,并在该层级的累积层级 V 中工作。本章一切都是构造性的:不假设排中律、resize 或选择。公理将据以证明的载体,是 V 的集合连同可构造性证书 isL 组成的类型,而下文每条主张都仅凭周遭集合层级建立。

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

open import Base.Prelude

module L.Axioms.Basic { : Level} where

open import FOL.Syntax using ( Formula; var; con; _≐_; _∈̇_; _∨̇_; ⊤̇; ⊥̇; ∃̇∈ )

闭包模式的刻出步骤在一阶语言中进行。它的公式以某结构的小索引类型为载体,原子谓词是相等与隶属,并备有析取与有界存在量词;这正是可定义性算子所用的构造。关于从结构过渡到子结构,有两条周遭集合层级的事实将发挥作用:限制中两个元素之间的路径已经是其底层集合之间的路径,而继承来的公理要利用的正是这一方向。

open import FOL.ZFStructure using ( ↾-reflects; module hPropStructure )
import FOL.ZFModel
open import V.Hierarchy {} using ( 𝒮ᵥ; extensionalV; regularityV )
open import V.Model {}
  using ( empty-spec; pair-spec; union-spec; self∈sucV; ∈sucV-elim

待提升的每个构造在周遭集合层级中已满足其成员律:空集没有成员,无序对的每个成员是两个条目之一,并集有精确的双向刻画。这些周遭定律在层级中证明一次,便充当下文公式以外延性接受检验的标准;它们被继承,而非重证。计算中还要用到两条周遭集合层级的事实:属于后继 sucV σ 可分成「属于 σ」与「就是 σ」两种情形,而单点集与对 ⁅ x , x ⁆ 被指认等同。有序对的 Kuratowski 码 pr 落在哪个层,将由无序对计算得出。

        ; pair-singleton )
open import V.Coding {} using ( pr )
open import L.Definability {} using ( module DefOf )
open import L.Constructible {}
  using ( 𝒮ʟ; isL; isL-trans; IsOrd; Lset; Lset-layer

可构造一侧提供层体系。Lset 以集合为索引给出各层,IsOrd 是序数性证书isL 是可构造集的类,isL-trans 使其传递。层的可定义幂集是 𝒟ₒ𝒟ₒ-intro 从一条公式加一条外延等式识别出可定义子集,而 Lset-inLset-outLset⊆𝒟ₒLset-monoLset→isL 让层中的隶属得以转换、沿更大的层向上搬运、并被读成可构造性证书。层的传递性是 layer-trans

        ; layer-trans; 𝒟ₒ; 𝒟ₒ-intro; Lset-in; Lset-out; Lset⊆𝒟ₒ
        ; Lset-mono; Lset→isL )
open import L.Ordinal {} using ( ∅-ord; suc-ord; bound2 )

open import Cubical.Data.FinData using ( zero; suc )
open import Cubical.Data.Sum using ( inl; inr )

三个序数事实控制层:空集是序数,序数的后继仍是序数,而 bound2 对两个给定序数返回一个严格包含二者的序数。配对用最后一条把两个可构造实参放进同一层,无须比较原层或选取最大者。有穷索引类型随后描述该层中的有穷像,二元和则表达定义这些像所用的析取。

open import Cubical.Functions.Logic using ( ⇔toPath )
open import Cubical.Foundations.Prelude using ( isPropIsContr )
open import Cubical.Induction.WellFounded using ( Acc; acc; WellFounded )
import Cubical.Data.Empty as Empty
import Cubical.HITs.PropositionalTruncation as PT

周遭集合层级中的隶属取值于命题,而呈现嵌入的纤维也是命题。因此,∈-asFiber 能把给定的隶属证明转换成小呈现中的实际索引,连同回到该成员的路径。具体地,从 ⟨ x ∈ Lset σ ⟩ 得到 m : ⟪ Lset σ ⟫⟪ Lset σ ⟫↪ m ≡ x,公式因而能用常元指名该成员。这里直接得到数据,是因为相应纤维自身为命题;这一步没有另一个外层截断需要消去。

open PT using ( ∣_∣₁; ∥_∥₁; squash₁ )
open import Cubical.HITs.CumulativeHierarchy.Base using ( V; _∈_; sett )
open import Cubical.HITs.CumulativeHierarchy.Properties
  using ( _∈ₛ_; ∈∈ₛ; ∈-asFiber; extensionality; _⊆_; ⟪_⟫; ⟪_⟫↪ )
open import Cubical.HITs.CumulativeHierarchy.Constructions

本章所需的周遭集合都带有精确的隶属刻画:空集配 ∅-empty,无序对 ⁅_,_⁆ 及其单点变体配 pairing-ax,并配 union-ax⋃_。这些是层级自己的分类结果,给出每条成员律的两个方向,故下文刻出的可定义子集可以对照它们以外延性检验。后继运算 sucV 给出下一层的索引。

  using ( ; ∅-empty; ⁅_,_⁆; ⁅_⁆s; pairing-ax; ⋃_; union-ax
        ; module InfinitySet )
open InfinitySet using ( sucV )

open hPropStructure 𝒮ʟ

语义一侧一次性确定。真值取层级 ℓ-suc ℓ 上的命题,故公式的解释落在普通的类型构造中;把限制结构经命题值语义读取,便得到结构成员关系 ∈ˢ,以及取命题底层类型的括号记法 ⟨_⟩。一个实现集合于是是载体 S 的元素,即带可构造性证书的集合,连同说明其成员关系实现哪条规格的等式;这就是类型 SetOf Q。原理 setOf-unique 把一个实现集合变成收缩性数据,正是它把本章余下每条公理字段化归为纯粹的存在问题。

module ModelL = FOL.ZFModel 𝒮ʟ
open ModelL using ( SetOf; setOf-unique )

可定义子集是可构造的

Lset (sucV σ) 是以 δ ∈ sucV σ 为指标的一族集合的并。由于 σ ∈ sucV σ,集合 𝒟ₒ (Lset σ) 是其中一个被并集合,所以它的每个元素都属于 Lset (sucV σ)。若 σ 是序数,其后继也是序数,这条层隶属便给出 isL 证书

引理 𝒟ₒ→isL 接收一个序数 σ 及其序数性证书 、一个集合 x、以及「x 属于 σ 处层的可定义幂集」的证明,结论是 x 可构造。证明把 x 抬高一级。由于 σ 属于自身的后继 sucV σ,包含关系 Lset-in 把「属于 𝒟ₒ (Lset σ)」变成「属于层 Lset (sucV σ)」,而该层的索引经 suc-ord oσ 是序数。再用一次 Lset→isL,就把这条层隶属转成证书 isL x。那条截断的假设按原样使用:它被直接送入 Lset-in,而后者的结论以同样方式截断,因此全程没有提取或选定任何可构造性见证。

𝒟ₒ→isL : (σ : V )  IsOrd σ  (x : V )   x  𝒟ₒ (Lset σ)    isL x 
𝒟ₒ→isL σ  x x∈𝒟ₒσ = Lset→isL (sucV σ) (suc-ord ) x
  (Lset-in (sucV σ) σ x (self∈sucV σ) x∈𝒟ₒσ)

把闭包引理与算子的识别原则复合,就得到本章每个构造所用的形式:要把一个集合放进 L,出示一个序数层、一条公式、以及一条说明该公式恰定义该集合的外延等式。这份出示只是存在层面的,即一条公式与一条等式组成的截断对,而这就已经足够。下文的空集、配对与并正是它的头三个实例。

defSet→isL 的假设是一个截断的存在式:仅仅是存在一条以该层成员为载体、元数为 1 的公式 φ,满足 defSet (Lset σ) φ ≡ x。识别原则 𝒟ₒ-intro 恰好把这样的数据转换成 x 属于 𝒟ₒ (Lset σ) 的成员关系。该隶属是命题,故向它消去截断是合法的,任何公式都从未被选定;与 𝒟ₒ→isL 的一行复合随即给出 isL x。这份证书的形状,序数层、定义公式、外延等式,正是本章余下部分反复实例化的模式。

defSet→isL : (σ : V )  IsOrd σ  (x : V )
             Σ[ φ  Formula  Lset σ  1 ] (DefOf.defSet (Lset σ) φ  x) ∥₁
             isL x 
defSet→isL σ  x p = 𝒟ₒ→isL σ  x (𝒟ₒ-intro (Lset σ) x p)

这个模式的第零个实例是层自身。公式「真」定义出一个集合的全体,故每层都是它自身的可定义子集,从而在下一层可构造。正是这一点使层可以被一条公式点名,凡用层界住量词的构造都立足于此。再加上把层与其可构造性证书配对的打包 LsetS,层本身就成为 L 载体的一个元素。

isL-Lset 的证明是在 x = Lset β 处对 𝒟ₒ→isL 的直接实例化。见证公式是常真公式 ⊤̇,而 defSet⊤≡A 把它的外延等同于载体集合的全体,在这里就是层 Lset β 自身。把公式与等式组成的对包进一次截断,便得到 𝒟ₒ (Lset β) 的一个成员;闭包引理再把它提升为 ⟨ isL (Lset β) ⟩。证明没有检视层的任何内部结构;唯一进入论证的是 β 的序数性,经由 suc-ord

opaque
  isL-Lset : (β : V )  IsOrd β   isL (Lset β) 
  isL-Lset β  = 𝒟ₒ→isL β  (Lset β)
    (𝒟ₒ-intro (Lset β) (Lset β)  ⊤̇ , DefOf.defSet⊤≡A (Lset β) ∣₁)

LsetS : (β : V )  IsOrd β  S

限制结构的载体 S 由一个集合连同「它落在该类中」的证明组成;LsetS 恰好为序数层给出这个配对:底层集合 Lset β 加上刚构造的证书。经由这个元素,层作为一个普通的载体点进入可构造结构。

LsetS β  = Lset β , isL-Lset β 

后继层

塔的步进是可定义幂集;在后继索引处,步进就是全部:Lset (sucV σ) 恰是 𝒟ₒ (Lset σ)。这条恒等式作为两个包含来证明。其一,σ 属于自身的后继,所以 𝒟ₒ (Lset σ) 是被并集合之一,其每个元素都属于下一层。其二,Lset (sucV σ) 的成员属于某个 δ ∈ sucV σ 对应的 𝒟ₒ (Lset δ);若 δσ 的成员,该集合已在 Lset σ 中,因而是它的可定义子集;若 δ 就是 σ,结论直接成立。两个方向都不使用相对化,也不需要算子的单调性;这里没有 σ 的序数性假设。

有了这条恒等式,可定义幂集的可构造性随之立得:层在下一层可构造,而层的可定义幂集正是那下一层。

两个集合用周遭集合层级的外延性比较,路径化归为一对包含关系。较难的方向需要一条桥引理:从下一层的成员 x 出发,仅仅是存在某个更早层的可定义幂集包含 x,其见证 δsucV σ 的成员。按 sucV σ 的构造,其成员要么是 σ 的成员,要么是 σ 自身,故这个见证正是论证可以分情况处理的信息。

Lset-suc : (σ : V )  Lset (sucV σ)  𝒟ₒ (Lset σ)
Lset-suc σ = extensionality (Lset (sucV σ)) (𝒟ₒ (Lset σ)) (sub₁ , sub₂)
  where
  fromEarlier : (x : V )
               Σ[ δ  V  ] ( δ  sucV σ  ×  x  𝒟ₒ (Lset δ) )

对见证的消去恰好使用这条二分法。∈sucV-elim 取「δ 落在 sucV σ 中」的证明与两个分支。第一个分支里 δσ 的成员,于是 Lset-inx 放进 Lset σ,而引理 Lset⊆𝒟ₒ 说层的每个成员都是它的可定义子集之一,把 x 抬进 𝒟ₒ (Lset σ)。第二个分支里 δ 就是 σ 自身,subst 沿路径 δ ≡ σ 搬运已有的隶属,改换层的索引。整个目标 x ∈ 𝒟ₒ (Lset σ) 是命题,这正是截断的见证在此得以消去的前提。

                x  𝒟ₒ (Lset σ) 
  fromEarlier x (δ , (δ∈suc , x∈𝒟ₒδ)) =
    ∈sucV-elim {A = σ} {x = δ} (snd (x  𝒟ₒ (Lset σ))) δ∈suc
       δ∈σ  Lset⊆𝒟ₒ σ x (Lset-in σ δ x δ∈σ x∈𝒟ₒδ))
       δ≡σ  subst  w   x  𝒟ₒ (Lset w) ) δ≡σ x∈𝒟ₒδ)

第一个包含正向使用这条桥。Lset (sucV σ) 的结构成员经 ∈∈ₛ 转成周遭成员关系,层刻画 Lset-out 返回截断的更早层见证,fromEarlier 再把它映入 𝒟ₒ (Lset σ);消去的目标是命题 x ∈ 𝒟ₒ (Lset σ),这正是丢弃 δ 的选择得以合法的依据。反向包含只需 σ 属于自身的后继:经 ∈∈ₛ 把结构成员关系转成周遭形式后,带见证 self∈sucV σLset-in𝒟ₒ (Lset σ) 的任何成员直接放进 sucV σ 处的层。两个包含合起来,便得到作为路径的恒等式。

  sub₁ :  Lset (sucV σ)  𝒟ₒ (Lset σ) 
  sub₁ x x∈ₛ = ∈∈ₛ {a = x} {b = 𝒟ₒ (Lset σ)} .fst
    (PT.rec (snd (x  𝒟ₒ (Lset σ))) (fromEarlier x)
      (Lset-out (sucV σ) x (∈∈ₛ {a = x} {b = Lset (sucV σ)} .snd x∈ₛ)))

  sub₂ :  𝒟ₒ (Lset σ)  Lset (sucV σ) 

另一个包含用 self∈sucV σ 指出:在 Lset (sucV σ) 的定义中,𝒟ₒ (Lset σ) 是被并集合之一。因此,Lset-in 把这个可定义幂集的每个元素送入后继层。结合第一个包含,周遭集合层级的外延性给出路径 Lset (sucV σ) ≡ 𝒟ₒ (Lset σ);这条恒等式不含 σ 的序数性假设。

  sub₂ x x∈ₛ = ∈∈ₛ {a = x} {b = Lset (sucV σ)} .fst
    (Lset-in (sucV σ) σ x (self∈sucV σ)
      (∈∈ₛ {a = x} {b = 𝒟ₒ (Lset σ)} .snd x∈ₛ))

后继恒等式把「层在下一层可构造」转成关于可定义幂集自身的陈述:既然 Lset (sucV σ) 恰是 𝒟ₒ (Lset σ),而前者由前文引理可构造,故任何序数层的可定义幂集都可构造。于是可以把它打包成载体的一个元素:一个 L 的集合,附上其可构造性证书

证明是沿后继恒等式的一次传输。在后继处应用 isL-Lset (其序数性为 suc-ord oσ),得到 ⟨ isL (Lset (sucV σ)) ⟩;再沿路径 Lset-suc σ 改写目标,便得到 ⟨ isL (𝒟ₒ (Lset σ)) ⟩。除这条恒等式外,没有使用算子的任何其他性质。

opaque
  isL-𝒟ₒ : (σ : V )  IsOrd σ   isL (𝒟ₒ (Lset σ)) 
  isL-𝒟ₒ σ  = subst  w   isL w ) (Lset-suc σ)
    (isL-Lset (sucV σ) (suc-ord ))

𝒟ₒS : (σ : V )  IsOrd σ  S

打包 𝒟ₒS 把该层的可定义幂集与其可构造性证书配成对,得到一个恰指称 𝒟ₒ (Lset σ) 的载体元素。上一节打包的是层自身,这一节打包的是「一层的可定义子集的全体」。

𝒟ₒS σ  = 𝒟ₒ (Lset σ) , isL-𝒟ₒ σ 

有穷族

闭包模式在有穷族上最容易看清。固定一层 Lset σ 与它的 n 个成员组成的族。它们的像是集合 finSet n h,而「等于这一个」的有穷析取恰好从该层中刻出这个像:长度为零时公式取假,此后每个长度多比较一个常元与自由变元。族中的成员可以重复,不同位置可以指名同一个集合。

全部内容是一次归纳,它把析取的满足与被该族命中等同起来,两个方向都对着被指名成员的嵌入代表陈述。两个方向就位后,一次周遭集合层级的外延性证出 defSet≡,即「可定义子集恰是该像」的等式;finSet∈𝒟ₒ 把该像记录为 𝒟ₒ (Lset σ) 的成员,而 finSetL 从「族中每个成员都落在该层」的假设出发,经闭包引理 defSet→isL,给出证书 isL (finSet n h)

像集合被直接定义:finSet n h 是由提升到层级所在宇宙的索引类型 Fin n 与「先降层再作用 h」的索引映射所呈现的集合。成员关系按层级截断的形式刻画:y 属于 finSet n h,恰当仅仅是存在索引 i 满足 h i ≡ yfinSet-infinSet-out 的每个方向都是截断内部的一次映射,因为呈现场合中的成员关系按构造就是索引的截断存在。

finSet : (n : )  (Fin n  V )  V 
finSet n h = sett (Lift {ℓ-zero} {} (Fin n))  i  h (lower i))

finSet-in : (n : ) (h : Fin n  V ) (y : V )
            Σ[ i  Fin n ] (h i  y) ∥₁   y  finSet n h 
finSet-in n h y = PT.map  { (i , q)  lift i , q })

反向成员引理 finSet-out 是同一映射倒过来读,从提升后的索引降回 Fin n。随后可定义性的工作在序数层 σ 上进行:在 DefOf (Lset σ) 内部工作,把常元的字母表定为该层的小索引类型 ⟪ Lset σ ⟫,于是层的成员可用常元命名,而所论的可定义子集就是从 Lset σ 中刻出的那些。

finSet-out : (n : ) (h : Fin n  V ) (y : V )
             y  finSet n h    Σ[ i  Fin n ] (h i  y) ∥₁
finSet-out n h y = PT.map  { (i , q)  lower i , q })

module FinOf (σ : V ) ( : IsOrd σ) where
  module DefC = DefOf (Lset σ)

公式是等式的有穷析取。长度为零时无可等同之物,故公式取假;长度为后继时,自由变元与指名族首成员的常元比较,其余成员由族平移后的递归调用处理。元数始终为一:整个析取共用一个自由变元槽,而函数 g 无须单射,不同位置可以指名同一个成员。

  finDisj : (n : )  (Fin n   Lset σ )  Formula  Lset σ  1
  finDisj zero    g = ⊥̇
  finDisj (suc n) g =
    (var zero  con (g zero)) ∨̇ finDisj n  i  g (suc i))

  private

桥陈述 Hits 说:赋值所指名的成员仅仅被该族命中,其中路径是对照被指名成员的嵌入代表 ⟪ Lset σ ⟫↪ (g i) 书写的。两个方向连接的是:可定义子集所看见的「析取被满足」,与像集合所看见的「被族命中」。

    Hits : (n : ) (g : Fin n   Lset σ ) (y : V )  Type (ℓ-suc )
    Hits n g y =  Σ[ i  Fin n ] ( Lset σ ⟫↪ (g i)  y) ∥₁

    sat→hits : (n : ) (g : Fin n   Lset σ ) (m :  Lset σ )
               (DefC.ι m  []) DefC.⊨ᵐ finDisj n g 
              Hits n g ( Lset σ ⟫↪ m)

从满足到命中沿长度递归。长度为零时公式是假,其证明导致荒谬。长度为后继时,满足是截断的析取:左支中赋值等于第一个常元,给出索引 zero;右支中递归调用对平移后的族返回一个命中,其索引加一提升。每个分支都在截断内返回其见证,而外层消去合法,因为目标 Hits 取命题值。

    sat→hits zero    g m bot = Empty.rec* bot
    sat→hits (suc n) g m = PT.rec squash₁
       { (inl e)    zero , sym e ∣₁
         ; (inr sat)  PT.map  { (i , q)  suc i , q })
                         (sat→hits n  i  g (suc i)) m sat) })

反方向把命中转为满足,同样沿长度递归。长度为零时索引类型 Fin 0 没有任何元素,故通过对照空索引类型做匹配即可反驳那里的命中;这正与公式在零处取假相配。由于 hits→sat 是同时对所有长度陈述的,后继情形中的递归调用无须携带任何额外假设即可使用。

    hits→sat : (n : ) (g : Fin n   Lset σ ) (m :  Lset σ )
              Hits n g ( Lset σ ⟫↪ m)
               (DefC.ι m  []) DefC.⊨ᵐ finDisj n g 
    hits→sat zero g m =
      PT.rec (snd ((DefC.ι m  []) DefC.⊨ᵐ finDisj zero g))  { (() , _) })

长度为后继时,命中是截断的对,其索引要么是 zero,要么是后继 suc i。第一种情形中,路径把成员与第一个常元等同,公式的左析取支得到满足。第二种情形中,对平移后族施用递归调用得到尾部析取的满足,它成为右析取支。两种情形都在截断内返回答案,故证明从不依赖于命中恰好携带的是哪个索引。

    hits→sat (suc n) g m =
      PT.rec (snd ((DefC.ι m  []) DefC.⊨ᵐ finDisj (suc n) g))
         { (zero  , q)   inl (sym q) ∣₁
           ; (suc i , q) 
              inr (hits→sat n  j  g (suc j)) m  i , q ∣₁) ∣₁ })

桥的两个方向恰好是恒等式 defSet≡ 所需的两条包含。证明用的是周遭集合层级的外延性:集合的路径化归为一对包含,而像集合以缩写 F 记之。剩下的工作只是在结构成员记号与周遭成员记号之间做簿记。

  defSet≡ : (n : ) (g : Fin n   Lset σ )
           DefC.defSet (finDisj n g)  finSet n  i   Lset σ ⟫↪ (g i))
  defSet≡ n g = extensionality _ _ (sub₁ , sub₂)
    where
    F = finSet n  i   Lset σ ⟫↪ (g i))

第一个包含从可定义子集的结构成员 y 出发。转换 ∈∈ₛ 把它变成周遭成员关系,其读法引理给出截断的定义数据:赋值 m 连同满足证书,以及强迫 y 等于 m 所指名成员的路径 q。此处要证的目标是命题 ⟨ y ∈ F ⟩,这正是消去截断得以合法的依据。

    sub₁ :  DefC.defSet (finDisj n g)  F 
    sub₁ y y∈ₛ = ∈∈ₛ {a = y} {b = F} .fst (PT.rec (snd (y  F))
       { ((m , h) , q) 
        subst  v   v  F ) q
          (finSet-in n  i   Lset σ ⟫↪ (g i)) ( Lset σ ⟫↪ m)

满足证书经可定义子集成员关系的计算规则 defSet-mem 转换,得到析取在赋值 m 处的一次满足。桥引理 sat→hits 随之产出一次命中,finSet-in 把命中读成嵌入元素在像中的成员关系。最后沿 q 的搬移把这条成员关系从被指名的成员移到 y 自身。

            (sat→hits n g m
              (subst ⟨_⟩ (DefC.defSet-mem (finDisj n g) m)
                 (m , h) , refl ∣₁))) })
      (∈∈ₛ {a = y} {b = DefC.defSet (finDisj n g)} .snd y∈ₛ))
    sub₂ :  F  DefC.defSet (finDisj n g) 

反向包含从 y ∈ F 出发。消去规则 finSet-out 仅仅给出索引 i : Fin n路径 q : ⟪ Lset σ ⟫↪ (g i) ≡ y。在代表元 g i 处,截断见证 ∣ i , refl ∣₁ 证明 Hits n g (⟪ Lset σ ⟫↪ (g i))hits→sat 把它转换成有限析取在该代表元处的满足。随后沿 q 搬移,便得到 y 属于可定义子集。

    sub₂ y y∈ₛ = PT.rec (snd (y ∈ₛ DefC.defSet (finDisj n g)))
       { (i , q) 
        subst  v   v ∈ₛ DefC.defSet (finDisj n g) ) q
          (∈∈ₛ {a =  Lset σ ⟫↪ (g i)} {b = DefC.defSet (finDisj n g)} .fst
            (subst ⟨_⟩ (sym (DefC.defSet-mem (finDisj n g) (g i)))

满足经反向使用 defSet 的隶属读法,被读成嵌入的 g i 在可定义子集中的结构成员关系,再沿命中路径的搬移把它落到 y 上。两条包含合起来,defSet≡ 便作为集合的路径陈述这一相等:由有穷析取刻出的子集就是该族的像,族中的重复也在其内,因为相同的成员由多个常元名指,并不影响像。

              (hits→sat n g (g i)  i , refl ∣₁))) })
      (finSet-out n  i   Lset σ ⟫↪ (g i)) y
        (∈∈ₛ {a = y} {b = F} .snd y∈ₛ))

  finSet∈𝒟ₒ : (n : ) (g : Fin n   Lset σ )
              finSet n  i   Lset σ ⟫↪ (g i))  𝒟ₒ (Lset σ) 

本节以两步收尾。第一步,finSet∈𝒟ₒ 把刚才证明的析取与等式交给 𝒟ₒ-intro,把像集合记录为该层可定义幂集的一个成员;这一可定义性证书是截断的,故被保留的数据中不含特定公式。第二步,finSetL 从一个由任意集合组成的族出发,并给定每个成员属于该层的证明。对每个成员,∈-asFiber 给出层呈现的索引以及回到该成员的路径;用 cong (finSet n) (funExt qg) 沿这些路径改写像集合,便把它与 defSet≡ 所谈论的嵌入族等同起来。闭包引理 defSet→isL 随即给出 finSet n h 的可构造性。

  finSet∈𝒟ₒ n g = 𝒟ₒ-intro (Lset σ) _  finDisj n g , defSet≡ n g ∣₁

  finSetL : (n : ) (h : Fin n  V )  ((i : Fin n)   h i  Lset σ )
            isL (finSet n h) 
  finSetL n h  = defSet→isL σ  (finSet n h)
     finDisj n g , (defSet≡ n g  cong (finSet n) (funExt qg)) ∣₁

假设 hσ i 只是陈述 h i 属于该层。对一个层级集合的隶属是嵌入映射 ⟪ Lset σ ⟫↪ 的纤维的截断,而该映射是嵌入,其纤维类型是命题,故向纤维类型消去截断是合法的,∈-asFiber 做的正是这一转换。于是 g i 是被选出的索引,其嵌入后的元素有路径 qg i 回到 h i。交给 defSet→isL证书把关于代表元 g 的有穷析取与 defSet≡ n g 配对,再接上改写 funExt qg,把这条等同从嵌入后的族 finSet n (λ i → ⟪ Lset σ ⟫↪ (g i)) 搬到原先的族 finSet n h 上。

    where
    g : Fin n   Lset σ 
    g i = ∈-asFiber {a = h i} {b = Lset σ} ( i) .fst
    qg : (i : Fin n)   Lset σ ⟫↪ (g i)  h i
    qg i = ∈-asFiber {a = h i} {b = Lset σ} ( i) .snd

两个集合,一层

isL-directed 把任意两个可构造集合放进一个公共的序数层。

每个可构造集合都有自己的层,由其截断的可构造性证书「仅仅地」给出。结论把二者合并:仅仅是存在一个序数 σ,其层同时装下这两个集合。bound2 产出一个同时包含两个给定序数的序数,而层的单调性把每个集合从各自的层抬进上界处的层。结论以截断形式陈述,故从不向外界出示任何层;在局部,两份证书只被打开到足以读出它们各自名指的层为止。

这条陈述把两个可构造集合当作截断的证书接收:⟨ isL x ⟩⟨ isL y ⟩ 只是说各自落在 L 中,并不点名某一层。结论同样是截断的,因此那两份证书只被消去到一条截断的存在陈述中,从未向外部世界选出任何层。局部的目标内容被打包为 Bound:一个序数 σ、它的序数性,以及 Lset σ 中的两条隶属。

isL-directed : (x y : V )   isL x    isL y 
               Σ[ σ  V  ] (IsOrd σ × ( x  Lset σ  ×  y  Lset σ )) ∥₁
isL-directed x y px py = PT.rec2 squash₁ go px py
  where
  Bound : Type (ℓ-suc )

两条截断由 PT.rec2 一次消去,其目标是截断 ∥ Bound ∥₁。干活的分支 go 接收证书所隐藏的显式数据:序数层 αx 属于 Lset α,以及序数层 βy 属于 Lset β。合并它们并不是在比较大小;bound2 α β oα oβ 返回一个同时包含 αβ 的序数上界,连同它的序数性和两条隶属。

  Bound = Σ[ σ  V  ] (IsOrd σ × ( x  Lset σ  ×  y  Lset σ ))
  go : Σ[ α  V  ] (IsOrd α ×  x  Lset α )
      Σ[ β  V  ] (IsOrd β ×  y  Lset β )   Bound ∥₁
  go (α , ( , x∈Lα)) (β , ( , y∈Lβ)) =
     bnd .fst , (bnd .snd .fst , ( Lset-mono (bnd .snd .snd .fst) x∈Lα

上界自带 α ∈ σ₀β ∈ σ₀ 两条隶属,于是单调性 Lset-monox ∈ Lset α 抬进上界处的层 Lset σ₀;对来自 βy 同理。把拼好的三元组用 ∣_∣₁ 包起来便完成 go,也随之完成整条陈述:任意两个可构造集合「仅仅存在」一个公共的序数层。配对字段要消费的正是它,因为配对需要两个实参在同一层上可见。

                                  , Lset-mono (bnd .snd .snd .snd) y∈Lβ )) ∣₁
    where bnd = bound2 α β  

继承来的两条公理

外延性与正则性都从周遭集合层级限制而来,但论证不同。对外延性,isL-trans 把任一可构造集合的周遭成员变成载体元素,从而可以应用关于载体成员的一致性假设;周遭集合层级的外延性随后等同底层集合,限制反射再给出载体路径。正则性不使用 isL-trans:只需把周遭可及性递归地限制到已经自带可构造性证书的对子上。

L 内部的外延性形状是:若载体的两个元素在每个载体元素处的隶属一致,它们就作为路径相等。证明被化归到底层层级。载体由「集合加可构造性证书」的对组成,而 ↾-reflects 是一条原理:这样的对由其第一投影决定,底层集合 fst afst b 之间的路径已经给出路径 a ≡ b。于是全部工作归结为制造那条底层路径,它在 vwise 的前提下由 extensionalV 提供。

extensionalL : {a b : S}  ((x : S)  (x ∈ˢ a)  (x ∈ˢ b))  a  b
extensionalL {a} {b} h =
  ↾-reflects {𝒮 = 𝒮ᵥ} {M = isL} (extensionalV {a = fst a} {b = fst b} vwise)
  where
  vwise : (v : V )  (v  fst a)  (v  fst b)

假设 h 只谈及载体元素,即可构造的对。要把它扩展到层级中任意的 v,出力的是传递性:由 v ∈ fst aa 所携带的证书isL-trans 得出 v 自身可构造;把该证书v 配成对,就把 v 呈现为载体元素,h 在该元素处给出限制成员关系的路径。沿这条路径搬移 v∈a 便落在 ⟨ v ∈ fst b ⟩,故 fwd 是一个普通的蕴涵。用 ⇔toPath 把两个方向的蕴涵合成路径,便得到 extensionalV 所要求的周遭隶属的逐点路径

  vwise v = ⇔toPath fwd bwd
    where
    fwd :  v  fst a    v  fst b 
    fwd v∈a = subst ⟨_⟩ (h (v , isL-trans v∈a (a .snd))) v∈a
    bwd :  v  fst b    v  fst a 

反向是从 b 出发读同一个论证,因 h 的方向是从 a 指向 b 而加 sym。至此 extensionalL 完成。正则性要的是另一件事:把载体的成员关系的良基性作为显式的可及性数据。对对子 (v , p),即集合 v 连同它的可构造性证书,周遭集合层级已经为 v 提供了 Acc;任务是把这份数据沿着证书抬上去。

    bwd v∈b = subst ⟨_⟩ (sym (h (v , isL-trans v∈b (b .snd)))) v∈b

regularityL : WellFounded _∈ᵗ_
regularityL (v , p) = accL v (regularityV v) p
  where
  module Vmem = hPropStructure 𝒮ᵥ

这次抬升是对周遭可及性数据的一次递归。若 u 可及,则依定义 u 的每个周遭成员 y 都可及,子句 rec 打包的正是这一点。限制元素 (u , q) 的成员 (y , r) 投影u 的周遭成员 y,故 accL 可以对 rec y y∈ 递归,并把证书 r 附到结果上。限制的成员关系 y ∈ᵗ (u , q) 只沿用底层关系 y ∈ u证书 r 属于前驱载体元素 (y , r),并不是成员证明的一部分。因此,可及性沿底层集合逐成员转移。

  accL : (u : V )  Acc Vmem._∈ᵗ_ u  (q : u ∈ᶜ isL)  Acc _∈ᵗ_ (u , q)
  accL u (acc rec) q = acc  { (y , r) y∈  accL y (rec y y∈) r })

由外延性得到唯一性

uniqueL 从外延性导出唯一性:实现固定成员规格的集合是唯一的,因此后文尚未完成的公理字段只须给出一个「仅仅存在」的见证。

论证是把载体的外延性用在实现者上。实现同一谓词 Q 的两个集合,在每个载体元素处取同一真值,即 Q x,故 extensionalL 把它们等同。此处所需的唯一性形式是收缩性,而收缩性是命题;这恰好使「仅仅存在的实现者」能够被转换为收缩性数据本身。

实现者的唯一性是收缩性数据:一个中心,即任一实现该规格的集合,以及从中心到任一实现集合的路径。给出路径的部分是 extensionalL,因为两个实现集合携带同一成员规格,因而重合;中心与路径的组装则是对 extensionalL 应用 setOf-unique。第二条陈述从仅仅存在出发:PT.rec 之所以能消去截断的假设,是因为其目标 isContr (SetOf Q) 是命题,并返回同样的收缩性数据。从这里起,余下每条公理字段都通过展示一个见证、且以截断形式给出,来完成证明。

uniqueL : (Q : S  hProp (ℓ-suc ))  SetOf Q  isContr (SetOf Q)
uniqueL = setOf-unique extensionalL

mere→uniqueL : (Q : S  hProp (ℓ-suc ))   SetOf Q ∥₁  isContr (SetOf Q)
mere→uniqueL Q = PT.rec isPropIsContr (uniqueL Q)

空集

对象语言中的假公式把周遭空集定义为可定义子集,而 hasEmptyL 封装其可构造性与空成员规格。

对象语言的假在任何层中都定义不出元素:defSet ⊥̇ 的成员会在其索引处包含一个假的证明。因此,defSet ⊥̇ 经外延性等于空集,从而空集可构造。它的规格来自层级,因为 L 中的隶属就是层级中的隶属;而上一节的唯一性原理把这个见证变成模型所要求的收缩性数据。

空集是第一个被构造的集合,而且它完全不需要上界:实参 σ 跑遍任意层,没有序数性假设,因为定义空集的公式在任何层都可以解读。证书是对象语言的假 ⊥̇ 与等式 defSet⊥≡∅ 组成的对,并按 𝒟ₒ-intro 的要求以截断形式给出。

∅∈𝒟ₒ : (σ : V )     𝒟ₒ (Lset σ) 
∅∈𝒟ₒ σ = 𝒟ₒ-intro (Lset σ)   ⊥̇ , defSet⊥≡∅ ∣₁
  where
  module DefC = DefOf (Lset σ)
  defSet⊥≡∅ : DefC.defSet ⊥̇  

这条等式是对照周遭空集的一次外延,分两个包含方向。第一向是有实质内容的方向:可定义子集的成员 y,经 defSet 的读法引理,呈现为索引 m⊥̇ 的满足证明 h 组成的截断对。假在对象语言中的满足是空的宿主类型,故 Empty.rec* h 反驳任何这样的成员。由于包含关系以命题值陈述,向它消去截断是合法的。

  defSet⊥≡∅ = extensionality (DefC.defSet ⊥̇)  (sub₁ , sub₂)
    where
    sub₁ :  DefC.defSet ⊥̇   
    sub₁ y y∈ₛ = PT.rec (snd (y ∈ₛ ))
       { ((m , h) , q)  Empty.rec* h })

第二向是空洞的:∅-empty 把周遭空集的任何候选成员直接变成反驳。两个方向齐备后,defSet ⊥̇ 作为集合相等,∅∈𝒟ₒ 于是记录下空集是任意层的可定义子集。闭包引理随后最后再施展一次,就在层 自身处,其序数性由引理 ∅-ord 提供:空集可构造,位于其自身之上一个后继。

      (∈∈ₛ {a = y} {b = DefC.defSet ⊥̇} .snd y∈ₛ)
    sub₂ :    DefC.defSet ⊥̇ 
    sub₂ y y∈ₛ = Empty.rec (∅-empty y y∈ₛ)

∅∈L :  isL  
∅∈L = 𝒟ₒ→isL  ∅-ord  (∅∈𝒟ₒ )

打包方式照应底层集合:∅ʟ 连同其可构造性证书组成的对,是载体 S 的一个元素。模型的存在性要求「没有成员的集合唯一存在」。所给出的见证是 ∅ʟ,连同从层级取来的规格,即对任何候选集合的底层集合读取 empty-spec;唯一性则由 uniqueL 得到。这是第一条字段,而下两条构造的模式在它身上已经可见:找界、刻出、收尾。

∅ʟ : S
∅ʟ =  , ∅∈L

hasEmptyL : isContr (SetOf  _  ))
hasEmptyL = uniqueL _ (∅ʟ ,  x  empty-spec (fst x)))

受层界住的配对

对同一层的两个成员,一条含两个常元的析取公式把其无序对定义为该可定义子集;派生的结果把单点集安置在高一层处,把 Kuratowski 有序对码安置在高两层处。

一层的两个成员,其无序对是该层的可定义子集:二者各是某个索引的 ⟪ Lset σ ⟫↪,而点名那两个索引的公式恰好定义出这个对。验证它要对照层级自己的配对公理做一次双向外延:可定义子集的成员满足那个析取,故是二者之一;而二者各自满足它,故是成员。

论证里没有一处关乎模型,说的是塔本身的一条事实,故照这样陈述:Kuratowski 编码下的有序对嵌套了两层无序对,因此落在其条目之上两层处。

此处不涉及序数性,后继恒等式也不涉及,理由相同:这里做的是构造,而非比较。单点集是退化的对,而有序对是单点集与对所成的对。

这条陈述只假设 xy 落在层 Lset σ 中;不要求 σ 的序数性,因为刻出一个子集不需要比较层。证书𝒟ₒ-intro 组装:一条公式 φ,连同说明 φ 在该层中的外延恰为 ⁅ x , y ⁆ 的等式 defSet≡,并按可定义性算子的接口要求以截断形式给出。

pair∈𝒟ₒ : (σ x y : V )   x  Lset σ    y  Lset σ 
           x , y   𝒟ₒ (Lset σ) 
pair∈𝒟ₒ σ x y x∈ y∈ = 𝒟ₒ-intro (Lset σ)  x , y   φ , defSet≡ ∣₁
  where
  module DefC = DefOf (Lset σ)

公式必须以层的小呈现 ⟪ Lset σ ⟫ 中的元素为常元。对两条隶属证明应用 ∈-asFiber,得到实际索引 mₓmᵧ,以及路径 qₓ : ⟪ Lset σ ⟫↪ mₓ ≡ xqᵧ : ⟪ Lset σ ⟫↪ mᵧ ≡ y。呈现嵌入的纤维是命题,所以这里可以直接恢复这些数据;论证没有把隶属假设当作另一个外层截断。

  mₓ = ∈-asFiber {a = x} {b = Lset σ} x∈ .fst
  qₓ :  Lset σ ⟫↪ mₓ  x
  qₓ = ∈-asFiber {a = x} {b = Lset σ} x∈ .snd
  mᵧ = ∈-asFiber {a = y} {b = Lset σ} y∈ .fst
  qᵧ :  Lset σ ⟫↪ mᵧ  y

公式有一个自由变元槽,读作:变元等于常元 mₓ,或等于常元 mᵧ。它被断言的外延是 xy 的无序对。证明并不直接把外延与这个对等同;它先把外延与嵌入代表元组成的对等同,常元实际上就在那里,再对构造子 ⁅_,_⁆ 应用 cong₂沿 qₓqᵧ 搬移整条等式。

  qᵧ = ∈-asFiber {a = y} {b = Lset σ} y∈ .snd

  φ : Formula  Lset σ  1
  φ = (var zero  con mₓ) ∨̇ (var zero  con mᵧ)

  defSet≡ : DefC.defSet φ   x , y 
  defSet≡ =

等同的前一半是一次外延性,从可定义子集到嵌入代表元的对,分为两个包含。此处展示的方向说的是:凡满足 φ 者,都是那两个被点名元素之一。

      extensionality (DefC.defSet φ)   Lset σ ⟫↪ mₓ ,  Lset σ ⟫↪ mᵧ 
        (sub₁ , sub₂)
     cong₂ ⁅_,_⁆ qₓ qᵧ
    where
    sub₁ :  DefC.defSet φ    Lset σ ⟫↪ mₓ ,  Lset σ ⟫↪ mᵧ  

可定义子集的成员 w,经读法引理,呈现为索引 m 与「在点名 m 的赋值下 φ 的满足证明」组成的截断对。等式析取的满足只是记录:m 所名指的元素等于两个常元之一。而这条截断析取恰好是层级的配对刻画在从右到左方向所需的假设,于是 pairing-ax 把嵌入元素 ⟪ Lset σ ⟫↪ m 放进嵌入代表元组成的对中。再沿把 w 与嵌入索引等同的路径 q 做搬移,包含即告完成。

    sub₁ w w∈ₛ = PT.rec (snd (w ∈ₛ   Lset σ ⟫↪ mₓ ,  Lset σ ⟫↪ mᵧ ))
       { ((m , h) , q) 
        subst  v   v ∈ₛ   Lset σ ⟫↪ mₓ ,  Lset σ ⟫↪ mᵧ  ) q
          (pairing-ax ( Lset σ ⟫↪ mₓ) ( Lset σ ⟫↪ mᵧ) ( Lset σ ⟫↪ m) .snd
            (subst ⟨_⟩ (DefC.defSet-mem φ m)  (m , h) , refl ∣₁)) })

反向包含把层级的配对刻画按另一方向读取。嵌入代表元之对的成员 w,仅仅是等于两个条目之一。两个分支各自把相应的代表元交给同一个辅助引理:既然知道 w 等于哪个代表元,就能证明 w 在该代表元的常元处满足 φ,因而是可定义子集的成员。

      (∈∈ₛ {a = w} {b = DefC.defSet φ} .snd w∈ₛ)
    sub₂ :    Lset σ ⟫↪ mₓ ,  Lset σ ⟫↪ mᵧ   DefC.defSet φ 
    sub₂ w w∈ₛ = PT.rec (snd (w ∈ₛ DefC.defSet φ))
       { (inl p)  memOf mₓ  inl refl ∣₁ p
         ; (inr p)  memOf mᵧ  inr refl ∣₁ p })

辅助引理 memOf 接收一个代表元 mᵢ、φ 在名指 mᵢ 的常元处的满足证明,以及把 wmᵢ 的嵌入元素等同的路径defSet 的隶属读法把在常元处的满足转成嵌入元素在可定义子集中的隶属;沿路径 (方向为 sym p) 搬移,就把这条隶属搬到 w 上。两个包含证毕后,外延性给出与嵌入代表元之对的等式,再对构造子 ⁅_,_⁆ 应用 cong₂,沿路径 qₓqᵧ 把那个对改写成 ⁅ x , y ⁆

      (pairing-ax ( Lset σ ⟫↪ mₓ) ( Lset σ ⟫↪ mᵧ) w .fst w∈ₛ)
      where
      memOf : (mᵢ :  Lset σ )   (DefC.ι mᵢ  []) DefC.⊨ᵐ φ 
             w   Lset σ ⟫↪ mᵢ   w ∈ₛ DefC.defSet φ 
      memOf mᵢ sat p = subst  v   v ∈ₛ DefC.defSet φ ) (sym p)

第一条派生结果把可定义性陈述转成对某一层的隶属。本章前文证明的后继恒等式说 Lset (sucV σ) 恰是 𝒟ₒ (Lset σ),故沿该恒等式 (方向取 sym) 搬移 pair∈𝒟ₒ 的结论,便得 ⟨ ⁅ x , y ⁆ ∈ Lset (sucV σ) ⟩:一层两个成员的无序对由此得到的上界是下一层。

        (∈∈ₛ {a =  Lset σ ⟫↪ mᵢ} {b = DefC.defSet φ} .fst
          (subst ⟨_⟩ (sym (DefC.defSet-mem φ mᵢ)) sat))

pair∈Lset-suc : (σ x y : V )   x  Lset σ    y  Lset σ 
                 x , y   Lset (sucV σ) 
pair∈Lset-suc σ x y x∈ y∈ =

单点集是退化情形。把配对安置对 x 施用两次,得到下一层中的 ⁅ x , x ⁆;层级把 ⁅ x , x ⁆ 等同于 ⁅ x ⁆spair-singleton 再把这条隶属搬到单点集 ⁅ x ⁆s 上。

  subst  w    x , y   w ) (sym (Lset-suc σ)) (pair∈𝒟ₒ σ x y x∈ y∈)

sgl∈Lset-suc : (σ x : V )   x  Lset σ     x ⁆s  Lset (sucV σ) 
sgl∈Lset-suc σ x x∈ = subst  w   w  Lset (sucV σ) ) (pair-singleton x)
  (pair∈Lset-suc σ x x x∈ x∈)

pr∈Lset-suc : (σ x y : V )   x  Lset σ    y  Lset σ 

有序对码 pr x y 是以单点集 ⁅ x ⁆s 与无序对 ⁅ x , y ⁆ 为两个条目的对。两个条目都落在 Lset (sucV σ) 中,第一个由单点集结果、第二个由配对结果给出,于是外层无序对可以安置在再高一个的层处:pr x y 落在 Lset (sucV (sucV σ)) 中。由于 Kuratowski 码把一个无序对嵌套在另一个之内,两次使用配对闭包给出有序对码的这个双后继上界,但并不声称它最早恰在此处出现。

              pr x y  Lset (sucV (sucV σ)) 
pr∈Lset-suc σ x y x∈ y∈ = pair∈Lset-suc (sucV σ)  x ⁆s  x , y 
  (sgl∈Lset-suc σ x x∈) (pair∈Lset-suc σ x y x∈ y∈)

配对

hasPairL 先把任意两个可构造集合放进公共层,再施用有界配对构造与唯一性原理。

这条公理的见证是两个实参在公共序数层处的无序对,其可构造性由上一节的引理证明;规格是层级自己对无序对的分类,在底层集合处读取。唯一性则来自外延性。

配对字段以两个实参为参数。谓词 Q x 说元素 x 等于 a 或等于 b,其中析取在模型的真值中解释。一个集合实现该字段,是指它的元素恰为满足 Q 的元素。构造 mkPair 假设已有一个公共序数层包含两个实参的底层集合,而这正是上界步骤所供给的。

module PairOf (a b : S) where
  Q : S  hProp (ℓ-suc )
  Q x = (x ≈ˢ a)  (x ≈ˢ b)

  mkPair : (σ : V )  IsOrd σ   fst a  Lset σ    fst b  Lset σ 
          SetOf Q

见证是底层集合的周遭无序对,连同其可构造性证书打包。该证书来自有界构造:Lset σ 两个成员的对是那里的可定义子集,而引理 𝒟ₒ→isL 把序数层的可定义子集抬进 L。规格是层级自己对无序对的分类 pair-spec,在底层集合处读取;限制载体上的隶属就是周遭隶属,故模型对该字段的解读与层级的分类一致。

  mkPair σ  fa∈ fb∈ = pairElt ,  z  pair-spec (fst a) (fst b) (fst z))
    where
    pairElt : S
    pairElt =  fst a , fst b 
            , 𝒟ₒ→isL σ   fst a , fst b  (pair∈𝒟ₒ σ (fst a) (fst b) fa∈ fb∈)

这个构造还不是那条字段:它需要一层,而手头只有其「仅仅存在」。buildPT.rec 消去 isL-directed 的截断,其目标 ∥ SetOf Q ∥₁ 本身就是截断的,因此可以把 ab 的两份可构造性证书打开到恰好读出公共层与两条隶属的程度,然后在该处运行 mkPair。全程没有向外部世界选定任何层。

  build :  SetOf Q ∥₁
  build = PT.rec squash₁
     { (σ , ( , (fa∈ , fb∈)))   mkPair σ  fa∈ fb∈ ∣₁ })
    (isL-directed (fst a) (fst b) (a .snd) (b .snd))

hasPairL : (a b : S)  isContr (SetOf  x  (x ≈ˢ a)  (x ≈ˢ b)))

字段 hasPairL 要求实现者类型具有收缩性:给出一个典范实现者,以及从中心到任一实现者的路径。公共层的截断上界只被消去到截断存在 ∥ SetOf Q ∥₁ 中;在该消去内部,mkPair 由层及两条隶属证明构造实现者。随后 mere→uniqueL 借助 uniqueL 与外延性,把仅仅存在与唯一性合成为明确的收缩中心。因此,证明不任意选择公共层,而最终结果确实含有 isContr 所要求的明确典范实现者。

hasPairL a b = mere→uniqueL (PairOf.Q a b) (PairOf.build a b)

并不需要寻找上界:一个装着实参的层就足够了。由于层 Lset σ 是传递的,fst a 的成员的每个成员也仍在该层中,于是有界存在公式「实参的某个成员以我为成员」恰好刻出周遭并 ⋃ (fst a)

外延等式由两个包含方向证明。一个方向读出公式的满足:一个见证 v 使 y 属于 v,恰好是层级的并刻画所要求的输入。另一个方向从并刻画出发,必须先把中间成员 v 拉进层,而这正是层传递性所做的,施用两次。最后的规格比较两个量词:可构造条件只对载体见证量化,而层级的并律对全部 V 量化,isL-trans 在两个方向上把这两个范围等同起来。并就位之后,本章已证明五条公理:外延、正则、空集、配对与并。

成员条件 Q 是模型真值内部的一条带索引析取:若存在属于 a 的某个 y 使 x 属于 y,则 x 实现这个并。构造 mkUnion 只带一条假设:某个序数层 σ 装下 a 的底层集合。这里没有第二个实参需要安置,因此与配对不同,无须任何上界序数;a 本已有的那一层便够了。

module UnionOf (a : S) where
  Q : S  hProp (ℓ-suc )
  Q x = ∃[ y  S ] (y ∈ˢ a)  (x ∈ˢ y)

  mkUnion : (σ : V )  IsOrd σ   fst a  Lset σ   SetOf Q
  mkUnion σ  fa∈ = unionElt , spec

在层 Lset σ 上,公式跑遍该层的小呈现。由 Lset-layer σlayer-trans 得到的传递性说明:层成员的成员仍属于该层。对给定的 fst a 层隶属应用 ∈-asFiber,得到代表元 mₐ路径 qₐ : ⟪ Lset σ ⟫↪ mₐ ≡ fst a;与上文相同,这是直接取得的纤维数据,并非对外层截断作消去。

    where
    module DefA = DefOf (Lset σ)
    Atrans = layer-trans (Lset-layer σ)
    mₐ = ∈-asFiber {a = fst a} {b = Lset σ} fa∈ .fst
    qₐ :  Lset σ ⟫↪ mₐ  fst a

公式有一个自由变元槽,是一个有界存在:变元跑遍常元 mₐ 的成员,也就是在层内呈现的 a 的成员;母式说,约束变元以外部变元为成员。由于约束变元在量词母式中占据第一个槽,外部变元落在后继槽上。被断言的外延是周遭并 ⋃ (fst a),等式 defSet≡ 是一次外延性,分为两个包含。

    qₐ = ∈-asFiber {a = fst a} {b = Lset σ} fa∈ .snd

    φ : Formula  Lset σ  1
    φ = ∃̇∈ (con mₐ) (var (suc zero) ∈̇ var zero)

    defSet≡ : DefA.defSet φ   (fst a)
    defSet≡ = extensionality (DefA.defSet φ) ( (fst a)) (sub₁ , sub₂)

第一个包含说:凡满足公式者,都在周遭并中。可定义子集的成员 y,经 defSet 的读法引理,呈现为索引 m 与满足证明组成的截断对,连同把 y 与嵌入元素 ⟪ Lset σ ⟫↪ m 等同的路径 q。满足假设是按索引来名指成员的,所以它只能用于嵌入元素;沿 q 的搬移把目标从 y 移到那个元素,而向命题 y ∈ₛ ⋃ (fst a) 的消去保证整步合法。

      where
      sub₁ :  DefA.defSet φ   (fst a) 
      sub₁ y y∈ₛ = PT.rec (snd (y ∈ₛ  (fst a)))
         { ((m , h) , q) 
          subst  w   w ∈ₛ  (fst a) ) q

有界存在的满足证明仅仅给出一个来自范围的见证 v,连同母式的两条隶属:fst v 属于嵌入的 mₐ,而嵌入的 m 属于 fst v。这两条恰好是层级的并刻画在进入方向所需的输入:要把 ⟪ Lset σ ⟫↪ m 放进 ⋃ (fst a),只须出示 fst a 的某个成员以它为成员。

            (PT.rec (snd ( Lset σ ⟫↪ m ∈ₛ  (fst a)))
               { (v , (fstv∈mₐ , m∈fstv)) 
                union-ax (fst a) ( Lset σ ⟫↪ m) .snd
                   fst v
                  , ( ∈∈ₛ {a = fst v} {b = fst a} .fst

但母式的两条隶属说的是限制呈现的语言,必须变成周遭隶属。∈∈ₛ 执行转换,而已有的路径 qₐ 把范围从嵌入的 mₐ 改写为 fst a,于是见证 fst v 被呈现为 fst a 的成员;第二个合取肢按原样使用,因为它本来就是嵌入的 mfst v 的隶属。两条隶属都成为周遭形式后,并刻画随即适用,第一个包含合拢。

                        (subst  w   fst v  w ) qₐ fstv∈mₐ)
                    , ∈∈ₛ {a =  Lset σ ⟫↪ m} {b = fst v} .fst m∈fstv ) ∣₁ })
              (subst ⟨_⟩ (DefA.defSet-mem φ m)  (m , h) , refl ∣₁)) })
        (∈∈ₛ {a = y} {b = DefA.defSet φ} .snd y∈ₛ)
      sub₂ :   (fst a)  DefA.defSet φ 

反向包含把同一条刻画按另一方向读取:y 在周遭并中的隶属,仅仅是 fst a 的某个成员 vy 为成员。辅助引理 member 随后必须对这个特定的 vy 展示在可定义子集中。这一半正是层假设出力的地方,因为到此为止,没有任何东西保证那个中间的 v 在层中可见。

      sub₂ y y∈ₛ = PT.rec (snd (y ∈ₛ DefA.defSet φ))
         { (v , (v∈ₛfa , y∈ₛv))  member v v∈ₛfa y∈ₛv })
        (union-ax (fst a) y .fst y∈ₛ)
        where
        member : (v : V )   v ∈ₛ fst a    y ∈ₛ v 

辅助引理先把 y 转成层的一个代表元 m',连同其等同路径 q',并把 defSet 的隶属读法反着用:在名指 m' 的常元处的 φ 满足变成嵌入 m' 的隶属,沿 q' 的搬移再把这条隶属搬到 y 上。剩下的只是满足证明 sat,它由两条隶属 v ∈ₛ fst ay ∈ₛ v 组装:经由 Atrans 施用层传递性,先证 v 落在 Lset σ 中,再证 y 也如此,两个合取肢则沿路径 sym qₐsym q' 被搬到嵌入呈现上。

                 y ∈ₛ DefA.defSet φ 
        member v v∈ₛfa y∈ₛv =
          subst  w   w ∈ₛ DefA.defSet φ ) q'
            (∈∈ₛ {a =  Lset σ ⟫↪ m'} {b = DefA.defSet φ} .fst
              (subst ⟨_⟩ (sym (DefA.defSet-mem φ m')) sat))

这一块正是层假设出力之处,也是配对所不需要的一步。先用 ∈∈ₛ 把两条周遭隶属从结构形式读出:va 底层集合的成员,yv 的成员。然后对层的传递性施用两次:既然 fst a 落在 Lset σ 中而层传递,其成员 v 也落在 Lset σ 中;对 y 属于 v 这条隶属再施同一推理,便证得 y 自身是层的成员。于是 a 的成员的成员被拉进层,这恰好让公式的量词能够看到它。

          where
          v∈fa = ∈∈ₛ {a = v} {b = fst a} .snd v∈ₛfa
          y∈v = ∈∈ₛ {a = y} {b = v} .snd y∈ₛv
          v∈A = Atrans {x = fst a} {y = v} v∈fa fa∈
          y∈A = Atrans {x = v} {y = y} y∈v v∈A

y 落在层的证书到手后,纤维转换 ∈-asFiber 给出代表元 m' 及其从嵌入元素回到 y 的等同路径 q'。随后在截断内组装 φ 在该代表元处的满足证明:见证是 v 连同它自身在层中的隶属 v∈A 组成的对,而两条母式合取肢被搬到嵌入呈现处,v 沿 sym qₐ 进入嵌入的 mₐ,嵌入的 m' 沿 sym q' 进入 v。这恰好就是有界存在所要求的数据。

          fib = ∈-asFiber {a = y} {b = Lset σ} y∈A
          m' = fib .fst
          q' = fib .snd
          sat :  (DefA.ι m'  []) DefA.⊨ᵐ φ 
          sat =  (v , v∈A)

两个包含组装成等式 defSet≡,识别原则 𝒟ₒ-intro 把公式与等式转换为 ⋃ (fst a)𝒟ₒ (Lset σ) 中的隶属。再对闭包引理 𝒟ₒ→isL 施用一次便完成构造:既然 σ 是序数,Lset σ 的可定义子集就可构造,于是 ⋃ (fst a) 连同其证书被打包成载体元素进入 L。下一块将对该打包给出刻画。

                , ( subst  w   v  w ) (sym qₐ) v∈fa
                  , subst  w   w  v ) (sym q') y∈v ) ∣₁

    union∈𝒟ₒ :   (fst a)  𝒟ₒ (Lset σ) 
    union∈𝒟ₒ = 𝒟ₒ-intro (Lset σ) ( (fst a))  φ , defSet≡ ∣₁

    unionElt : S

规格是一条真值路径,由两块复合而成。层级自己的并律 union-specfst z 在周遭并中的隶属分类为跑遍整个层级的带索引析取:存在 fst a 中的 y 使 fst z 属于 y。剩下要做的是把这条周遭的带索引析取转成 Q z,后者对载体 S 量化,也就是只对可构造的见证量化。两个量化范围不同,下一块的桥将把这两条截断的析取等同起来。

    unionElt =  (fst a) , 𝒟ₒ→isL σ  ( (fst a)) union∈𝒟ₒ

    spec : (z : S)  (z ∈ˢ unionElt)  Q z
    spec z = union-spec (fst a) (fst z)  bridge
      where
      bridge : (∃[ y  (V ) ] (y  fst a)  (fst z  y))  Q z

桥是这两条截断析取之间的一对映射,由 ⇔toPath 接成路径。正向:带两条隶属的周遭见证 y 获得一份可构造性证书,依据恰恰是 y 属于 fst a,而 a 自身的证书 a .snd 就在手边;类的传递性在此处即 isL-trans 施于「y 的隶属」与「a证书」,证得 y 自身可构造,于是该见证可以被呈现为载体元素而不丢失隶属。反向:载体见证被投影回其底层集合,丢掉证书但保留隶属。两个方向都不检视真值是如何构造的,都作用于抽象的 Ω 值。桥就位后,spec 便是复合路径,模型的并字段由此得证。

      bridge = ⇔toPath
        (PT.map  { (y , py) 
          (y , isL-trans {x = fst a} {y = y} (py .fst) (a .snd)) , py }))
        (PT.map  { (y , py)  fst y , py }))

  build :  SetOf Q ∥₁

组装方式照应配对字段。实参自身的证书 a .snd 是截断的,buildPT.rec 把它消去,得到实现集合的截断存在:在证书所名指的层处运行 mkUnion,产出见证。字段本身于是是一次唯一性原理的应用,mere→uniqueL 把仅仅存在的见证变成收缩性数据,这正是模型 record 每个存在字段所采取的形式。

  build = PT.rec squash₁  { (σ , ( , fa∈))   mkUnion σ  fa∈ ∣₁ }) (a .snd)

hasUnionL : (a : S)  isContr (SetOf  x  ∃[ y  S ] (y ∈ˢ a)  (x ∈ˢ y)))
hasUnionL a = mere→uniqueL (UnionOf.Q a) (UnionOf.build a)

小结

本章为可构造宇宙供给五条公理。外延公理与正则公理是继承来的:外延性用传递性处理周遭成员,而正则性直接限制周遭可及性;而一旦载体内部有了外延性,余下每条公理都化归为出示一个见证,因为实现固定隶属条件的集合是唯一的。空集、配对与并是构造出来的:各由一条公式从单一层中刻出;两个实参须会合时,所需的层由上界序数提供。并的规格还第二次展示了传递性的作用:周遭并中的隶属见证,其可构造性证书恰由 isL-trans 给出,正是它把模型的限制见证与周遭并的全部见证等同起来。与公理并行,本章还记录了关于塔自身的相应安置事实:pair∈Lset-suc 把一层的两个成员的无序对放进下一层,sgl∈Lset-suc 放单点集,pr∈Lset-suc 把有序对放到高两层处;这正是以有序对写成的任何东西得以安置在某一层上的原因。