The definable powerset, at a carrier that is a slot

这就是整条路线为之存在的那一步。在它之前的每一章,造的都是这台机器在「调用方着的载体」上的一个零件:L 的一个集合,在公式里被点名为常元。内部层级没法那样握住自己的阶段。它的图把阶段绑定起来,因为一个图不可以点名它所定义的那个对象,而集合进入公式的唯一方式是被点名。故可定义幂集的描述必须能在那层绑定之下说出口,其载体只占周遭环境的一位,别无其他。

那条描述所说的,就是这个算子本身。u 是载体的可定义幂集,当其诸成员恰是「由一条公式从载体中刻出的那些集合」:仅仅存在载体之上的一个码 c 与一个取值 v,该取值就是满足关系那场递归在那个码处所记录的东西,而 u 的那个成员是「其单条目环境落在 v 中的载体诸成员」之集。三个合取项,而每一个都是一章早已交付的东西,只是读在一位上、不读在常元上。

有一处形状上的更正是被逼的,值得在公式出现之前先讲。码与取值由相邻的两个存在量词绑定,中间不隔任何合取项。若中间隔一个合取项而嵌套,那两条假设就落到不同的环境上,于是这条路线会平白背上一条它本来永远用不着的弱化引理:同一条公式、同样的合取项数目、同样的深度,差别恰好是一条引理。

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

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

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

open import FOL.ZFStructure using ( module hPropStructure )
open import FOL.Syntax using ( Formula; var; _∈̇_; _∧̇_; ∃̇_ )
open import FOL.Manipulation.Relabelling using ( mapFo )
import FOL.Absoluteness
open import V.Hierarchy {} using ( 𝒮ᵥ )
open import V.Coding {} using ( pr )
open import L.Constructible {}
  using ( 𝒮ʟ; isL; isL-trans; IsOrd; Lset; 𝒟ₒ; 𝒟ₒ-intro; 𝒟ₒ-inv )
open import L.Definability {} using ( module DefOf )
open import L.Axioms.Basic {} using ( 𝒟ₒ→isL; 𝒟ₒS; LsetS )
open import L.Coding.Model {}
  using ( extAt; extAt-out; extAt-in; extAt-in-both; tagAtL; tagAtL-adequate
        ; domAt; domAt-intro; domAt-out )
open import L.Coding.Environment {} using ( env )
open import L.Coding.Recover {} using ( keyOf; keyOf-fst )
open import L.Coding.CodeSet {} lem
  using ( keyArityAtL; keyArityAtL-in; keyArityAtL-out; hasWitnessAt
        ; codeS; keyS; witnessAt-in; witnessAt-out )
open import L.Coding.Graph {} lem
  using ( satGraphAt; GraphWitAt; graphAt-in; graphAt-out )
open import L.Coding.Table {} lem
  using ( keyʟ; slot; satTable; total; inSlot; entry-in )
open import L.Coding.Slot {} lem using ( slotClosed )
open import L.Coding.Sound {} lem using ( soundness )
open import L.Coding.Unique {} lem using ( module Good )
open import L.Coding.Sat {} lem using ( Sat )
open import L.Coding.Bridge {} lem using ( asConst; defSet-Sat )
open import L.Coding.Uniform {} lem using ( keyBridge )

open import Cubical.Foundations.Prelude using ( subst2 )
open import Cubical.Foundations.HLevels using ( isProp× )
open import Cubical.Data.Sigma using ( Σ≡Prop )
open import Cubical.Functions.Logic using ( ⇔toPath )
import Cubical.HITs.PropositionalTruncation as PT
open PT using ( ∥_∥₁; ∣_∣₁; squash₁ )
open import Cubical.HITs.CumulativeHierarchy.Base using ( V; _∈_; setIsSet )
open import Cubical.HITs.CumulativeHierarchy.Properties
  using ( ⟪_⟫; ⟪_⟫↪; ∈∈ₛ; ∈ₛ⟪_⟫↪_; ∈-asFiber; _⊆_; extensionality )
open import Cubical.HITs.CumulativeHierarchy.Constructions
  using ( module InfinitySet )
