この章を読むか、対話型目次と依存グラフで別のルートを選べます。

対話型目次 · 依存グラフ

したがって、すべての構成はただ一つの仮定 lem : LEM (ℓ-suc ℓ) を共有する。とくに、後の有限探索は排中律から得られるものであり、選択原理を用いるものではない。

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

無限順序数 δ の段階 Lset δ を L の内部で数えるには、二つの材料が要る。基底の単射 Lω ↪ ω と、単射を有限環境へ持ち上げる方法である。この章はその両方を供給する。ここで証明されることは、すべて本文で名指しされた構成についてのものである。

本章では、固定した宇宙レベルにおける排中律を仮定する。この仮定は章全体で用いる構成に受け継がれる。本章内でとくに明瞭な役割は、有限段階の一覧から名前を探索することと、順序数の三分律によって崩壊値を ω と比較することである。

open import Cubical.HITs.PropositionalTruncation using ( rec2 )
open import Cubical.Foundations.HLevels using ( isPropΠ2; isPropΠ3 )
open import Cubical.Data.FinData using ( inj-toℕ )

以下で使う内部グラフは、L 自身が解釈できる論理式で記述する必要がある。等号、所属、連言、含意、有界量化子と非有界量化子によって、関係が全域的で一価な単射であることと、その有限環境への作用を表す。

議論では一貫して二つの水準のデータを扱う。累積階層の集合には、その要素を名指す小さな提示があり、L の要素には構成可能性の証明も添えられている。この二つの水準を行き来することで、内部グラフを提示のインデックス上の通常の関数として働かせられる。

順序数の構造は二度使われる。数項は環境の有限な定義域を識別し、構成可能段階の順序は後で Lset ω の標準的な整列順序を与える。その後、三岐性によって順序数崩壊の各値が ω に対してどこに位置するかを判定する。

符号化された単射は順序対の集合で表される。その四つの条件は、グラフが一価であること、定義域が指定された集合とちょうど一致すること、入力について単射であること、値が指定された目標に属すことである。章の前半では、このように実際に与えられた符号化グラフから出発する。

各自然数 n について、A に値を取る長さ n の環境には具体的な提示がある。集合 seqL A はすべての有限な長さをまとめたものである。したがって、成分ごとに作用して長さを保つ写像こそ、A 上のすべての有限列を B 上の有限列へ送るために必要な操作である。

後半では、Lset ω の要素をまず誕生段階で並べ、誕生段階が等しいときにはその段階の局所的な順序で並べる。この区別は欠かせない。前者が後者の前者であっても誕生段階が同じ場合があるが、それでも各前者はその共通段階の後続段階に属する。

この整列順序を崩壊させると、Lset ω の各要素に順序数が割り当てられる。次の課題は、すべての崩壊値が ω に属すことを示すことである。証明では前者切片を一つずつ有限な構成可能段階で抑え、ω からその段階への単射を排除する。

有限列の符号化と崩壊の議論は、後の基数計算で合流する。前者はすでに与えられた符号化単射を成分ごとに移し、後者は基礎となる結論 Lset ω ↪ ω を与える。どちらも全単射を主張せず、任意の無限列を数えるものでもない。

open FiniteBase using ( fromFin; fromFin-inj )

有限段階には、その全要素を列挙する有限な名簿がある。重複していてもよいので、この名簿は全単射ではなく、全射的に名前を与えるものである。それで十分である。排中律を使った有界探索により、与えられた各要素の名前を一つ見つけられる。

見つけた名簿のインデックスによって、有限段階の各要素を有限順序数の提示へ送れる。ω からの単射があると仮定してこの命名写像と合成し、得られた値を対角線上で二重にすると、有限平方の排除定理に反する。

open import Cubical.Data.Nat.Order using ( _<_ )
open import Cubical.Data.FinData.FinSet using ( DecΣ )
open import Cubical.Relation.Nullary using ( decRec )
open import Cubical.Data.FinData.Properties using ( toℕ<n; fromℕ'; toFromId'; inj-toℕ )

後で現れるいくつかの等しさは、第二成分が証明である依存対についてのものである。その成分は命題なので、底の集合の等しさから包装された要素の等しさが決まる。これにより、L の要素、その提示、グラフの符号の間を円滑に行き来できる。

数項には、環境の長さを示す以外にも役割がある。周囲の集合が ω に属すという主張は、それが何らかの数項に等しいことだけを述べ、自然数による大域的に選ばれた表示を保持しない。後の消去もこの命題性を守る。

open import Cubical.HITs.CumulativeHierarchy.Base using ( V; _∈_; setIsSet )
open import Cubical.HITs.CumulativeHierarchy.Properties using ( ⟪_⟫; ⟪_⟫↪ )
open import Cubical.HITs.CumulativeHierarchy.Constructions
  using ( module InfinitySet )
