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

対話型目次 · 依存グラフ

宇宙レベル ℓ を固定し、lem : LEM (ℓ-suc ℓ) を仮定する。この仮定は該当するレベルの各命題に判定を与え、以下の構成の明示的なパラメータとして保たれる。

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

凝縮の議論には、外の包だけでは足りない。包そのものと、崩壊の各値が L に属する必要がある。本章は、崩壊を符号化し、包を ω 反復として表すことで、これらの所属の事実を証明する。

本章は古典論理のもとで進む。モデル自身のレベルの後続での排中律の実例を使う。これは選択の構成が帯びるのと同じ仮定であり、ここで仮定される古典的な事実はこれだけである。

open import Cubical.Relation.Nullary using ( decRec )
open import Cubical.HITs.PropositionalTruncation using ( rec2 )
open import Cubical.Foundations.Prelude using ( J )
open import Cubical.Foundations.HLevels using ( isPropΠ2 )

モジュールはこの仮定をパラメータとする。したがって以下の主張はすべてそれに相対的であり、漠然とした排中律の原理に訴えるものではない。

本章は集合論の一階言語で語る。論理式は構成可能な構造の台の上で組み立てられ、その定数は L の要素を名指す。定数は任意の対応に沿って改名でき、充足は改名で変わる。これが、崩壊と包を記述するための語彙である。

論理式の読みは、改名によって環境の間を移動する。改名は充足にとって無害である。周囲の階層は、所属に沿う帰納、集合の外延性、そして「要素=添字とその所属の証明」という提示の仕方という、背景の事実を供給する。

議論は、L のすべての集合の住む場所からはじまる。順序数で添字づけられた段階の塔である。集合の崩壊はその要素だけから計算され、構成可能性は所属に沿って伝わる。示すべきは、この局所的な計算が L の外に出ないことである。包は推移的ではないので、議論は崩壊についての大域的な事実を使えず、段階ごとに、値が内側にとどまることを改めて導く。

構成可能集合 ωʟ は周囲の ω を表し、その仕様は要素を内部の数項と同定する。後では分出によって有界な切片と一段階の閉包を切り出す。どちらの演算も、結果が再び L の要素である。それが、構成全体を、その記述対象の宇宙の内側に保つのである。

置換が値を表へ集める。グラフが定義可能な再帰は L の要素となり、各入力で一意な値が「単に存在する」だけで十分である。定義可能性が論理式の定数を解釈し、モデル側の対と数項の符号化が、項目とその名前を供給する。

環境はパラメータのベクトルを一つの集合として符号化し、ベクトルはそこから復元される。充足の橋は内部の充足を外側で読み、符号の集合がすべての符号を L の一つの要素に集め、構成可能な合併が、構成が途中で集めた部分を結合する。

一様な充足の表は、すべての符号にその充足集合を割り当て、外側で読める。正準名の構成は、数項と、定数を持たない論理式のコードを Lset ω に置く。そのような論理式にも自由変数の枠は残りえる。段階の内部の整列順序は要素を、まず誕生の段階、つぎに名前で比較する。

狭義の整列順序の上の最小元の探索は、住民のある族から最小元を返す。関係そのものも、二つの読みをもつ対の集合になり、順序型の章が、崩壊の表を記述する三つの述語を述べる。

正しさ、入力での完備さ、値の条項は、それぞれ二つの充足の読みをもつ論理式である。内部 ω 再帰は、モデル自身の ω に沿って、定義可能な二項のステップを反復する。包の要素は、任意の入れ子の深さの符号に名指されるので、一度の分離で包を作ることはできない。ω に沿って、定義可能な一段階の閉包を反復することではじめて届く。閉包を ω 回作らねばならない理由はこれである。

証明は結びついた二つの部分からなる。まず局所的な崩壊表により、構成可能な台の各崩壊値が構成可能であることを示す。次に Skolem 包を有限閉包段階の合併として実現し、台自身の構成可能性を得て、第一の議論を適用する。

入れ子になった包の符号には有限の深さがあり、パラメータ符号の深さの最大値から計算される。この深さが、その値の現れる閉包段階を上から評価する。

open import Cubical.Data.Nat.Properties using ( max )
open import Cubical.Data.Nat.Order using ( _≤_; left-≤-max; right-≤-max )

有限パラメータベクトルにより、一つの証人符号は有限個の先行する値に依存できる。空集合、単集合、非順序対から、これらのパラメータとその順序対を階層内で表す集合符号を作れる。

open import Cubical.HITs.CumulativeHierarchy.Constructions
  using ( ∅; ⁅_,_⁆; ⁅_⁆s; module InfinitySet )

フォン・ノイマンの後者と数項により、有限閉包段階を ω の内部で整理する。非順序対は、グラフと環境に使う順序対を符号化する材料にもなる。

open InfinitySet {ℓ} using ( ω; sucV; #_ )

存在の主張は、その証人を別の命題の証明にだけ使う段階まで命題的切断のまま保つ。累積階層の等式は命題なので、崩壊の議論では集合の等式を示す際にこの切断されたデータを除去できる。

open import Cubical.HITs.CumulativeHierarchy.Base using ( V; _∈_; setIsSet )
open import Cubical.HITs.CumulativeHierarchy.Properties using ( ⟪_⟫; ⟪_⟫↪; ∈∈ₛ )

二つの所属を区別する必要がある。外側の所属は累積階層の関係である。一方、構成可能な台の要素は外側の集合とその構成可能性の証明を組にし、台上の所属はその基底集合を通して読まれる。

open hPropView 𝒮ᵥ
module CS = hPropView 𝒮ʟ using ( S; _∈ˢ_ )

定数が L の要素である論理式について、⊨ は L のクラスモデルでの充足を表す。恒等写像による定数の付け替えは、環境も充足も変えない。

module AbsL = FOL.Absoluteness.Single 𝒮ᵥ isL isL-trans using ( _⊨ᵐ_ )
open AbsL using () renaming ( _⊨ᵐ_ to _⊨_ )
module Ren = Sat 𝒮ʟ id using ( Agrees; ⊨-rename )

i0 から i6 までの七つの名前が、最初の七つの de Bruijn 添字を略記する。長い環境の枠ごとに一つである。

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)))))

これらは自由変数の位置であり、後の束縛子が環境を拡張すると読み方が移動する。

  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

台の要素はその基礎の集合で決まる。構成可能性が命題だからである。基礎の集合が等しい台の要素は等しく、補助 S≡ が、同じ基礎の集合から台の要素を組み立て直す場所で、その同定を行う。

  S≡ : {x y : CS.S} → x .fst ≡ y .fst → x ≡ y
  S≡ = Σ≡Prop (λ v → (isL v) .snd)

改名 ρs は二つの枠を入れ替える。入れ替えた順で書かれた、ある対についての論理式を、元の順で読むためのものである。ステップの論理式を一方の枠の順で証明し、別の順で使うときに使われる。

  ρs : Fin 2 → Fin 2
  ρs zero = suc zero
  ρs (suc zero) = zero

改名 ρf は w を第零スロットに保ち、Z を第一スロットから第二スロットへ送り、次段階の候補 Z' が占める中央のスロットを飛ばす。

  ρf : Fin 2 → Fin 3
  ρf zero = zero
  ρf (suc zero) = suc (suc zero)

ρs の一致は、入れ替えた環境が、動いた枠で元の環境と同じ要素を載せていると言う。どちらの場合も反射性で証明できる。各枠が、同じ要素のある位置へ送られるからである。

  ags : (Z'' w : CS.S) → Ren.Agrees ρs (Z'' ∷ w ∷ []) (w ∷ Z'' ∷ [])
  ags Z'' w zero = refl
  ags Z'' w (suc zero) = refl

任意の構成可能な台 M を固定する。

  agf : (w Z' Z : CS.S) → Ren.Agrees ρf (w ∷ Z' ∷ Z ∷ []) (w ∷ Z ∷ [])
  agf w Z' Z zero = refl
  agf w Z' Z (suc zero) = refl

構成可能な台の崩壊は L にとどまる

崩壊の議論が使うのは M の構成可能性と、その内部に残る先行者だけであり、推移性は仮定しない。

module PiIn (Mʟ : CS.S) where

選んだ構成可能な台の基底集合を M とする。付随する証明により、後に M から持ち上げる各要素が構成可能であることが保証される。

M : S
M = Mʟ .fst

π x は、x の要素のうち M にも属するものの崩壊値から作られ、πX は x ∈ M に対する値 π x を集める。この制限された先行者関係により、M の推移性を仮定せずに定義できる。

module C = Collapse M using ( Fiber; π; π-compute; πX; πX-member; π∈-fwd )

構成可能性は要素へ受け継がれるので、各 y ∈ M は構成可能である。したがって y をその証明と組にし、構成可能な台の要素として扱える。

memL : (y : S) → ⟨ y ∈ˢ M ⟩ → ⟨ isL y ⟩
memL y y∈M = isL-trans {x = M} {y = y} y∈M (Mʟ .snd)

持ち上げ up は、要素を台の要素としてまとめる。最初の補題は、崩壊値を外向きに読む。π x の要素はどれも、x の、M に属する要素の崩壊である。これは崩壊の計算の条項、すなわち「π x は x の M の中の要素の上の崩壊の像に等しい」という恒等式から従う。

up : (y : S) → ⟨ y ∈ˢ M ⟩ → CS.S
up y y∈M = y , memL y y∈M
π-mem-out : (x w : S) → ⟨ w ∈ˢ C.π x ⟩
          → ∥ Σ[ y ∶ S ] (⟨ y ∈ˢ x ⟩ × ⟨ y ∈ˢ M ⟩ × (C.π y ≡ w)) ∥₁
π-mem-out x w w∈ = map₁ mk (subst (λ u → ⟨ w ∈ˢ u ⟩) (C.π-compute x) w∈)

この変換は、崩壊自身のファイバーの証人を、要素についての主張へ変える。ファイバーは、提示された添字と、「提示された要素の崩壊が w に等しい」証明を組にする。提示された要素は、崩壊が取られる x の要素である。

  where
  mk : Σ[ p ∶ C.Fiber x ] (C.π (⟪ x ⟫↪ (p .fst)) ≡ w)
     → Σ[ y ∶ S ] (⟨ y ∈ˢ x ⟩ × ⟨ y ∈ˢ M ⟩ × (C.π y ≡ w))
  mk (p , q) = ⟪ x ⟫↪ (p .fst)
             , ( member x (p .fst)

M の所属関係は三つの自由変数スロットで表され、Relation により環境 y ∷ x ∷ e ∷ [] で読まれる。第三スロットは符号化された対を載せ、論理式は y ∈ M、x ∈ M、y ∈ x を主張する。

               , ∈∈ₛ {a = ⟪ x ⟫↪ (p .fst)} {b = M} .snd (p .snd)
               , q )
private module Membership = Relation Mʟ Mʟ
          ((var i1 ∈̇ con Mʟ) ∧̇ ((var i0 ∈̇ con Mʟ) ∧̇ (var i1 ∈̇ var i0)))

関係のホスト側の読みは、三つの所属の連言そのものである。この妥当性があるから、対象言語の論理式と外側の主張は互いに代わり合える。

          (λ y x → (y .fst ∈ˢ M) ⊓ ((x .fst ∈ˢ M) ⊓ (y .fst ∈ˢ x .fst)))
          (λ y x z h → h) (λ y x z h → h)

関係はモデルの要素になる。台の要素の対からなる集合で、二つの読み出しによって導入と消去ができる。関係が台で界されているので、対の集合は分離で切り出せるほど小さいのである。

R : CS.S
R = Membership.rel

導入の読み出しは、両端の所属と、その間の所属を示す。それがこの対での関係の内容である。

R-in : (y x : CS.S) → ⟨ y .fst ∈ˢ M ⟩ → ⟨ x .fst ∈ˢ M ⟩ → ⟨ y .fst ∈ˢ x .fst ⟩
     → Holds R y x
R-in y x my mx yx = Membership.into y x my mx (my , mx , yx)

消去の読み出しは、同じ三つの所属を返す。二方向合わせて、この関係が妥当であること、ホスト側の主張よりも強くも弱くもないことが分かる。

R-out : (y x : CS.S) → Holds R y x
      → ⟨ y .fst ∈ˢ M ⟩ × ⟨ x .fst ∈ˢ M ⟩ × ⟨ y .fst ∈ˢ x .fst ⟩
R-out = Membership.pair-out

崩壊の論理式は、値と実引数の枠の上に立ち、大域的ではなく局所的である。こう言う。関係 R に対して正しく、実引数で完備であり、そこでの値が与えられた値であるような表 F が、単に存在する、と。一つの大域的な関数のグラフを主張するのではなく、各実引数でそのような表の存在だけを述べるのである。だからこの論理式は、推移的でない台の上でも成立する。

opaque
  piFo : Formula CS.S 2
  piFo = ∃̇ ( correctAt i0 R
           ∧̇ ( completeAt i0 R i2 ∧̇ valueAt i0 R i2 i1 ) )

論理式の外向きの読み出しは、充足を三つの成分にほどく。正しい表、実引数での完備さ、値の条項である。それぞれの連言項が、順序型の章自身の射影によって束縛子の外へ運ばれる。

  piFo-out : (v p : CS.S) → ⟨ (v ∷ p ∷ []) ⊨ piFo ⟩
           → ∥ Σ[ F ∶ CS.S ] (Correct F R × (Complete F R p × ValueIs F R p v)) ∥₁
  piFo-out v p = map₁ (λ { (F , (hc , (hm , hv))) → F
    , ( correct-out i0 R (F ∷ v ∷ p ∷ []) hc
      , ( complete-out i0 R i2 (F ∷ v ∷ p ∷ []) hm

最も内側の射影がほどきを終える。値の条項は、実引数での表の項目についての通常の主張として届く。

        , value-out i0 R i2 i1 (F ∷ v ∷ p ∷ []) hv ) ) })

内向きの読みでは、存在量化の証人として表 F を選び、その正しさ、入力での完全性、値の条項の証明を与える。外向きの読みと合わせると、この論理式は意図した内容と正確に対応する。

  piFo-in : (v p F : CS.S) → Correct F R → Complete F R p → ValueIs F R p v
          → ⟨ (v ∷ p ∷ []) ⊨ piFo ⟩
  piFo-in v p F hc hm hv = ∣ F
    , ( correct-in i0 R (F ∷ v ∷ p ∷ []) hc
      , ( complete-in i0 R i2 (F ∷ v ∷ p ∷ []) hm

一意性は、所属に沿う帰納が一回で証明する。動機はこう言う。台の構成可能な要素 x のそれぞれで、その関係に対して正しく x で完備な表は、x の崩壊を値として割り当てる、と。構成可能性も所属も、表の項目が台の要素の対であるために、動機とともに運ばれる。

        , value-in i0 R i2 i1 (F ∷ v ∷ p ∷ []) hv ) ) ∣₁
private
  Pv : CS.S → S → Type (ℓ-suc ℓ)
  Pv F x = (xL : ⟨ isL x ⟩) → ⟨ x ∈ˢ M ⟩ → (v : CS.S)
         → Complete F R (x , xL) → ValueIs F R (x , xL) v → v .fst ≡ C.π x

帰納は、周囲の階層の所属に沿って走る。崩壊そのものがそうやって定義されているからである。x での動機を証明するには、x のすべての要素での動機を証明する。

value-val′ : (F : CS.S) → Correct F R → (x : S) → Pv F x
value-val′ F hc = ∈-induction {P = Pv F} go
  where
  go : (x : S) → ((y : S) → ⟨ y ∈ˢ x ⟩ → Pv F y) → Pv F x
  go x IH xL x∈M v cmp val =

ステップは要素を比較する。記録された値と崩壊は同じ要素をもち、周囲の階層の外延性がそれを等しさへ変える。入力は台の要素として提示されるので、その項目は台の上で型づけられる。

    extensionalV {a = v .fst} {b = C.π x} (λ w → ⇔toPath (fwd w) (bwd w))
    where
    xS : CS.S
    xS = x , xL

前向き:記録された値の要素 w を台に載せ、値の条項が、関係の項目と、そこの表の項目を作る。載せるとき、記録された値から受け継いだ構成可能性を w とともに包む。

    fwd : (w : S) → ⟨ w ∈ˢ v .fst ⟩ → ⟨ w ∈ˢ C.π x ⟩
    fwd w w∈ = rec₁ ((w ∈ˢ C.π x) .snd) read (val wS .fst w∈)
      where
      wS : CS.S
      wS = w , isL-trans {x = v .fst} {y = w} w∈ (v .snd)

源の証人は関係の事実 ry と表の項目 fy に分かれる。ry から y ∈ M と y ∈ x を読み、fy に帰納法の仮定を適用して w を π y と同定し、π∈-fwd によって w を π x に入れる。

      read : Σ[ y ∶ CS.S ] (Holds R y xS × Holds F y wS) → ⟨ w ∈ˢ C.π x ⟩
      read (y , (ry , fy)) =
        subst (λ t → ⟨ t ∈ˢ C.π x ⟩) e (C.π∈-fwd x (y .fst) y∈x y∈M)
        where
        y∈M : ⟨ y .fst ∈ˢ M ⟩

関係の項目はさらに、その成分が入力の下にあるとも言い、これが帰納の仮定を解き放つ。その成分での表の値は成分の崩壊に等しい、と。この等式を崩壊の読み出しと合成すれば、w の同定が終わる。

        y∈M = R-out y xS ry .fst
        y∈x : ⟨ y .fst ∈ˢ x ⟩
        y∈x = R-out y xS ry .snd .snd
        e : C.π (y .fst) ≡ w
        e = sym (IH (y .fst) y∈x (y .snd) y∈M wS (hc y wS fy .fst) (hc y wS fy .snd))

後ろ向き:崩壊の要素 w は、すでに証明した外向きの読みによって、台の中の入力の成分へと分解され、その成分の崩壊が w になる。元の実引数 x における表の完備さを前者 y に適用すると、項目 (y,u) が得られる。

    bwd : (w : S) → ⟨ w ∈ˢ C.π x ⟩ → ⟨ w ∈ˢ v .fst ⟩
    bwd w w∈ = rec₁ ((w ∈ˢ v .fst) .snd) read (π-mem-out x w w∈)
      where
      read : Σ[ y ∶ S ] (⟨ y ∈ˢ x ⟩ × ⟨ y ∈ˢ M ⟩ × (C.π y ≡ w)) → ⟨ w ∈ˢ v .fst ⟩
      read (y , (y∈x , y∈M , e)) = rec₁ ((w ∈ˢ v .fst) .snd) inner (cmp yS ry)