open InfinitySet using ( #_ )

open TruthAlgebra (hPropAlgebra (ℓ-suc ))
open hPropStructure 𝒮ʟ

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

只有一个条目的环境

元数一处的可定义性,问的是一条公式对单个成员是否成立,而满足关系那场递归是在环境处作答的;把两者接起来的,正是「把那个成员指派给仅有的那一个变元」的环境。环境就是它的图,而长度为一的图只是一个对:数码零配上那个取值。

于是读式只有一行。「这一位上的集合,其成员恰是诸对 (0, y)」就是 extAt 施于标签读式,而标签读式本来就交付底集之间的那条等式,故此处压根不必再证任何关于对的事。

它的两个方向手写在那个单元素索引类型上,而这是测量、不是口味。把「属于一个单条目集合」读回来,是一次两分支的情形分析,其中一支不可能;若走库里「有穷函数与向量」的往返,同一条陈述曾把某一章卡在八分钟以上,而遇上它的那一章改为手写两条子句。这一章照办。

envOne : V   V 
envOne y = env {1}  _  y)

envOneAt :  {n}  Fin n  Fin n  Formula S n
envOneAt e y = extAt e (tagAtL zero 0 (suc y))

module _ {n : } (e y : Fin n) (γ : S ^ n) where
  private
    E : S
    E = lookup e γ

    v : V 
    v = fst (lookup y γ)

    readEntry : (z : S)   fst z  envOne v   fst z  pr (# 0) v
    readEntry z = PT.rec (setIsSet (fst z) (pr (# 0) v))
       { (lift zero , q)  sym q ; (lift (suc ()) , _) })

    entry∈ : (z : S)  fst z  pr (# 0) v   fst z  envOne v 
    entry∈ z q =  lift zero , sym q ∣₁

  envOneAt-in : fst E  envOne v   γ  envOneAt e y 
  envOneAt-in q = extAt-in-both e (tagAtL zero 0 (suc y)) γ fwd bwd
    where
    fwd : (z : S)   fst z  fst E    (z  γ)  tagAtL zero 0 (suc y) 
    fwd z z∈ = subst ⟨_⟩ (sym (tagAtL-adequate zero 0 (suc y) (z  γ)))
      (readEntry z (subst  w   fst z  w ) q z∈))

    bwd : (z : S)   (z  γ)  tagAtL zero 0 (suc y)    fst z  fst E 
    bwd z h = subst  w   fst z  w ) (sym q)
      (entry∈ z (subst ⟨_⟩ (tagAtL-adequate zero 0 (suc y) (z  γ)) h))

  envOneAt-out :  γ  envOneAt e y   fst E  envOne v
  envOneAt-out h = extensionality (fst E) (envOne v) (sub₁ , sub₂)
    where
    sub₁ :  fst E  envOne v 
    sub₁ w w∈ₛ = ∈∈ₛ {a = w} {b = envOne v} .fst
      (entry∈ wS (subst ⟨_⟩
        (tagAtL-adequate zero 0 (suc y) (wS  γ))
        (extAt-out e (tagAtL zero 0 (suc y)) γ h wS w∈)))
      where
      w∈ :  w  fst E 
      w∈ = ∈∈ₛ {a = w} {b = fst E} .snd w∈ₛ

      wS : S
      wS = w , isL-trans {x = fst E} {y = w} w∈ (snd E)

    sub₂ :  envOne v  fst E 
    sub₂ w w∈ₛ = ∈∈ₛ {a = w} {b = fst E} .fst
      (PT.rec (snd (w  fst E))
         { (lift zero , q) 
               subst  u   u  fst E ) (keyOf-fst 0 (lookup y γ)  q) hasKey
           ; (lift (suc ()) , _) })
        (∈∈ₛ {a = w} {b = envOne v} .snd w∈ₛ))
      where
      hasKey :  fst (keyOf 0 (lookup y γ))  fst E 
      hasKey = extAt-in e (tagAtL zero 0 (suc y)) γ h (keyOf 0 (lookup y γ))
        (subst ⟨_⟩
          (sym (tagAtL-adequate zero 0 (suc y) (keyOf 0 (lookup y γ)  γ)))
          (keyOf-fst 0 (lookup y γ)))

一个取值「是某个码所定义的东西」,是什么意思

第三个合取项,单独拿出来,落在三个槽位上:那个成员、载体,以及满足关系那场递归所记录的取值。它说的是:那个成员就是「其单条目环境落在该取值之中」的那些载体成员之集,也就是把可定义子集逐字写出来、只是用那场递归顶替了满足关系。

