编码单射的复合与包含

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

阅读指南 · 依赖地图

本章在 L 内部发展两种编码单射的构造,并证明一个排除。其一,两个编码单射的复合:当某个中间值 y 使 (x, y) 落在第一个图、(y, z) 落在第二个图时,复合图把 x 关联到 z。其二,集合的包含由较小集合上的恒等映射编码,其图是由相等定义的有序对集合:即满足 y = x 的那些对 (x, y)。最后,从 ω 到有限序数平方的单射不存在。

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

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

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

图的性质与应用由模型语言的公式表达。每个变元空位对照一列元素读取,满足关系即结构的语义。这里有两个结构。外围层级提供集合本身;可构造结构提供图所居、被读取的载体。

open import FOL.ZFStructure using ( module hPropStructure )
open import FOL.Syntax
  using ( Formula; var; _≐_; _∧̇_; ∃̇_ )
import FOL.Absoluteness
open import V.Hierarchy {} using ( 𝒮ᵥ )

外围集合的有序对由一个配对运算编码,其两个分量皆可恢复:相等的码有相等的分量。小集合带有呈现,即嵌入层级的索引类型,因此关于被呈现元素的事实可转移为关于索引的事实。可构造性是沿隶属向下封闭的谓词:可构造集合的成员是可构造的。

open import V.Coding {} using ( pr; pr-inj )
open import V.Presentation {} using ( member; fiber; ↪-inj )
open import L.Constructible {}
  using ( 𝒮ʟ; isL; isL-trans; IsOrd )

四项材料支撑全章。序数 ω,连同「其成员恰为数码」的事实。数码与有限集之间的有限词典,及其抽象追逐论证。小域原理:把由可构造集合组成的任何小族界于单一层。以及 L 内部的分离,对任意复杂度的公式可用,下文的每个关系都由此从公共界中刻出。