その成分は台の要素として載せられ、対での関係の項目が、二つの所属とその間の所属から改めて導入される。

        where
        yS : CS.S
        yS = up y y∈M
        ry : Holds R yS xS
        ry = R-in yS xS y∈M x∈M y∈x

帰納法の仮定が u を π y と同定し、π y = w に沿って輸送すると、w が記録された値に属することが従う。後ろ向きの方向が主張するのはこれである。

        inner : Σ[ u ∶ CS.S ] Holds F yS u → ⟨ w ∈ˢ v .fst ⟩
        inner (u , fu) =
          subst (λ t → ⟨ t ∈ˢ v .fst ⟩) (eu ∙ e) (val u .snd ∣ yS , (ry , fu) ∣₁)
          where
          eu : u .fst ≡ C.π y

等式 eu は、成分 y での帰納の仮定である。表の y での値は y の崩壊に等しい、というものである。分解が携える等式と合成すれば、項目の値は w と同一視され、後ろ向きの方向が置こうとしていたのはまさにこれである。

          eu = IH y y∈x (yS .snd) y∈M u (hc yS u fu .fst) (hc yS u fu .snd)

台の要素の基礎集合に帰納を適用すると、制限された構造で同じ一意性の主張が得られる。得られる決定補題は、崩壊の論理式が M の要素で成立するなら、その値はその要素の崩壊に等しいことを述べる。

value-val : (F : CS.S) → Correct F R → (x : CS.S) → ⟨ x .fst ∈ˢ M ⟩ → (v : CS.S)
          → Complete F R x → ValueIs F R x v → v .fst ≡ C.π (x .fst)
value-val F hc x = value-val′ F hc (x .fst) (x .snd)
piFo-val : (q : CS.S) → ⟨ q .fst ∈ˢ M ⟩ → (v : CS.S) → ⟨ (v ∷ q ∷ []) ⊨ piFo ⟩
         → v .fst ≡ C.π (q .fst)

証明は、切り詰められた存在を二つの h-集合の等しさという命題へ消去し、外向きの読み出しが手渡す正しい表に、今証明した一意性を適用する。次の構成では、L の与えられた要素の内側にある要素を台から切り出す。

piFo-val q mq v h = rec₁ (setIsSet (v .fst) (C.π (q .fst)))
  (λ { (F , (hc , (hm , hv))) → value-val F hc q mq v hm hv })
  (piFo-out v q h)
module Cut (K : CS.S) where

切り出しの論理式はただ一つの原子論理式である。自由な枠が定数 K の要素であることを表す。スライスが収めるのは、これを満たす要素だけである。

cutFo : Formula CS.S 1
cutFo = var i0 ∈̇ con K

分離を Mʟ に適用することで、スライスも L の要素として得られ、単なる要素の類では終わらない。このため、スライスを内部再帰の定義域として使える。

opaque
  cut : CS.S
  cut = hasSeparationL Mʟ cutFo .fst .fst

所属の仕様は、スライスへの所属を、台への所属と切り出しの論理式の充足とを合わせたものとして同定する。後者はほどけば、K の基礎の集合の中にあることにほかならない。

  cut-mem : (y : CS.S) → (y CS.∈ˢ cut) ≡ ((y CS.∈ˢ Mʟ) ⊓ ((y ∷ []) ⊨ cutFo))
  cut-mem = hasSeparationL Mʟ cutFo .fst .snd

内向きの方向は、M への所属と K の基礎集合への所属を組み合わせ、載せた要素をスライスに入れる。

  cut-in : (y : CS.S) → ⟨ y .fst ∈ˢ M ⟩ → ⟨ y .fst ∈ˢ K .fst ⟩ → ⟨ y CS.∈ˢ cut ⟩
  cut-in y my yK = subst ⟨_⟩ (sym (cut-mem y)) (my , yK)

外向きの方向は、同じ仕様を二つの成分へ読み戻す。台の要素 q が段階 δ で「良い」とは、その段階に属するとき、崩壊の構成可能な表示と q における崩壊の論理式の両方が得られることである。

  cut-out : (y : CS.S) → ⟨ y CS.∈ˢ cut ⟩ → ⟨ y .fst ∈ˢ M ⟩ × ⟨ y .fst ∈ˢ K .fst ⟩
  cut-out y h = subst ⟨_⟩ (cut-mem y) h
Good : S → S → Type (ℓ-suc ℓ)
Good δ q = ⟨ q ∈ˢ M ⟩ → ⟨ q ∈ˢ Lset δ ⟩
         → Σ[ qL ∶ ⟨ isL (C.π q) ⟩ ] ((mq : ⟨ q ∈ˢ M ⟩)

「良いこと」の第二成分は、構成可能性の証明によって崩壊を 𝒮ʟ の要素として包み、その値と選んだ M の要素の表示について崩壊の論理式が成立することを述べる。

              → ⟨ ((C.π q , qL) ∷ up q mq ∷ []) ⊨ piFo ⟩)

「良いこと」は命題である。台への所属も、段階への所属も、構成可能性も充足も、それぞれ命題だからである。ここが大切である。段階の分解が返すのは、単に存在するだけの証人であるが、命題である「良いこと」なら、証人を選ぶことなく消費できるのである。

isPropGood : (δ q : S) → isProp (Good δ q)
isPropGood δ q = isPropΠ2 λ _ _ → isPropΣ ((isL (C.π q)) .snd)
  λ qL → isPropΠ λ mq → (((C.π q , qL) ∷ up q mq ∷ []) ⊨ piFo) .snd

順序数段階 δ' を固定し、M と Lset δ' の両方に属する各 q が「良い」と仮定する。これら先行する崩壊値を組み合わせて、次の入力での値を作る。

module Step (δ' : S) (oδ' : IsOrd δ')
            (IH : (q : S) → Good δ' q) where

スライスは、段階 Lset δ' で切り出される。その段階がすでに収めている台の要素である。段階は L の集合なので、スライスは分離によって L の要素になり、これこそ帰納の仮定が語る定義域である。

module Sl = Cut (LsetS δ' oδ') using ( cut; cut-in; cut-out )

段階は推移的である。したがって、段階の要素の要素も段階の内側にあり、この事実が後で表の条件をより小さい入力へ制限する。帰納の仮定により、スライスの要素の崩壊は 𝒮ʟ の要素として得られ、その構成可能性の証明が「良いこと」の第一成分である。

Lδ'-trans : {x y : S} → ⟨ y ∈ˢ x ⟩ → ⟨ x ∈ˢ Lset δ' ⟩ → ⟨ y ∈ˢ Lset δ' ⟩
Lδ'-trans {x} {y} = layer-trans (Lset-layer δ') {x = x} {y = y}
πʟ : (y : CS.S) → ⟨ y CS.∈ˢ Sl.cut ⟩ → CS.S
πʟ y hy = C.π (y .fst) , IH (y .fst) (Sl.cut-out y hy .fst) (Sl.cut-out y hy .snd) .fst

崩壊の論理式が、その崩壊と要素の対の上で成立するのも、同じ帰納の仮定による。「良いこと」の第二成分はちょうど、この対での論理式の充足であり、要素とその基礎の集合の同定に沿って運ばれる。

πʟ-graph : (y : CS.S) (hy : ⟨ y CS.∈ˢ Sl.cut ⟩)
         → ⟨ (πʟ y hy ∷ y ∷ []) ⊨ piFo ⟩
πʟ-graph y hy =
  subst (λ y' → ⟨ (πʟ y hy ∷ y' ∷ []) ⊨ piFo ⟩) (S≡ refl)
    (IH (y .fst) my (Sl.cut-out y hy .snd) .snd my)

この同定には、スライスの仕様から読み出した要素の台への所属を使う。基礎集合は変わっておらず、構成可能性の証明は命題なので、この同一視に沿った輸送は一意に定まる。

  where
  my : ⟨ y .fst ∈ˢ M ⟩
  my = Sl.cut-out y hy .fst

スライス上の崩壊値は、スライスを定義域、piFo をグラフの論理式とする内部再帰をなす。構成可能性によって各値は 𝒮ʟ の要素となるので、グラフの項目は 𝒮ʟ の要素の対である。

private
  Rπ : Recursion
  Rπ = record
    { dom = Sl.cut ; graph = piFo
    ; funct = λ y hy → (πʟ y hy , πʟ-graph y hy)

関数性が成立するのは、崩壊の論理式が台のすべての要素でその値を決めるからである。同じ対で論理式を満たすほかの値はどれもそれと等しく、決定の補題がそれを読み出す。対応する 𝒮ʟ の要素の等しさは、構成可能性の証明が命題値であることから従う。

        , λ { (v , h) → Σ≡Prop (λ w → ((w ∷ y ∷ []) ⊨ piFo) .snd)
            (sym (S≡ (piFo-val y (Sl.cut-out y hy .fst) v h))) } }

L のグラフの再帰が表を集める。台の要素の対からなる集合で、その項目はスライス上の崩壊の記録にほかならない。

  module T = RecursionGraph Rπ using ( F; F-in; pair-out )

集められた集合が、この段階での表である。L の要素であり、スライスの各要素と、その構成可能な崩壊とを対にする。

Tab : CS.S
Tab = T.F

表の内向きの読み出しは、その項目を示す。スライスの各要素で、要素とその崩壊の対が記録される。

Tab-in : (y : CS.S) (hy : ⟨ y CS.∈ˢ Sl.cut ⟩) → Holds Tab y (πʟ y hy)
Tab-in = T.F-in

外向きの読み出しは、項目をスライスの要素と、その基礎集合の崩壊に等しい値へ分解する。内向きの読み出しと合わせて、表が記録するのは崩壊そのものであり、歪みがないことが分かる。

Tab-pair : (x v : CS.S) → Holds Tab x v
         → ⟨ x CS.∈ˢ Sl.cut ⟩ × (v .fst ≡ C.π (x .fst))
Tab-pair = T.pair-out

引数 x が閉じているとは、x の要素であり、かつ M に属するものがすべて段階スライスに入ることである。この条件は引数ごとに課される。ここでは M の推移性を仮定していない。

Closed : CS.S → Type (ℓ-suc ℓ)
Closed x = (y : S) (y∈x : ⟨ y ∈ˢ x .fst ⟩) (y∈M : ⟨ y ∈ˢ M ⟩)
         → ⟨ up y y∈M CS.∈ˢ Sl.cut ⟩

スライスの要素は段階の推移性によって閉じている。その要素であり、かつ M に属するものは段階内にとどまるので、スライスに属する。