那个条件是一个合取而不是单独一条子句,因为「落在载体之内」这道界并不由其余部分蕴含。递归取值的成员是一个环境,不是载体的一个子集,故仅凭后半句,对「那个成员从哪里来」什么也没说;可定义子集是从载体中刻出来的,公式必须把这一点说出来。

它的两个方向就是 extAt 自己的那两个,而条件里面那个存在量词由上一节读出。此处没有任何东西去查看那个取值,这也是本节对码一无所知的原因。

DefinesAt :  {n}  Fin n  Fin n  Fin n  Formula S n
DefinesAt x w v = extAt x ( (var zero ∈̇ var (suc w))
                          ∧̇ ∃̇ ( envOneAt zero (suc zero)
                               ∧̇ (var zero ∈̇ var (suc (suc v))) ) )

module _ {n : } (x w v : Fin n) (γ : S ^ n) where
  private
    inner : Formula S (suc n)
    inner = ∃̇ (envOneAt zero (suc zero) ∧̇ (var zero ∈̇ var (suc (suc v))))

    body : Formula S (suc n)
    body = (var zero ∈̇ var (suc w)) ∧̇ inner

    Holds : S  Type (ℓ-suc )
    Holds z =  fst z  fst (lookup w γ) 
              ×  envOne (fst z)  fst (lookup v γ) 

    readInner : (z : S)   (z  γ)  inner 
                envOne (fst z)  fst (lookup v γ) 
    readInner z = PT.rec (snd (envOne (fst z)  fst (lookup v γ))) step
      where
      step : Σ[ E  S ]  (E  z  γ)
                (envOneAt zero (suc zero) ∧̇ (var zero ∈̇ var (suc (suc v)))) 
             envOne (fst z)  fst (lookup v γ) 
      step (E , (hE , E∈)) = subst  u   u  fst (lookup v γ) )
        (envOneAt-out zero (suc zero) (E  z  γ) hE) E∈

    fillInner : (z : S)   envOne (fst z)  fst (lookup v γ) 
                (z  γ)  inner 
    fillInner z h =
       E , (envOneAt-in zero (suc zero) (E  z  γ) refl , h) ∣₁
      where
      E : S
      E = envOne (fst z)
        , isL-trans {x = fst (lookup v γ)} {y = envOne (fst z)} h
            (snd (lookup v γ))

  DefinesAt-out :  γ  DefinesAt x w v 
                 (z : S)   fst z  fst (lookup x γ)   Holds z
  DefinesAt-out h z z∈ = hz .fst , readInner z (hz .snd)
    where
    hz :  (z  γ)  body 
    hz = extAt-out x body γ h z z∈

  DefinesAt-in :  γ  DefinesAt x w v 
                (z : S)  Holds z   fst z  fst (lookup x γ) 
  DefinesAt-in h z (hw , hv) =
    extAt-in x body γ h z (hw , fillInner z hv)

  DefinesAt-both : ((z : S)   fst z  fst (lookup x γ)   Holds z)
                  ((z : S)  Holds z   fst z  fst (lookup x γ) )
                   γ  DefinesAt x w v 
  DefinesAt-both f g = extAt-in-both x body γ
     z z∈  f z z∈ .fst , fillInner z (f z z∈ .snd))
     z h  g z (h .fst , readInner z (h .snd)))

是那一位上的载体之上的一个码

两个合取项,都早已证好,而此处只是它们会合之处:那个实参是元数一处的一个键,且它在「那一位所持有的载体」上有一个既封闭又成形的见证。前者告诉解码该在哪个元数上作答;后者是解码跑在其上的东西。两者都不点名任何集合,故这一对可以在任意绑定之下说出口。

码集那一章那条被钉住的谓词,就是同一对再压上一层绑定,而那层绑定正是「一个阶段握得住的谓词」与「一个被绑定变元携带得了的谓词」之间唯一的差别。

isCodeAt :  {n}  Fin n  Fin n  Formula S n
isCodeAt c w = keyArityAtL c 1 ∧̇ hasWitnessAt w c