open import L.Ordinal {} using ( ω-ord; #∈ω )
import L.Ordinal.SquareLaw {} lem as SQ
open SQ using ( module FiniteBase )
open import L.Recursion {} lem using ( smallDom )
open import L.Axioms.Full {} lem using ( hasSeparationL )

L 内部,语言的应用原子在常元处读取:图施于参数后仍是公式,且该读取是忠实的。单射的三条公式条件在这些原子下各有引入与消去两种形式。编码单射还可读回为其定义域与陪域的呈现之间的真正函数。

open import L.Coding.Model {} using ( prAtL; prAtL-adequate; prʟ; prʟ-fst; svAt; svAt-in; svAt-out; domAt; domAt-in; domAt-out; domAt-intro )
open import L.Coding.Model {} using ( appC; appC-adequate ) public
open import L.Coding.Injection {} lem
  using ( injAt; injAt-out; injAt-in; module Small )

单射的码是图连同全部四项条件:单值性、定义域上的全域性、单射性作为在定义域上读取的公式,外加以元语言陈述的值域条款。内部单射关系 InjL 仅仅地断言:这样的图连同其四项条件存在。可定义单射构造把连同定义公式一起给出的映射变成这样的码。

open import L.Cardinal {} lem using ( InjCode; InjL )
open import L.DefinableInjection {} lem
  using ( DefinableMap ) renaming ( module Inj to DefinableInj )

内部存在经命题截断来断言:陈述成立而无需选定见证,截断后的陈述只能消去到命题。空类型与自然数从两端抑住下文的有限论证。

import Cubical.Data.Empty as Empty
import Cubical.HITs.PropositionalTruncation as PT
open PT using ( ∣_∣₁; ∥_∥₁; squash₁ )
open import Cubical.Data.Nat using (  )
open import Cubical.Data.Sigma using ( _×_; Σ≡Prop )

有的证明让一对的两个分量同时变动,二元的搬运正为此服务。在两个集合的呈现类型之间,等价把函数与单射搬运过去;集合之间的路径给出这样的等价。外围层级是本章一切成员陈述所读取的载体。

open import Cubical.Foundations.Prelude using ( subst2 )
import Cubical.Foundations.Equiv as Equiv
open Equiv using ( equivFun; invEq; retEq; _≃_ )
open import Cubical.Foundations.Univalence using ( pathToEquiv )
open import Cubical.HITs.CumulativeHierarchy.Base using ( V; _∈_; setIsSet )

层级同样地构造后继与极限:后继运算向集合添入一个元素,无穷集合 ω 收集诸数码,每个有限序数一个。

open import Cubical.HITs.CumulativeHierarchy.Constructions
  using ( module InfinitySet )
module IS = InfinitySet {}
open IS using ( sucV; #_; ω )

呈现把索引类型与到层级的嵌入配成一对,其纤维在元素与索引之间搬运事实。取值于命题的存在量词陈述复合所用的定义域条件。

open import Cubical.HITs.CumulativeHierarchy.Properties
  using ( ⟪_⟫; ⟪_⟫↪ )
open import Cubical.Functions.Logic using ( ∃[∶]-syntax )

可构造载体以本章一切集合所居之名打开。绝对性一章带来两种读法:在可构造结构处的满足 (为本地使用而改名),及其抬升形式,即原子在常元列表处求值。下文图的一切应用都经过这一抬升读法。

open hPropStructure 𝒮ʟ using ( S )

module AbsL = FOL.Absoluteness.Single 𝒮ᵥ isL isL-trans
open AbsL using ( _^_ ) renaming ( _⊨ᵐ_ to _⊨_ )


有限一侧打开其数码词典与抽象追逐,二者都以本章只需例示的形式陈述。

open FiniteBase using ( ω-mem→numeral; toFin; toFin-inj; fromFin; fromFin-inj )
open FiniteBase using ( module AbstractChase )

共同的可构造界

用分离刻出关系,需要候选元素落在同一个可构造集合中。共享装置接收任意小索引族 g : I → S,返回包含每个 g i 的可构造集合;稍后的 PairBound 才把它例示于由选定定义域与陪域产生的有序对。

module StageBound (I : Type ) (g : I  S) where

  opaque
    bnd : S
    bnd = smallDom I g .fst

读取器直接陈述界的用途:族的每个成员按外围元素读取时都属于该界。此后每个被纳入 Relation 的对都经此读取器进入该界。

    below : (i : I)   fst (g i)  fst bnd 
    below = smallDom I g .snd

排除有限目标

后文所需的有限排除取如下形式:从 ω 到有限序数平方的单射不存在。这条路线几乎完全避开 ω 的内部隶属。所用到的只是:ω 的每个成员仅仅地是某个数码;每个数码呈现一个有限集,且词典在两个方向上都单射;以及一条抽象追逐。给定从每个有限呈现到某个固定类型的单射、再给定从该固定类型到某个有限呈现之平方的单射,便导出从较大有限集到较小有限集的单射。

关于 ω 自身的一条事实,取其隶属谓词所能支撑的强度:ω 的成员仅仅地是某个数码,而数码 n 的后继仍是数码,因而仍是成员。γ 与其数码的同一视沿后继搬运。

ω-limit : (γ : V )   γ  ω    sucV γ  ω 
ω-limit γ γ∈ω = PT.rec (snd (sucV γ  ω)) go (ω-mem→numeral γ γ∈ω)
  where
  go : Σ[ n   ] (γ  # n)   sucV γ  ω 
  go (n , p) = subst  w   sucV w  ω ) (sym p) (#∈ω (suc n))

诸数码嵌入 ω 的呈现,路线是直接的。数码 m 的呈现的一个索引指名该数码的一个元素;该数码属于 ω,而由 ω 的传递性,被指名的元素也属于 ω;取 ω 的呈现在该元素处的纤维,即得呈现它的那个 ω 呈现索引。

numeral-into-ω : (m : )   # m    ω 
numeral-into-ω m i = fiber ω (ω-ord .fst (member (# m) i) (#∈ω m)) .fst

嵌入是单射的。若同一数码的两个索引在 ω 的呈现中取值相等,两条纤维的同一视就把像的相等换成该数码内部被呈现元素的相等;而数码自身的呈现是单射的,故两个索引重合。

numeral-into-ω-inj : (m : ) (i₁ i₂ :  # m )
                    numeral-into-ω m i₁  numeral-into-ω m i₂  i₁  i₂
numeral-into-ω-inj m i₁ i₂ e = ↪-inj {a = # m}
  (sym (fiber ω (ω-ord .fst (member (# m) i₁) (#∈ω m)) .snd)
     cong ( ω ⟫↪) e

ω 一侧用到的单射事实只有数码呈现的单射性。

     fiber ω (ω-ord .fst (member (# m) i₂) (#∈ω m)) .snd)

追逐是元理论层面关于呈现索引类型的陈述,并非内部单射关系。其假设有二:其一,对每个数码 n,呈现类型 ⟪ # n ⟫ 与有限集 Fin n 之间在两个方向各有一个单射,各自单射;其二,每个 ⟪ # m ⟫ 都有到固定类型 ⟪ ω ⟫ 的单射。其结论:从 ⟪ ω ⟫⟪ # n ⟫ × ⟪ # n ⟫ 的单射不可能存在。

no-inj-finite-ω : (n : )  (f :  ω    # n  ×  # n )
                 ((x y :  ω )  f x  f y  x  y)  Empty.⊥
no-inj-finite-ω n f finj =

抽象论证恰好消耗那两本词典与到固定类型的单射族。其核心是鸽笼计数:从 Fin (suc (n · n))Fin (n · n) 的单射不存在,而追逐把所设单射化归为恰是这一形状。

  AbstractChase.NoInj.no-inj
     n   # n )
    toFin toFin-inj
    fromFin fromFin-inj
    ( ω )

本章只需交出数码的词典与到 ω 呈现的嵌入。

    (numeral-into-ω)
    (numeral-into-ω-inj)
    n f finj

该条款把排除提升到任意有限序数,且始终停留在呈现索引类型层面,保持追逐的形状:此处固定类型是 ⟪ ω ⟫,有限呈现是诸 ⟪ # n ⟫

finite-excl-ω : (β : V )  IsOrd β   β  ω 
               (f :  ω    β  ×  β )
               ((x y :  ω )  f x  f y  x  y)  Empty.⊥
finite-excl-ω β  β∈ω f finj =
  PT.rec Empty.isProp⊥ go (ω-mem→numeral β β∈ω)

βω 的序数成员,并设从 ω 的呈现到 β 之呈现的平方的函数为单射;要证的是矛盾。

  where

β 属于 ω 仅仅地给出一个与 β 同一视的数码,故只需对数码情形导出反驳;截断消去到空类型,而空类型是命题。

  go : Σ[ n   ] (β  # n)  Empty.⊥
  go (n , p) = no-inj-finite-ω n f' finj'
    where

该同一视是集合之间的路径,对路径取平方便得两个平方呈现之间的等价。所设函数与该等价复合,其单射性沿等价的单位律转移:若被搬运的函数等同了两个输入,原来的函数也会等同它们。

    e :  β  ×  β    # n  ×  # n 
    e = pathToEquiv (cong  w   w  ×  w ) p)
    f' :  ω    # n  ×  # n 
    f' x = equivFun e (f x)
    finj' : (x y :  ω )  f' x  f' y  x  y

于是追逐施于该数码,其矛盾正是所述鸽笼形状:从 Fin (suc (n · n))Fin (n · n) 的单射。

    finj' x y e' = finj x y
      (sym (retEq e (f x))  cong (invEq e) e'  retEq e (f y))

有界有序对图所呈现的关系

L 中两个集合之间的关系将成为编码有序对组成的集合。界在任何公式出现之前就枚举了这些对:索引类型是定义域的一个呈现索引与陪域的一个呈现索引之积。

module PairBound (D C : S) where

  Ix : Type 
  Ix =  fst D  ×  fst C 

每个呈现索引被实现为载体的元素:即那个被呈现的集合;它是可构造集合 DC 的成员,可构造性沿隶属向下搬运。

  private
    toD :  fst D   S
    toD m =  fst D ⟫↪ m
          , isL-trans {x = fst D} {y =  fst D ⟫↪ m} (member (fst D) m) (snd D)

    toC :  fst C   S

每一侧各为每个索引产生一个 L 元素。

    toC k =  fst C ⟫↪ k
          , isL-trans {x = fst C} {y =  fst C ⟫↪ k} (member (fst C) k) (snd C)

该族把每对索引送到两个实现元素的编码有序对,共享界装置对这个族一次施用:一个可构造集合包含由 DC 可能产生的一切编码对。

    pw : Ix  S
    pw (m , k) = prʟ (toD m) (toC k)

    module SB = StageBound Ix pw

界从该装置读出,此后只通过隶属使用;下文无需其构造。

  bnd : S
  bnd = SB.bnd

读取器把界扩展到呈现之外:对 D 的任意元素 xC 的任意元素 z,即便不由索引给出,其编码对仍在界内。此后每个构造触及界用的都是这个形式。

  below : (x z : S)   fst x  fst D    fst z  fst C 
          pr (fst x) (fst z)  fst bnd 
  below x z mx mz = subst  w   w  fst bnd ) pa (SB.below i)
    where

由于 DC 是被呈现的,两个元素各有纤维:一个索引,其被呈现集合与该元素被等同。两条纤维各自独立取得。

    fD : Σ[ m   fst D  ] ( fst D ⟫↪ m  fst x)
    fD = fiber (fst D) mx
    fC : Σ[ k   fst C  ] ( fst C ⟫↪ k  fst z)
    fC = fiber (fst C) mz

两个索引构成界的族的一个索引,族在该索引处的取值是被呈现元素们的编码对,沿两条纤维路径它等于 xz 的编码对。沿该相等搬运隶属,读取器即告完成。

    i : Ix
    i = fD .fst , fC .fst
    pa : fst (pw i)  pr (fst x) (fst z)
    pa = prʟ-fst (toD (fD .fst)) (toC (fC .fst))
        cong₂ pr (fD .snd) (fC .snd)

从界中刻出关系需要三份数据:一个三空位公式,以及定义在有序对上的宿主谓词 P,连同两个方向的充分性。公式的读取次序是值、索引、对:在环境 y ∷ x ∷ e 下,该公式被读作 P x y

module Relation (D C : S) (φ : Formula S 3) (P : S  S  hProp (ℓ-suc ))
                (read : (x y e : S)   (y  x  e  [])  φ    P x y )
                (fill : (x y e : S)   P x y    (y  x  e  [])  φ ) where

刻画公式对两个空位作存在量化,并且除给定公式外,还在对象语言中断言第三空位编码前两者的有序对。共享界上的分离施于这个单空位公式,返回作为 L 元素的关系。

  opaque
    fo : Formula S 1
    fo = ∃̇ (∃̇ (prAtL (suc (suc zero)) (suc zero) zero ∧̇ φ))

    rel : S
    rel = hasSeparationL (PairBound.bnd D C) fo .fst .fst

反向读取把隶属换成关于某一对的截断数据。关系的成员 e 由分离规格满足刻画公式;两层存在量化解开得到分量 xy,以及「e 编码其对子」的证明,经充分性恢复为编码运算自身的形式,而公式部分被读成 P x y

    out : (e : S)   fst e  fst rel 
          Σ[ x  S ] Σ[ y  S ] ((fst e  pr (fst x) (fst y)) ×  P x y ) ∥₁
    out e h = PT.rec squash₁  { (x , hx)  PT.map
       { (y , q , hy)  x , y
         , subst ⟨_⟩ (prAtL-adequate (suc (suc zero)) (suc zero) zero (y  x  e  [])) q

一切都是截断的,与该关系日后被消耗的形式一致。

         , read x y e hy }) hx })
      (subst ⟨_⟩ (hasSeparationL (PairBound.bnd D C) fo .fst .snd e) h .snd)

正向由谓词构造隶属。

    into : (x y : S)   fst x  fst D    fst y  fst C    P x y 
           pr (fst x) (fst y)  fst rel 
    into x y mx my h = subst  w   w  fst rel ) (prʟ-fst x y)
      (subst ⟨_⟩ (sym (hasSeparationL (PairBound.bnd D C) fo .fst .snd (prʟ x y)))
        ( subst  w   w  fst (PairBound.bnd D C) ) (sym (prʟ-fst x y))

xy 的编码对由界的读取器进入共享界;公式的编码条款由编码运算的计算成立,给定公式由充分性成立;分离给出隶属,并沿编码的定义性相等搬运。

            (PairBound.below D C x y mx my)
        ,  x ,  y
          , subst ⟨_⟩ (sym (prAtL-adequate (suc (suc zero)) (suc zero) zero (y  x  prʟ x y  [])))
              (prʟ-fst x y)
          , fill x y (prʟ x y) h ∣₁ ∣₁ ))

xy 的真实编码对,反向读取可锐化为非截断的结论。

  pair-out : (x y : S)   pr (fst x) (fst y)  fst rel    P x y 
  pair-out x y h = PT.rec (snd (P x y))
     { (x' , y' , q , h') 
      subst2  a b   P a b )
        (Σ≡Prop  v  snd (isL v)) (sym (pr-inj (sym (prʟ-fst x y)  q) .fst)))

其见证把 e 呈现为某对 x'y' 的编码对;编码的单射性把 x' 的底层元素等同于 x 的底层元素、y' 的等同于 y 的;又因可构造性是命题,这些底层等式提升为载体元素的等式。谓词随即被恰好搬到 P x y

        (Σ≡Prop  v  snd (isL v)) (sym (pr-inj (sym (prʟ-fst x y)  q) .snd))) h' })
    (out (prʟ x y) (subst  w   w  fst rel ) (sym (prʟ-fst x y)) h))

复合编码单射

第一个的陪域是第二个的定义域时,两个编码单射可以复合。复合物仍是图,其验证从不重跑替换:两个输入图已作为集合存在,复合物只是从共享界内分离出的一个关系。模块收取两个图,以及各自的三条读取条件。

module Comp (D E C F H : S)
            (svF :  (F  D  [])  svAt zero )
            (dmF :  (F  D  [])  domAt zero (suc zero) )
            (ijF :  (F  D  [])  injAt zero )

除三条读取条件外,每个图还以模块的独立假设携带值域条款:第一个图的每个编码对的取值落在中间集合,第二个图的每个编码对的取值落在最终陪域。

            (ranF : (x y : S)   pr (fst x) (fst y)  fst F 
                    fst y  fst E )
            (svH :  (H  E  [])  svAt zero )
            (dmH :  (H  E  [])  domAt zero (suc zero) )
            (ijH :  (H  E  [])  injAt zero )

这两条条款以元语言陈述,而非公式。

            (ranH : (y z : S)   pr (fst y) (fst z)  fst H 
                    fst z  fst C ) where

每个「码与定义域」的对,正是三条公式条件所需的两槽环境:槽 0 放图,槽 1 放定义域。每个图一个环境。

  private
    γF : S ^ 2
    γF = F  D  []

    γH : S ^ 2
    γH = H  E  []

连接关系说:当对象语言能产生中间值 y,使 (x, y) 在第一个图中、(y, z) 在第二个图中时,xz 相关。它的截断继承自存在量词的语义:量词取值于命题,公式的满足只带有量化器内建截断意义上的见证。

  private
    Chain : S  S  Type (ℓ-suc )
    Chain x z =  Σ[ y  S ] ( pr (fst x) (fst y)  fst F 
                             ×  pr (fst y) (fst z)  fst H ) ∥₁

刻画公式只有一个存在量化,遍历中间值。其内合取两个应用原子:第一个图以中间值居取值空位、x 居索引空位读取,第二个图以 z 居取值空位、中间值居索引空位读取。这正是 (x, y) ∈ F(y, z) ∈ H 的对象语言形状。

    opaque
      body : Formula S 3
      body = ∃̇ (appC F (suc (suc zero)) zero ∧̇ appC H zero (suc zero))

应用原子的充分性把每个合取项搬到其本意的隶属:第一个搬到第一个图在 (x, y) 处的隶属,第二个搬到第二个图在 (y, z) 处的隶属。剩下的恰是截断形式的连接见证。

      read : (x z p : S)   (z  x  p  [])  body   Chain x z
      read x z p = PT.map  { (y , hf , hh)  y
        , subst ⟨_⟩ (appC-adequate F (suc (suc zero)) zero (y  z  x  p  [])) hf
        , subst ⟨_⟩ (appC-adequate H zero (suc zero) (y  z  x  p  [])) hh })

逆向把连接见证沿同一条充分性的反向搬回对象语言。两个方向合起来说:公式与连接关系互相表达。

      fill : (x z p : S)  Chain x z   (z  x  p  [])  body 
      fill x z p = PT.map  { (y , hf , hh)  y
        , subst ⟨_⟩ (sym (appC-adequate F (suc (suc zero)) zero (y  z  x  p  []))) hf
        , subst ⟨_⟩ (sym (appC-adequate H zero (suc zero) (y  z  x  p  []))) hh })

有界关系装置被例示一次,宿主谓词取为连接关系;下文一切都从这个唯一实例读出。

    module Composite = Relation D C body  x z  Chain x z , squash₁) read fill

复合图就是那个分离出的关系。

  K : S
  K = Composite.rel

  K-out : (x z : S)   pr (fst x) (fst z)  fst K 
          Σ[ y  S ] ( pr (fst x) (fst y)  fst F 
                      ×  pr (fst y) (fst z)  fst H ) ∥₁

其反向读取原样继承:复合物中的一个编码对仅仅地给出中间值 y,使 (x, y) 在第一个图、(y, z) 在第二个图。下文四项验证都由这一条读取驱动。

  K-out = Composite.pair-out

正向读取即复合律:给定中间值 y,使两对分别落在两个图中,把截断的见证交给装置,装置便把 xz 的编码对放进复合物。

  K-in : (x y z : S)   fst x  fst D    fst z  fst C 
         pr (fst x) (fst y)  fst F    pr (fst y) (fst z)  fst H 
         pr (fst x) (fst z)  fst K 
  K-in x y z mx mz hf hh = Composite.into x z mx mz  y , hf , hh ∣₁

复合物现在必须以其自身资格满足四项条件,环境把复合图与第一个定义域配对。先证单值性。

  γK : S ^ 2
  γK = K  D  []

  svK :  γK  svAt zero 

设复合把 x 与两个值 yy' 配对。拆开两个截断的连接得中间值 ww'(x, w)(x, w') 在第一个图中。

  svK = svAt-in zero γK  x y y' p q 
    PT.rec (setIsSet (fst y) (fst y'))
       { (w , (hf , hh))  PT.rec (setIsSet (fst y) (fst y'))
         { (w' , (hf' , hh')) 
          svAt-out zero γH svH w y y' hh

第一个图的单值性等同 ww';该同一视被搬入第二个图的对子,其单值性随即等同 yy'。目标是 h-集合中的路径,因而是命题,故两次截断消去都合法。

            (subst  t   pr t (fst y')  fst H )
              (sym (svAt-out zero γF svF x w w' hf hf')) hh') })
        (K-out x y' q) })
      (K-out x y p))

接着验证单射性,且两个图的使用次序重要:先用第二个图的单射性,再用第一个图的。

  ijK :  γK  injAt zero 

设复合把 xx' 都映到 y。两个截断的连接给出中间值 ww'(x, w)(x', w') 在第一个图中,而 (w, y)(w', y) 都在第二个图中。

  ijK = injAt-in zero γK  y x x' p q 
    PT.rec (setIsSet (fst x) (fst x'))
       { (w , (hf , hh))  PT.rec (setIsSet (fst x) (fst x'))
         { (w' , (hf' , hh')) 
          injAt-out zero γF ijF w x x' hf

第二个图在公共值 y 处的单射性等同 ww';第一个图在此时公共的中间值处的单射性等同 xx'

            (subst  t   pr (fst x') t  fst F )
              (sym (injAt-out zero γH ijH y w w' hh hh')) hf') })
        (K-out x' y q) })
      (K-out x y p))

复合在定义域上的全域性是一条等价:x 属于第一个定义域,当且仅当它有复合取值。两个方向一并交给引入形式。

  dmK :  γK  domAt zero (suc zero) 
  dmK = domAt-intro zero (suc zero) γK  x  fwd x , bwd x)

一个方向直接消去第一个图的定义域条件。

    where
    fwd : (x : S)   ∃[ y  S ] (pr (fst x) (fst y)  fst K) 
          fst x  fst D 
    fwd x = PT.rec (snd (fst x  fst D))
       { (y , p)  PT.rec (snd (fst x  fst D))

x 有复合取值,连接见证给出中间值 w,使 (x, w) 在第一个图中;把定义域原子自身的消去施于该对,即将 x 放入 D。这个方向用不到第二个图。

         { (w , (hf , _))  domAt-out zero (suc zero) γF dmF x w hf })
        (K-out x y p) })

另一方向串起两条引入。给定 D 中的 x,第一个图的定义域引入给出中间值 w,使 (x, w) 在第一个图中,其值域条款把 w 放入中间集。

    bwd : (x : S)   fst x  fst D 
          ∃[ y  S ] (pr (fst x) (fst y)  fst K) 
    bwd x mx = PT.rec squash₁
       { (w , hf)  PT.rec squash₁
         { (z , hh)   z , K-in x w z mx (ranH w z hh) hf hh ∣₁ })

第二个图的定义域引入在 w 处产出 z,使 (w, z) 在第二个图中;第二个图的值域条款把 z 放入 C;复合律把 xz 的对放进复合物。两步都是截断的,结论亦然。

        (domAt-in zero (suc zero) γH dmH w (ranF x w hf)) })
      (domAt-in zero (suc zero) γF dmF x mx)

值域条件是第二个图的值域条款在中间值处的应用。拆开复合对得到连接见证;其第二分量在第二个图内把中间值与 z 配对,条款随即将 z 放入 C

  ranK : (x z : S)   pr (fst x) (fst z)  fst K    fst z  fst C 
  ranK x z h = PT.rec (snd (fst z  fst C))
     { (w , (_ , hh))  ranH w z hh }) (K-out x z h)

三条读取条件连同值域条款,恰是「编码单射可读回为呈现之间的函数」所需。因此复合物也承认这一读取;该模块私下承载它:公开传递出去的只是图与其四项条件,这一读取所需不外乎此。

  private
    module Sm = Small K D C svK dmK ijK ranK

符号化包含

包含不需要新的构造:当 D 包含于 C 时,D 上的恒等映射本来就是到 C 的映射。被编码的是这个映射的图,它在对象语言中写作取值空位与索引空位之间的相等。模块收取两个集合与逐点的包含。

module InclGraph (D C : S)
                 (sub : (z : V )   z  fst D    z  fst C ) where

可定义映射记录由定义域上的恒等填成:函数把每个元素送到自身,逐点包含证明每个取值落入

  private
    M : DefinableMap
    M = record
      { dom = D ; cod = C
      ; fn = λ x _  x

C

      ; into = λ x mx  sub (fst x) mx

图公式是两个空位之间的相等,它对函数自身取值成立是定义性的。解的唯一性用的是等式的底层等式:任何解都满足该等式,而那是底层元素之间的相等;又因可构造性是命题,这个底层等式提升为载体元素的等式。排除「与函数取值无关的解」靠的正是这一点。

      ; graph = var zero  var (suc zero)
      ; defines = λ _ _  refl
      ; only = λ _ _ _ h  Σ≡Prop  w  snd (isL w)) h }

共享构造把该映射变成带三条读取条件的图,但它要从外部收取底层函数为单射的证明。对恒等映射而言这是直接的:该假设等同两个输入的像,而在恒等映射下像的相等就是输入的相等,故所提供的、把等式原样返回的延续恰是所需的证明。

    module I = DefinableInj M  _ _ _ _ e  e)
      using ( F; code )

  opaque
    G : S
    G = I.F

图连同全部四项条件一并作为从 DC 的单射之码交付;使用者把整个包当作一个单元接收,无需打开。

  opaque
    unfolding G
    code : InjCode G D C
    code = I.code

同一个图经共享读取被读回为 DC 的呈现之间的函数。这一读取由一个私有的模块承载:公开传递出去的结果只是图与其四项条件,而这正是该读取所需的全部。

  private
    module Sm = Small G D C (code .fst) (code .snd .fst)
      (code .snd .snd .fst) (code .snd .snd .snd)

导出的函数名为 incl,其路线值得注意。D 呈现的一个索引指名一个底层元素,该元素属于 D,因而由包含属于 C。函数随后取 C 自身呈现在该元素处的纤维:即呈现它的那个 C 索引。索引不是被直接搬运的,而是经由元素与纤维找回。

  opaque
    incl :  fst D    fst C 
    incl = Sm.small

内部存在层面的包含与复合

至此的构造产出图;而内部单射关系只要求某个图存在。提升是直接的:包含给出恒等图作为见证,断言在其外围截断。包含进入基数论证所用的正是这一形式。

inclusion-coded : (a b : S)
                 ((z : V )   z  fst a    z  fst b )
                 InjL a b
inclusion-coded a b sub =  I.G , I.code ∣₁
  where module I = InclGraph a b sub

复合同样提升:PT.rec2 在局部分支中展开两个见证,构造其复合,再次截断结果,而不作代表的全局选择。

injl-trans : (a b c : S)  InjL a b  InjL b c  InjL a c
injl-trans a b c = PT.rec2 PT.squash₁ step
  where

双重消去局部地拆开两个见证,用已验证的构造组装复合物,再把结果重新截断。它不作任何全局的代表选择:两个见证只作为构造的假设存在,从不被保留。

  step : Σ[ F  S ] InjCode F a b
        Σ[ H  S ] InjCode H b c
        InjL a c
  step (F , svF , dmF , ijF , ranF) (H , svH , dmH , ijH , ranH) =
     K.K , (K.svK , K.dmK , K.ijK , K.ranK) ∣₁

复合模块承载全部验证,因此在这个层面,复合律只有一行。

    where
    module K = Comp a b c F H svF dmF ijF ranF svH dmH ijH ranH

主要实例从序数 C 的成员 D 出发。唯一的假设是 D 属于序数 CC 的传递性随即断言 D 的每个成员都是 C 的成员,而这正是编码所需的逐点包含。模块对这一对打开包含构造,于是其图、码与导出映射都在同一个名字下可用。

module OrdIncl (C : S) (oC : IsOrd (fst C))
               (D : S) (D∈C :  fst D  fst C ) where

  open InclGraph D C  _ z∈D  oC .fst z∈D D∈C) public

小结

三项结果服务于内部基数论证。有限排除表明从 ω 到任何有限序数平方的单射不存在:ω 的成员仅仅地是数码,呈现类型 ⟪ # n ⟫ 与有限集 Fin n 在两个方向上各有一个单射,若假设存在到某个有限平方的单射,抽象追逐便导出从较大有限集到较小有限集的单射。复合把两个编码单射变成一个,经连接关系核验单值性、定义域上的全域性、单射性与值域条款。包含由恒等图把逐点包含编码为单射。在存在层面,两种操作都提升到截断的内部关系,因此基数界限的构造与比较完全可以经由居于 L 内部的图进行。