slice-closed : (x : CS.S) → ⟨ x CS.∈ˢ Sl.cut ⟩ → Closed x
slice-closed x hx y y∈x y∈M =
  Sl.cut-in (up y y∈M) y∈M (Lδ'-trans {x = x .fst} {y = y} y∈x (Sl.cut-out x hx .snd))

閉じた入力に対する表の完備さとは、関係する各要素での表自身の項目の切り詰められた存在である。閉じていることがその要素をスライスの中へ置き、表がそこに崩壊を記録する。関係の項目は分解されて、その要素を名指す。

complete-of : (x : CS.S) → Closed x → Complete Tab R x
complete-of x cl y ry = ∣ πʟ y' hy' , subst (λ w → ⟨ pr w (C.π (y .fst)) ∈ˢ Tab .fst ⟩) refl (Tab-in y' hy') ∣₁
  where
  ro = R-out y x ry
  y' : CS.S

その要素は台の要素として載せられ、閉じていることが、載せられた要素をスライスの中へ置く。これは、表が崩壊を記録したときの仮定そのものである。

  y' = up (y .fst) (ro .fst)
  hy' : ⟨ y' CS.∈ˢ Sl.cut ⟩
  hy' = cl (y .fst) (ro .snd .snd) (ro .fst)

閉じた入力に対して、値の条項は崩壊そのものについて成立する。証明には二方向ある。崩壊値の要素はどれも関係する要素から来ており、入力と関係する要素はどれも、表によって崩壊値の中へ運ばれる。

valueIs-of : (x : CS.S) → ⟨ x .fst ∈ˢ M ⟩ → Closed x → (v : CS.S) → v .fst ≡ C.π (x .fst)
           → ValueIs Tab R x v
valueIs-of x mx cl v ev w = fwd , bwd
  where
  fwd : ⟨ w .fst ∈ˢ v .fst ⟩ → Src Tab R x w

前向きでは、候補の値 v の要素 w を、崩壊の読み出しによって台の中の入力の成分へ分解する。その成分の崩壊は w に等しくなる。分解は切り詰められた存在であり、消去の対象は命題である。

  fwd w∈ = map₁ read (π-mem-out (x .fst) (w .fst) (subst (λ t → ⟨ w .fst ∈ˢ t ⟩) ev w∈))
    where
    read : Σ[ y ∶ S ] (⟨ y ∈ˢ x .fst ⟩ × ⟨ y ∈ˢ M ⟩ × (C.π y ≡ w .fst))
         → Σ[ y ∶ CS.S ] (Holds R y x × Holds Tab y w)
    read (y , (y∈x , y∈M , e)) = up y y∈M

その成分を台の要素へ持ち上げる。入力への所属から関係の項目が得られ、表の項目はその崩壊と w の等式に沿って輸送される。この二つを合わせると、必要な Src Tab R x w の証人になる。

      , ( R-in (up y y∈M) x y∈M mx y∈x
        , subst (λ t → ⟨ pr y t ∈ˢ Tab .fst ⟩) e (Tab-in (up y y∈M) (cl y y∈x y∈M)) )

後ろ向き:w のソースの項目は、表の値が w であるような関係する要素を名指す。対の読み出しが項目を所属と等式に分け、崩壊の読み出しが w を第一成分の崩壊の中に置き、二つの等式がそれを記録された値へ運び戻す。

  bwd : Src Tab R x w → ⟨ w .fst ∈ˢ v .fst ⟩
  bwd = rec₁ ((w .fst ∈ˢ v .fst) .snd) (λ { (y , (ry , ty)) →
    subst2 (λ s t → ⟨ s ∈ˢ t ⟩) (sym (Tab-pair y w ty .snd)) (sym ev)
      (C.π∈-fwd (x .fst) (y .fst) (R-out y x ry .snd .snd) (R-out y x ry .fst)) })

それぞれの項目での表の正しさは、その項目が名指すスライスの要素での二つの条項から組み立てられる。対の読み出しが、スライスへの所属と台への所属を与える。

Tab-correct : Correct Tab R
Tab-correct x v hxv = complete-of x cl , valueIs-of x mx cl v (Tab-pair x v hxv .snd)
  where
  hx : ⟨ x CS.∈ˢ Sl.cut ⟩
  hx = Tab-pair x v hxv .fst

台への所属と閉じていることが仮定を完成させ、ステップのモジュールは、その要素がすべてより前の段階の下にあるような台の入力 q でパラメータづけられる。これは Lset δ' の定義可能冪集合の要素に必要な状況であり、ここでは閉じていることが q⊆ から従う。

  mx : ⟨ x .fst ∈ˢ M ⟩
  mx = Sl.cut-out x hx .fst
  cl : Closed x
  cl = slice-closed x hx
module At (q : S) (mq : ⟨ q ∈ˢ M ⟩) (q⊆ : (y : S) → ⟨ y ∈ˢ q ⟩ → ⟨ y ∈ˢ Lset δ' ⟩) where

入力は台の要素として載せられ、環境の枠としても、対の第二成分としても働けるようになる。

  qS : CS.S
  qS = up q mq

載せた入力の閉じていることは仮定から成立する。台の中のその要素はすべてより前の段階の下にあり、スライスが受け入れる。そして台の中の入力の要素が、それ自身のスライスとして切り出される。崩壊の値はこの定義域の上で計算される。

  cl : Closed qS
  cl y y∈q y∈M = Sl.cut-in (up y y∈M) y∈M (q⊆ y y∈q)
  module Mq = Cut qS using ( cut; cut-in; cut-out )

q の崩壊値は、内部の再帰として作られる。定義域は台の中の q の要素のスライス、グラフは崩壊の論理式である。したがって、この関数的グラフは L における置換の仮定を満たす。

  private
    valR : Recursion
    valR = record
      { dom   = Mq.cut
      ; graph = piFo

関数性は mereFunct を通して組み立てられる。各入力で、一意な値が「単に存在する」ことからである。証人 wit は、そのような値と、その充足と一意性とを、切り詰めの内側で産出する。台の要素での崩壊の論理式の一意性が命題だからである。

      ; funct = λ y hy → mereFunct piFo y (wit y hy) }
      where
      wit : (y : CS.S) (hy : ⟨ y CS.∈ˢ Mq.cut ⟩)
          → ∥ Σ[ v ∶ CS.S ] (⟨ (v ∷ y ∷ []) ⊨ piFo ⟩
                            × ((v' : CS.S) → ⟨ (v' ∷ y ∷ []) ⊨ piFo ⟩ → v' ≡ v)) ∥₁

証人は大域的な崩壊値 C.π (y .fst) であり、帰納の仮定によって構成可能なものとして表示される。段階スライス上の表が piFo の証明を与え、piFo-val が一意性を与える。

      wit y hy = ∣ πʟ y hy'
        , ( πʟ-graph y hy'
          , λ v' hv' → S≡ (piFo-val y my v' hv') ) ∣₁
        where
        my : ⟨ y .fst ∈ˢ M ⟩

y の台への所属は q のスライスから来る。仮定により q の各要素は Lset δ' に入るので、そのうち台に属する要素はすべて段階スライスに入る。

        my = Mq.cut-out y hy .fst
        hy' : ⟨ y CS.∈ˢ Sl.cut ⟩
        hy' = Sl.cut-in y my (q⊆ (y .fst) (Mq.cut-out y hy .snd))

置換はこの再帰の値を L の要素として集める。その要素はちょうど、q の要素であり、かつ M に属するものの構成可能な崩壊値である。

    module Vq = Of valR using ( table; table-in; table-out )

表の基礎の集合は、q の崩壊と一致する。要素ごとの同値を通して外延性で証明される。前向き:表の要素は、台の中の q のある要素 y での値であり、消去の対象は「w が q の崩壊に属する」という命題である。

  val≡π : Vq.table .fst ≡ C.π q
  val≡π = extensionalV {a = Vq.table .fst} {b = C.π q} (λ w → ⇔toPath (fwd w) (bwd w))
    where
    fwd : (w : S) → ⟨ w ∈ˢ Vq.table .fst ⟩ → ⟨ w ∈ˢ C.π q ⟩
    fwd w hw = rec₁ ((w ∈ˢ C.π q) .snd)

外向きの読み出しが要素 y とその値を名指し、決定の補題がその値を y の崩壊と同一視し、崩壊の読み出しが y の崩壊を q の崩壊の中へ置く。輸送がこの二つを合成する。

      (λ { (y , (hy , h)) →
         subst (λ t → ⟨ t ∈ˢ C.π q ⟩)
           (sym (piFo-val y (Mq.cut-out y hy .fst) wS h))
           (C.π∈-fwd q (y .fst) (Mq.cut-out y hy .snd) (Mq.cut-out y hy .fst)) })
      (Vq.table-out wS hw)

w は構成可能な値集合 Vq.table に属するので、L の推移性から w の構成可能性が得られ、𝒮ʟ の要素として表示できる。

      where
      wS : CS.S
      wS = w , isL-trans {x = Vq.table .fst} {y = w} hw (Vq.table .snd)

後ろ向き:q の崩壊の要素は、台の中の q の成分へと分解され、その成分の崩壊がそれと等しくなる。これは、表が項目を記録する形そのものである。

    bwd : (w : S) → ⟨ w ∈ˢ C.π q ⟩ → ⟨ w ∈ˢ Vq.table .fst ⟩
    bwd w hw = rec₁ ((w ∈ˢ Vq.table .fst) .snd) read (π-mem-out q w hw)
      where
      read : Σ[ y ∶ S ] (⟨ y ∈ˢ q ⟩ × ⟨ y ∈ˢ M ⟩ × (C.π y ≡ w)) → ⟨ w ∈ˢ Vq.table .fst ⟩
      read (y , (y∈q , y∈M , e)) =

等式が w を成分の崩壊へ運び、表の内向きの読み出しが、載せた成分での項目を作る。そこに記録されるのはまさにその崩壊である。

        subst (λ t → ⟨ t ∈ˢ Vq.table .fst ⟩) e
          (Vq.table-in yS (πʟ yS hy') hy (πʟ-graph yS hy'))
        where
        yS : CS.S
        yS = up y y∈M

載せた成分は、台への所属によって q のスライスの中にあり、また「q の要素はより前の段階の下にある」という仮定によって、段階のスライスの中にもある。

        hy : ⟨ yS CS.∈ˢ Mq.cut ⟩
        hy = Mq.cut-in yS y∈M y∈q
        hy' : ⟨ yS CS.∈ˢ Sl.cut ⟩
        hy' = Sl.cut-in yS y∈M (q⊆ y y∈q)

q の崩壊は構成可能である。それは表の基礎の集合に等しく、表は L の要素なので、構成可能性がこの等式に沿って運ばれる。これが q での「良いこと」の最初の条項である。

  πq-isL : ⟨ isL (C.π q) ⟩
  πq-isL = subst (λ t → ⟨ isL t ⟩) val≡π (Vq.table .snd)

「良いこと」の第二の条項は、崩壊と要素の対の上で崩壊の論理式が成立することである。表の正しさ、閉じた入力での完備さ、そして値を崩壊と同定する値の条項である。二つの条項がそろえば、段階の帰納を述べられる。すべての順序数での「良いこと」である。

帰納は、階層の所属に沿って走り、各ステップで、段階への所属の分解を消費する。

  good : (mq' : ⟨ q ∈ˢ M ⟩) → ⟨ ((C.π q , πq-isL) ∷ up q mq' ∷ []) ⊨ piFo ⟩
  good mq' = subst (λ q' → ⟨ ((C.π q , πq-isL) ∷ q' ∷ []) ⊨ piFo ⟩) (S≡ refl)
    (piFo-in (C.π q , πq-isL) qS Tab Tab-correct (complete-of qS cl)
      (valueIs-of qS mq cl (C.π q , πq-isL) refl))
good-at : (δ : S) → IsOrd δ → (q : S) → Good δ q

δ での「良いこと」を証明するには、段階 Lset δ への q の所属を分解する。q は、より前の段階 δ' の定義可能冪集合の中にある、と。分解は「良いこと」へ消去される。「良いこと」が命題だからである。

good-at = ∈-induction {P = λ δ → IsOrd δ → (q : S) → Good δ q} go
  where
  go : (δ : S) → ((δ' : S) → ⟨ δ' ∈ˢ δ ⟩ → IsOrd δ' → (q : S) → Good δ' q)
     → IsOrd δ → (q : S) → Good δ q
  go δ IH oδ q mq q∈Lδ = rec₁ (isPropGood δ q) read (Lset-out δ q q∈Lδ) mq q∈Lδ

分解は、δ の下のより前の段階 δ' と、その定義可能冪集合への q の所属を名指す。δ' より下での「良いこと」を使うと、ステップの構成から q での「良いこと」が得られる。定義可能冪集合の条項はさらに、q のすべての要素が段階 Lset δ' の中にあると言う。これが、ステップが消費する閉じていることの仮定である。

    where
    read : Σ[ δ' ∶ S ] (⟨ δ' ∈ˢ δ ⟩ × ⟨ q ∈ˢ 𝒟ₒ (Lset δ') ⟩) → Good δ q
    read (δ' , (δ'∈δ , q∈𝒟)) _ _ = A.πq-isL , A.good
      where
      oδ' : IsOrd δ'

δ' ∈ δ から δ' の順序数性が得られる。δ' より下で帰納の仮定を使い、q のすべての要素が Lset δ' に属するという定義可能冪集合の事実を合わせると、q での「良いこと」が得られ、good-at の所属帰納が閉じる。また M 自身が L に属するので、その構成可能性の証明から M を含む段階が得られ、その段階の推移性によって M の各要素も段階内に入る。

      oδ' = mem-ord {A = δ} oδ δ' δ'∈δ
      module A = Step.At δ' oδ' (IH δ' δ'∈δ oδ') q mq (λ y y∈q → 𝒟ₒ∋⊆ (Lset δ') q q∈𝒟 y y∈q)
        using ( πq-isL; good )
π-isL : (y : S) → ⟨ y ∈ˢ M ⟩ → ⟨ isL (C.π y) ⟩
π-isL y y∈M = rec₁ ((isL (C.π y)) .snd)

証明 Mʟ から構成可能な台 M を含む段階を取り、その段階での「良いこと」から M の各要素の崩壊が構成可能であることを得る。続く主張は、崩壊像全体 C.πX の要素について同じ議論を始め、やはり切り詰められた表示を構成可能性へ消去する。

  (λ { (α , (oα , M∈Lα)) →
     good-at α oα y y∈M (layer-trans (Lset-layer α) {x = M} {y = y} y∈M M∈Lα) .fst })
  (Mʟ .snd)
πX-isL : (x : S) → ⟨ x ∈ˢ C.πX ⟩ → ⟨ isL x ⟩
πX-isL x x∈πX = rec₁ ((isL x) .snd)

πX-isL の主張は要素についてのものである。

  (λ { (y , (y∈M , e)) → subst (λ w → ⟨ isL w ⟩) e (π-isL y y∈M) })
  (C.πX-member x x∈πX)

Skolem 包を ω 反復として表す

崩壊像の各要素は台のどこかの要素の崩壊であり、だから構成可能である。これは、崩壊像が L に含まれると言っているだけである。像そのものが L の要素であるとは主張していない。前半が終わり、後半は新しいパラメータで始まる。要素の後者で閉じた段階 lam と、その要素がすべて段階の中にある始点 X である。

module Telescope (lam : S) (ordλ : IsOrd lam)
  (succλ : (d : S) → ⟨ d ∈ˢ lam ⟩ → ⟨ sucV d ∈ˢ lam ⟩)
  (X : S) (X⊆L : (x : S) → ⟨ x ∈ˢ X ⟩ → ⟨ x ∈ˢ Lset lam ⟩)
  (∅∈λ : ⟨ ∅ ∈ˢ lam ⟩) where

空集合も段階の中にあり、包の機構がこれらのデータの上で開かれる。包の台 M、包が段階に含まれること、そして始点のすべての要素が包の要素であることである。

module HS = HullStage lam ordλ succλ X X⊆L ∅∈λ using ( M )
module HSH = HullStage.H lam ordλ succλ X X⊆L ∅∈λ
  using ( ∅∈Lsetα; hull-member; X⊆M; Hull⊆L )
open HullStage.H.T lam ordλ succλ X X⊆L ∅∈λ public

包の符号は、X の要素に対する基底名か、無定数公式とそのパラメータの符号を保存する wit k ψ cs である。部分符号を評価した後、証人が存在するかどうかに応じて、最小の証人または廃棄値をその値とする。

  using ( Code; base; wit; val; vals; search; searchPredicate; Sat; Hull; val-wit
        ; satDecision )
open HullStage.H.T lam ordλ succλ X X⊆L ∅∈λ using ( inHull; _⊨₀_ )

小さな台 SL は、すべてが型づけられる、段階の要素を集める。集合 Z から取ったパラメータのベクトルとは、各成分が Z の基礎の集合に属することである。ステップの探索はそのようなベクトルだけにわたる。

SL : Type (ℓ-suc ℓ)
SL = HullStage.ASt.SL lam ordλ succλ X X⊆L ∅∈λ
From : {k : ℕ} → CS.S → Vec SL k → Type (ℓ-suc ℓ)
From {k} Z vs = (i : Fin k) → ⟨ (lookup i vs) .fst ∈ˢ Z .fst ⟩
Searched : CS.S → S → Type (ℓ-suc ℓ)

探索にはアリティ k+1 の無定数公式を使う。Z から取ったベクトルが k 個のパラメータ変数に値を与え、残る変数には候補となる証人を割り当てる。Sat はそのような証人の存在を表す。

Searched Z z = Σ[ k ∶ ℕ ] Σ[ ψ ∶ Formula (⊥* {ℓ}) (suc k) ] Σ[ vs ∶ Vec SL k ]
               Σ[ w ∶ Sat k ψ vs ] (From Z vs × (z ≡ (search k ψ vs w) .fst))
Reads : CS.S → S → Type (ℓ-suc ℓ)
Reads Z z = ⟨ z ∈ˢ Z .fst ⟩ ⊎ ((z ≡ ∅) ⊎ Searched Z z)

この構造は、演算 Φ、二変数公式 ΦFo、そして任意の Z について二つの変数に Φ Z と Z を割り当てた環境がその公式を満たすという証明を含む。

record StepPack : Type (ℓ-suc (ℓ-suc ℓ)) where
  field
    Φ       : CS.S → CS.S
    ΦFo     : Formula CS.S 2
    defines : (Z : CS.S) → ⟨ (Φ Z ∷ Z ∷ []) ⊨ ΦFo ⟩

残りのフィールドがステップを確定させる。論理式を満たす集合はどれもステップの集合であり、要素は増え、廃棄値はつねにあり、現在の集合から取ったパラメータでのすべての探索に、最小の証人が加わる。

    only    : (Z Z' : CS.S) → ⟨ (Z' ∷ Z ∷ []) ⊨ ΦFo ⟩ → Z' ≡ Φ Z
    grows   : (Z : CS.S) (z : S) → ⟨ z ∈ˢ Z .fst ⟩ → ⟨ z ∈ˢ (Φ Z) .fst ⟩
    junk    : (Z : CS.S) → ⟨ ∅ ∈ˢ (Φ Z) .fst ⟩
    least   : (Z : CS.S) (k : ℕ) (ψ : Formula (⊥* {ℓ}) (suc k)) (vs : Vec SL k)
            → From Z vs → (w : Sat k ψ vs) → ⟨ (search k ψ vs w) .fst ∈ˢ (Φ Z) .fst ⟩

外向きのフィールドは、現在の集合が段階の下にあるとき、ステップの要素をホスト側で読む。ステップの要素は、古い要素、廃棄値、探索の値のいずれかである。使い尽くしの証明が使うのはこの読み出しである。

    out     : (Z : CS.S) → ((z : S) → ⟨ z ∈ˢ Z .fst ⟩ → ⟨ z ∈ˢ Lset lam ⟩)
            → (z : S) → ⟨ z ∈ˢ (Φ Z) .fst ⟩ → ∥ Reads Z z ∥₁

反復のモジュールは、始点の構成可能性と、まとめられたステップを受け取る。どちらも必要である。内部の再帰は L の要素からはじまり、ステップが論理式とその条項を供給するからである。

module HullIter (X-isL : ⟨ isL X ⟩) (P : StepPack) where
open StepPack P

始点は台の要素として提示される。集合とその構成可能性の組であり、内部の再帰が消費するのはこの形である。

Xʟ : CS.S
Xʟ = X , X-isL

内部の ω 再帰が反復を作り、その閉包の機構が成長のフィールドを持ち運ぶ。それぞれの反復は前のものを含む。反復はモデルの集合であり、反復の合併が L の要素になるのはこのためである。

module It = Iterate Xʟ ΦFo Φ defines only
  using ( it; module Closure; iterUnion; iterUnion-in; iterUnion-out; iter; iter-in; iter-out; ω-num; Num )
module Cl = It.Closure (λ Z z → grows Z (z .fst)) using ( it-up )

反復の各段階は hullStep n と名づけられる。始点に対するステップの n 回目の適用である。

hullStep : ℕ → CS.S
hullStep = It.it

反復はその定義の等式に支配される。ステップを n+1 回適用して得られるものは、n 番目の反復に一段階の閉包 Φ を適用したものちょうどである。この等式は refl で成立する。内部の ω 再帰は、後者の段階を計算するときにステップの演算を直接呼ぶので、輸送は何も要らない。これが、この構成のもっとも裸の算術である。この構成のそれぞれの層は、前の層の、ただ一つの定義可能なステップの下での閉包である。

hullStep-suc : (n : ℕ) → hullStep (suc n) ≡ Φ (hullStep n)
hullStep-suc n = refl

反復はその添字とともに増える。n が n' を超えなければ、n 番目の反復が集めたものはすべて、n' 番目の反復も集める。ステップの成長のフィールドを差のぶんだけ繰り返し適用し、そのたびに古い要素は保たれる。数の等式が計数を運び、要素の構成可能性もそれとともに運ばれる。その要素は構成可能な反復に属するからである。この単調性により、早い段階で集められたものは、その後も収められたままになる。

hullStep-≤ : (n n' : ℕ) → n ≤ n' → (z : S)
           → ⟨ z ∈ˢ (hullStep n) .fst ⟩ → ⟨ z ∈ˢ (hullStep n') .fst ⟩
hullStep-≤ n n' (k , e) z h =
  subst (λ m → ⟨ z ∈ˢ (hullStep m) .fst ⟩) e (Cl.it-up n k (z , zL) h)
  where

反復の単調性は成長のフィールドから従う。前の反復の要素は、それ以降のすべての反復の要素であり、構成可能性も運ばれる。包の符号の深さは再帰で割り当てられる。base の符号の深さは零である。

証人の符号は、その符号のベクトルより一つ深い。その値は、パラメータの値の一歩あとの段階で計算されるからである。

  zL : ⟨ isL z ⟩
  zL = isL-trans {x = (hullStep n) .fst} {y = z} h ((hullStep n) .snd)
mutual
  depth : Code → ℕ
  depth (base m) = 0

証人の構成子は、その子の符号のベクトルの深さに一を加える。

  depth (wit k ψ cs) = suc (depths cs)

符号のベクトルの深さは、項目の深さの最大値である。ベクトルは、すべての項目が手に入れば使える。

  depths : {m : ℕ} → Vec Code m → ℕ
  depths [] = 0
  depths (c ∷ cs) = max (depth c) (depths cs)

補助は、決定可能な選言の一方が不可能なときの、場合分けの振る舞いを記録する。充足が空なら、計算された値は廃棄の分岐であり、もう一方の分岐が何と言おうと変わらない。

private
  stuck-r : {A : Type (ℓ-suc ℓ)} (na : A → ⊥₀)
            (f : A → SL) (g : (A → ⊥₀) → SL) (s : Dec A)
          → decRec f g s ≡ g na
  stuck-r na f g (yes a) = ⊥₀-rec (na a)

反駁の分岐は、不可能な関数の関数外延性で証明される。区別するような要素は存在しないからである。

  stuck-r na f g (no h) = cong g (funExt (λ a → ⊥₀-rec (na a)))

包から合併へ、前半:すべての包の符号の値は、その深さで添字づけられた反復に用意される。base の符号は始点の要素を名指し、それは零番目の反復にある。

mutual
  hullStep-in : (c : Code) → ⟨ (val c) .fst ∈ˢ (hullStep (depth c)) .fst ⟩
  hullStep-in (base m) = member X m
  hullStep-in (wit k ψ cs) = go (satDecision k ψ (vals cs))
    where

証人符号について、その探索が充足可能かどうかで場合分けする。その深さはパラメータ符号ベクトルの深さより一つ大きく、後続段階の等式により、その深さの反復は Φ をもう一度適用した反復と同一視される。

    n : ℕ
    n = depths cs
    go : (s : Dec (Sat k ψ (vals cs)))
       → ⟨ (decRec (search k ψ (vals cs)) (λ _ → (∅ , HSH.∅∈Lsetα)) s) .fst
            ∈ˢ (hullStep (suc n)) .fst ⟩

探索が充足されていれば、ステップの最小の証人の条項が、次の反復で探索された値を加える。そのパラメータはベクトルの深さによって手に入る。探索が充足されなければ、加える証人はなく、ステップは代わりに廃棄値を保つ。

    go (yes w) = least (hullStep n) k ψ (vals cs) (vals-in cs) w
    go (no h) = junk (hullStep n)

符号のベクトルのパラメータは、項目の深さの最大値で手に入る。各項目の値はそれぞれの深さで現れ、単調性がそれを、ベクトルを消費するより後の反復へ運ぶ。

  vals-in : {m : ℕ} (cs : Vec Code m) → From (hullStep (depths cs)) (vals cs)
  vals-in (c ∷ cs) zero =
    hullStep-≤ (depth c) (max (depth c) (depths cs)) left-≤-max ((val c) .fst) (hullStep-in c)
  vals-in (c ∷ cs) (suc i) =
    hullStep-≤ (depths cs) (max (depth c) (depths cs)) right-≤-max

この選択はパラメータベクトルについて再帰する。空ベクトルでは空の符号ベクトルの値ベクトルが条件を満たす。空でない場合は、先頭の包への所属からその符号を得て、尾部の符号を再帰的に得る。

      ((lookup i (vals cs)) .fst) (vals-in cs i)
private
  choose : {k : ℕ} (vs : Vec SL k)
         → ((i : Fin k) → ⟨ (lookup i vs) .fst ∈ˢ Hull ⟩)
         → ∥ Σ[ cs ∶ Vec Code k ] (vals cs ≡ vs) ∥₁

帰納のステップは、先頭を包の要素として符号化し、尾を帰納的に符号化する。値の等式は成分ごとに組み立てられ、台の等しさは基礎の集合の等しさへ帰着する。

  choose [] h = ∣ [] , refl ∣₁
  choose (v ∷ vs) h = rec₁ squash₁ (λ { (c , ec) → map₁
    (λ { (cs , ecs) → (c ∷ cs)
       , cong₂ _∷_ (Σ≡Prop (λ z → (z ∈ˢ Lset lam) .snd) ec) ecs })
    (choose vs (λ i → h (suc i))) })

符号ベクトル cs に対し、val-wit は wit k ψ cs の値を探索が返す最小の証人と同一視する。すべての符号の値は包に属するので、探索値も包に属する。

    (HSH.hull-member (v .fst) (h zero))
  search-val : (k : ℕ) (ψ : Formula (⊥* {ℓ}) (suc k)) (cs : Vec Code k) (vs : Vec SL k)
             → vals cs ≡ vs → (w : Sat k ψ vs) → ⟨ (search k ψ vs w) .fst ∈ˢ Hull ⟩
  search-val k ψ cs vs e w =
    J (λ vs' e' → (w' : Sat k ψ vs') → ⟨ (search k ψ vs' w') .fst ∈ˢ Hull ⟩)

パスの帰納が、パラメータのベクトルの同定に沿って主張を運び、証人の符号は包の内側で判定される。

      (λ w' → subst (λ z → ⟨ z .fst ∈ˢ Hull ⟩) (val-wit k ψ cs w') (inHull (wit k ψ cs)))
      e w

符号 wit 0 ⊥̇ [] には充足する証人がないため、その値は失敗側の分岐を通って ∅ になる。すべての符号の値は包に属するので、廃棄値も包に属する。

  junk∈Hull : ⟨ ∅ ∈ˢ Hull ⟩
  junk∈Hull = subst (λ z → ⟨ z .fst ∈ˢ Hull ⟩)
    (stuck-r unsat (search 0 ⊥̇ []) (λ _ → (∅ , HSH.∅∈Lsetα))
      (satDecision 0 ⊥̇ []))
    (inHull (wit 0 ⊥̇ []))
    where

偽を満たす環境はない。そのような充足の証明を展開すると、空型の要素が得られてしまう。

    unsat : Sat 0 ⊥̇ [] → ⊥₀
    unsat = rec₁ isProp⊥ (λ { (a , h) → ⊥*-rec h })

合併から包へ、後半:すべての反復のすべての要素が包の中にある。反復の添字についての帰納である。基底の場合は始点であり、その要素は包の章によって包の要素である。

hullStep⊆Hull : (n : ℕ) (z : S) → ⟨ z ∈ˢ (hullStep n) .fst ⟩ → ⟨ z ∈ˢ Hull ⟩
hullStep⊆Hull 0 z h = HSH.X⊆M z h
hullStep⊆Hull (suc n) z h = rec₁ ((z ∈ˢ Hull) .snd) read
  (out (hullStep n) (λ z' hz' → HSH.Hull⊆L z' (hullStep⊆Hull n z' hz')) z h)
  where

ステップの場合は、外向きの条項を通して、後者の反復の要素を読む。それは古い要素であり、帰納の仮定によってすでに包の中にある。廃棄値でもあり、すでに包の中にある。あるいは探索された値で、つぎに扱われる。

  read : Reads (hullStep n) z → ⟨ z ∈ˢ Hull ⟩
  read (inl h') = hullStep⊆Hull n z h'
  read (inr (inl e)) = subst (λ t → ⟨ t ∈ˢ Hull ⟩) (sym e) junk∈Hull
  read (inr (inr (k , ψ , vs , w , from , e))) =
    subst (λ t → ⟨ t ∈ˢ Hull ⟩) (sym e)

探索された値は、そのパラメータの符号のベクトルと対応づけられ、各パラメータは帰納の仮定によって包の要素である。だから探索は search-val によって包の中にあり、等式がその所属を z へ運ぶ。反復の合併が、包を提示する L の要素として名づけられる。

      (rec₁ (((search k ψ vs w) .fst ∈ˢ Hull) .snd)
        (λ { (cs , ecs) → search-val k ψ cs vs ecs w })
        (choose vs (λ i → hullStep⊆Hull n ((lookup i vs) .fst) (from i))))
hullL : CS.S
hullL = It.iterUnion

L の要素としての包は、反復の合併であり、その所属の記述は、要素がちょうど包の要素であると言う。前向き:合併の要素はある反復に属し、だから包の中にある。

hullL-spec : hullL .fst ≡ Hull
hullL-spec = extensionalV {a = hullL .fst} {b = Hull} (λ z → ⇔toPath (fwd z) (bwd z))
  where
  fwd : (z : S) → ⟨ z ∈ˢ hullL .fst ⟩ → ⟨ z ∈ˢ Hull ⟩
  fwd z h = rec₁ ((z ∈ˢ Hull) .snd)

反復の添字は、合併の外向きの読み出しに消費され、要素の構成可能性は合併から運ばれる。合併そのものが、構成によって構成可能なのである。

    (λ { (n , hn) → hullStep⊆Hull n z hn })
    (It.iterUnion-out (z , isL-trans {x = hullL .fst} {y = z} h (hullL .snd)) h)

後ろ向き:包の要素はある符号に名指され、その値は、符号の深さで添字づけられた反復に現れる。合併の内向きの読み出しがそれを受け入れる。

  bwd : (z : S) → ⟨ z ∈ˢ Hull ⟩ → ⟨ z ∈ˢ hullL .fst ⟩
  bwd z h = rec₁ ((z ∈ˢ hullL .fst) .snd)
    (λ { (c , ec) → It.iterUnion-in (depth c) zS
           (subst (λ t → ⟨ t ∈ˢ (hullStep (depth c)) .fst ⟩) ec (hullStep-in c)) })
    (HSH.hull-member z h)

名指された要素は台の中へ載せられる。その構成可能性は、包が段階に含まれることから従い、段階の要素としての提示が証明書を供給する。

    where
    zS : CS.S
    zS = z , Lset→isL lam ordλ z (HSH.Hull⊆L z h)

基礎の集合の等しさが、合併の構成可能性を包の上へ運ぶ。包は L の要素である。本章の前半はこれで完全に清算され、第二のモジュールは、今消費された定義可能なステップを作る。

ステップは段階の内側で作られ、その定数は段階の対象を名指す。lam の構成可能性は、lam が順序数であることから来る。

M-isL : ⟨ isL HS.M ⟩
M-isL = subst (λ t → ⟨ isL t ⟩) hullL-spec (hullL .snd)
module Build where

階層の順序数は構成可能であり、これが段階を L の内側に固定する。

λ-isL : ⟨ isL lam ⟩
λ-isL = isL-ord lam ordλ

A は Lset lam をその構成可能性の証明とともにモデルの要素として表す。充足グラフと段階上の公式の符号化は、これを段階のパラメータとして用いる。

A : CS.S
A = LsetS lam ordλ

段階の上の充足のグラフは、すべての符号の充足集合を、二つの読み出しとともに一度に供給する。そして段階の上の定義可能性が、論理式の定数を段階の要素として解釈する。

module SM = SatGraph A using ( pairs; pairs-in; pairs-out; valOf; valOf≡ )
module DA = DefOf (Lset lam) using ( ι; _⊨ᵐ_; 𝒮M )

空のアルファベットでの符号の集合は、無定数の論理式の符号を集める。そのような論理式は自由変数をもつことがある。欠けているのは定数であり、自由変数に値を与えるのは、探索のパラメータ環境である。

C₀ : CS.S
C₀ = AllCodes ∅ʟ

段階の内部の整列順序は、モデルの要素として提示される。最小の証人を比較するための関係である。

Rel : CS.S
Rel = relL lam λ-isL ordλ

小さな台の上の狭義の整列順序は、その関係から読まれ、比較は台の要素の上で述べられる。構成可能な順序対の第二成分もまた構成可能であり、これが、のちの名前のパラメータに必要になる。

wL : SWO SL
wL = orderAt lam ordλ
relOf-at : SL → SL → Type (ℓ-suc ℓ)
relOf-at = relOf wL
pr-snd-isL : (a b : V ℓ) → ⟨ isL (pr a b) ⟩ → ⟨ isL b ⟩

証明は、順序対を一元集合を通して二度剥がす。対への所属は第二成分を「一元集合と対」の入れ子の中に置き、それぞれの剥離が、推移性によって構成可能性を保つ。

pr-snd-isL a b h =
  isL-trans {x = ⁅ a , b ⁆} {y = b} (subst ⟨_⟩ (sym (pair-spec a b b)) ∣ inr refl ∣₁)
    (isL-trans {x = pr a b} {y = ⁅ a , b ⁆}
      (subst ⟨_⟩ (sym (pair-spec ⁅ a ⁆s ⁅ a , b ⁆ ⁅ a , b ⁆)) ∣ inr refl ∣₁) h)

数項は台の要素として提示される。有限の順序数とその構成可能性であり、証人の論理式のキーの条項がこれを量化する。

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

定数のアルファベットは空なので、段階の台への解釈 ε′ は一意である。これにより、何も選択せずに無定数公式を段階の言語へ付け替えられる。

ε′ : ⊥* {ℓ} → ⟪ Lset lam ⟫
ε′ = ⊥*-rec
sat-bridge : (k : ℕ) (χ : Formula (⊥* {ℓ}) k) (δ : Vec SL k)
           → (δ ⊨₀ χ) ≡ (δ DA.⊨ᵐ mapFo ε′ χ)
sat-bridge k χ δ =

この橋は合成である。空のアルファベットの環境は、解釈すべきものがないため、自明に一致する。そして改名の定理が、改名された論理式の外側の充足と、段階の内側の充足とを同一視する。

    cong (λ κ → let module I = FOL.Semantics.At DA.𝒮M (⊥* {ℓ}) κ in δ I.⊨ χ)
      (funExt (λ b → ⊥*-rec b))
  ∙ sym (⊨-map DA.𝒮M ε′ DA.ι χ δ)
opaque
  keyOf : (k : ℕ) → Formula (⊥* {ℓ}) k → CS.S

無定数の論理式の、段階でのキーとは、改名された形の、段階の符号の集合でのキーである。一度だけ名づけられ、以後の主張はその構成を開かずに参照できる。

  keyOf k χ = keyS A (mapFo ε′ χ)

そのキーは、段階での符号の集合に属する。改名された論理式の符号は、段階のアルファベットの上の符号であり、符号の集合はそれらをすべて含む。

  keyOf∈ : (k : ℕ) (χ : Formula (⊥* {ℓ}) k) → ⟨ keyOf k χ CS.∈ˢ AllCodes A ⟩
  keyOf∈ k χ = key∈AllCodes A (mapFo ε′ χ)

keyOf は不透明であるが、補題 keyOf≡ が keyS A (mapFo ε′ χ) との正確な等式を公開する。以後の証明は、封印された定義を展開せずにこの等式を使える。

  keyOf≡ : (k : ℕ) (χ : Formula (⊥* {ℓ}) k) → keyOf k χ ≡ keyS A (mapFo ε′ χ)
  keyOf≡ k χ = refl

封印されたキーの基礎の集合が計算される。それは、アリティの数項と、改名された論理式の符号との順序対である。証明は、論理式の二つの改名を合成する。空のアルファベットを経て、段階の埋め込みへ続くものである。改名の定理が、結果を極限段階が記録する符号と同一視する。

  keyOf-fst : (k : ℕ) (χ : Formula (⊥* {ℓ}) k)
            → (keyOf k χ) .fst ≡ pr (# k) ((limitCode χ) .fst)
  keyOf-fst k χ = cong (pr (# k)) (cong VCode.⌜_⌝
    ( mapFo-comp ε′ ⟪ Lset lam ⟫↪ χ
    ∙ cong (λ f → mapFo f χ) (funExt (λ b → ⊥*-rec b)) ))

各無パラメータ論理式に対し、Tof は充足のグラフがその論理式の封印されたキーで選ぶ充足集合である。この固定した集合が、段階全体でその論理式の充足関係を表す。

Tof : (k : ℕ) → Formula (⊥* {ℓ}) k → CS.S
Tof k χ = SM.valOf (keyOf k χ) (keyOf∈ k χ)

キーとその充足集合との順序対は、充足のグラフに属する。さらに、キーと同じ基礎集合をもつ台の要素は同じ充足集合を選ぶ。構成可能性の証明は命題なので、基礎集合の等しさが台での等しさへ持ち上がり、したがって選ばれた値も等しくなる。

Tof-pair : (k : ℕ) (χ : Formula (⊥* {ℓ}) k)
         → ⟨ pr ((keyOf k χ) .fst) ((Tof k χ) .fst) ∈ˢ SM.pairs .fst ⟩
Tof-pair k χ = SM.pairs-in (keyOf k χ) (keyOf∈ k χ)
valOf-same : (x : CS.S) (m : ⟨ x CS.∈ˢ AllCodes A ⟩) (k : ℕ) (χ : Formula (⊥* {ℓ}) k)
           → x .fst ≡ (keyOf k χ) .fst → SM.valOf x m ≡ Tof k χ

証明は、基礎の集合の等式の上のパス帰納で進む。符号集合への所属の命題性が、所属の証明の違いを吸収する。大切なのは基礎の集合だけなので、輸送はそのほかの何ものにも触れない。

valOf-same x m k χ e =
  J (λ x' e' → (m' : ⟨ x' CS.∈ˢ AllCodes A ⟩) → SM.valOf x m ≡ SM.valOf x' m')
    (λ m' → cong (SM.valOf x) ((x CS.∈ˢ AllCodes A) .snd m m'))
    (S≡ {x = x} {y = keyOf k χ} e) (keyOf∈ k χ)
sat-at : (k : ℕ) (χ : Formula (⊥* {ℓ}) k) (δ : Vec SL k) (z : CS.S)

充足集合への所属が、ここで段階自身の充足として計算される。この橋は三つの同定を合成する。封印された名前は、その作られたキーと一致すること。キーでの値は、一様な充足の定理によって外側の充足として読めること。そして改名された論理式の外側の充足が、改名の橋によって段階の内側の充足に等しいことである。

       → z .fst ≡ graph A δ → (z CS.∈ˢ Tof k χ) ≡ (δ ⊨₀ χ)
sat-at k χ δ z qz =
    cong (z CS.∈ˢ_) (SM.valOf≡ (keyOf k χ) (keyOf∈ k χ))
  ∙ val-sat A (mapFo ε′ χ) (keyOf k χ) (keyOf∈ k χ) (cong (λ p → p .fst) (keyOf≡ k χ)) δ z qz
  ∙ sym (sat-bridge k χ δ)

キーの認識式は、枠 s の値がこの段階の符号集合に属し、ある符号との間で、枠 a にある数項の後者とその符号との順序対になっている、と述べる。したがって、枠 a が # k を含むとき、これはアリティ k+1 の無パラメータ論理式のキーを認識する。ここで無パラメータとは定数域が空であるという意味で、論理式は自由変数をもちえる。

opaque
  keyIn : ∀ {n} → Fin n → Fin n → Formula CS.S n
  keyIn s a = (var s ∈̇ con C₀)
            ∧̇ ∃̇ ( sucAtL (suc a) zero
                 ∧̇ ∃̇ (prAtL (suc (suc s)) (suc zero) zero) )

読み出しは、変数の環境の上で、固定したアリティ k に対して述べられる。その数項は枠 a に名指されている。アリティをはじめに固定するからこそ、二つの読み出しは、符号の中を探すのではなく、符号についての等式になるのである。

module KeyIn {n : ℕ} (s a : Fin n) (γ : Vec CS.S n) (k : ℕ)
             (qa : (lookup a γ) .fst ≡ # k) where

論理式は、その自分の枠の上で計算のために開かれる。読み出しが、定義の連言と存在量化子を通り抜けなければならないからである。

  opaque
    unfolding keyIn

導入は、三つのデータから充足を作る。s の符号集合への所属、階層の要素 c、そして s を「後者の数項と c の対」と同定する等式である。数項、後者の条項、対の条項が、この順で満たされる。

    keyIn-in : ⟨ (lookup s γ) .fst ∈ˢ C₀ .fst ⟩ → (c : V ℓ)
             → (lookup s γ) .fst ≡ pr (# (suc k)) c → ⟨ γ ⊨ keyIn s a ⟩
    keyIn-in h c q = h , ∣ numAt , ( hsuc , ∣ cS , hpr ∣₁ ) ∣₁
      where
      numAt : CS.S

数項は台の要素として提示され、符号 c も台の要素へ持ち上げられる。s をその順序対と同定する等式と s の構成可能性から、pr-snd-isL は順序対の第二成分 c の構成可能性を取り出す。

      numAt = nn (suc k)
      cS : CS.S
      cS = c , pr-snd-isL (# (suc k)) c
                 (subst (λ u → ⟨ isL u ⟩) q (isL-trans h (C₀ .snd)))
      hsuc : ⟨ (numAt ∷ γ) ⊨ sucAtL (suc a) zero ⟩

後者の条項は、枠 a の数項の等式から、対の条項は s の等式から、それぞれその符号化の演算子の妥当性を通して運ばれる。この二つの輸送こそ、ホストの等式を充足へ変えるものである。

      hsuc = subst ⟨_⟩ (sym (sucAtL-adequate (suc a) zero (numAt ∷ γ)))
        (cong sucV (sym qa))
      hpr : ⟨ (cS ∷ numAt ∷ γ) ⊨ prAtL (suc (suc s)) (suc zero) zero ⟩
      hpr = subst ⟨_⟩
        (sym (prAtL-adequate (suc (suc s)) (suc zero) zero (cS ∷ numAt ∷ γ))) q

消去は、二つのデータを取り戻す。s の符号集合への所属と、「s は後者の数項とある符号の対である」という切り詰められた主張である。論理式の存在の連鎖が、一歩ずつほどかれる。

    keyIn-out : ⟨ γ ⊨ keyIn s a ⟩
              → ⟨ (lookup s γ) .fst ∈ˢ C₀ .fst ⟩
              × ∥ Σ[ c ∶ V ℓ ] ((lookup s γ) .fst ≡ pr (# (suc k)) c) ∥₁
    keyIn-out (h , hk) = h , rec₁ squash₁ atNum hk
      where

中間の束縛子は、後者の枠の数項を名指し、後者の符号化の妥当性が、その充足を基礎の集合の等式へ変換する。

      atNum : Σ[ z ∶ CS.S ] ( ⟨ (z ∷ γ) ⊨ sucAtL (suc a) zero ⟩
                            × ⟨ (z ∷ γ) ⊨ ∃̇ (prAtL (suc (suc s)) (suc zero) zero) ⟩ )
            → ∥ Σ[ c ∶ V ℓ ] ((lookup s γ) .fst ≡ pr (# (suc k)) c) ∥₁
      atNum (z , (hs , hc)) = map₁
        (λ { (c , hp) → c .fst

内側の存在量化子が、対の条項の充足をもつ符号 c を与える。妥当性がそれを順序対の等式へ運び、数項とその後者の同定と合成する。取り戻された等式は、求めていた切り詰められた主張そのものである。

           , ( subst ⟨_⟩ (prAtL-adequate (suc (suc s)) (suc zero) zero (c ∷ z ∷ γ)) hp
             ∙ cong (λ u → pr u (c .fst)) (qz ∙ cong sucV qa) ) })
        hc
        where
        qz : z .fst ≡ sucV ((lookup a γ) .fst)

七つの枠の環境がここで組み立てられる。充足の表、拡張された環境、パラメータの環境、キー、数項、証人、そして現在の集合。本体が読む順のままである。

        qz = subst ⟨_⟩ (sucAtL-adequate (suc a) zero (z ∷ γ)) hs
Env : CS.S → CS.S → CS.S → CS.S → CS.S → CS.S → CS.S → Vec CS.S 7
Env T e' e s k w Z = T ∷ e' ∷ e ∷ s ∷ k ∷ w ∷ Z ∷ []

極小性の部分の論理式は、段階のアルファベットの上で量化する。こう言う。パラメータの環境がある段階の要素で拡張され、符号化された論理式を満たすなら、そのような要素で、段階の整列順序において証人の前に立つものはない。定数 A で界されているので、量化は宇宙ではなく段階の上を走る。

opaque
  minFo : Formula CS.S 7
  minFo = ∀̇∈ (con A)
    ( (∃̇ ( consAtL i0 i1 i4 ∧̇ (var i0 ∈̇ var i2) )) ⇒̇ ¬̇ (appC Rel i0 i6) )

本体の連言項は、順にこう言う。数項は内部の ωʟ の中にある。s はアリティが一つ大きいキーである。パラメータの環境が、現在の集合の上のベクトルを符号化する。拡張された環境が、それを証人で拡張する、と。

  bodyFo : Formula CS.S 7
  bodyFo = (var i4 ∈̇ con ωʟ)
        ∧̇ ( keyIn i3 i4
        ∧̇ ( envOverAt i2 i4 i6
        ∧̇ ( consAtL i1 i5 i2

残りの連言項はこう言う。キーと表の対が充足のグラフの中にある。拡張された環境が表の中にある。証人が段階の中にある。そして極小性が成立する。連言項は全部で八つである。段階は証人と極小性で比較する候補を制限し、符号化の連言項は、この記録を充足表へ結びつける補助対象を与える。

        ∧̇ ( appC SM.pairs i3 i0
        ∧̇ ( (var i1 ∈̇ var i0)
        ∧̇ ( (var i5 ∈̇ con A)
        ∧̇ minFo ))))))

七つの対象 T,e',e,s,k,w,Z を固定する。それらからなる環境では、本体は具体的な命題となり、八つの連言項を個別に取り出すことも、逆に組み立てることもできる。

module BodyRd (T e' e s k w Z : CS.S) where

七つの枠の環境が記録され、ホスト側の極小性は、パラメータの環境を提示する族に相対的に述べられる。より小さい段階の要素による拡張が、充足の表の中に落ち、かつ整列順序で証人の前に立つ、ということはない。

  γ₇ : Vec CS.S 7
  γ₇ = Env T e' e s k w Z
  Min : {m : ℕ} (g : Fin m → V ℓ) → Type (ℓ-suc ℓ)
  Min g = (w' : CS.S) → ⟨ w' .fst ∈ˢ A .fst ⟩ → (e'' : CS.S)
        → e'' .fst ≡ env (cons (w' .fst) g) → ⟨ e'' .fst ∈ˢ T .fst ⟩

この条項は空型で終わる。極小性は反駁であり、反例のデータ、つまりより小さい拡張とその対への所属が、ちょうど不可能でなければならないのである。

        → ⟨ pr (w' .fst) (w .fst) ∈ˢ Rel .fst ⟩ → ⊥₀

本体は入れ子の連言なので、八つの条件はそれぞれ射影によって読み出せる。逆に、八条件の証明を組み合わせれば、本体の充足を得られる。

  opaque
    unfolding bodyFo

最初の読み出しは数項の条項を射影する。内部の ωʟ への所属から自然数 n を復元でき、キーの条項と合わせると、s がアリティ n+1 のキーであり、その一枠が証人に割り当てられていると分かる。

    b-num : ⟨ γ₇ ⊨ bodyFo ⟩ → ⟨ k .fst ∈ˢ ωʟ .fst ⟩
    b-num h = h .fst

第二の射影はキーの条項である。論理式は s と k の枠で、s が認識されたキーであり、そのアリティが数項 k より一つ大きいことを述べる。

    b-key : ⟨ γ₇ ⊨ bodyFo ⟩ → ⟨ γ₇ ⊨ keyIn i3 i4 ⟩
    b-key h = h .snd .fst

第三の読み出しは、環境の条項を射影する。パラメータの環境が、記録された枠で、現在の集合の上のベクトルを符号化する。

    b-env : ⟨ γ₇ ⊨ bodyFo ⟩ → ⟨ γ₇ ⊨ envOverAt i2 i4 i6 ⟩
    b-env h = h .snd .snd .fst

第四の読み出しは拡張の等式を述べる。cons の符号化の妥当性に沿って運ばれたもので、拡張された環境は、パラメータの環境を証人で拡張したものである。

    b-cons : {m : ℕ} (g : Fin m → V ℓ) → e .fst ≡ env g
           → ⟨ γ₇ ⊨ bodyFo ⟩ → e' .fst ≡ env (cons (w .fst) g)
    b-cons g hE h =
      subst ⟨_⟩ (consAtL-adequate i1 i5 i2 γ₇ g hE) (h .snd .snd .snd .fst)

第五の読み出しは、キーと表の対のグラフへの所属を述べる。適用の符号化の妥当性に沿って運ばれたものである。

    b-tab : ⟨ γ₇ ⊨ bodyFo ⟩ → ⟨ pr (s .fst) (T .fst) ∈ˢ SM.pairs .fst ⟩
    b-tab h = subst ⟨_⟩ (appC-adequate SM.pairs i3 i0 γ₇) (h .snd .snd .snd .snd .fst)

第六の読み出しは、拡張された環境の充足の表への所属である。証人がパラメータで符号化された論理式を満たす、という事実である。

    b-mem : ⟨ γ₇ ⊨ bodyFo ⟩ → ⟨ e' .fst ∈ˢ T .fst ⟩
    b-mem h = h .snd .snd .snd .snd .snd .fst

第七の射影は、証人が段階 A に属することを述べる。したがって、証人と、それと比較される候補はすべて同じ段階を動く。

    b-stage : ⟨ γ₇ ⊨ bodyFo ⟩ → ⟨ w .fst ∈ˢ A .fst ⟩
    b-stage h = h .snd .snd .snd .snd .snd .snd .fst

第八の読み出しは、反駁の形で読まれる極小性の条項である。より小さい候補が充足する拡張をもてば、有界の量化子と矛盾する。関係の項目は、適用の妥当性を通して輸送されたうえでである。

    b-min : {m : ℕ} (g : Fin m → V ℓ) → e .fst ≡ env g → ⟨ γ₇ ⊨ bodyFo ⟩ → Min g
    b-min g hE h w' hw' e'' qe hm hr =
      lower (h .snd .snd .snd .snd .snd .snd .snd w' hw' ∣ e'' , (hc , hm) ∣₁
        (subst ⟨_⟩ (sym (appC-adequate Rel i0 i6 (w' ∷ γ₇))) hr))
      where

候補の拡張の cons の条項は、そのホストの等式から運ばれる。内側の存在量化子での拡張の符号化と、ちょうど鏡の関係である。

      hc : ⟨ (e'' ∷ w' ∷ γ₇) ⊨ consAtL i0 i1 i4 ⟩
      hc = subst ⟨_⟩ (sym (consAtL-adequate i0 i1 i4 (e'' ∷ w' ∷ γ₇) g hE)) qe

充填の読み出しは、八つの成分から本体の充足を組み立てる。数項の条項、キーの条項、環境の条項、拡張の等式、グラフへの所属、表への所属、段階への所属、そして極小性である。

    b-fill : {m : ℕ} (g : Fin m → V ℓ) → e .fst ≡ env g
           → ⟨ k .fst ∈ˢ ωʟ .fst ⟩ → ⟨ γ₇ ⊨ keyIn i3 i4 ⟩ → ⟨ γ₇ ⊨ envOverAt i2 i4 i6 ⟩
           → e' .fst ≡ env (cons (w .fst) g) → ⟨ pr (s .fst) (T .fst) ∈ˢ SM.pairs .fst ⟩
           → ⟨ e' .fst ∈ˢ T .fst ⟩ → ⟨ w .fst ∈ˢ A .fst ⟩ → Min g
           → ⟨ γ₇ ⊨ bodyFo ⟩

五つの連言項はそのまま挿入される。拡張の等式とグラフの項目は、consAtL と appC の妥当性の等式を逆向きに用いて充足へ戻され、極小性は最後の条項で与えられる。

    b-fill g hE c1 c2 c3 c4 c5 c6 c7 mn =
      c1 , c2 , c3
      , subst ⟨_⟩ (sym (consAtL-adequate i1 i5 i2 γ₇ g hE)) c4
      , subst ⟨_⟩ (sym (appC-adequate SM.pairs i3 i0 γ₇)) c5
      , c6 , c7

極小性の充填は、切り詰められた反例を空型へ消去することで行われる。反例は二つの妥当性の等式を通して運ばれ、反駁に手渡される。だから充填に要るのは矛盾だけで、構成ではない。

      , λ w' hw' hex hr → lift (rec₁ isProp⊥
          (λ { (e'' , (hc , hm)) → mn w' hw' e''
                 (subst ⟨_⟩ (consAtL-adequate i0 i1 i4 (e'' ∷ w' ∷ γ₇) g hE) hc) hm
                 (subst ⟨_⟩ (appC-adequate Rel i0 i6 (w' ∷ γ₇)) hr) })
          hex)

証人の論理式は、本体を五重の存在量化で包む。対象ごとに一つである。充足の表、拡張された環境、パラメータの環境、キー、そして数項。この論理式の w と Z での充足が言うのは、Z の上の w での最小の証人の完全な記録が存在するということである。

opaque
  witFo : Formula CS.S 2
  witFo = ∃̇ (∃̇ (∃̇ (∃̇ (∃̇ bodyFo))))

内向きの読み出しは、五つの対象と本体の充足を、五つの束縛子を通して注入する。一回の注入が一つの対象を、その枠へ運ぶ。

  witFo-in : (w Z T e' e s k : CS.S) → ⟨ Env T e' e s k w Z ⊨ bodyFo ⟩
           → ⟨ (w ∷ Z ∷ []) ⊨ witFo ⟩
  witFo-in w Z T e' e s k h = ∣ k , ∣ s , ∣ e , ∣ e' , ∣ T , h ∣₁ ∣₁ ∣₁ ∣₁ ∣₁

外向きの読み出しは、束縛の順に五つの切り詰められた存在を消去する。最内層では map₁ が、復元した対象を表示された依存対へ並べ替えるだけで、本体の充足そのものは輸送しない。

  witFo-out : (w Z : CS.S) → ⟨ (w ∷ Z ∷ []) ⊨ witFo ⟩
            → ∥ Σ[ T ∶ CS.S ] Σ[ e' ∶ CS.S ] Σ[ e ∶ CS.S ] Σ[ s ∶ CS.S ] Σ[ k ∶ CS.S ]
                 ⟨ Env T e' e s k w Z ⊨ bodyFo ⟩ ∥₁
  witFo-out w Z = rec₁ squash₁ (λ { (k , hk) → rec₁ squash₁ (λ { (s , hs) →
    rec₁ squash₁ (λ { (e , he) → rec₁ squash₁ (λ { (e' , he') → map₁

witFo をほどくと、充足表・拡張環境・パラメータ環境・キー・数項が得られ、それらからなる環境が本体を満たす。

      (λ { (T , hT) → T , e' , e , s , k , hT }) he' }) he }) hs }) hk })

固定したキーと環境における最小の証人の関係

e と s を固定すると、LeastWitness Z e s z は残る充足表・拡張環境・数項の切り詰められた存在を保持する。

LeastWitness : CS.S → CS.S → CS.S → CS.S → Type (ℓ-suc ℓ)
LeastWitness Z e s z =
  ∥ Σ[ T ∶ CS.S ] Σ[ e' ∶ CS.S ] Σ[ k ∶ CS.S ]
      ⟨ Env T e' e s k z Z ⊨ bodyFo ⟩ ∥₁

六つの周囲の変数を保ったまま充足表・拡張環境・数項を束縛するため、本体を七枠から九枠へ改名する。写像は七つの実質的な成分を T,e',e,s,k,z,Z の位置へ置く。

private
  ρ₉ : Fin 7 → Fin 9
  ρ₉ zero = i0
  ρ₉ (suc zero) = i1
  ρ₉ (suc (suc zero)) = i4

残る四つの場合は、キー s、数項 k、候補 z、現在の集合 Z を配置する。末尾の p,q は読まれないので、充足はその値に依存しない。

  ρ₉ (suc (suc (suc zero))) = i5
  ρ₉ (suc (suc (suc (suc zero)))) = i2
  ρ₉ (suc (suc (suc (suc (suc zero))))) = i6
  ρ₉ (suc (suc (suc (suc (suc (suc zero)))))) = i3

Γ₉ がこの配置を示し、元の七つの枠の環境との各一致は、定義上の反射性で成り立つ。

  Γ₉ : (T e' k Z e s z p q : CS.S) → Vec CS.S 9
  Γ₉ T e' k Z e s z p q = T ∷ e' ∷ k ∷ Z ∷ e ∷ s ∷ z ∷ p ∷ q ∷ []

一致はこう言う。改名されたそれぞれの枠で、二つの環境は同じ台の要素を載せている、と。最初の三つは反射性で証明され、改名された位置ごとに一つである。

  ag₉ : (T e' k Z e s z p q : CS.S)
      → Ren.Agrees ρ₉ (Γ₉ T e' k Z e s z p q) (Env T e' e s k z Z)
  ag₉ T e' k Z e s z p q zero = refl
  ag₉ T e' k Z e s z p q (suc zero) = refl
  ag₉ T e' k Z e s z p q (suc (suc zero)) = refl

残りの四つの一致も同じく反射性で、枠ごとに一つである。どの一致も計算であり、これが、改名を充足の内側で使える理由である。

  ag₉ T e' k Z e s z p q (suc (suc (suc zero))) = refl
  ag₉ T e' k Z e s z p q (suc (suc (suc (suc zero)))) = refl
  ag₉ T e' k Z e s z p q (suc (suc (suc (suc (suc zero))))) = refl
  ag₉ T e' k Z e s z p q (suc (suc (suc (suc (suc (suc zero)))))) = refl

改名された本体は、本体の論理式を枠の対応に沿って押し出したもので、九つの枠の上にありながら、言うことは以前と同じである。

  body₉ : Formula CS.S 9
  body₉ = renameFo ρ₉ bodyFo

読みの等式はこう言う。九つの枠の環境で改名された本体を充足することは、七つの枠の環境で本体を充足することと、同じ命題である。

  body₉-read : (T e' k Z e s z p q : CS.S)
             → ⟨ Γ₉ T e' k Z e s z p q ⊨ body₉ ⟩
             ≡ ⟨ Env T e' e s k z Z ⊨ bodyFo ⟩
  body₉-read T e' k Z e s z p q =
    cong ⟨_⟩ (Ren.⊨-rename ρ₉ bodyFo (Γ₉ T e' k Z e s z p q)

証明は、枠の一致を引数に改名の定理を適用し、充足の括弧の下で輸送するものである。

                (Env T e' e s k z Z) (ag₉ T e' k Z e s z p q))

最小の証人の論理式は、改名された本体の上に、さらに三つの存在量化を包む。数項、拡張された環境、充足の表である。六つの枠の環境での充足が言うのは、候補の、現在の集合・キー・パラメータの環境における最小の証人の記録が存在するということである。

opaque
  leastWitnessFo : Formula CS.S 6
  leastWitnessFo = ∃̇ (∃̇ (∃̇ body₉))

内向きの読み出しは、切り詰められた最小の証人のデータを消去して三つの対象を注入し、本体の充足を、改名された本体の読みの等式に沿って運ぶ。

  leastWitness-in : (Z e s z p q : CS.S) → LeastWitness Z e s z
                  → ⟨ (Z ∷ e ∷ s ∷ z ∷ p ∷ q ∷ []) ⊨ leastWitnessFo ⟩
  leastWitness-in Z e s z p q = rec₁ (((Z ∷ e ∷ s ∷ z ∷ p ∷ q ∷ []) ⊨ leastWitnessFo) .snd)
    (λ { (T , e' , k , h) →
      ∣ k , ∣ e' , ∣ T , transport (sym (body₉-read T e' k Z e s z p q)) h ∣₁ ∣₁ ∣₁ })

外向きの読み出しは、三重の入れ子の存在量化を順に消去し、そのつど切り詰められた続きの中へ消去する。だから論理式の充足は、再び最小の証人の記録になる。

  leastWitness-out : (Z e s z p q : CS.S)
                   → ⟨ (Z ∷ e ∷ s ∷ z ∷ p ∷ q ∷ []) ⊨ leastWitnessFo ⟩
                   → LeastWitness Z e s z
  leastWitness-out Z e s z p q = rec₁ squash₁ at₁
    where

最も内側の消去は、名指された充足表・拡張環境・数項から最小の証人のデータを組み立て直し、本体の充足を読み出しの等式に沿って輸送する。外側の二つの消去は、この構成に必要な束縛された対象を与える。

    at₃ : (k e' : CS.S) → Σ[ T ∶ CS.S ] ⟨ Γ₉ T e' k Z e s z p q ⊨ body₉ ⟩
        → LeastWitness Z e s z
    at₃ k e' (T , h) = ∣ T , e' , k , transport (body₉-read T e' k Z e s z p q) h ∣₁
    at₂ : (k : CS.S) → Σ[ e' ∶ CS.S ] ∥ Σ[ T ∶ CS.S ] ⟨ Γ₉ T e' k Z e s z p q ⊨ body₉ ⟩ ∥₁
        → LeastWitness Z e s z

ここには二重の切り詰めが残っている。外側は延長された環境 e' を、内側は表 T を隠している。二回の除去でそれらを順に取り出すと、at₃ が改名された本体の証明を LeastWitness へ戻す。

    at₂ k (e' , h) = rec₁ squash₁ (at₃ k e') h
    at₁ : Σ[ k ∶ CS.S ] ∥ Σ[ e' ∶ CS.S ] ∥ Σ[ T ∶ CS.S ]
            ⟨ Γ₉ T e' k Z e s z p q ⊨ body₉ ⟩ ∥₁ ∥₁
        → LeastWitness Z e s z
    at₁ (k , h) = rec₁ squash₁ (at₂ k) h

数項のスロットには内部の ω の要素が収められており、decode-num がそれを解読する。切り詰められた自然数 n と、その項目を周囲の数項 # n と同一視する等式が得られるのである。解読は、内部の付番と証人のデータの自然数の管理とを結ぶ橋である。

private
  decode-num : (q : CS.S) → ⟨ q .fst ∈ˢ ωʟ .fst ⟩ → ∥ Σ[ n ∶ ℕ ] (q .fst ≡ # n) ∥₁
  decode-num q h = map₁ (λ { (n , e) → lower n , (e ∙ numeralL-fst (lower n)) })
    (subst ⟨_⟩ (ω-specL q) h)

LeastWitnessData は最小証人の背後にある実際のデータである。自然数 n、Z の提示への n 個の添字の割り当て g、e がそれらの値を名指す環境であることの等式、そして s を Lset ω に置く段階の所属である。

LeastWitnessData : CS.S → CS.S → CS.S → Type (ℓ-suc ℓ)
LeastWitnessData Z e s =
  Σ[ n ∶ ℕ ] Σ[ g ∶ (Fin n → ⟪ Z .fst ⟫) ]
    ((e .fst ≡ env (λ i → ⟪ Z .fst ⟫↪ (g i))) × (⟨ s .fst ∈ Lset ω ⟩))

定理 leastWitness-data は、論理式の水準の最小証人から、命題的切り詰めのもとで、自然数のアリティ、Z 上で添字付けられたパラメータ環境、そしてキーが Lset ω に属する証明が得られることを述べる。

opaque
  leastWitness-data : (Z e s z : CS.S) → LeastWitness Z e s z
                    → ∥ LeastWitnessData Z e s ∥₁
  leastWitness-data Z e s z = rec₁ squash₁ body
    where

変換の本体は、体の充足を消費する。それを表 T、拡張 e'、鍵 k、そして体の証明へ分解し、鍵の数項の項目がまず解読される。

    body : Σ[ T ∶ CS.S ] Σ[ e' ∶ CS.S ] Σ[ k ∶ CS.S ]
             ⟨ Env T e' e s k z Z ⊨ bodyFo ⟩
         → ∥ LeastWitnessData Z e s ∥₁
    body (T , e' , k , hb) = map₁ at (decode-num k (BodyRd.b-num T e' e s k z Z hb))
      where

数項 n と鍵を名指す等式が揃うと、データが組み上がる。長さ n、復元された割り当て g、環境の復元の等式、そして s の段階の所属である。七項目の文脈には一度名前が与えられ、復元が各スロットを参照できるようにする。

      at : Σ[ n ∶ ℕ ] (k .fst ≡ # n) → LeastWitnessData Z e s
      at (n , qk) = n , R.g , R.recovers , s∈Lω
        where
        γ : Vec CS.S 7
        γ = Env T e' e s k z Z

環境の節は Z の添字の割り当て g を復元し、e がそれらの値のグラフであることを示す。一方、キーの節は s がコードであり、後続アリティの数項と論理式コードとの順序対であることを述べる。

        module R = Recover Z n γ i2 i4 i6 qk refl (BodyRd.b-env T e' e s k z Z hb)
          using ( g; recovers )
        kr : ⟨ s .fst ∈ C₀ .fst ⟩ × ∥ Σ[ c ∶ V ℓ ] (s .fst ≡ pr (# (suc n)) c) ∥₁
        kr = KeyIn.keyIn-out i3 i4 γ n qk (BodyRd.b-key T e' e s k z Z hb)
        s∈Lω : ⟨ s .fst ∈ Lset ω ⟩

鍵の値の段階の所属がデータの最後の部分である。これは対の等式から証明される。鍵の第二成分 c はコードであり、コードは極限の段階で既に構成可能である。

        s∈Lω = rec₁ ((s .fst ∈ Lset ω) .snd) read (kr .snd)
          where
          read : Σ[ c ∶ V ℓ ] (s .fst ≡ pr (# (suc n)) c) → ⟨ s .fst ∈ Lset ω ⟩
          read (c , qs) = rec₁ ((s .fst ∈ Lset ω) .snd)
            (λ { (χ , qc) → subst (λ w → ⟨ w ∈ Lset ω ⟩) (sym qs)

したがって鍵の二つの成分はどちらも Lset ω に住む。後続の数項は数項の所属によって極限に属し、極限の段階の要素の順序対はやはり極限にとどまる。対の等式に沿って輸送すれば s は Lset ω に入り、LeastWitnessData が完成する。

                   (pr∈limit (# (suc n)) c (numeral∈limit (suc n))
                     (subst (λ w → ⟨ w ∈ˢ Lset ω ⟩) (sym qc) ((limitCode χ) .snd))) })
            (freeCode-out (suc n) c (subst (λ u → ⟨ u ∈ C₀ .fst ⟩) qs (kr .fst)))

証人の論理式の外向きの読みがここで組み上がる。(z, Z) での witFo の充足は、表、拡張、鍵、そして体の証明へ展開され、体の証明は切り詰められた LeastWitness へ変換される。Skolem の節の充足を消費するのはこの形である。

  witFo-leastWitness : (z Z : CS.S) → ⟨ (z ∷ Z ∷ []) ⊨ witFo ⟩
                     → ∥ Σ[ e ∶ CS.S ] Σ[ s ∶ CS.S ] LeastWitness Z e s z ∥₁
  witFo-leastWitness z Z h = map₁
    (λ { (T , e' , e , s , k , hb) → e , s , ∣ T , e' , k , hb ∣₁ })
    (witFo-out z Z h)

二つの証人を比較するため、本体の八つの節のうち、数項、環境、延長、表、所属、段階、最小性の七つを保持する。ここではキーの節は必要ない。二つの証人はすでに s を共有しており、そのキーに対応する値の一意性によって二つの表が同定されるからである。

private module WitnessBody (z T e' e s k Z : CS.S) (hb : ⟨ Env T e' e s k z Z ⊨ bodyFo ⟩) where
  module Rd = BodyRd T e' e s k z Z
    using ( b-num; b-env; b-cons; b-tab; b-mem; b-stage; b-min )

保持した二つの節から、延長された環境が表に属することと、証人が Lset lam に属することが直ちに得られる。キーの数項を # n と同定すると、環境の節はさらに Z の添字からなる n 組を復元する。

  h6 = Rd.b-mem hb
  h7 = Rd.b-stage hb
  module AtNum (n : ℕ) (qk : k .fst ≡ # n) where
    module R = Recover Z n (Env T e' e s k z Z) i2 i4 i6 qk refl (Rd.b-env hb)
      using ( g; recovers )

復元された添字は Z の提示を通して周囲の値を名指し、復元の等式は、拡張環境が名指すのはまさにこれらの周囲の値であり、その順序は添字の並びどおりであることを言う。

    g′ : Fin n → V ℓ
    g′ i = ⟪ Z .fst ⟫↪ (R.g i)
    hE : e .fst ≡ env g′
    hE = R.recovers

一意性を示すため、同じ Z、パラメータ環境 e、論理式のキー s をもつ二つの本体の証人を取る。最初の証人のアリティの数項を解読すると、復元されるパラメータ列の共通の長さ n が定まる。

private module WitnessUnique (Z e s z T e' k : CS.S) (hb : ⟨ Env T e' e s k z Z ⊨ bodyFo ⟩) (z' T₂ e'₂ k₂ : CS.S) (hb₂ : ⟨ Env T₂ e'₂ e s k₂ z' Z ⊨ bodyFo ⟩) (n : ℕ) (qk : k .fst ≡ # n) where

段階の節によって z と z' は Lset lam の要素となるので、その段階の整列順序で比較できる。また、最初の証人の解読から、二つの本体が共有するパラメータ列が得られる。

  module A₁ = WitnessBody z T e' e s k Z hb
  module A₂ = WitnessBody z' T₂ e'₂ e s k₂ Z hb₂
  module N = A₁.AtNum n qk
  zS : SL
  zS = z .fst , A₁.h7

二番目の要素も同様にまとめられる。拡張の等式は、それぞれの体の環境が、みずからの証明された要素を加えた拡張であることを言う。e' は復元された値の前に z を加えたものを名指し、e'₂ も同じ仕方で z' を名指す。

  z'S : SL
  z'S = z' .fst , A₂.h7
  e'≡ : e' .fst ≡ env (cons (z .fst) N.g′)
  e'≡ = A₁.Rd.b-cons N.g′ N.hE hb
  e'₂≡ : e'₂ .fst ≡ env (cons (z' .fst) N.g′)

ついで、二つの表のスロットが一致することが示される。どちらの体も、鍵 s とみずからの表の対が表の族の対に属すると主張し、コードの名指しの単射性が、同じ鍵と対にされた二つの表を等しく強制する。

  e'₂≡ = A₂.Rd.b-cons N.g′ N.hE hb₂
  T≡ : T .fst ≡ T₂ .fst
  T≡ =
    let p = SM.pairs-out s T (A₁.Rd.b-tab hb)
        q = SM.pairs-out s T₂ (A₂.Rd.b-tab hb₂)

表の等式は、二つの表の節の外向きの読みから組み立てられる。各表は鍵が名指す値であり、コードの名指しの単射性が二つの鍵のコードの添字を同一視する。ついで not-below が準備される。より真に小さい構成可能な要素がみずからの体の証人をもち、その拡張が相手の表の内側にあることはあり得ない。

    in p .snd ∙ cong (λ m → (SM.valOf s m) .fst)
      ((s .fst ∈ (AllCodes A) .fst) .snd (p .fst) (q .fst)) ∙ sym (q .snd)
  not-below : (a b : CS.S) (ha : ⟨ a .fst ∈ A .fst ⟩) (hb' : ⟨ b .fst ∈ A .fst ⟩)
              (Ta e'a ka : CS.S) (hba : ⟨ Env Ta e'a e s ka a Z ⊨ bodyFo ⟩)
              (e'b : CS.S) → e'b .fst ≡ env (cons (b .fst) N.g′) → ⟨ e'b .fst ∈ Ta .fst ⟩

構成可能な候補が一方の証人より真に下にあり、その延長された環境が同じ表に属するなら、最小性の節から矛盾が得られる。段階の整列順序が、その節に必要な内部の比較関係を与える。

            → relOf wL (b .fst , hb') (a .fst , ha) → ⊥₀
  not-below a b ha hb' Ta e'a ka hba e'b qe hm b<a =
    BodyRd.b-min Ta e'a e s ka a Z N.g′ N.hE hba b hb' e'b qe hm
      (relL-fill lam λ-isL ordλ (b .fst , hb') (a .fst , ha) b<a)
  result : z .fst ≡ z' .fst

結果は、まとめられた二つの証人の上の内部の整列順序の三分法から従う。z が z' より下なら、より小さい z が z' の体の記録する最小性と矛盾する。共有された表は表の等式を通して供給される。

  result = go (SWO.tri∙ wL zS z'S)
    where
    go : Tri∙ (relOf wL zS z'S) (zS ≡ z'S) (relOf wL z'S zS) → z .fst ≡ z' .fst
    go (tri-lt h) = ⊥₀-rec (not-below z' z A₂.h7 A₁.h7 T₂ e'₂ k₂ hb₂ e' e'≡
                  (subst (λ t → ⟨ e' .fst ∈ t ⟩) T≡ A₁.h6) h)

まとめられた二つの証人が等しければ、その基礎にある集合も等しい。残る狭義順序の場合は対称であり、z' が z より下なら z の最小性に矛盾する。

    go (tri-eq q) = cong (λ p → p .fst) q
    go (tri-gt h) = ⊥₀-rec (not-below z z' A₁.h7 A₂.h7 T e' k hb e'₂ e'₂≡
                  (subst (λ t → ⟨ e'₂ .fst ∈ t ⟩) (sym T≡) A₂.h6) h)

最小証人の一意性が組み上がる。同じ Z、e、s に対する二つの証人は、等しい基底要素をもつ。二つの切り詰めは一緒に消費され、目標は h-集合における等式である。

opaque
  leastWitness-unique : (Z e s z z' : CS.S) → LeastWitness Z e s z
                      → LeastWitness Z e s z' → z .fst ≡ z' .fst
  leastWitness-unique Z e s z z' = rec2 (setIsSet (z .fst) (z' .fst)) inner
    where

内側の補題は、展開された二つの体の証人を受け取る。候補の要素 z と z' のそれぞれに対する表、拡張、鍵、そして体の充足である。

    inner : (Σ[ T ∶ CS.S ] Σ[ e' ∶ CS.S ] Σ[ k ∶ CS.S ]
               ⟨ Env T e' e s k z Z ⊨ bodyFo ⟩)
          → (Σ[ T₂ ∶ CS.S ] Σ[ e'₂ ∶ CS.S ] Σ[ k₂ ∶ CS.S ]
               ⟨ Env T₂ e'₂ e s k₂ z' Z ⊨ bodyFo ⟩)
          → z .fst ≡ z' .fst

最初のキーを数項へ解読すると、先の一意性の議論をそのアリティで行える。同じ解読原理を ω-num として記録する。内部の ω の各要素は、命題的切り詰めのもとで、ある周囲の数項 # n である。

    inner (T , e' , k , hb) (T₂ , e'₂ , k₂ , hb₂) =
      rec₁ (setIsSet (z .fst) (z' .fst))
        (λ { (n , qk) → WitnessUnique.result Z e s z T e' k hb z' T₂ e'₂ k₂ hb₂ n qk })
        (decode-num k (BodyRd.b-num T e' e s k z Z hb))
ω-num : (q : CS.S) → ⟨ q .fst ∈ˢ ωʟ .fst ⟩ → ∥ Σ[ n ∶ ℕ ] (q .fst ≡ # n) ∥₁

解読は、内部の ω の要素を数項の等式とともに自然数へ写す。そして vecOf は Fin k の上の関数を、構成可能な要素の長さ k のベクトル、すなわち充足の節が消費する形へ変える。

ω-num q h = map₁ (λ { (n , e) → lower n , (e ∙ numeralL-fst (lower n)) })
  (subst ⟨_⟩ (ω-specL q) h)
vecOf : {k : ℕ} → (Fin k → SL) → Vec SL k
vecOf {0} f = []
vecOf {suc k} f = f zero ∷ vecOf (λ i → f (suc i))

vecOf f の各成分を参照すると f が復元される。ここで、集合 Z、アリティ k、一つの証人変数と k 個のパラメータ変数をもつ論理式 χ、Z から取ったパラメータベクトル vs、そして χ が vs で証人をもつことの証拠を固定する。

lookup-vecOf : {k : ℕ} (f : Fin k → SL) (i : Fin k) → lookup i (vecOf f) ≡ f i
lookup-vecOf {suc k} f zero = refl
lookup-vecOf {suc k} f (suc i) = lookup-vecOf (λ j → f (suc j)) i
module Least (Z : CS.S) (k : ℕ) (χ : Formula (⊥* {ℓ}) (suc k)) (vs : Vec SL k)
             (from : From Z vs) (w₀ : Sat k χ vs) where

最小化される述語は、要素 a について、拡張された環境 (a ∷ vs) が χ を充足することを述べる。これは命題としてまとめられるため、整列順序の最小性の述語として働ける。

  P : SL → hProp (ℓ-suc ℓ)
  P a = (a ∷ vs) ⊨₀ χ

この述語には、隠れたホストだけの成分はない。対象言語の論理式は χ であり、候補 a が拡張環境 a ∷ vs を決め、再利用できるパッケージ searchPredicate k χ vs の意味論的な読みは定義上 P そのものである。

最小証人 a は、この述語と非空の記録に対して、L の内部の整列順序に沿う最小要素の探索によって選ばれる。

  a : SL
  a = leastOfFormula wL (searchPredicate k χ vs) lem w₀ .fst

その最小性のデータは丸ごと保持される。a は述語を満たし、整列順序のより小さい要素は述語を満たさない。

  a-least : IsLeast wL P a
  a-least = leastOfFormula wL (searchPredicate k χ vs) lem w₀ .snd

選ばれた証人 a は Lset lam に属するので構成可能であり、構成可能な台の要素 aS とみなせる。各パラメータ位置について、g はそのパラメータを名指す添字を Z の表示から選ぶ。

  aS : CS.S
  aS = a .fst , Lset→isL lam ordλ (a .fst) (a .snd)
  g : Ix Z k
  g i = fiber (Z .fst) (from i) .fst

名指しの等式は、各パラメータの添字が提示するのはまさにそのパラメータであることを言う。埋め込まれた添字は、L の要素としてそのパラメータに等しいのである。

  g-val : (i : Fin k) → ⟪ Z .fst ⟫↪ (g i) ≡ (lookup i vs) .fst
  g-val i = fiber (Z .fst) (from i) .snd

パラメータの周囲の値は g′ に集められ、スロットごとに一つである。これによりパラメータの環境は、内部と周囲の両方で記述できる。

  g′ : Fin k → V ℓ
  g′ i = ⟪ Z .fst ⟫↪ (g i)

パラメータの環境 e は、これらの値の Z の上の内部のグラフであり、ext b は候補 b の拡張環境である。パラメータの前に b を加えたものである。

  e : CS.S
  e = envS Z g
  ext : SL → CS.S
  ext b = envFor A (b ∷ vs)

拡張のグラフの等式は、その基底集合が、候補 b を周囲のパラメータの値の前に加えたグラフであることを言う。拡張の二つの読みは項目ごとに同一視される。

  ext-graph : (b : SL) → (ext b) .fst ≡ env (cons (b .fst) g′)
  ext-graph b = envFor-graph A (b ∷ vs)
    ∙ cong env (funExt (λ { zero → refl ; (suc i) → sym (g-val i) }))

拡張は、アリティ suc k における χ の充足の表に属するのは、拡張された環境が χ を充足するとき、かつそのときに限る。ここでの表はこの論理式だけのための表であり、この等式によって、表への所属を充足と読み替えられるのである。

  ext-sat : (b : SL) → (ext b CS.∈ˢ Tof (suc k) χ) ≡ ((b ∷ vs) ⊨₀ χ)
  ext-sat b = sat-at (suc k) χ (b ∷ vs) (ext b) (envFor-graph A (b ∷ vs))

鍵 sS は論理式とそのアリティを名指す。表の族が χ の表を索引するための対である。

  sS : CS.S
  sS = keyOf (suc k) χ

表 T はアリティ suc k における χ の充足の表であり、充足する拡張が集められる集合である。

  T : CS.S
  T = Tof (suc k) χ

七項目の環境 γ₇ が全体の絵を組み上げる。表、最小証人による拡張、パラメータの環境、鍵、アリティの数項、まとめられた証人、そして基礎集合 Z である。

  γ₇ : Vec CS.S 7
  γ₇ = Env T (ext a) e sS (nn k) aS Z

第一の節は、アリティの数項が内部の ω に属することを記録する。環境の長さは自然数だからである。

  c1 : ⟨ γ₇ ⊨ (var i4 ∈̇ con ωʟ) ⟩
  c1 = #∈ω k

鍵の節は、鍵がコードの集合に属し、後続の数項と χ のコードの対であることを述べる。このコードは自由コードであり、自由コードは ω の極限の段階に住む。

  c2 : ⟨ γ₇ ⊨ keyIn i3 i4 ⟩
  c2 = KeyIn.keyIn-in i3 i4 γ₇ k refl
    (subst (λ u → ⟨ u ∈ˢ C₀ .fst ⟩) (sym (keyOf-fst (suc k) χ)) (freeCode-in (suc k) χ))
    ((limitCode χ) .fst) (keyOf-fst (suc k) χ)

環境の節は、パラメータの環境が Z の上の長さ nn k、値 g′ の環境であることを述べる。これは e の環境の補題から七項目の文脈へ輸送される。

  c3 : ⟨ γ₇ ⊨ envOverAt i2 i4 i6 ⟩
  c3 = envOverAt-transport (Z ∷ nn k ∷ e ∷ []) γ₇ i2 i1 i0 i2 i4 i6 refl refl refl
         (envOver Z g)

拡張の等式は、最小証人による拡張が、パラメータの値の前に証人を加えたグラフであることを繰り返す。

  c4 : (ext a) .fst ≡ env (cons (a .fst) g′)
  c4 = ext-graph a

鍵と表の対は、表の族の対に属する。表がみずからの鍵によって索引されるのはこの仕組みである。

  c5 : ⟨ pr (sS .fst) (T .fst) ∈ˢ SM.pairs .fst ⟩
  c5 = Tof-pair (suc k) χ

最小証人による拡張は表に属する。表の所属の等式がそれを χ の充足として読み、最小性のデータがまさにその充足を供給するのである。

  c6 : ⟨ (ext a) .fst ∈ˢ T .fst ⟩
  c6 = transport (sym (cong ⟨_⟩ (ext-sat a))) (a-least .fst)

最小証人は段階 Lset lam に属する。内部表示 A = LsetS lam ordλ では、これはまさに a がもつ所属の証明である。

  c7 : ⟨ aS .fst ∈ˢ A .fst ⟩
  c7 = a .snd

最小性の節は、延長された環境が表に属するような Lset lam の各候補 w' を排除する。そのまとめられた形が選ばれた証人より真に下にあることはできない。これはまさに a の最小性である。

  c8 : BodyRd.Min T (ext a) e sS (nn k) aS Z g′
  c8 w' w'∈ e'' q hm hr = a-least .snd w'S sat lt'
    where
    w'S : SL
    w'S = w' .fst , w'∈

より小さい候補と a の間の内部の関係は、構成可能な要素に制限した周囲の整列順序から満たされ、候補は χ を充足する。その拡張が表に属することを、拡張の等式を通して充足として読むのである。

    lt' : relOf-at w'S a
    lt' = relL-rep lam λ-isL ordλ w'S a hr
    sat : ⟨ (w'S ∷ vs) ⊨₀ χ ⟩
    sat = transport (cong ⟨_⟩ (ext-sat w'S))
            (subst (λ t → ⟨ t ∈ˢ T .fst ⟩) (q ∙ sym (ext-graph w'S)) hm)

八つの節を合わせると、witFo が (aS, Z) で成り立つ。すなわち a は、選んだパラメータにおける χ の最小証人であり、この事実は構成可能な構造の内部だけで表されている。次に、Z の各要素が Lset lam に属すると仮定し、同じ本体のデータを周囲で読む。

  least : ⟨ (aS ∷ Z ∷ []) ⊨ witFo ⟩
  least = witFo-in aS Z T (ext a) e sS (nn k)
    (BodyRd.b-fill T (ext a) e sS (nn k) aS Z g′ refl c1 c2 c3 c4 c5 c6 c7 c8)
module Out (Z : CS.S) (Z⊆ : (z : S) → ⟨ z ∈ˢ Z .fst ⟩ → ⟨ z ∈ˢ Lset lam ⟩)
           (w T e' e s k : CS.S) (h : ⟨ Env T e' e s k w Z ⊨ bodyFo ⟩) where

本体の証人は八つの事実を与える。アリティの数項、キーの形、復元されたパラメータ環境、延長の等式、添字付けられた表、表への所属、段階への所属、そして最小性である。これらを周囲で読むと、コードが表す意味論的な探索を復元できる。

  module Rd = BodyRd T e' e s k w Z
    using ( b-num; b-key; b-env; b-cons; b-tab; b-mem; b-stage; b-min )

段階の節は、証人となる集合 w が Lset lam に属することを示す。w とこの証明を組にすると、段階の台の対応する要素 wS が得られる。

  wS : SL
  wS = w .fst , Rd.b-stage h

解読されたキーのアリティ成分は内部の ω に属する。したがって命題的切り詰めのもとで、ある数項 # n に等しい。この n を固定すれば、通常の自然数のアリティでキーを分析できる。

  module AtNum (n : ℕ) (qk : k .fst ≡ # n) where

この場合の最初の事実は、鍵のスロット成分 s がそれ自体コード、すなわち C₀ の要素であることを言う。これは鍵の逆読みから従う。鍵はアリティの数項とコードの順序対であり、対を分解すればコードが現れる。

    s∈ : ⟨ s .fst ∈ˢ C₀ .fst ⟩
    s∈ = KeyIn.keyIn-out i3 i4 (Env T e' e s k w Z) n qk (Rd.b-key h) .fst

アリティを n と同定すると、環境の節から関数 g : Fin n → ⟪ Z .fst ⟫ が復元され、符号化されたパラメータ環境が、それらの添字の名指す値のグラフであることが示される。

    module R = Recover Z n (Env T e' e s k w Z) i2 i4 i6 qk refl (Rd.b-env h) using ( g; recovers )

復元された環境は、始集合の索引の列である。各索引はその提示の埋め込みによって周囲の要素として実現され、底の集合のベクトル g′ が得られる。

    g′ : Fin n → V ℓ
    g′ i = ⟪ Z .fst ⟫↪ (R.g i)

ベクトル vs は、同じ要素を構成可能な台の項目として集め、それぞれに構成可能性の証明を対にする。

    vs : Vec SL n
    vs = vecOf (λ i → g′ i , Z⊆ (g′ i) (member (Z .fst) (R.g i)))

各位置 i について、lookup i vs の第一成分は g′ i である。したがって vs と g′ は同じパラメータ列を、一方は段階の台の要素として、他方は周囲の集合として表す。

    vs-val : (i : Fin n) → (lookup i vs) .fst ≡ g′ i
    vs-val i = cong (λ p → p .fst) (lookup-vecOf (λ i → g′ i , Z⊆ (g′ i) (member (Z .fst) (R.g i))) i)

復元された環境は、実際に始集合から来ている。vs の各項目は、集合として読めば Z の要素である。これが From Z vs の記録である。

    from : From Z vs
    from i = subst (λ u → ⟨ u ∈ˢ Z .fst ⟩) (sym (vs-val i)) (member (Z .fst) (R.g i))

復元の等式は、元の環境成分 e を env g′、すなわち復元された周囲の値から作られるグラフと同定する。

    hE : e .fst ≡ env g′
    hE = R.recovers

証人のスロットは、復元された環境を一項目だけ延ばすことで他の候補と比較される。ext b は b を vs の前に置いた環境である。

    ext : SL → CS.S
    ext b = envFor A (b ∷ vs)

この延長の底の環境は、b の底の集合と g′ の cons として計算され、延長された環境のグラフの記述は項目ごとに一致する。

    ext-graph : (b : SL) → (ext b) .fst ≡ env (cons (b .fst) g′)
    ext-graph b = envFor-graph A (b ∷ vs)
      ∙ cong env (funExt (λ { zero → refl ; (suc i) → vs-val i }))

鍵自身の環境成分は ext wS と同一視される。復元された環境を証人のスロットで延ばしたものが、まさに鍵が記録していたものである。

    e'≡ : e' .fst ≡ (ext wS) .fst
    e'≡ = Rd.b-cons g′ hE h ∙ sym (ext-graph wS)

ここでコード成分から解読された論理式 χ を取り、s をその正準なキー keyOf (suc n) χ と同定する。これで環境、論理式、キーはすべて同じ充足の問いを表す。

    module AtCode (χ : Formula (⊥* {ℓ}) (suc n)) (qs : s .fst ≡ (keyOf (suc n) χ) .fst) where

述語 P b は、b を復元された環境の前に置けば χ を充足することを言う。これが、最小の証人の探索が最小化する性質である。

      P : SL → hProp (ℓ-suc ℓ)
      P b = (b ∷ vs) ⊨₀ χ

χ の充足表への所属は P b と一致する。ext b の環境が b ∷ vs のグラフとして計算されるからである。これが、充足の符号化された読みと意味論的な読みを切り替える。

      ext-sat : (b : SL) → ⟨ ext b CS.∈ˢ Tof (suc n) χ ⟩ ≡ ⟨ P b ⟩
      ext-sat b = cong ⟨_⟩ (sat-at (suc n) χ (b ∷ vs) (ext b) (envFor-graph A (b ∷ vs)))

鍵の表の成分は、アリティを上げた χ の充足表と同一視される。両成分が解読されれば、鍵の要素を意味論的に読める。

      module AtTable (qT : T .fst ≡ (Tof (suc n) χ) .fst) where

証人のスロットは、復元された論理式を充足する。鍵に記録された所属が、環境と表の同一視に沿って運ばれ、延長された環境のもとでの χ の充足になる。

        sat : ⟨ P wS ⟩
        sat = transport (ext-sat wS)
          (subst2 (λ u t → ⟨ u ∈ˢ t ⟩) e'≡ qT (Rd.b-mem h))

最小性は、χ を充足して wS より真に下にある段階の要素 b が存在しないことを述べる。χ の充足は ext b が復元された表に属することへ読み替えられ、段階の整列順序は本体の最小性の節が要求する内部関係へ変換される。

        min : (b : SL) → ⟨ P b ⟩ → relOf-at b wS → ⊥₀
        min b pb lt = Rd.b-min g′ hE h bS (b .snd) (ext b) (ext-graph b) hm
          (relL-fill lam λ-isL ordλ b wS lt)
          where
          bS : CS.S

より小さい候補は構成可能な要素 bS として包まれ、その延長された環境が表の中にあることが示される。これこそ、鍵の最小性が反証する所属である。

          bS = b .fst , Lset→isL lam ordλ (b .fst) (b .snd)
          hm : ⟨ (ext b) .fst ∈ˢ T .fst ⟩
          hm = subst (λ t → ⟨ (ext b) .fst ∈ˢ t ⟩) (sym qT) (transport (sym (ext-sat b)) pb)

二つの事実は、復元された環境のもとでの χ の充足可能性の証人へと合成される。証人のスロットとその充足が、Sat へと切り詰められるのである。

        w₀ : Sat n χ vs
        w₀ = ∣ wS , sat ∣₁

復元されたアリティ n、論理式 χ、パラメータベクトル vs、証人 w₀ が意味論的な探索をなす。最小要素の一意性により、その結果 search n χ vs w₀ は元の証人集合 w と同定される。一方、表の節から、復元された表が χ の充足表であることの証明が始まる。

        searched : Searched Z (w .fst)
        searched = n , χ , vs , w₀ , (from , sym (cong (λ q → (q .fst) .fst)
          (isPropLeastOf wL P (leastOfFormula wL (searchPredicate n χ vs) lem w₀)
            (wS , (sat , min)))))
      table : ∥ Searched Z (w .fst) ∥₁
      table = ∣ AtTable.searched

表の節は T の基礎にある集合を、キー s に対応する値として表す。s はすでに、アリティ suc n における χ の正準なキーと同定されているので、そのキーにおける値の一意性から T .fst ≡ (Tof (suc n) χ) .fst が得られる。

        (p .snd ∙ cong (λ p → p .fst) (valOf-same s (p .fst) (suc n) χ qs)) ∣₁
        where
        p : Σ[ m ∶ ⟨ s CS.∈ˢ AllCodes A ⟩ ] (T .fst ≡ (SM.valOf s m) .fst)
        p = SM.pairs-out s T (Rd.b-tab h)

コード成分 s を解読するため、freeCode-out は、その自由コードがこの成分である論理式 χ を与える。スロットの等式、解読されたコードの等式、keyOf の計算の等式を順に合成すると、s は χ の正準なキーと同定される。

    code : ∥ Searched Z (w .fst) ∥₁
    code = rec₁ squash₁
      (λ { (c , qc) → rec₁ squash₁
        (λ { (χ , ec) → AtCode.table χ
               (qc ∙ cong (pr (# (suc n))) ec ∙ sym (keyOf-fst (suc n) χ)) })

キーの等式が、符号化されたスロットと解読された論理式を結ぶ最後の関係を与える。したがってこの数項の場合には、切り詰められた Searched Z (w .fst) が得られる。証人集合は、Z から復元したパラメータによる最小証人探索の結果にほかならない。

        (freeCode-out (suc n) c (subst (λ u → ⟨ u ∈ˢ C₀ .fst ⟩) qc s∈)) })
      (KeyIn.keyIn-out i3 i4 (Env T e' e s k w Z) n qk (Rd.b-key h) .snd)

各本体の証人に記録されたアリティは内部の ω に属するので、数項の解読により、先の分析から各証人について切り詰められた意味論的探索が得られる。分出の上界には Bnd Z = Z ∪ A を取り、A は Lset lam の内部表示である。

  searched : ∥ Searched Z (w .fst) ∥₁
  searched = rec₁ squash₁ (λ { (n , qk) → AtNum.code n qk }) (ω-num k (Rd.b-num h))
Bnd : CS.S → CS.S
Bnd Z = cupʟ Z A

Z の要素は、和の左の包含によって上界の中に入る。

bnd-Z : (Z z : CS.S) → ⟨ z .fst ∈ˢ Z .fst ⟩ → ⟨ z CS.∈ˢ Bnd Z ⟩
bnd-Z Z z = cupʟ-inl Z A (z .fst)

Lset lam の各要素は右側の包含によって Bnd Z に入る。一段階の閉包条件には三つの場合がある。Z の既存の要素、証人がないときに使う空集合、または基礎 Z とともに witFo を充足する集合 w である。

bnd-L : (Z z : CS.S) → ⟨ z .fst ∈ˢ Lset lam ⟩ → ⟨ z CS.∈ˢ Bnd Z ⟩
bnd-L Z z = cupʟ-inr Z A (z .fst)
Body : CS.S → CS.S → Type (ℓ-suc ℓ)
Body Z w = ⟨ w .fst ∈ˢ Z .fst ⟩ ⊎ ((w .fst ≡ ∅) ⊎ ⟨ (w ∷ Z ∷ []) ⊨ witFo ⟩)

第三の場合、witFo に符号化された段階の節が w ∈ Lset lam を直接示す。したがって新たに加えられる最小証人はすべて固定した段階の内部にとどまる。

wit-L : (Z w : CS.S) → ⟨ (w ∷ Z ∷ []) ⊨ witFo ⟩ → ⟨ w .fst ∈ˢ Lset lam ⟩
wit-L Z w hw = rec₁ ((w .fst ∈ˢ Lset lam) .snd)
  (λ { (T , e' , e , s , k , h) → BodyRd.b-stage T e' e s k w Z h })
  (witFo-out w Z hw)
opaque

分出の論理式は、構成可能な構造の内部で三つの場合を表す。Z への所属、空集合との等しさ、または改名された witFo の充足である。改名は、その二つの自由変数を存在量化で作られた位置に配置する。

  sepFo : CS.S → Formula CS.S 1
  sepFo Z = (var i0 ∈̇ con Z)
          ∨̇ ( (var i0 ≐ con ∅ʟ)
            ∨̇ ∃̇ ( (var i0 ≐ con Z) ∧̇ renameFo ρs witFo ) )

この改名は環境の二つの成分を交換するだけである。したがって、改名された witFo を (Z'', w) で評価した真理値は、元の witFo を (w, Z'') で評価した真理値に等しい。

  private
    rs : (Z'' w : CS.S)
       → ⟨ (Z'' ∷ w ∷ []) ⊨ renameFo ρs witFo ⟩ ≡ ⟨ (w ∷ Z'' ∷ []) ⊨ witFo ⟩
    rs Z'' w = cong ⟨_⟩ (Ren.⊨-rename ρs witFo (Z'' ∷ w ∷ []) (w ∷ Z'' ∷ []) (ags Z'' w))

分出の論理式の充足は、本体の三つの切り詰められた場合に分解される。Z への所属、空集合との等号、あるいは、その証人が定義域を指認する存在の場合である。

  sep-out : (Z w : CS.S) → ⟨ (w ∷ []) ⊨ sepFo Z ⟩ → ∥ Body Z w ∥₁
  sep-out Z w = rec₁ squash₁ (λ
    { (inl hz) → ∣ inl hz ∣₁
    ; (inr h') → rec₁ squash₁ (λ
      { (inl e) → ∣ inr (inl e) ∣₁

存在の場合、その証人 Z'' は固定したパラメータ Z に等しい。この等しさに沿って移送し、さらに改名のパスに沿って移送すると、witFo が (w, Z) で成り立つことが得られる。

      ; (inr hw) → map₁ (λ { (Z'' , (eZ , hr)) → inr (inr
          (subst (λ u → ⟨ (w ∷ u ∷ []) ⊨ witFo ⟩) (S≡ {x = Z''} {y = Z} eZ)
            (transport (rs Z'' w) hr))) }) hw }) h' })

逆に、本体の三つの場合はそれぞれ、分出の論理式の対応する充足を産み、必要なところで名前の付け替えを包み直す。

  sep-in : (Z w : CS.S) → Body Z w → ⟨ (w ∷ []) ⊨ sepFo Z ⟩
  sep-in Z w (inl hz) = ∣ inl hz ∣₁
  sep-in Z w (inr (inl e)) = ∣ inr ∣ inl e ∣₁ ∣₁
  sep-in Z w (inr (inr hw)) = ∣ inr ∣ inr ∣ Z , (refl , transport (sym (rs Z w)) hw) ∣₁ ∣₁ ∣₁

L の内部で分出を行い、Bnd Z から sepFo Z を充足する集合だけを選ぶ。その構成可能集合を Φ Z とする。その所属のパスは、Φ Z への所属を、上界への所属と論理式の充足との組に同定する。

opaque
  Φ : CS.S → CS.S
  Φ Z = hasSeparationL (Bnd Z) (sepFo Z) .fst .fst

所属の仕様は次のように読める。w が Φ Z に属するのは、w が上界 Bnd Z に属し、分出の論理式を満たすとき、そのときに限る。

  Φ-mem : (Z w : CS.S) → (w CS.∈ˢ Φ Z) ≡ ((w CS.∈ˢ Bnd Z) ⊓ ((w ∷ []) ⊨ sepFo Z))
  Φ-mem Z = hasSeparationL (Bnd Z) (sepFo Z) .fst .snd

本体のどの場合も Φ Z に着地する。所属の場合は上界を通って入り、証明は、各選言支から産み出される上界への所属を、分出の充足とともに包む。

Φ-in : (Z w : CS.S) → Body Z w → ⟨ w .fst ∈ˢ (Φ Z) .fst ⟩
Φ-in Z w b = subst ⟨_⟩ (sym (Φ-mem Z w)) (bnd b , sep-in Z w b)
  where
  bnd : Body Z w → ⟨ w CS.∈ˢ Bnd Z ⟩
  bnd (inl hz) = bnd-Z Z w hz

空集合の場合は ∅ ∈ Lset lam によって上界に属する。証人の場合も、witFo の段階の節がその値の Lset lam への所属を示すので、上界に属する。

  bnd (inr (inl e)) = bnd-L Z w (subst (λ u → ⟨ u ∈ˢ Lset lam ⟩) (sym e) HSH.∅∈Lsetα)
  bnd (inr (inr hw)) = bnd-L Z w (wit-L Z w hw)

逆に、Φ Z への所属からは、所属の仕様と分出の読みを通して、切り詰められた本体の場合が得られる。同値の論理式のために、本体は三つの枠の並びへ書き直される。

Φ-out : (Z w : CS.S) → ⟨ w .fst ∈ˢ (Φ Z) .fst ⟩ → ∥ Body Z w ∥₁
Φ-out Z w h = sep-out Z w (subst ⟨_⟩ (Φ-mem Z w) h .snd)
opaque
  bodyF : Formula CS.S 3
  bodyF = (var i0 ∈̇ var i2) ∨̇ ((var i0 ≐ con ∅ʟ) ∨̇ renameFo ρf witFo)

グラフの論理式 ΦFo は新しい集合 w を全称量化し、w ∈ Z' と三つの場合からなる条件 Body Z w の間の二つの含意を述べる。したがって (Z', Z) が ΦFo を充足するのは、Z' と Φ Z が同じ要素をもつとき、かつそのときに限る。

  ΦFo : Formula CS.S 2
  ΦFo = ∀̇ ( ((var i0 ∈̇ var i1) ⇒̇ bodyF) ∧̇ (bodyF ⇒̇ (var i0 ∈̇ var i1)) )

グラフのための改名の同値は、前のものと同じように証明される。改名は環境を入れ替え、充足はその入れ替えに沿って運ばれる。

  private
    rf : (w Z' Z : CS.S)
       → ⟨ (w ∷ Z' ∷ Z ∷ []) ⊨ renameFo ρf witFo ⟩ ≡ ⟨ (w ∷ Z ∷ []) ⊨ witFo ⟩
    rf w Z' Z = cong ⟨_⟩ (Ren.⊨-rename ρf witFo (w ∷ Z' ∷ Z ∷ []) (w ∷ Z ∷ []) (agf w Z' Z))

本体は、三つの枠の並びの下で双方向に移る。Z への所属は直接であり、残りの選言支は切り詰めの上で写される。

    bodyF-out : (w Z' Z : CS.S) → ⟨ (w ∷ Z' ∷ Z ∷ []) ⊨ bodyF ⟩ → ∥ Body Z w ∥₁
    bodyF-out w Z' Z = rec₁ squash₁ (λ
      { (inl hz) → ∣ inl hz ∣₁
      ; (inr h') → map₁ (λ
        { (inl e) → inr (inl e)

証人の場合、改名のパスは三変数の論理式の充足を (w, Z) における witFo の充足へ戻し、グラフの本体から Body Z w への順方向の含意を完成させる。

        ; (inr hw) → inr (inr (transport (rf w Z' Z) hw)) }) h' })

逆方向は、三つの場合を三つの枠の読みに組み立て、Witnessの選言支を改名に対して運ぶ。

    bodyF-in : (w Z' Z : CS.S) → Body Z w → ⟨ (w ∷ Z' ∷ Z ∷ []) ⊨ bodyF ⟩
    bodyF-in w Z' Z (inl hz) = ∣ inl hz ∣₁
    bodyF-in w Z' Z (inr (inl e)) = ∣ inr ∣ inl e ∣₁ ∣₁
    bodyF-in w Z' Z (inr (inr hw)) = ∣ inr ∣ inr (transport (sym (rf w Z' Z)) hw) ∣₁ ∣₁

続いて、定義可能性の条項が証明される。対 (Φ Z, Z) はグラフの論理式を充足する。同値のそれぞれの向きは、対応する所属の向きと本体の転送の合成である。

  Φ-defines : (Z : CS.S) → ⟨ (Φ Z ∷ Z ∷ []) ⊨ ΦFo ⟩
  Φ-defines Z w =
      (λ h → rec₁ (((w ∷ Φ Z ∷ Z ∷ []) ⊨ bodyF) .snd) (bodyF-in w (Φ Z) Z) (Φ-out Z w h))
    , (λ h → rec₁ ((w .fst ∈ˢ (Φ Z) .fst) .snd) (Φ-in Z w) (bodyF-out w (Φ Z) Z h))

グラフの一意性は、構成可能な構造の外延性によって証明される。Z との対がグラフの論理式を充足する任意の Z' のすべての要素は本体を満たし、Φ-in がそれを Φ Z の中に置く。

  Φ-only : (Z Z' : CS.S) → ⟨ (Z' ∷ Z ∷ []) ⊨ ΦFo ⟩ → Z' ≡ Φ Z
  Φ-only Z Z' h = extensionalL (λ v → ⇔toPath (fwd v) (bwd v))
    where
    fwd : (v : CS.S) → ⟨ v .fst ∈ˢ Z' .fst ⟩ → ⟨ v .fst ∈ˢ (Φ Z) .fst ⟩
    fwd v hv = rec₁ ((v .fst ∈ˢ (Φ Z) .fst) .snd) (Φ-in Z v) (bodyF-out v Z' Z (h v .fst hv))

外延性の議論の逆方向は、Φ Z の各要素を切り詰められた本体の場合として読み、その要素のもとでグラフの論理式を適用する。

    bwd : (v : CS.S) → ⟨ v .fst ∈ˢ (Φ Z) .fst ⟩ → ⟨ v .fst ∈ˢ Z' .fst ⟩
    bwd v hv = h v .snd
      (rec₁ (((v ∷ Z' ∷ Z ∷ []) ⊨ bodyF) .snd) (bodyF-in v Z' Z) (Φ-out Z v hv))

これで定義可能な一段階の演算 Φ が得られた。論理式 ΦFo がそのグラフを特徴づけ、外延性により、そのグラフ条件を満たす任意の集合は Φ Z に等しい。

pack : StepPack
pack = record
  { Φ       = Φ
  ; ΦFo     = ΦFo
  ; defines = Φ-defines

この一段階は Z の既存の各要素を含み、常に空集合を含み、さらに Z の要素をパラメータとする充足可能な各論理式の最小証人を含む。逆に、その要素はこの三つの場合からしか生じないので、Φ は求める一段階の閉包にほかならない。

  ; only    = Φ-only
  ; grows   = λ Z z hz → Φ-in Z (z , isL-trans {x = Z .fst} {y = z} hz (Z .snd)) (inl hz)
  ; junk    = λ Z → Φ-in Z ∅ʟ (inr (inl refl))
  ; least   = λ Z k χ vs from w₀ →
                Φ-in Z (Least.aS Z k χ vs from w₀) (inr (inr (Least.least Z k χ vs from w₀)))

Z の各要素が Lset lam に属すると仮定する。z ∈ Φ Z なら、所属の特徴づけから三つの可能性が得られる。z がすでに Z に属する場合、z = ∅ の場合、または witFo が (z, Z) で成り立つ場合である。第三の場合、本体を解読すると、Z の要素をパラメータとし、結果が z である意味論的探索が復元される。

  ; out     = λ Z Z⊆ z hz → rec₁ squash₁ (λ
      { (inl h') → ∣ inl h' ∣₁
      ; (inr (inl e)) → ∣ inr (inl e) ∣₁
      ; (inr (inr hw)) → rec₁ squash₁
          (λ { (T , e' , e , s , k , hb) →

証人の場合、z ∈ Φ Z からまず z の構成可能性が得られ、z を構成可能な台の要素として読める。解読された本体はさらに Searched Z z を示し、z を復元された論理式とパラメータが定める最小証人探索と同定する。

             map₁ (λ sr → inr (inr sr)) (Out.searched Z Z⊆ (zS Z z hz) T e' e s k hb) })
          (witFo-out (zS Z z hz) Z hw) })
      (Φ-out Z (zS Z z hz) hz) }
  where
  zS : (Z : CS.S) (z : S) → ⟨ z ∈ˢ (Φ Z) .fst ⟩ → CS.S

Φ Z は構成可能であり、構成可能性は推移的なので、Φ Z の各要素 z も構成可能である。

  zS Z z hz = z , isL-trans {x = (Φ Z) .fst} {y = z} hz ((Φ Z) .snd)

凝縮に必要な構成可能性の前提を与える

これにより先の解読に必要な台の要素が得られ、定義可能な一段階の閉包の構成が完成する。

module Discharge (lam : S) (ordλ : IsOrd lam)
  (succλ : (d : S) → ⟨ d ∈ˢ lam ⟩ → ⟨ sucV d ∈ˢ lam ⟩)
  (X : S) (X⊆L : (x : S) → ⟨ x ∈ˢ X ⟩ → ⟨ x ∈ˢ Lset lam ⟩)
  (∅∈λ : ⟨ ∅ ∈ˢ lam ⟩)
  (M-isL : ⟨ isL (HullStage.M lam ordλ succλ X X⊆L ∅∈λ) ⟩) where

包 M 自身が構成可能であると仮定する。これにより M を構成可能な台として扱えるので、包が推移的であると仮定せずに、先の崩壊の議論を適用できる。

M を構成可能な台とみなすと、その崩壊像 πX が得られる。この像の各要素は M のある要素の崩壊値であり、構成可能な台についての定理から、そのような値は L に属する。

module HS = HullStage lam ordλ succλ X X⊆L ∅∈λ using ( M )
module HSC = HullStage.C lam ordλ succλ X X⊆L ∅∈λ using ( πX )
module P = PiIn (HS.M , M-isL) using ( πX-isL )

したがって、すべての x ∈ πX は構成可能である。ここで、X から Lset λ の内部で生成される包に戻る。λ は後続について閉じた順序数であり、X の各要素はこの段階に属すると仮定する。

pixL : (x : S) → ⟨ x ∈ˢ HSC.πX ⟩ → ⟨ isL x ⟩
pixL = P.πX-isL
module Condense′ (lam : S) (ordλ : IsOrd lam)
  (succλ : (d : S) → ⟨ d ∈ˢ lam ⟩ → ⟨ sucV d ∈ˢ lam ⟩)
  (X : S) (X⊆L : (x : S) → ⟨ x ∈ˢ X ⟩ → ⟨ x ∈ˢ Lset lam ⟩)
  (∅∈λ : ⟨ ∅ ∈ˢ lam ⟩)
  (elem : Frame.A.Elementary lam ordλ succλ X X⊆L ∅∈λ)
  (sup : Superadequate lam)
  (X-isL : ⟨ isL X ⟩)
  where

さらに、∅ ∈ λ、X から生成される包の枠組みの初等性、λ が強化された十分な段階であること、および X 自身の構成可能性を仮定する。最後の仮定は内部の有限反復の始点を与え、初等性と強化された十分性は凝縮の議論に必要な仮定を与える。

この構成は三つの部分からなる。コードが初期要素と後の探索で選ばれる値を指し、探索に証人がない場合は空集合を値とする。一つの定義可能な演算 Φ が一段の閉包を行い、Φ を有限回反復して合併を取ることで、後に Skolem 包と同一視される構成可能集合を作る。

module T = Telescope lam ordλ succλ X X⊆L ∅∈λ using ( Code; val; Reads; module StepPack )
module TB = Telescope.Build lam ordλ succλ X X⊆L ∅∈λ using ( pack; Φ )
module HI = Telescope.HullIter lam ordλ succλ X X⊆L ∅∈λ X-isL TB.pack
  using ( hullL; hullL-spec; hullStep; hullStep-suc; hullStep-in; hullStep⊆Hull; depth; M-isL )
module HS = HullStage lam ordλ succλ X X⊆L ∅∈λ using ( M )

有限な閉包段階の合併は、すでに構成可能宇宙の要素 hullL になっている。次の等式により、その台集合が周囲で定義された包 M にほかならないことを示す。これが、先に崩壊像を扱う際に仮定した包全体の構成可能性を与える。

module HSH = HullStage.H lam ordλ succλ X X⊆L ∅∈λ using ( Hull⊆L )
module HSC = HullStage.C lam ordλ succλ X X⊆L ∅∈λ using ( πX )
module D = Discharge lam ordλ succλ X X⊆L ∅∈λ HI.M-isL using ( pixL )
hullL : CS.S
hullL = HI.hullL

hullL の台集合はちょうど M である。したがって、Skolem 包の周囲での特徴づけと、反復から得た構成可能集合は同じ要素を記述し、hullL はさらに構成可能性の証明も備えている。

hullL-spec : hullL .fst ≡ HS.M
hullL-spec = HI.hullL-spec

殻の閉包の段階は自然数で添字づけられる。hullStep n は閉包の段階を n 回適用して到達する層である。

hullStep : ℕ → CS.S
hullStep = HI.hullStep

後続の添字では、次の段階は現在の段階に Φ を作用させたものである。この演算は現在の要素を保ち、空集合を加え、さらにパラメータがすでに現れている各符号化された探索について最小証人を加える。

hullStep-suc : (n : ℕ) → hullStep (suc n) ≡ TB.Φ (hullStep n)
hullStep-suc = HI.hullStep-suc

各コードには有限の深さがあり、それが指す値はその深さの閉包段階に属する。包の各要素は何らかのコードで表されるので、その要素を含む有限段階が得られるが、要素ごとに正準的なコードを選ぶわけではない。

hullStep-in : (c : T.Code) → ⟨ (T.val c) .fst ∈ˢ (hullStep (HI.depth c)) .fst ⟩
hullStep-in = HI.hullStep-in

逆に、各有限閉包段階のすべての要素は M に属する。包の要素の符号による特徴づけと合わせると、これにより段階の合併と Skolem 包がまったく同じ要素をもつことが分かる。

hullStep⊆Hull : (n : ℕ) (z : S) → ⟨ z ∈ˢ (hullStep n) .fst ⟩ → ⟨ z ∈ˢ HS.M ⟩
hullStep⊆Hull = HI.hullStep⊆Hull

段階の合併は構成可能である。殻の段階 M は L の要素である。これが本章が証明を目指した二つの所属の事実のうちの一つである。

M-isL : ⟨ isL HS.M ⟩
M-isL = HI.M-isL

第二の事実は処理を通して従う。殻の段階 M の崩壊 πX のすべての値が構成可能なのは、台 M が構成可能だからである。

pixL : (x : S) → ⟨ x ∈ˢ HSC.πX ⟩ → ⟨ isL x ⟩
pixL = D.pixL

凝縮により、崩壊像がちょうど Lset β となる順序数 β が得られる。これにより、先の要素ごとの構成可能性は、像全体を構成可能階層の一つの段階と同一視する主張へ強められる。結論が主張するのはこの等式と β の順序数性であり、β と λ の間の比較までは含まない。

condenses′ : Σ[ β ∶ S ] (IsOrd β × (HSC.πX ≡ Lset β))
condenses′ = Condense.condenses lam ordλ succλ X X⊆L ∅∈λ elem sup D.pixL