module _ (A : S) where
  codeAt-in :  {n} (c w : Fin n) (γ : S ^ n)
             fst (lookup w γ)  fst A
             (ψ : Formula  fst A  1)  fst (lookup c γ)  fst (keyS A ψ)
              γ  isCodeAt c w 
  codeAt-in c w γ qw ψ qc =
    keyArityAtL-in c 1 γ (codeS A ψ) qc , witnessAt-in A w c γ ψ qw qc

  codeAt-out :  {n} (c w : Fin n) (γ : S ^ n)
              fst (lookup w γ)  fst A
               γ  isCodeAt c w 
               (Σ[ ψ  Formula  fst A  1 ]
                   (fst (lookup c γ)  fst (keyS A ψ))) ∥₁
  codeAt-out c w γ qw (hk , hw) =
    PT.rec squash₁ step (keyArityAtL-out c 1 γ hk)
    where
    step : Σ[ z  S ] (fst (lookup c γ)  pr (# 1) (fst z))
           (Σ[ ψ  Formula  fst A  1 ]
               (fst (lookup c γ)  fst (keyS A ψ))) ∥₁
    step (z , qz) = witnessAt-out A w c γ qw hw 1 z qz

那个图,落在一个作为槽位的载体上

满足关系那场递归的图已被推广为把载体取作一位,而它的两半就是那场递归据以建立的存在性与唯一性,只是重新陈述在那一位上、并落在一个变元环境上。此处没有证任何当时未证之事:存在性递出子公式槽、其上的那张表、以及十二条子句,而这三样本来就把周遭环境取作实参;唯一性把图自己绑定的索引集与表读回来,再在图所绑定的那个载体上施用钉住定理。

两者都把码与取值以等式抵达、而不是点名,这正是诸取值定理据以写下的那条规矩:点名一个键,就把它的构造塞进了一个满足关系里面,同一条陈述于是从几秒变成几分钟。

module _ (B : S) where
  private
    Ci Ti :  {k}  Fin (suc (suc (suc k)))
    Ci = suc (suc zero)
    Ti = suc zero

  graphAt-holds :  {m n} (φ : Formula S m) (w c v : Fin n) (γ : S ^ n)
                 fst (lookup w γ)  fst B
                 fst (lookup c γ)  fst (keyʟ φ)
                 fst (lookup v γ)  fst (Sat B φ)
                  γ  satGraphAt w c v 
  graphAt-holds φ w c v γ qw qc qv = graphAt-in w c v γ
     slot B φ , (satTable B φ , (B , (sym qw
    , ( slotClosed B φ γ
    , ( hdom
    , ( entry
    , soundness B φ γ )))))) ∣₁
    where
    δ : S ^ (suc (suc (suc _)))
    δ = B  satTable B φ  slot B φ  γ

    hdom :  δ  domAt Ti Ci 
    hdom = domAt-intro Ti Ci δ
       z   h  PT.rec (snd (fst z  fst (slot B φ)))
                   { (u , hu)  inSlot B φ (fst z) (fst u) hu }) h)
           ,  h  total B φ (fst z) h))

    entry :  pr (fst (lookup c γ)) (fst (lookup v γ))  fst (satTable B φ) 
    entry = subst2  a b   pr a b  fst (satTable B φ) )
      (sym qc) (sym qv) (entry-in B φ)

  graphAt-unique :  {m n} (φ : Formula S m) (w c v : Fin n) (γ : S ^ n)
                  fst (lookup w γ)  fst B
                  fst (lookup c γ)  fst (keyʟ φ)
                   γ  satGraphAt w c v 
                  fst (lookup v γ)  fst (Sat B φ)
  graphAt-unique φ w c v γ qw qc h =
    PT.rec (setIsSet (fst (lookup v γ)) (fst (Sat B φ))) step
      (graphAt-out w c v γ h)
    where
    step : GraphWitAt w c v γ  fst (lookup v γ)  fst (Sat B φ)
    step (C , (T , (b , (eb , (hc , (hd , (ha , h12)))))))
      = Good.pinned (b  T  C  γ) Ci Ti zero hc hd h12 φ
          (lookup c γ) (lookup v γ) qc
          (domAt-out Ti Ci (b  T  C  γ) hd (lookup c γ) (lookup v γ) ha) ha
       cong  u  fst (Sat u φ)) (Σ≡Prop  u  snd (isL u)) (eb  qw))

那条描述,以及随它一同旅行的旁条件