open InfinitySet {ℓ} using ( #_; ω; sucV )

所属やグラフの読みで現れる存在は、しばしば命題的切り詰め ∥_∥₁ の下にだけ保たれる。この証人を消去できるのは、行き先が命題である場合、または一意性によって行き先の型をまず命題にした場合である。この操作は任意の代表を選ぶものではない。

open import Cubical.Induction.WellFounded using ( Acc; acc; WellFounded )

同じ区別は最後の数え上げにも当てはまる。InjL A B が保持するのは、A から B への単射を符号化する構成可能グラフが存在するという命題だけであり、大域的に選ばれた台の水準の関数を公開しない。

open hPropView 𝒮ᵥ using ( _∈ˢ_ )

これに対して、列の構成は特定のグラフ E と完全なデータ InjCode E A B から始まる。したがって、そのグラフから台の水準の関数を読み取り、成分ごとに用いた後、得られたグラフを InjL によって再び隠せる。

module SV = hPropView 𝒮ᵥ using ()

構成可能集合の要素から読み取った各項目は、L の推移性によってそれ自身も構成可能である。この基本的な事実により、有限環境とそのグラフに現れる順序対を内部モデルの対象として扱える。

module SL = hPropView 𝒮ʟ using ( S )
open SL using ( S )

充足の記法は、論理式の水準でのグラフの記述を、これらの周囲の所属の事実と結び付ける。妥当性補題を両方向に用いることで、具体的なグラフのデータから内部論理式を満たし、後でその論理式からデータを読み戻せる。

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

自然数 k に対し、nn k は数項 # k とその構成可能性の証明を組にする。この包装された数項を、充足の環境における有限な定義域の対象として用いる。

nn : ℕ → S
nn k = # k , numL k

後のグラフ論理式では、束縛子が何重にも入れ子になる。i0、i1 などの名前は対応する De Bruijn 位置の略記であり、i0 は常に最も新しく束縛された変数を表す。

private
  i0 : ∀ {k} → Fin (suc k)
  i0 = zero
  i1 : ∀ {k} → Fin (suc (suc k))
  i1 = suc i0

束縛子が一つ加わるたびに、それまでの変数は一つ後の位置へ移る。型の付いた略記がその移動をまとめて記録するので、長い後続式を繰り返さずに論理式の数学的な形を示せる。

  i2 : ∀ {k} → Fin (suc (suc (suc k)))
  i2 = suc i1
  i3 : ∀ {k} → Fin (suc (suc (suc (suc k))))
  i3 = suc i2
  i4 : ∀ {k} → Fin (suc (suc (suc (suc (suc k)))))

i6 までの位置があれば、入力環境 s、その像 y、共通の定義域 n、インデックス i、そして E で結ばれる二つの項目を同時に参照できる。

  i4 = suc i3
  i5 : ∀ {k} → Fin (suc (suc (suc (suc (suc (suc k))))))
  i5 = suc i4
  i6 : ∀ {k} → Fin (suc (suc (suc (suc (suc (suc (suc k)))))))
  i6 = suc i5

後で符号化された単射を表す論理式では、さらに深い位置もいくつか必要になる。同じ命名法を延長しておけば、追加の束縛子を導入しても記法の約束を変えずに済む。

  i7 : ∀ {k} → Fin (suc (suc (suc (suc (suc (suc (suc (suc k))))))))
  i7 = suc i6
  i8 : ∀ {k} → Fin (suc (suc (suc (suc (suc (suc (suc (suc (suc k)))))))))
  i8 = suc i7
  i9 : ∀ {k} → Fin (suc (suc (suc (suc (suc (suc (suc (suc (suc (suc k))))))))))

最後の略記で、このモジュールに必要な位置がすべてそろう。これらの名前は数学的な仮定を何も加えず、変数位置の管理を読みやすくするだけである。

  i9 = suc i8

環境の長さと外延性

最初の剛性の事実は、二つの符号化された環境の長さを比較する。一つの底の集合が env h とも env h' とも等しく、各項目が構成可能なら、二つの長さは等しくなる。符号化された環境の定義域はその長さの数項であり、同じ集合の二つの読みが数項の射影で同一視されるのである。

env-len : (E : S) {n n' : ℕ} (h : Fin n → V ℓ) (h' : Fin n' → V ℓ)
        → ((i : Fin n) → ⟨ isL (h i) ⟩) → ((i : Fin n') → ⟨ isL (h' i) ⟩)
        → E .fst ≡ env h → E .fst ≡ env h' → n ≡ n'
env-len E {n} {n'} h h' cg cg' q q' =
  #-inj′ (domAt-numeral (suc zero) zero (nn n ∷ E ∷ []) n' h' cg' q'

証明は、最初の提示の定義域を n の数項で埋め、同じ定義域を n' の数項として読み戻し、数項の単射性を適用する。結論は長さの等式だけであり、二つの提示の関数の等式ではない。

            (domAt-fill (suc zero) zero (nn n ∷ E ∷ []) n h cg q refl))

二つ目の剛性の事実では、二つの列の長さがすでに同じで、符号化されたグラフも等しいと仮定する。両方のグラフでインデックスに対応する数項のキーを参照すると、対応する項目の等しさが得られる。逆向き、すなわち各点の等しさからグラフの等しさを作る方向は、後で必要になる箇所で証明する。

env-pt : {n : ℕ} (h h' : Fin n → V ℓ) → env h ≡ env h' → (i : Fin n) → h i ≡ h' i
env-pt h h' q i = subst ⟨_⟩ (lookup-spec h' i (h i))
  (subst (λ w → ⟨ pr (# (toℕ i)) (h i) ∈ w ⟩) q
    (subst ⟨_⟩ (sym (lookup-spec h i (h i))) refl))

符号化された単射を有限列へ持ち上げる

持ち上げのモジュールは、構成可能なグラフ E に対して四つのデータとともに述べられる。一価性、A の上の全域性、A の上の単射性、そして B の中の値である。これらはちょうど、A から B への符号化された単射の四つの条項である。

module SeqMap (A B E : S)
              (sv : ⟨ (E ∷ A ∷ []) ⊨ svAt zero ⟩)
              (dm : ⟨ (E ∷ A ∷ []) ⊨ domAt zero (suc zero) ⟩)
              (ij : ⟨ (E ∷ A ∷ []) ⊨ injAt zero ⟩)
              (ran : (x y : S) → ⟨ pr (x .fst) (y .fst) ∈ E .fst ⟩
                   → ⟨ y .fst ∈ B .fst ⟩) where

最後の値域条件が述べるのは、E に現れるすべての値が B に属すことだけである。B の各要素が像になることは要求しないので、このデータが表すのは単射であり、全射や全単射ではない。

抽出の仕組みは、内部のグラフを、A と B の提示の間の実際の関数として読む。一価性により各値の繊維は命題になるので、選択の原理なしに値を復元できる。

module Sm = Small E A B sv dm ij ran using ( at; fib; small; small-inj; module E )

抽出された関数は不透明に保たれる。後の議論は、そのグラフと単射性を通してだけそれを使う。

opaque
  f : ⟪ A .fst ⟫ → ⟪ B .fst ⟫
  f = Sm.small

グラフの記録は、索引の提示された要素と提示された像の順序対が E に属することを述べる。これは、項代数自身のグラフの記録から、提示された値の同一視に沿って運ばれる。

  f-graph : (m : ⟪ A .fst ⟫)
          → ⟨ pr (⟪ A .fst ⟫↪ m) (⟪ B .fst ⟫↪ (f m)) ∈ E .fst ⟩
  f-graph m = subst (λ w → ⟨ pr (⟪ A .fst ⟫↪ m) w ∈ E .fst ⟩)
    (sym (Sm.fib m .snd)) (Sm.E.toFun-graph (Sm.at m))

抽出された関数は A の提示の上で単射である。これが、列の持ち上げが成分ごとに受け継ぐ、各点の単射性である。

  f-inj : (m n : ⟪ A .fst ⟫) → f m ≡ f n → m ≡ n
  f-inj = Sm.small-inj

A の環境の項目は、提示の埋め込みを通して周囲の集合として読まれる。

vA : {n : ℕ} → Ix A n → Fin n → V ℓ
vA g i = ⟪ A .fst ⟫↪ (g i)

B の環境の項目についても同様である。

vB : {n : ℕ} → Ix B n → Fin n → V ℓ
vB h i = ⟪ B .fst ⟫↪ (h i)

持ち上げられた割り当ては、抽出された関数を項目ごとに適用する。A の長さ n の環境の像は B の長さ n の環境であり、長さは変わらない。

fg : {n : ℕ} → Ix A n → Ix B n
fg g i = f (g i)

A の環境のどの項目も構成可能である。A への所属を、構成可能性の推移性に沿って運ぶからである。

isLA : {n : ℕ} (g : Ix A n) (i : Fin n) → ⟨ isL (vA g i) ⟩
isLA g i = isL-trans (member (A .fst) (g i)) (A .snd)

B の環境の項目についても同様である。

isLB : {n : ℕ} (h : Ix B n) (i : Fin n) → ⟨ isL (vB h i) ⟩
isLB h i = isL-trans (member (B .fst) (h i)) (B .snd)

インデックス対象 i に対し、Ent y s i は、s(i)=u、y(i)=v であり、グラフ E が u を v へ送るような模型の要素 u と v がもっぱら存在することを述べる。これらの証人と三つのグラフ所属の事実は、すべて命題的切り詰めの下に保たれる。

Ent : (y s i : S) → Type (ℓ-suc ℓ)
Ent y s i = ∥ Σ[ u ∶ S ] Σ[ v ∶ S ]
    ( ⟨ pr (i .fst) (u .fst) ∈ s .fst ⟩
    × ⟨ pr (i .fst) (v .fst) ∈ y .fst ⟩
    × ⟨ pr (u .fst) (v .fst) ∈ E .fst ⟩ ) ∥₁

台の水準での読み Wit y s は、ある対象 n が s の定義域であり、y が固定された目標 B 上で同じ n を定義域にもつ環境であり、すべての i∈n が Ent y s i を満たすことを、もっぱら存在する形で述べる。したがって y は s と同じ有限な形をもち、その各項目は s の項目の E による像である。

Wit : (y s : S) → Type (ℓ-suc ℓ)
Wit y s = ∥ Σ[ n ∶ S ]
    ( ⟨ (n ∷ y ∷ s ∷ []) ⊨ domAt i2 i0 ⟩
    × ⟨ (B ∷ n ∷ y ∷ s ∷ []) ⊨ envOverAt i2 i1 i0 ⟩
    × ((i : S) → ⟨ i .fst ∈ n .fst ⟩ → Ent y s i) ) ∥₁

項目の論理式は、Ent に含まれる三つの等式をそのまま表す。存在量化された二つの値 u と v が s(i)=u、y(i)=v、E(u)=v を満たす。変数位置には、周囲の引数と二つの新しい証人がともに数えられている。

opaque
  private
    entFo : Formula S 5
    entFo = ∃̇ (∃̇ ( appAt i6 i2 i1 ∧̇ appAt i5 i2 i0 ∧̇ appC E i1 i0 ))

論理式全体は、まず共通の定義域 n を束縛し、次に対象 b を束縛して、それが固定した定数 B に等しいことを要求する。そして y が定義域 n をもつ b 上の環境であり、すべての i∈n で項目の論理式が成り立つと述べる。等式 b=B により、これは意図した目標上の環境になる。

  fo : Formula S 2
  fo = ∃̇ ( domAt i2 i0
         ∧̇ ∃̇ ( (var i0 ≐ con B)
              ∧̇ envOverAt i2 i1 i0
              ∧̇ ∀̇∈ (var i1) entFo ) )

論理式から項目を読み取るため、証明は入れ子になった二つの存在証人 u と v を順に消去する。Ent y s i 自体が命題的切り詰めによって命題になっているので、この消去は正当である。

  private
    entOut : (y s n b i : S) → ⟨ (i ∷ b ∷ n ∷ y ∷ s ∷ []) ⊨ entFo ⟩ → Ent y s i
    entOut y s n b i = rec₁ squash₁ (λ { (u , hv) →
      rec₁ squash₁ (λ { (v , (h1 , (h2 , h3))) →
        let γ = v ∷ u ∷ i ∷ b ∷ n ∷ y ∷ s ∷ [] in

二つの環境の適用とグラフ E の適用についての妥当性法則により、論理式の充足を三つの周囲の所属へ変換する。読み戻した u、v とこれらの所属を組にすると、必要な切り詰められた項目が得られる。

        ∣ u , v
        , ( subst ⟨_⟩ (appAt-adequate i6 i2 i1 γ) h1
          , subst ⟨_⟩ (appAt-adequate i5 i2 i0 γ) h2
          , subst ⟨_⟩ (appC-adequate E i1 i0 γ) h3 ) ∣₁ }) hv })

逆方向では、切り詰められた項目を論理式の充足へ写す。同じ三つの妥当性の等しさを逆向きに用い、周囲のグラフ所属を二つの環境適用の条項と E の適用の条項へ変換する。

    entIn : (y s n i : S) → Ent y s i → ⟨ (i ∷ B ∷ n ∷ y ∷ s ∷ []) ⊨ entFo ⟩
    entIn y s n i = map₁ (λ { (u , v , (h1 , h2 , h3)) →
      let γ = v ∷ u ∷ i ∷ B ∷ n ∷ y ∷ s ∷ [] in
      u , ∣ v , ( subst ⟨_⟩ (sym (appAt-adequate i6 i2 i1 γ)) h1
                , subst ⟨_⟩ (sym (appAt-adequate i5 i2 i0 γ)) h2

二つの証人を入れ子の存在量化子の下へ戻すと、E のグラフ所属の条項によって項目の論理式の充足が完成する。こうして entOut と entIn は、各インデックスで必要となる正確な対応を与える。

                , subst ⟨_⟩ (sym (appC-adequate E i1 i0 γ)) h3 ) ∣₁ })

本体の読み取りは、外側の論理式から現れる三つの成分を受け取る。n は s の定義域であり、補助対象 b の底の集合は B の底の集合と等しく、y は定義域 n をもつ b 上の環境で、その各インデックスが項目の論理式を満たす。これらを Wit y s へ変換することが目標である。

    bodyOut : (y s n b : S)
            → ⟨ (n ∷ y ∷ s ∷ []) ⊨ domAt i2 i0 ⟩
            → b .fst ≡ B .fst
            → ⟨ (b ∷ n ∷ y ∷ s ∷ []) ⊨ envOverAt i2 i1 i0 ⟩
            → ⟨ (b ∷ n ∷ y ∷ s ∷ []) ⊨ ∀̇∈ (var i1) entFo ⟩

b と B の底の集合の等しさに沿って、b 上の環境であるという主張を固定された目標 B へ移す。各有界インデックスでの項目の論理式を entOut で読み戻し、共通の定義域とこれら二つの成分を命題的切り詰めの下にまとめる。

            → Wit y s
    bodyOut y s n b hd eb he hS =
      ∣ n , ( hd
            , envOverAt-transport (b ∷ n ∷ y ∷ s ∷ []) (B ∷ n ∷ y ∷ s ∷ [])
                i2 i1 i0 i2 i1 i0 refl refl eb he

有界全称の節は各点で用いる。各 i∈n について、entOut がその充足の証明を Ent y s i へ変換する。これらの項目を、定義域の等式および移送した環境条件と合わせると、切り詰められた証人 Wit y s の三成分が得られる。

            , λ i i∈n → entOut y s n b i (hS i i∈n) ) ∣₁

グラフ論理式全体を外向きに読むには、まず切り詰められた証人 n を除去し、次に切り詰められた証人 b を除去する。それらに伴う節から、定義域条件、等式 b .fst ≡ B .fst、環境条件、有界ステップ条件が得られ、bodyOut がちょうどこれらを Wit y s に変える。Wit y s 自体が命題的に切り詰められているので、この二つの除去は正当である。

  fo-out : (y s : S) → ⟨ (y ∷ s ∷ []) ⊨ fo ⟩ → Wit y s
  fo-out y s = rec₁ squash₁ (λ { (n , (hd , hb)) →
    rec₁ squash₁ (λ { (b , (eb , (he , hS))) → bodyOut y s n b hd eb he hS }) hb })

逆に、ホスト側の証人は外側の存在量化に n を、内側の存在量化に固定された要素 B を与える。反射律がこの要素は必要な目標を表すことを示し、entIn が各点の項目を有界論理式へ戻す。したがって fo-out と fo-in は、Wit に対する fo の妥当性を両方向から確立する。

  fo-in : (y s : S) → Wit y s → ⟨ (y ∷ s ∷ []) ⊨ fo ⟩
  fo-in y s = rec₁ (((y ∷ s ∷ []) ⊨ fo) .snd)
    (λ { (n , (hd , he , hS)) →
      ∣ n , ( hd , ∣ B , ( refl , he , λ i i∈n → entIn y s n i (hS i i∈n) ) ∣₁ ) ∣₁ })

A 上の長さ N の列 g、台の要素 s、および s の底の集合を g の環境グラフと同一視する等式を固定する。この具体的な表示から成分ごとの像を構成し、同じグラフ論理式を満たす任意の出力が同じ底の集合をもつことを示せる。

module AtSeq (N : ℕ) (g : Ix A N) (s : S) (e : s .fst ≡ (envS A g) .fst) where

意図する出力は、成分ごとの像 fg g の環境グラフである。添字 j での値は f (g j) なので、源の列と目標の列は同じ有限長をもち、対応する項は入力グラフ E によって関係づけられる。

y₀ : S
y₀ = envS B (fg g)

次の補題は、この証人を構成するために必要な基本的な所属の事実を与える。各座標の対は環境グラフに属する。この補題が局所的なのは、この小節で公開する結論が像の環境全体の存在と一意性だからである。

private

項目の補題は、関数の符号化されたグラフが、それぞれの自然数の添字とその値の順序対を含むと言う。証明は、環境の構成子の仕様から来る。その対は定義によってそこにあるのである。

  at : {k : ℕ} (h : Fin k → V ℓ) (j : Fin k)
     → ⟨ pr (# (toℕ j)) (h j) ∈ env h ⟩
  at h j = subst ⟨_⟩ (sym (lookup-spec h j (h j))) refl

標準的な像はホスト側の述語 Wit を満たす。数項 nn N が共通の定義域を記録し、he が y₀ は長さ N の B 上の環境であることを記録し、step が N 未満の各添字で関係を確かめる。最後にこの三つの節を命題的切り詰めの中へ入れ、後の議論が特定の分解に依存しない形で存在だけを残す。

wit : Wit y₀ s
wit = ∣ nn N , ( hd , he , step ) ∣₁
  where
  hd : ⟨ (nn N ∷ y₀ ∷ s ∷ []) ⊨ domAt i2 i0 ⟩
  hd = domAt-fill i2 i0 (nn N ∷ y₀ ∷ s ∷ []) N (vA g) (isLA g) e refl

事実 envOver B (fg g) は、初めは B、nn N、y₀ だけを含む短い環境について述べられている。移送補題は同じ論理式を、さらに s を含む長い割当てへ移す。三つの反射律の証明は、論理式が使う各位置にまったく同じ要素が残っていることを示す。したがって、使われない源の列を加えても環境についての主張は変わらない。

  he : ⟨ (B ∷ nn N ∷ y₀ ∷ s ∷ []) ⊨ envOverAt i2 i1 i0 ⟩
  he = envOverAt-transport (B ∷ nn N ∷ y₀ ∷ []) (B ∷ nn N ∷ y₀ ∷ s ∷ [])
         i2 i1 i0 i2 i1 i0 refl refl refl (envOver B (fg g))

それぞれの位置でのステップの条項は、数項の所属を有界の自然数へ消去することで証明される。消去されたデータが、両方の列で値の得られる具体的な添字を名指す。

  step : (i : S) → ⟨ i .fst ∈ # N ⟩ → Ent y₀ s i
  step i i∈N = map₁ atIndex (∈#-elim N (i .fst) i∈N)
    where
    atIndex : Σ[ k ∶ ℕ ] ((k < N) × (i .fst ≡ # k))
            → Σ[ u ∶ S ] Σ[ v ∶ S ]

復元された有限添字 j に対し、必要な項目は源の値 vA g j、目標の値 vB (fg g) j、および三つのグラフ所属からなる。源の環境は j に前者を、目標の環境は同じ位置に後者を格納し、E は前者を後者に関係づける。構成可能性の証明により、二つの値はいずれも台 S の要素になる。

                ( ⟨ pr (i .fst) (u .fst) ∈ s .fst ⟩
                × ⟨ pr (i .fst) (v .fst) ∈ y₀ .fst ⟩
                × ⟨ pr (u .fst) (v .fst) ∈ E .fst ⟩ )
    atIndex (k , p , ei) =
        (vA g j , isLA g j) , (vB (fg g) j , isLB (fg g) j)

環境の項目補題が最初の二つの所属を与え、それらを、与えられた位置と j の数項を同一視する等式に沿って移送する。源の環境については、さらに提示の等式 e に沿って移送する。三つ目の所属はグラフ定理 f-graph から得られる。有限添字 j は、直前に得た有界自然数からすぐ下で定義される。

      , ( subst2 (λ a w → ⟨ pr a (vA g j) ∈ w ⟩) (sym qi) (sym e) (at (vA g) j)
        , subst (λ a → ⟨ pr a (vB (fg g) j) ∈ y₀ .fst ⟩) (sym qi) (at (vB (fg g)) j)
        , f-graph (g j) )
      where
      j : Fin N

内部の添字 j は、有界の自然数の有限の復号から構成され、数項の等式は、所属の輸送と添字の値の復元を合成したものである。

      j = fromℕ' N k p
      qi : i .fst ≡ # (toℕ j)
      qi = ei ∙ cong #_ (sym (toFromId' N k p))

一意性の証明では、Wit y s を満たす任意の候補 y から始め、その基礎にある集合が y₀ のものと等しいことを目標とする。累積階層の等しさは命題なので、切り詰められた証人を除去できる。三つの節を取り出した後、局所モジュール Only がそれらから必要な等式を導く。

only : (y : S) → Wit y s → y .fst ≡ y₀ .fst
only y = rec₁ (setIsSet (y .fst) (y₀ .fst))
  (λ { (n , (hd , he , hS)) → Only.final n hd he hS })
  where
  module Only (n : S)

内側のモジュールは、証人の三つの条項を集める。定義域の条件、環境の上の条件、そしてすべての位置でのステップの条項である。

              (hd : ⟨ (n ∷ y ∷ s ∷ []) ⊨ domAt i2 i0 ⟩)
              (he : ⟨ (B ∷ n ∷ y ∷ s ∷ []) ⊨ envOverAt i2 i1 i0 ⟩)
              (hS : (i : S) → ⟨ i .fst ∈ n .fst ⟩ → Ent y s i) where

数項の等式が、定義域の符号化の妥当性によって、未知の長さを既知の長さ N と同一視する。

    qn : n .fst ≡ # N
    qn = domAt-numeral i2 i0 (n ∷ y ∷ s ∷ []) N (vA g) (isLA g) e hd

環境条件と復元された長さから、候補 y を環境グラフとして表示する添字関数 gR : Ix B N が定まる。この定義は、切り詰められたデータを除去して構成されるため不透明である。以後はその除去を展開せず、述べられた等式を通して復元関数を使う。

    opaque
      gR : Ix B N
      gR = Recover.g B N (B ∷ n ∷ y ∷ s ∷ []) i2 i1 i0 qn refl he

復元はさらに、y の基礎にある集合が gR から生成される環境グラフであることを示す。この等式によって、証人に含まれる任意の提示を固定長の座標表示へ置き換えられるので、一意性を座標ごとに確かめられる。

      gR-eq : y .fst ≡ (envS B gR) .fst
      gR-eq = Recover.recovers B N (B ∷ n ∷ y ∷ s ∷ []) i2 i1 i0 qn refl he

各添字 j で、ステップの節は命題的切り詰めのもとに、源の値、候補となる目標値、および両者を結ぶ三つのグラフ所属を与える。目標の等式は命題なので、rec₁ はこれらのデータを read に渡せる。この補題が表示された二つの値の等しさを示し、B の表示の単射性から gR j ≡ fg g j が従う。

    pt : (j : Fin N) → gR j ≡ fg g j
    pt j = ↪-inj {a = B .fst} (rec₁ (setIsSet _ _) read (hS (nn (toℕ j)) j∈n))
      where
      j∈n : ⟨ # (toℕ j) ∈ n .fst ⟩
      j∈n = subst (λ w → ⟨ # (toℕ j) ∈ w ⟩) (sym qn) (#mono (toℕ j) N (toℕ<n j))

読み出しの補題は、ステップの条項が供給するものを述べる。二つの要素と三つの所属であり、源の列の中の引数、未知の環境の中の値、そして符号化された対でそれらを結ぶ関係の事実を同定する。

      read : Σ[ u ∶ S ] Σ[ v ∶ S ]
               ( ⟨ pr (# (toℕ j)) (u .fst) ∈ s .fst ⟩
               × ⟨ pr (# (toℕ j)) (v .fst) ∈ y .fst ⟩
               × ⟨ pr (u .fst) (v .fst) ∈ E .fst ⟩ )
           → vB gR j ≡ vB (fg g) j

源の引数の等式は、源の環境の参照の仕様によって復元され、同定の等式に沿って運ばれる。

      read (u , v , (hu , hv , hE)) = sym qv ∙ qv'
        where
        qu : u .fst ≡ vA g j
        qu = subst ⟨_⟩ (lookup-spec (vA g) j (u .fst))
               (subst (λ w → ⟨ pr (# (toℕ j)) (u .fst) ∈ w ⟩) e hu)

候補値 v には二つの記述がある。復元された環境から読み取ると v .fst ≡ vB gR j が得られる。一方、hE は、E が復元された源の引数を v に関係づけることを述べる。その引数を vA g j と同一視した後、E の一価性によってこの辺を f-graph (g j) と比較し、v .fst ≡ vB (fg g) j を得る。

        qv : v .fst ≡ vB gR j
        qv = subst ⟨_⟩ (lookup-spec (vB gR) j (v .fst))
               (subst (λ w → ⟨ pr (# (toℕ j)) (v .fst) ∈ w ⟩) gR-eq hv)
        qv' : v .fst ≡ vB (fg g) j
        qv' = svAt-out zero (E ∷ A ∷ []) sv u v (vB (fg g) j , isLB (fg g) j) hE

最後の等式が、関数のグラフの事実と逆向きの引数の等式を合成して、二つの像の値の同定を完成させる。

                (subst (λ w → ⟨ pr w (vB (fg g) j) ∈ E .fst ⟩) (sym qu) (f-graph (g j)))

残るのは、座標ごとの一致を二つの環境グラフの等しさへ高めることである。必要なパスは y の復元された提示から始まり、標準グラフ y₀ に至る。

    final : y .fst ≡ y₀ .fst

関数外延性により、pt は二つの添字関数の等しさになる。そのパスに沿って envS B を動かすと二つの環境グラフが同一視され、これを gR-eq と合成して y .fst ≡ y₀ .fst を得る。ここでのパスラムダは、この等しさに沿う環境グラフの cubical な作用を直接表している。

    final = gR-eq ∙ λ i → (envS B (funExt pt i)) .fst

列の集合への所属は型として記録され、議論が、写す各要素とともにそれを運べるようにする。

Mem : S → Type (ℓ-suc ℓ)
Mem s = ⟨ s .fst ∈ˢ (seqL A) .fst ⟩

表示とは、長さ、添字の関数、そして二つの提示を同一視する等式の、切り詰められた記録である。切り詰められた形こそ、seqL-out が供給するものである。

Rep : S → Type (ℓ-suc ℓ)
Rep s = ∥ Σ[ n ∶ ℕ ] Σ[ g ∶ Ix A n ] (s .fst ≡ (envS A g) .fst) ∥₁

seqL A への所属から、seqL-out は命題的切り詰めのもとで長さ n と、対応する固定長環境集合への所属を与える。その n に対して envSet-out は、切り詰められた添字関数と提示の等式を与える。これらを写し、切り詰められた目標にだけ除去することで、大域的な表示を選ばずに二段階を合成できる。

rep : (s : S) → Mem s → Rep s
rep s m = rec₁ squash₁
  (λ { (n , hn) → map₁ (λ { (g , e) → n , g , e }) (envSet-out A n s hn) })
  (seqL-out A s m)

再帰の構造は seqL A を定義域、fo をグラフとする。各要素 s の切り詰められた表示から標準的な像の環境が定まり、AtSeq.wit はその像がグラフを満たすことを、AtSeq.only はほかのどの充足値も同じ基礎の集合をもつことを示す。したがって、このグラフは mereFunct が要求する意味で全域的かつ一価である。

R : Recursion
R = record
  { dom   = seqL A
  ; graph = fo
  ; funct = λ s m → mereFunct fo s (map₁ (λ { (n , g , e) →

具体的な表示 (n , g , e) に対する関数性の証人は、標準的な像 AtSeq.y₀、それが fo を満たす証明、およびほかのどの充足する台の要素もそれに等しいという証明からなる。構成可能性の証明は命題値のファイバーをなすので、Σ≡Prop は基礎にある集合の等しさを S での等しさへ持ち上げる。続いて map₁ が構成全体を切り詰めの中に保つ。

      AtSeq.y₀ n g s e
      , ( fo-in (AtSeq.y₀ n g s e) s (AtSeq.wit n g s e)
        , λ y' h → Σ≡Prop (λ v → (isL v) .snd) (AtSeq.only n g s e y' (fo-out y' s h)) ) })
      (rep s m)) }

再帰の表の機構が開かれ、実際の関数、その値、そして値の一意性を供給する。

module T = Of R using ( funct; val; val-uniq )

得られる値 fn s m は、s において fo を満たす一意な台の要素である。その構成は s の切り詰められた表示から始まるが、一意性により、どの長さと添字関数でその列を表示しても値は変わらない。

fn : (s : S) → Mem s → S
fn = T.val

s が長さ n と添字関数 g で表示されるとき、計算された値 fn s m は標準的な成分ごとの像 AtSeq.y₀ n g s e に等しくなる。両方が s における再帰グラフを満たすので、一意性定理 T.val-uniq がこの等しさを与える。この等式により、以後の証明では s について手元にあるどの表示からでも推論できる。

fn-code : (s : S) (m : Mem s) (n : ℕ) (g : Ix A n) (e : s .fst ≡ (envS A g) .fst)
        → fn s m ≡ AtSeq.y₀ n g s e
fn-code s m n g e =
  T.val-uniq s m (AtSeq.y₀ n g s e) (fo-in (AtSeq.y₀ n g s e) s (AtSeq.wit n g s e))

目標の列の集合への所属は、符号の等式に沿って運び、目標の列の集合の内向きの読み出しを適用することで証明される。

into : (s : S) (m : Mem s) → ⟨ (fn s m) .fst ∈ˢ (seqL B) .fst ⟩
into s m = rec₁ (((fn s m) .fst ∈ˢ (seqL B) .fst) .snd)
  (λ { (n , g , e) → subst (λ w → ⟨ w .fst ∈ˢ (seqL B) .fst ⟩) (sym (fn-code s m n g e))
         (seqL-in B n (envS B (fg g)) (envSet-in B (fg g))) })
  (rep s m)

以上の事実から seqL A から seqL B への写像が定まる。fo がそのグラフを、fn が各始域要素での一意な値を与え、into はその値が再び B 上の有限列であることを示す。残る課題は、二つの値が等しければ元の列も等しいと示すことである。

D : DefinableMap
D = record
  { dom = seqL A ; cod = seqL B ; fn = fn ; into = into ; graph = fo
  ; defines = λ s m → T.funct s m .fst .snd
  ; only    = λ s m y h → sym (T.val-uniq s m y h) }

単射性を示すには、まず標準的な表示どうしを比較すれば十分である。表示上の長さが異なるかもしれない二つの成分ごとの像の環境が等しいと仮定する。補助補題 same は長さの等しさを復元し、二つ目の源の列を共通の有限添字型へ移送した後、各座標で f の単射性を使って源の環境グラフの等しさを示す。

private
  same : (n : ℕ) (g : Ix A n) (n' : ℕ) (g' : Ix A n')
       → (envS B (fg g)) .fst ≡ (envS B (fg g')) .fst
       → (envS A g) .fst ≡ (envS A g') .fst
  same n g n' g' q =

二つの目標環境グラフの等しさから、env-len によって有限長の等しさが定まる。環境の符号化された定義域が、その長さを表す数項だからである。この等しさに沿って置換すると、問題は同じ Fin n で添字づけられた二つの列の比較に帰着し、局所的な型族 P が整列後に残る主張を記録する。

    subst P (env-len (envS B (fg g)) (vB (fg g)) (vB (fg g')) (isLB (fg g)) (isLB (fg g')) refl q)
      base g' q
    where
    P : ℕ → Type (ℓ-suc ℓ)
    P k = (h : Ix A k) → (envS B (fg g)) .fst ≡ (envS B (fg h)) .fst

長さが共通になれば、env-pt は目標グラフの等しさを各添字での値の等しさとして読む。B の表示の単射性により、これは f (g j) ≡ f (h j) となり、f-inj から g j ≡ h j が復元される。関数外延性が源の添字関数を同一視し、したがってその環境グラフも同一視する。

        → (envS A g) .fst ≡ (envS A h) .fst
    base : P n
    base h q' = λ i → (envS A (funExt (λ j →
      f-inj (g j) (h j) (↪-inj {a = B .fst} (env-pt (vB (fg g)) (vB (fg h)) q' j))) i)) .fst

任意の要素 s と s' について、その表示は命題的切り詰めのもとでしか得られない。累積階層の値は集合をなすため、目標の等式 s .fst ≡ s' .fst は命題である。そこで rec2 により、各入力の表示を局所的に一つずつ取り出し、標準表示どうしの比較に渡せる。

inj : (s : S) (m : Mem s) (s' : S) (m' : Mem s')
    → (fn s m) .fst ≡ (fn s' m') .fst → s .fst ≡ s' .fst
inj s m s' m' q = rec2 (setIsSet (s .fst) (s' .fst))
  (λ { (n , g , e) (n' , g' , e') →
      e

二つの符号等式は、実際の出力 fn s m と fn s' m' を、それぞれの標準的な像の環境と同一視する。これらを仮定された出力の等しさと合成すると same が必要とする前提が得られ、最後に提示の等式 e と e' が源の環境グラフの等しさを s .fst ≡ s' .fst へ戻す。

    ∙ same n g n' g'
        (sym (cong (λ p → p .fst) (fn-code s m n g e)) ∙ q ∙ cong (λ p → p .fst) (fn-code s' m' n' g' e'))
    ∙ sym e' })
  (rep s m) (rep s' m')

いま示した単射性により、この定義可能な写像は内部の符号化された単射 seqL A ↪ seqL B になる。そのグラフは同じ成分ごとの作用を記録するが、結論に残るのは適切な符号の命題的な存在だけである。

injL : InjL (seqL A) (seqL B)
injL = Inj.injL D inj

公開される定理は、A から B への単射を証明する実際の符号化グラフ E から始める。このグラフは一価で、定義域が A であり、単射的で、値域が B に含まれる。これら四つの成分を SeqMap に渡すと、seqL A から seqL B への符号化された単射の命題的に切り詰められた存在が得られる。この結果が扱うのは任意の長さの有限列であり、無限列ではない。

seq-map : (A B E : S) → InjCode E A B → InjL (seqL A) (seqL B)
seq-map A B E (sv , dm , ij , ran) = SeqMap.injL A B E sv dm ij ran

量化変数を定数に固定する

釘づけの論理式は、一つの存在量化子を束縛して、自由な枠を選んだ定数に固定する。ある値が定数に等しく、内側の論理式を満たす、と言うだけである。

pinAt : ∀ {n} → S → Formula S (suc n) → Formula S n
pinAt c φ = ∃̇ ((var zero ≐ con c) ∧̇ φ)

内向きの読み出しは、定数を証人として示し、拡張された環境での本体の充足を与える。

pin-in : ∀ {n} (c : S) (φ : Formula S (suc n)) (γ : Vec S n)
       → ⟨ (c ∷ γ) ⊨ φ ⟩ → ⟨ γ ⊨ pinAt c φ ⟩
pin-in c φ γ h = ∣ c , (refl , h) ∣₁

外向きには、存在量化から台の要素 z、その基礎にある集合と c のものとの等しさ、および z で本体が成り立つ証明を得る。構成可能性は命題値なので、Σ≡Prop は基礎の集合の等しさを S における等式 z ≡ c へ持ち上げる。これに沿って移送すれば、固定された環境での充足が得られる。論理式の充足は命題なので、命題的切り詰めからのこの除去は正当である。

pin-out : ∀ {n} (c : S) (φ : Formula S (suc n)) (γ : Vec S n)
        → ⟨ γ ⊨ pinAt c φ ⟩ → ⟨ (c ∷ γ) ⊨ φ ⟩
pin-out c φ γ = rec₁ (((c ∷ γ) ⊨ φ) .snd)
  (λ { (z , (ez , h)) → subst (λ v → ⟨ (v ∷ γ) ⊨ φ ⟩) (Σ≡Prop (λ v → (isL v) .snd) ez) h })

固定した終域への符号化された単射の論理式

InjCode F a b は四つの命題値の条件からなる。F の一価性、その定義域が a であること、グラフの単射性、そして値が b に含まれることである。論理式の充足は命題値であり、最後の条件は所属命題を値とする依存関数なので、それらの入れ子の積も命題になる。

isPropInjCode : (F a b : S) → isProp (InjCode F a b)
isPropInjCode F a b =
  isProp× (((F ∷ a ∷ []) ⊨ svAt zero) .snd)
    (isProp× (((F ∷ a ∷ []) ⊨ domAt zero (suc zero)) .snd)
      (isProp× (((F ∷ a ∷ []) ⊨ injAt zero) .snd)

残る値域条件は、引数、値、およびグラフが両者を関係づける証明を順に量化する。その結論は値が b に属するという命題である。したがって依存関数を繰り返しても命題性が保たれ、InjCode が命題であることの証明が完成する。

        (isPropΠ3 (λ _ y _ → (y .fst ∈ b .fst) .snd))))

InjCode がグラフ引数と定義域引数について参照するのは、それらが表示する基礎の集合だけである。構成可能性の証明は命題なので、等式 F .fst ≡ F' .fst と a .fst ≡ a' .fst は S での等式へ一意に持ち上がる。続いて二変数の置換により、目標 b を固定したまま、単射の符号を (F , a) から (F' , a') へ移送する。

injcode-resp : (F F' a a' b : S) → F .fst ≡ F' .fst → a .fst ≡ a' .fst
             → InjCode F a b → InjCode F' a' b
injcode-resp F F' a a' b qF qa = subst2 {x = F} {y = F'} {z = a} {w = a'}
  (λ E A → InjCode E A b)
  (Σ≡Prop (λ v → (isL v) .snd) qF) (Σ≡Prop (λ v → (isL v) .snd) qa)

論理式 injFo b f B は、位置 f のグラフと位置 B の定義域を使って、単射の符号の四条件を表す。グラフは一価で、定義域がちょうど指定された集合であり、単射的である。さらに、グラフが引数を値に関係づけるなら、その値は固定された目標 b に属する。最後の節が表すのは値域の包含であり、b への全射性ではない。

injFo : ∀ {n} → S → Fin n → Fin n → Formula S n
injFo b f B = svAt f ∧̇ domAt f B ∧̇ injAt f
            ∧̇ ∀̇ (∀̇ (appAt (suc (suc f)) i1 i0 ⇒̇ (var i0 ∈̇ con b)))

injFo の読み出し則を示すため、目標 b、関係する二つの位置 f と B、および割当て γ を固定する。局所名 F と A は、それぞれの位置にある台の要素を表す。これにより、後の議論では変数参照の処理を数学的な主張から切り離し、結論を直接 InjCode F A b と述べられる。

module InjFo {n : ℕ} (b : S) (f B : Fin n) (γ : Vec S n) where
private
  F A : S
  F = lookup f γ
  A = lookup B γ

読み取りの補題は、単射論理式の充足を単射符号の四つの条件へ変換する。定義域の条件では、入力に対するグラフの証人を命題的切り詰めから「その入力が A に属する」という命題へ除去する。逆に、A への所属から必要な定義域の証人が得られる。

read : ⟨ γ ⊨ injFo b f B ⟩ → InjCode F A b
read (sv , dm , ij , ran) =
    svAt-in zero (F ∷ A ∷ []) (λ x y y' p q → svAt-out f γ sv x y y' p q)
  , domAt-intro zero (suc zero) (F ∷ A ∷ []) (λ x →
        (λ h → rec₁ ((x .fst ∈ A .fst) .snd)

一価性と単射性については、それぞれの意味論的な条件を γ で読み取り、二項環境 (F,A) に対する対応する条件を組み立て直す。値域の条件では、適用の妥当性によって F のグラフ所属を論理式が要求する適用原子へ変換し、最後の条項から値が固定された目標 b に属することを得る。

                 (λ { (y , p) → domAt-out f B γ dm x y p }) h)
      , (λ hx → domAt-in f B γ dm x hx))
  , injAt-in zero (F ∷ A ∷ []) (λ y x x' p q → injAt-out f γ ij y x x' p q)
  , λ x y p → ran x y (subst ⟨_⟩ (sym (appAt-adequate (suc (suc f)) i1 i0 (y ∷ x ∷ γ))) p)

埋めの補題は逆向きの構成である。符号化された単射の四つのデータから、単射の論理式の充足を作る。今度は、論理式が述べられている構造のもとですべてのアトムを読む。

fill : InjCode F A b → ⟨ γ ⊨ injFo b f B ⟩
fill (sv , dm , ij , ran) =
    svAt-in f γ (λ x y y' p q → svAt-out zero (F ∷ A ∷ []) sv x y y' p q)
  , domAt-intro f B γ (λ x →
        (λ h → rec₁ ((x .fst ∈ A .fst) .snd)

全域性については、切り詰められたグラフの証人を「入力が A に属する」という命題にだけ除去し、逆向きには A への所属から証人を与える。残りの条項は γ で一価性と単射性を組み立て直し、適用の妥当性によって値域の仮定を論理式の最後の条項へ変換する。したがって read と fill は、論理式の充足と単射符号の四条件の間の両方向を与える。

                 (λ { (y , p) → domAt-out zero (suc zero) (F ∷ A ∷ []) dm x y p }) h)
      , (λ hx → domAt-in zero (suc zero) (F ∷ A ∷ []) dm x hx))
  , injAt-in f γ (λ y x x' p q → injAt-out zero (F ∷ A ∷ []) ij y x x' p q)
  , λ x y p → ran x y (subst ⟨_⟩ (appAt-adequate (suc (suc f)) i1 i0 (y ∷ x ∷ γ)) p)

無限段階の計数を L_ω に帰着する

無限順序数 ω における段階は、構成可能な集合として提示される。順序数の段階 Lset ω とその順序数性が、段階の提示によってまとめられる。

Lω : S
Lω = LsetS ω ω-ord

この節の目標は、型として述べられる。Lset ω の構成可能な提示から内部の ω への、符号化された内部単射である。これが、より大きな段階の数え上げが依拠する基底の場合である。

LimitStageCounted : Type (ℓ-suc ℓ)
LimitStageCounted = InjL Lω ωʟ

移送の補題は、始域と目標の底の集合の等しさに沿って、内部の符号化された単射を移す。始域の等しさから新しい始域 a' を古い始域 a へ含め、与えられた単射を適用した後、目標の等しさから古い目標 b を新しい目標 b' へ含める。この三つの単射の合成によって InjL a' b' が得られる。

move : (a a' b b' : S) → a .fst ≡ a' .fst → b .fst ≡ b' .fst → InjL a b → InjL a' b'
move a a' b b' qa qb h =
  injl-trans a' a b' (inclusion-coded a' a (λ z hz → subst (λ w → ⟨ z ∈ˢ w ⟩) (sym qa) hz))
    (injl-trans a b b' h (inclusion-coded b b' (λ z hz → subst (λ w → ⟨ z ∈ˢ w ⟩) qb hz)))

基底の計数:L_ω を ω へ単射する

排除の議論は、Lset (# n) の形の有限段階を扱い、そのような有限段階の名簿を取ることから始まる。すなわちその要素の、索引づけられた列挙である。

private module FinNo (n : ℕ) where
t : Tally (finiteStage n)
t = StageOrder.tally (stageOrder n)

名簿は、その大きさ、各索引での要素、そしてすべての要素がある索引に現れるという覆いの事実を供給する。

open Tally t using ( size; item; onto )

探索の補題は要素に名前を与える。有限段階の各要素 x に対して、有限の索引の上で判定可能な探索を走らせ、排中律で各項目を x と比較し、その項目が x に等しい索引を返す。探索が返すのはある索引であって、それが一意だとは主張しない。これは有限の族の上の有限の判定であり、選択の原理への訴えではない。

named : (x : V ℓ) → ⟨ x ∈ˢ finiteStage n ⟩ → Σ[ i ∶ Fin size ] (item i ≡ x)
named x hx = decRec (λ q → q) (λ nq → ⊥₀-rec (rec₁ isProp⊥ nq (onto x hx)))
  (DecΣ size (λ i → item i ≡ x)
    (λ i → FOL.Semantics.decideEquality 𝒮ᵥ lem (item i) x))

f が ω の提示を有限段階へ単射すると仮定する。各値 f x には名簿のインデックス q x を割り当てられ、そのインデックスを二つ並べた写像 x ↦ (q x,q x) が有限性による排除定理の入力になる。この対が等しければ対応する f の値が等しくなり、さらに f の単射性から元の入力が等しくなる。

noinj : (f : ⟪ ω ⟫ → ⟪ Lset (# n) ⟫)
      → ((x y : ⟪ ω ⟫) → f x ≡ f y → x ≡ y) → ⊥₀
noinj f finj = finite-excl-ω (# size) (numeral-ord size) (#∈ω size)
  (λ x → q x , q x) (λ x y e → finj x y (qq x y (cong (λ p → p .fst) e)))
  where

補助の写像は、f のそれぞれの値を周囲の要素として読み、それが有限の段階に属することを証明し、先ほど見つかった有限の索引で名前を与える。

  vl : ⟪ ω ⟫ → V ℓ
  vl x = ⟪ Lset (# n) ⟫↪ (f x)
  mm : (x : ⟪ ω ⟫) → ⟨ vl x ∈ˢ finiteStage n ⟩
  mm x = member (Lset (# n)) (f x)
  q : ⟪ ω ⟫ → ⟪ # size ⟫

写像 q は、選ばれた名簿のインデックスを有限順序数の提示 ⟪# size⟫ の対応する要素へ変換する。その二つの名前が等しければ、この提示の単射性によって自然数インデックスが等しくなり、二つの名簿項目も等しくなる。最後に Lset (# n) の提示が、この周囲での等しさを f の二つの値の等しさへ戻す。

  q x = fromFin size (toℕ (named (vl x) (mm x) .fst) , toℕ<n (named (vl x) (mm x) .fst))
  qq : (x y : ⟪ ω ⟫) → q x ≡ q y → f x ≡ f y
  qq x y e = ↪-inj {a = Lset (# n)}
    (sym (named (vl x) (mm x) .snd)
      ∙ cong item (inj-toℕ (cong (λ p → p .fst) (fromFin-inj size _ _ e)))

同一視の連鎖は、二つ目の点の名指しされた項目で閉じる。名前が等しければ値が等しい、という証明がこれで完成する。

      ∙ named (vl y) (mm y) .snd)

任意の添字 w に対して、NoInto w は ω の提示から Lset w の提示への周囲の水準での単射が存在しないという命題である。次の補題では、w が ω に属するという追加の仮定のもとで、この命題を証明する。

private
  NoInto : V ℓ → Type ℓ
  NoInto w = (f : ⟪ ω ⟫ → ⟪ Lset w ⟫)
           → ((x y : ⟪ ω ⟫) → f x ≡ f y → x ≡ y) → ⊥₀

一般の形は、g の ω への所属に沿って有限の場合を運ぶことで得られる。ω の要素は、単に、ある数項であり、この輸送が排除の主張全体をその数項の段階へ移す。目標が矛盾の命題であるため、消去は正当である。

  no-inj-fin : (g : V ℓ) → ⟨ g ∈ˢ ω ⟩ → NoInto g
  no-inj-fin g g∈ω = rec₁ (isPropΠ2 (λ _ _ → isProp⊥))
    (λ { (k , e) → subst NoInto e (FinNo.noinj (lower k)) }) g∈ω

無限順序数 ω は構成可能である。その順序数性が、順序数の段階の構成を供給する。

hω : ⟨ isL ω ⟩
hω = isL-ord ω ω-ord

Lset ω の段階の順序は、L の内部の、符号化された対からなる構成可能な集合 Rω として実装される。

Rω : SL.S
Rω = relL ω hω ω-ord

関係の仕様は、Rω の符号化された対が、段階の順序で関係づけられた L の要素の順序対にちょうど一致することを言う。

specω : IsRel ω Rω
specω = relL-spec ω hω ω-ord

端点条件は、関係する各対の両端点について段階への所属を復元する。符号化された対を展開すると Lset ω の二つの要素が得られ、成分の等式がそれらの底の集合を端点 y と x にそれぞれ同一視する。

Rsub : (y x : SL.S) → Holds Rω y x
     → ⟨ y .fst ∈ˢ Lset ω ⟩ × ⟨ x .fst ∈ˢ Lset ω ⟩
Rsub y x h = rec₁ isP
  (λ { (_ , h₁) → rec₁ isP
    (λ { (a , h₂) → rec₁ isP

二つの所属は、順序対の符号化の単射性が供給する、二つの成分の等式に沿って運ばれる。

      (λ { (b , (q , _)) →
             subst (λ w → ⟨ w ∈ˢ Lset ω ⟩) (sym (pr-inj q .fst)) (a .snd)
           , subst (λ w → ⟨ w ∈ˢ Lset ω ⟩) (sym (pr-inj q .snd)) (b .snd) })
      h₂ })
    h₁ })

二つの所属の連言は命題であり、符号化された対の関係は、構成可能な順序対のもとの関係の仕様から産み出される。

  rel
  where
  isP : isProp (⟨ y .fst ∈ˢ Lset ω ⟩ × ⟨ x .fst ∈ˢ Lset ω ⟩)
  isP = isProp× ((y .fst ∈ˢ Lset ω) .snd) ((x .fst ∈ˢ Lset ω) .snd)
  rel : ⟨ Related ω (pr (y .fst) (x .fst)) ⟩

関係は、符号化された対を、二つの底の集合の素の順序対と同一視する輸送に沿って運ばれる。

  rel = subst (λ w → ⟨ Related ω w ⟩) (prʟ-fst y x)
    (specω (prʟ y x) .fst
      (subst (λ w → ⟨ w ∈ˢ Rω .fst ⟩) (sym (prʟ-fst y x)) h))

順序型の仕組みは、内部の関係とその端点の条件とともに、段階 Lset ω のもとで具体化される。これにより、小さな定義域・内部の関係・そして前章の崩壊の構成が固定される。

module OT = Code Lω Rω Rsub using ( module Conjuncts; Dom; _≺_; isProp≺; ≺-in; ≺-out )

ホストの整列順序は、Lset ω の提示に運ばれた段階の順序であり、抽象的な整列順序の仕組みを小さな索引型の上で使える。

Wω : SWO ⟪ Lset ω ⟫
Wω = carry (Lset ω) (orderAt ω ω-ord)

この整列順序が Lset ω の提示上に与える狭義の比較を a <ω b と書く。次の二つの補題は、この関係と内部で符号化された先行関係 a OT.≺ b が同じ比較を表すことを示す。

open SWO Wω using () renaming ( _<∙_ to _<ω_ )

内部関係と周囲の段階順序は、共通の提示の上で一致する。最初の向きでは、符号化された関係の表現定理を使い、内部の先行関係の証明 a OT.≺ b を周囲の順序比較 a <ω b として読み取る。

≺→< : (a b : OT.Dom) → a OT.≺ b → a <ω b
≺→< a b k = ixRel-rep ω ω-ord Rω specω a b (OT.≺-out a b k)

逆に、符号化された関係の充足定理は、周囲の順序比較 a <ω b を内部の先行関係の証明 a OT.≺ b へ変換する。この二方向の変換により、周囲の関係がもつ順序論的性質を内部関係へ移せる。

<→≺ : (a b : OT.Dom) → a <ω b → a OT.≺ b
<→≺ a b k = OT.≺-in a b (ixRel-fill ω ω-ord Rω specω a b k)

内部の関係の整礎性は、ホストの順序の整礎性から従う。到達可能性は点ごとに運ばれる。内部の関係のそれぞれの先行者は、まずホストの先行者に変換されるのである。

wfω : WellFounded OT._≺_
wfω m = go (SWO.wf∙ Wω m)
  where
  go : {n : OT.Dom} → Acc _<ω_ n → Acc OT._≺_ n
  go {n} (acc r) = acc (λ n' k → go (r n' (≺→< n' n k)))

内部の関係の推移性も、ホストの順序を通して運ばれる。連なる二つの内部の一歩が変換され、合成され、そして元に戻される。

transω : {a b c : OT.Dom} → a OT.≺ b → b OT.≺ c → a OT.≺ c
transω {a} {b} {c} k k' =
  <→≺ a c (SWO.trans∙ Wω a b c (≺→< a b k) (≺→< b c k'))

任意の a と b に対して、周囲の整列順序の三岐性は a <ω b、等しい、または b <ω a のいずれかを与える。結論を入れ子の直和で表すことで、各比較を内部関係の対応する場合へ変換できる。

triω : (a b : OT.Dom) → (a OT.≺ b) ⊎ ((a ≡ b) ⊎ (b OT.≺ a))
triω a b = go (SWO.tri∙ Wω a b)
  where
  go : TriW (a <ω b) (a ≡ b) (b <ω a)
     → (a OT.≺ b) ⊎ ((a ≡ b) ⊎ (b OT.≺ a))

ホストのそれぞれの場合が、対応する内部の場合、すなわち小さい・等しい・大きいへ変換される。

  go (lt h) = inl (<→≺ a b h)
  go (eq e) = inr (inl e)
  go (gt h) = inr (inr (<→≺ b a h))

整礎性と推移性から、崩壊値とその順序数像 otL が得られる。三岐性により異なる点の崩壊値が異なることが分かるので、崩壊グラフ colTable は単射性の条件を満たし、後で使う符号を与える。

module C = OT.Conjuncts wfω transω using ( module Inj; col; col-ord; col-out; colTable; otL; otL-out )
module I = C.Inj triω using ( code; col-inj )

誕生段階の族は、内部の ω のもとで具体化される。Lset ω の提示されたすべての要素は ω の中に誕生段階をもち、族の関係がそれを順序づける。

private module F = Family ω (λ δ _ → orderAt δ) ω-ord using ( _≺_; bornAt )

族の関係の展開された読みが証明される。ω のもとでは、抽象的に述べられた順序は、誕生段階とその次の一歩からなる具体的な順序と等しくなる。

private
  unfoldω : (a b : MemOf (Lset ω))
          → relOf (orderAt ω ω-ord) a b ≡ (a F.≺ b)
  unfoldω a b = cong (λ z → relOf (z ω-ord) a b) (orderAt-step ω)

要素の誕生段階は、周囲の集合として読まれる。

  bAt : MemOf (Lset ω) → V ℓ
  bAt a = F.bornAt a .fst

すべての誕生段階は内部の ω に属する。族の全体が ω より下にあるからである。

  bAt∈ω : (a : MemOf (Lset ω)) → ⟨ bAt a ∈ˢ ω ⟩
  bAt∈ω a = F.bornAt a .snd

すべての誕生段階は順序数である。順序数 ω の要素であり、順序数の要素は順序数だからである。

  bAt-ord : (a : MemOf (Lset ω)) → IsOrd (bAt a)
  bAt-ord a = mem-ord {A = ω} ω-ord (bAt a) (bAt∈ω a)

Lset ω の提示されたすべての要素は、その自身の誕生段階を一つ上げた段階に属する。要素の構成可能性が、その後続の段階の中へ運ばれるのである。

  self-at : (a : MemOf (Lset ω)) → ⟨ a .fst ∈ˢ Lset (sucV (bAt a)) ⟩
  self-at a = birth-mem (a .fst) (Lset→isL ω ω-ord (a .fst) (a .snd))

ステップの上界は次を言う。族の順序で a が b に先行するなら、a の底の集合は、b の誕生段階に一つを加えたものが添字づける段階に属する。誕生段階が真に早い場合には、後続の比較が順序数の線形性によって判定される。

  step-bound : (a b : MemOf (Lset ω)) → a F.≺ b
             → ⟨ a .fst ∈ˢ Lset (sucV (bAt b)) ⟩
  step-bound a b (inl h) =
    raise (suc∈or≡ (bAt a) (bAt b) (bAt-ord a) (bAt-ord b) h)
    where

誕生段階が真に早い分岐では、順序数の離散性によって sucV (bAt a) と bAt b を直接比較する。この後続がなお bAt b より下にある場合も、それと等しい場合も、段階の単調性によって既知の a∈Lset (sucV (bAt a)) を Lset (sucV (bAt b)) へ移す。

    raise : ⟨ sucV (bAt a) ∈ˢ bAt b ⟩ ⊎ (sucV (bAt a) ≡ bAt b)
          → ⟨ a .fst ∈ˢ Lset (sucV (bAt b)) ⟩
    raise (inl k) = Lset-mono {α = sucV (bAt b)} {β = sucV (bAt a)}
      (∈sucV-inl {A = bAt b} {x = sucV (bAt a)} k) (self-at a)
    raise (inr e) = Lset-mono {α = sucV (bAt b)} {β = sucV (bAt a)}

等式の場合 sucV (bAt a) ≡ bAt b には、まずこの順序数を bAt b の後続に入れ、それから段階の単調性を適用する。もう一方の主な分岐では誕生段階が等しく、ステップ順序の証人そのものが a の共通の誕生段階の後続段階への所属を含む。その等しさに沿って移送すれば、求める上界が得られる。

      (subst (λ w → ⟨ sucV (bAt a) ∈ˢ sucV w ⟩) e (self∈sucV (sucV (bAt a))))
      (self-at a)
  step-bound a b (inr (e , u)) =
    subst (λ w → ⟨ a .fst ∈ˢ Lset (sucV w) ⟩) (sym e) (u .fst)

内部の崩壊の定義域のすべての点は、Lset ω の提示された要素として読まれる。

  atIx : OT.Dom → MemOf (Lset ω)
  atIx m = ⟪ Lset ω ⟫↪ m , memOf (Lset ω) m

崩壊領域の点 p に対し、護衛となる添字 gOf p は、p が表す要素の誕生段階の後続である。有限段階 Lset (gOf p) が p のすべての先行者を含むことになる。

  gOf : OT.Dom → V ℓ
  gOf p = sucV (bAt (atIx p))

どの衛も内部の ω の中にある。ω の要素の後続だからである。

  gOf∈ω : (p : OT.Dom) → ⟨ gOf p ∈ˢ ω ⟩
  gOf∈ω p = ω-limit (bAt (atIx p)) (bAt∈ω (atIx p))

先行者の上界は、点 p のすべての先行者 r が、p の衛とされる有限の段階の周囲の要素を提示することを言う。証明は、ステップの上界を、族の順序の展開された読みを通して運ぶ。

  seg-bound : (p r : OT.Dom) → r OT.≺ p
            → ⟨ ⟪ Lset ω ⟫↪ r ∈ˢ Lset (gOf p) ⟩
  seg-bound p r k =
    step-bound (atIx r) (atIx p) (transport (unfoldω (atIx r) (atIx p)) (≺→< r p k))

先行者の区間は、p の先行者 r と、その崩壊の値が与えられた集合と等しいことの同一視を記録する。

private
  Seg : OT.Dom → V ℓ → Type (ℓ-suc ℓ)
  Seg p b = Σ[ r ∶ OT.Dom ] ((r OT.≺ p) × (C.col r ≡ b))

先行者の区間は命題である。同じ崩壊の値をもつ二つの記録は、崩壊が小さな定義域の上で単射であり、関係が命題値であり、底の集合が h-集合を作ることによって、同一視される。

  isPropSeg : (p : OT.Dom) (b : V ℓ) → isProp (Seg p b)
  isPropSeg p b (r , _ , e) (r' , _ , e') =
    Σ≡Prop (λ z → isProp× (OT.isProp≺ z p) (setIsSet _ _))
      (I.col-inj r r' (e ∙ sym e'))

崩壊の値の中の所属はどれも、先行者の区間を与える。崩壊の切り詰められた読みが、命題値の区間の中へ消去されるのである。

  seg : (p : OT.Dom) (b : V ℓ) → ⟨ b ∈ˢ C.col p ⟩ → Seg p b
  seg p b h = rec₁ (isPropSeg p b) (λ z → z) (C.col-out p b h)

残るのは、各順序数 C.col p が ω より下にあることの証明である。順序数の三分律で妨げとなるのは、ω に等しい場合と、崩壊が ω を要素として含む場合である。どちらからも同じ包含 ω ⊆ C.col p が従うので、まずこの包含が有限段階 Lset (gOf p) へのありえない単射を導くことを示す。

col-fin : (p : OT.Dom) → ⟨ C.col p ∈ˢ ω ⟩
col-fin p = go (ord-tri (C.col p) (C.col-ord p) ω ω-ord)
  where
  refute : ((z : V ℓ) → ⟨ z ∈ˢ ω ⟩ → ⟨ z ∈ˢ C.col p ⟩) → ⊥₀
  refute sub = no-inj-fin (gOf p) (gOf∈ω p) f f-inj

背理法のため、ω のすべての要素が C.col p に属すると仮定する。ω の提示要素 x に対し、崩壊への所属から、崩壊値が x の提示する集合に等しい前者 r ≺ p が得られる。そのような前者からなる型 Seg は命題なので、seg は切り詰められた所属の証拠を除去でき、s x は一意に定まる前者を記録する。前者区間の界が Lset (gOf p) に入れるのは r の表す集合であって、その崩壊値ではない。fb x はその集合のこの段階での標準的な提示を取り出す。

    where
    s : (x : ⟪ ω ⟫) → Seg p (⟪ ω ⟫↪ x)
    s x = seg p (⟪ ω ⟫↪ x) (sub (⟪ ω ⟫↪ x) (member ω x))
    fb : (x : ⟪ ω ⟫)
       → Σ[ m ∶ ⟪ Lset (gOf p) ⟫ ] (⟪ Lset (gOf p) ⟫↪ m ≡ ⟪ Lset ω ⟫↪ (s x .fst))

こうして f は、ω の各提示要素を、共通の有限段階における対応する前者の提示へ送る。この写像の単射性を示すため f x = f y と仮定する。有限段階の添字の等しさから、まず二つの前者が表す集合の等しさが得られ、残る道の計算によって元の要素 x と y の等しさが復元される。

    fb x = fiber (Lset (gOf p)) (seg-bound p (s x .fst) (s x .snd .fst))
    f : ⟪ ω ⟫ → ⟪ Lset (gOf p) ⟫
    f x = fb x .fst
    f-inj : (x y : ⟪ ω ⟫) → f x ≡ f y → x ≡ y
    f-inj x y e = ↪-inj {a = ω}

提示の単射性により、f の二つの値の等しさは、Lset ω で復元された前者の添字の等式 rr になる。rr に崩壊関数を作用させ、s x と s y に記録された等式と合成すると、x と y が提示する集合は等しいと分かる。最後に ω の提示の単射性から x = y を得る。したがって、仮定した包含 ω ⊆ C.col p は、ω から有限段階 Lset (gOf p) への単射を与えてしまう。

      (sym (s x .snd .snd) ∙ cong C.col rr ∙ s y .snd .snd)
      where
      rr : s x .fst ≡ s y .fst
      rr = ↪-inj {a = Lset ω}
        (sym (fb x .snd) ∙ cong ⟪ Lset (gOf p) ⟫↪ e ∙ fb y .snd)

順序数の三分律で C.col p と ω を比較する。崩壊がすでに ω の要素なら、求める結論は直ちに得られる。C.col p = ω なら、この等式に沿う輸送によって ω のすべての要素が崩壊の要素になる。これは上で反駁した包含そのものであり、Lset (gOf p) へのありえない単射を与えてしまう。

  go : ⟨ C.col p ∈ˢ ω ⟩ ⊎ ((C.col p ≡ ω) ⊎ ⟨ ω ∈ˢ C.col p ⟩) → ⟨ C.col p ∈ˢ ω ⟩
  go (inl k) = k
  go (inr (inl e)) =
    ⊥₀-rec (refute (λ z z∈ω → subst (λ w → ⟨ z ∈ˢ w ⟩) (sym e) z∈ω))
  go (inr (inr ω∈c)) =

残る場合は ω ∈ C.col p である。C.col p は順序数であり、したがって推移的なので、ω のすべての要素も C.col p に属する。これも禁止された包含を与え、三分律の最後の枝が閉じる。ゆえに、すべての崩壊値 C.col p は ω の要素である。

    ⊥₀-rec (refute (λ z z∈ω → C.col-ord p .fst z∈ω ω∈c))

したがって、順序型の像は ω に含まれる。その外向きの読みは、命題的切り詰めのもとで、添字 b と、与えられた像の要素 z を C.col b と同一視する等式を与える。目標の命題 z∈ω は命題なので、そこへこの証人を除去でき、col-fin b を等式に沿って移送すれば求める所属が得られる。ここで示すのは C.otL ⊆ ω だけであり、逆向きの包含ではない。

otL⊆ω : (z : V ℓ) → ⟨ z ∈ˢ C.otL .fst ⟩ → ⟨ z ∈ˢ ω ⟩
otL⊆ω z h = rec₁ ((z ∈ˢ ω) .snd)
  (λ { (b , e) → subst (λ w → ⟨ w ∈ˢ ω ⟩) e (col-fin b) })
  (C.otL-out z h)

崩壊表は L_ω からその像 C.otL への符号化された単射を与え、証明した包含は C.otL から ωʟ への符号化された包含を与える。両者を合成すると limit-stage-counted : InjL Lω ωʟ が得られる。したがって形式的な結論は、内部単射 L_ω ↪ ω の命題的に保持された存在である。全射、全単射、あるいは等式 C.otL=ω は主張していない。後の段階計数はこの結果を基底単射として用いる。

limit-stage-counted : LimitStageCounted
limit-stage-counted =
  injl-trans Lω C.otL ωʟ ∣ C.colTable , I.code ∣₁
    (inclusion-coded C.otL ωʟ otL⊆ω)