三个合取项,压在两个相邻的存在量词之下,再压在一次外延之下:u 恰是那些 x 之集,对它们仅仅存在载体之上的一个码 c 与一个取值 v,使得那场递归在 c 处记录的是 v,而 x 就是 v 所定义的东西。这就是可定义幂集,用对象语言说出来,而载体自始至终待在一位上。

那个旁条件关乎对象语言的量词够得着什么。描述里的每个存在量词都在 L 上取值,故这条描述所挑出的集合只可能装着可构造集。若载体的某个可定义子集不可构造,这条描述仍会被满足,被「诸可构造者之集」满足,而那样它就对一个并非可定义幂集的东西成立了。DefOK 恰是「这道缝不存在」。

调用方握着的载体无须写出这样的条件,因为握着载体的调用方也握着关于它的定理。一位上的载体则是周遭环境往那里放的任何东西,在那层绑定之下没有任何关于它的定理可用,故这件事必须作为假设一路旅行,并在那一位被填上之处解除。它只是消去那一半的假设:引入被给定 u 就是可定义幂集,而 uL 的元素,故它的诸成员本就可构造,它本会需要的那个条件由它自己的假设蕴含。

private
  sh3 :  {n}  Fin n  Fin (suc (suc (suc n)))
  sh3 i = suc (suc (suc i))

DefBody :  {n}  Fin n  Formula S (suc (suc (suc n)))
DefBody w = isCodeAt (suc zero) (sh3 w)
            ∧̇ ( satGraphAt (sh3 w) (suc zero) zero
              ∧̇ DefinesAt (suc (suc zero)) (sh3 w) zero )

DefAt :  {n}  Fin n  Fin n  Formula S n
DefAt u w = extAt u (∃̇ (∃̇ (DefBody w)))

DefOK : S  Type (ℓ-suc )
DefOK A = (x : V )   x  𝒟ₒ (fst A)    isL x 

一条公式,两个方向

描述的两半落在单独一条公式上,而适足性正是由它们装配起来的。为一条公式 ψ 供上那三个合取项,就是把它的键供给码、把递归的取值供给取值;把它们读回来,则是把码解码成一条公式、把取值钉在递归自己的取值上,然后把第三个合取项读作一条集合等式。

此处的一切都陈述在变元载体上、并经一条等式抵达,而正是这一点把阶段挡在证明之外。在某个阶段处的实例化是调用方供上的一条等式,而 Lset 与序数在下面任何地方都不出现。

module _ (A : S) where
  private
    module DA = DefOf (fst A)

    toS : Formula  fst A  1  Formula S 1
    toS ψ = mapFo (asConst A) ψ

    ιA :  fst A   V 
    ιA =  fst A ⟫↪

    ιA∈ : (m :  fst A )   ιA m  fst A 
    ιA∈ m = ∈∈ₛ {a = ιA m} {b = fst A} .snd (∈ₛ⟪ fst A ⟫↪ m)

    Fibre : Formula  fst A  1  V   Type (ℓ-suc )
    Fibre ψ y = Σ[ p  Σ[ m   fst A  ]  DA.smallSat ψ m  ]
                  (ιA (p .fst)  y)

    inSat : (ψ : Formula  fst A  1) (m :  fst A )
            ιA m  DA.defSet ψ 
            envOne (ιA m)  fst (Sat A (toS ψ)) 
    inSat ψ m h = subst ⟨_⟩ (defSet-Sat A ψ m) h

    outSat : (ψ : Formula  fst A  1) (m :  fst A )
             envOne (ιA m)  fst (Sat A (toS ψ)) 
             ιA m  DA.defSet ψ 
    outSat ψ m h = subst ⟨_⟩ (sym (defSet-Sat A ψ m)) h

  fill :  {n} (w : Fin n) (γ : S ^ n)  fst (lookup w γ)  fst A
        (z : S) (ψ : Formula  fst A  1)  DA.defSet ψ  fst z
         (Sat A (toS ψ)  keyS A ψ  z  γ)  DefBody w 
  fill {n} w γ qw z ψ qz = hcode , (hgraph , hdef)
    where
    δ : S ^ (suc (suc (suc n)))
    δ = Sat A (toS ψ)  keyS A ψ  z  γ

    hcode :  δ  isCodeAt (suc zero) (sh3 w) 
    hcode = codeAt-in A (suc zero) (sh3 w) δ qw ψ refl

    hgraph :  δ  satGraphAt (sh3 w) (suc zero) zero 
    hgraph = graphAt-holds A (toS ψ) (sh3 w) (suc zero) zero δ qw
               (keyBridge A ψ) refl

    Holds : S  Type (ℓ-suc )
    Holds y =  fst y  fst (lookup w γ) 
              ×  envOne (fst y)  fst (Sat A (toS ψ)) 

    into : (y : S)   fst y  fst z   Holds y
    into y y∈ = PT.rec
      (isProp× (snd (fst y  fst (lookup w γ)))
               (snd (envOne (fst y)  fst (Sat A (toS ψ)))))
      step (subst  X   fst y  X ) (sym qz) y∈)
      where
      step : Fibre ψ (fst y)  Holds y
      step ((m , hm) , qm) =
          subst  u   u  fst (lookup w γ) ) qm
            (subst  X   ιA m  X ) (sym qw) (ιA∈ m))
        , subst  u   envOne u  fst (Sat A (toS ψ)) ) qm
            (inSat ψ m  (m , hm) , refl ∣₁)

    back : (y : S)  Holds y   fst y  fst z 
    back y (yw , ys) = subst  X   fst y  X ) qz
      (subst  u   u  DA.defSet ψ ) (fib .snd)
        (outSat ψ (fib .fst)
          (subst  u   envOne u  fst (Sat A (toS ψ)) )
            (sym (fib .snd)) ys)))
      where
      fib : Σ[ m   fst A  ] (ιA m  fst y)
      fib = ∈-asFiber {a = fst y} {b = fst A}
        (subst  X   fst y  X ) qw yw)

    hdef :  δ  DefinesAt (suc (suc zero)) (sh3 w) zero 
    hdef = DefinesAt-both (suc (suc zero)) (sh3 w) zero δ into back

  read :  {n} (w : Fin n) (γ : S ^ n)  fst (lookup w γ)  fst A
        (z c v : S)   (v  c  z  γ)  DefBody w 
         (Σ[ ψ  Formula  fst A  1 ] (DA.defSet ψ  fst z)) ∥₁
  read {n} w γ qw z c v (hcode , (hgraph , hdef)) =
    PT.rec squash₁ step (codeAt-out A (suc zero) (sh3 w) δ qw hcode)
    where
    δ : S ^ (suc (suc (suc n)))
    δ = v  c  z  γ

    step : Σ[ ψ  Formula  fst A  1 ] (fst c  fst (keyS A ψ))
           (Σ[ ψ  Formula  fst A  1 ] (DA.defSet ψ  fst z)) ∥₁
    step (ψ , qc) =  ψ , extensionality (DA.defSet ψ) (fst z) (sub₁ , sub₂) ∣₁
      where
      qv : fst v  fst (Sat A (toS ψ))
      qv = graphAt-unique A (toS ψ) (sh3 w) (suc zero) zero δ qw
             (qc  keyBridge A ψ) hgraph

      sub₁ :  DA.defSet ψ  fst z 
      sub₁ y y∈ₛ = ∈∈ₛ {a = y} {b = fst z} .fst
        (PT.rec (snd (y  fst z)) place
          (∈∈ₛ {a = y} {b = DA.defSet ψ} .snd y∈ₛ))
        where
        place : Fibre ψ y   y  fst z 
        place ((m , hm) , qm) =
          DefinesAt-in (suc (suc zero)) (sh3 w) zero δ hdef
            (y , isL-trans {x = fst A} {y = y}
                   (subst  u   u  fst A ) qm (ιA∈ m)) (snd A))
            ( subst  X   y  X ) (sym qw)
                (subst  u   u  fst A ) qm (ιA∈ m))
            , subst  X   envOne y  X ) (sym qv)
                (subst  u   envOne u  fst (Sat A (toS ψ)) ) qm
                  (inSat ψ m  (m , hm) , refl ∣₁)) )

      sub₂ :  fst z  DA.defSet ψ 
      sub₂ y y∈ₛ = ∈∈ₛ {a = y} {b = DA.defSet ψ} .fst
        (subst  u   u  DA.defSet ψ ) (fib .snd)
          (outSat ψ (fib .fst)
            (subst  u   envOne u  fst (Sat A (toS ψ)) ) (sym (fib .snd))
              (subst  X   envOne y  X ) qv (cond .snd)))))
        where
        y∈ :  y  fst z 
        y∈ = ∈∈ₛ {a = y} {b = fst z} .snd y∈ₛ

        yS : S
        yS = y , isL-trans {x = fst z} {y = y} y∈ (snd z)

        cond :  y  fst (lookup w γ)  ×  envOne y  fst v 
        cond = DefinesAt-out (suc (suc zero)) (sh3 w) zero δ hdef yS y∈

        fib : Σ[ m   fst A  ] (ιA m  y)
        fib = ∈-asFiber {a = y} {b = fst A}
          (subst  X   y  X ) qw (cond .fst))

那条描述的两种读法

装配与描述是逐成员的那两半,而两种读法就是它们置于 extAt 自己那两个方向之下。引入说的是可定义幂集满足这条描述:它的每个成员都是一个可定义子集,而那三个合取项为「定义它的那条公式」供上。消去说的是别的东西都不满足,而这正是那个旁条件所为的方向,因为一个「描述对之成立」的集合要被逐成员地重新进入,而一个成员要么以 L 的元素的形式到场,要么根本不到场。

  private
    describe :  {n} (w : Fin n) (γ : S ^ n)  fst (lookup w γ)  fst A
              (z : S)   (z  γ)  ∃̇ (∃̇ (DefBody w)) 
               (Σ[ ψ  Formula  fst A  1 ] (DA.defSet ψ  fst z)) ∥₁
    describe w γ qw z = PT.rec squash₁ viaCode
      where
      Target : Type (ℓ-suc )
      Target =  (Σ[ ψ  Formula  fst A  1 ] (DA.defSet ψ  fst z)) ∥₁

      viaValue : (c : S)
                Σ[ v  S ]  (v  c  z  γ)  DefBody w   Target
      viaValue c (v , hv) = read w γ qw z c v hv

      viaCode : Σ[ c  S ]  (c  z  γ)  ∃̇ (DefBody w)   Target
      viaCode (c , hc) = PT.rec squash₁ (viaValue c) hc

    assemble :  {n} (w : Fin n) (γ : S ^ n)  fst (lookup w γ)  fst A
              (z : S)
               (Σ[ ψ  Formula  fst A  1 ] (DA.defSet ψ  fst z)) ∥₁
               (z  γ)  ∃̇ (∃̇ (DefBody w)) 
    assemble w γ qw z = PT.rec (snd ((z  γ)  ∃̇ (∃̇ (DefBody w)))) step
      where
      step : Σ[ ψ  Formula  fst A  1 ] (DA.defSet ψ  fst z)
             (z  γ)  ∃̇ (∃̇ (DefBody w)) 
      step (ψ , ) =  keyS A ψ ,  Sat A (toS ψ) , fill w γ qw z ψ  ∣₁ ∣₁

  DefAt-in :  {n} (u w : Fin n) (γ : S ^ n)
            fst (lookup w γ)  fst A
            fst (lookup u γ)  𝒟ₒ (fst A)
             γ  DefAt u w 
  DefAt-in {n} u w γ qw qu = extAt-in-both u Φ γ f g
    where
    Φ : Formula S (suc n)
    Φ = ∃̇ (∃̇ (DefBody w))

    f : (z : S)   fst z  fst (lookup u γ)    (z  γ)  Φ 
    f z z∈ = assemble w γ qw z
      (𝒟ₒ-inv (fst A) (fst z) (subst  X   fst z  X ) qu z∈))

    g : (z : S)   (z  γ)  Φ    fst z  fst (lookup u γ) 
    g z hz = subst  X   fst z  X ) (sym qu)
      (𝒟ₒ-intro (fst A) (fst z) (describe w γ qw z hz))

  DefAt-out :  {n} (u w : Fin n) (γ : S ^ n)  DefOK A
             fst (lookup w γ)  fst A
              γ  DefAt u w 
             fst (lookup u γ)  𝒟ₒ (fst A)
  DefAt-out {n} u w γ ok qw h =
    extensionality (fst (lookup u γ)) (𝒟ₒ (fst A)) (sub₁ , sub₂)
    where
    Φ : Formula S (suc n)
    Φ = ∃̇ (∃̇ (DefBody w))

    sub₁ :  fst (lookup u γ)  𝒟ₒ (fst A) 
    sub₁ y y∈ₛ = ∈∈ₛ {a = y} {b = 𝒟ₒ (fst A)} .fst
      (𝒟ₒ-intro (fst A) y (describe w γ qw yS (extAt-out u Φ γ h yS y∈)))
      where
      y∈ :  y  fst (lookup u γ) 
      y∈ = ∈∈ₛ {a = y} {b = fst (lookup u γ)} .snd y∈ₛ

      yS : S
      yS = y , isL-trans {x = fst (lookup u γ)} {y = y} y∈ (snd (lookup u γ))

    sub₂ :  𝒟ₒ (fst A)  fst (lookup u γ) 
    sub₂ y y∈ₛ = ∈∈ₛ {a = y} {b = fst (lookup u γ)} .fst
      (extAt-in u Φ γ h yS
        (assemble w γ qw yS (𝒟ₒ-inv (fst A) y y∈)))
      where
      y∈ :  y  𝒟ₒ (fst A) 
      y∈ = ∈∈ₛ {a = y} {b = 𝒟ₒ (fst A)} .snd y∈ₛ

      yS : S
      yS = y , ok y y∈

落在一个阶段上,那个旁条件随之消失

那次实例化,而它的全部就是一条等式。阶段是 L 的元素,它的诸可定义子集可构造 (因为阶段在下一阶段可构造),而这两件事正是后继恒等式在每个阶段处一并交付的。故那个旁条件一劳永逸地被解除,剩下的是一条真值之间的等价:在一个持有阶段的载体上,这条描述对某个集合成立,恰当那个集合就是该阶段的可定义幂集。它对 𝒟ₒS 成立,对别的什么都不成立。

两条陈述都只把那个阶段当作某一位的取值来提,而这正是内部层级所需要的:那条描述将在一层绑定之下被说出,而调用方供上的那条等式,是唯一把它与某个阶段联系起来的东西。

DefAt-stage : (β : V ) ( : IsOrd β)   {n} (u w : Fin n) (γ : S ^ n)
             fst (lookup w γ)  Lset β
             (γ  DefAt u w)
               ( (fst (lookup u γ)  𝒟ₒ (Lset β))
                , setIsSet (fst (lookup u γ)) (𝒟ₒ (Lset β)) )
DefAt-stage β  u w γ qw = ⇔toPath
  (DefAt-out (LsetS β ) u w γ (𝒟ₒ→isL β ) qw)
  (DefAt-in (LsetS β ) u w γ qw)

DefAt-𝒟ₒS : (β : V ) ( : IsOrd β)   {n} (u w : Fin n) (γ : S ^ n)
           lookup w γ  LsetS β   lookup u γ  𝒟ₒS β 
            γ  DefAt u w 
DefAt-𝒟ₒS β  u w γ qw qu =
  DefAt-in (LsetS β ) u w γ (cong fst qw) (cong fst qu)

小结

DefAt 是可定义幂集在对象语言中、落在一个作为槽位的载体上的描述,而 DefAt-inDefAt-out 是它的两种读法:这个算子满足那条描述,且在 DefOK 之下别的东西都不满足。DefAt-stage 把两者花在一个阶段上,那里旁条件被一劳永逸地解除,而那条描述变成一条真值之间的等式。

三章在此会合,而没有一章被重证。码谓词读在一位上,满足关系的图读在一位上,而可定义子集经那座桥读出,那座桥说的是「递归的取值就是载体之上的满足关系」。新的只有接合处:envOneAt,一行,因为长度为一的环境只是一个对;以及 DefinesAt,它就是 extAt 施于一个两部分的条件。

有两次测量值得留存。相邻那处更正在第一行写下之前就已采纳,且分文未花,故这条路线上任何地方都不存在弱化引理。而写作期间遇上的唯一一堵墙,压根不在数学里:码谓词在被钉住的载体处的消去,若把截断的载荷交给推断,跑过 140 秒并在那里被杀掉;而同样两行,把载荷的类型写出来则两秒检查完毕。此处每一次 PT.rec 都为自己的载荷点名,而这正是本章能在半分钟内、而不是根本无法检查完的原因。