The slot is closed

图将要对它的索引集陈述的那条假设,在「一条公式自己的递归所索引的那个槽」处交付。这是闭包那一章的定理再来一遍,只是落在模型自己的编码上、而非层级的编码上;而它在此处更短,因为它所需的部件是为那两半造的,不是为它造的。

八条子句每一条都是四步:把索引求逆回「它是谁的键」的那条公式、从子句的标签算出那条公式的构造子、把部件的键放回整体的槽里,再沿求逆返回的那条包含关系抬上去。没有子公式的那四个构造子无话可说,也不在这八条之列。

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

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

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

open import FOL.ZFStructure using ( module hPropStructure )
open import FOL.Syntax
  using ( Term; Formula; _∧̇_; _∨̇_; _⇒̇_; ¬̇_; ∃̇_; ∀̇_; ∀̇∈; ∃̇∈ )
import FOL.Absoluteness
open import V.Hierarchy {} using ( 𝒮ᵥ )
open import V.Coding {} using ( pr; pr-inj )
open import L.Constructible {} using ( 𝒮ʟ; isL; isL-trans )
open import L.Coding.Model {}
  using ( module LCode; prʟ; prʟ-fst; closedAt
        ; binSameClosed-in; unSameClosed-in; unSuccClosed-in; binSuccClosed-in
        ; binShapeAt; unShapeAt; bothSameAt; oneSameAt; oneSuccAt; succSndAt )
open import L.Axioms.Numerals {} using ( numeralL; numeralL-fst )
open import L.Coding.Table {} lem
  using ( keyʟ; keyʟ-shape; slot; satTable; slot-inv; module Parts )

import Cubical.HITs.PropositionalTruncation as PT
open import Cubical.Foundations.HLevels using ( isProp× )
open import Cubical.HITs.CumulativeHierarchy.Base using ( V; _∈_ )
open import Cubical.HITs.CumulativeHierarchy.Constructions
  using ( module InfinitySet )
open InfinitySet using ( #_; sucV )

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

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

把部件的键放回去

唯一的那次计算,八条共用:一旦把元数与那个载荷分量认同起来,子句所读的那个对就是部件自己的键。后继的形式是同一件事、元数抬高一级,而那也是那四个绑定变元的构造子造成的唯一差别。

module _ (B : S) where
  private
    Sl :  {n}  Formula S n  S
    Sl = slot B

  key≡ :  {j} (χ : Formula S j) (ar p : V )  # j  ar
        p  fst LCode.⌜ χ   pr ar p  fst (keyʟ χ)
  key≡ {j} χ ar p qa qp =
      cong₂ pr (sym qa) qp
     cong  w  pr w (fst LCode.⌜ χ )) (sym (numeralL-fst j))
     sym (prʟ-fst (numeralL j) LCode.⌜ χ )

  keyS≡ :  {j} (χ : Formula S (suc j)) (ar p : V )  # j  ar
         p  fst LCode.⌜ χ   pr (sucV ar) p  fst (keyʟ χ)
  keyS≡ {j} χ ar p qa qp =
      cong₂ pr (cong sucV (sym qa)) qp
     cong  w  pr w (fst LCode.⌜ χ )) (sym (numeralL-fst (suc j)))
     sym (prʟ-fst (numeralL (suc j)) LCode.⌜ χ )

八条子句

两段共用主体,每个框架一段,再加八次实例化。同一框架下两条子句之间变的是标签、以及那个构造子交回哪个部件,而两者都是参数。

  module _ {n : } (φ : Formula S n) {k : } (γ : S ^ k) where
    private
      δ : S ^ (suc (suc (suc k)))
      δ = B  satTable B φ  Sl φ  γ

      Ci : Fin (suc (suc (suc k)))
      Ci = suc (suc zero)

    binSame : (k' : ) (op :  {m}  Formula S m  Formula S m  Formula S m)
             (∀ {m} (ψ : Formula S m)  LCode.Match k' ψ
                Σ[ a'  Formula S m ] (Σ[ b'  Formula S m ] (ψ  op a' b')))
             (∀ {m} (a' b' : Formula S m)
                LCode.payOf (op a' b')  prʟ LCode.⌜ a'  LCode.⌜ b' )
             (∀ {m} (a' b' : Formula S m) (z : V )
                 z  fst (Sl a')    z  fst (Sl (op a' b')) )
             (∀ {m} (a' b' : Formula S m) (z : V )
                 z  fst (Sl b')    z  fst (Sl (op a' b')) )
              δ  binShapeAt Ci k' (bothSameAt Ci) 
    binSame k' op get payOp inL inR = binSameClosed-in Ci k' δ
       c ar a b c∈ sh  PT.rec
        (isProp× (snd (pr (fst ar) (fst a)  fst (Sl φ)))
                 (snd (pr (fst ar) (fst b)  fst (Sl φ))))
         { (m , ψ , (q , incl)) 
          let r  = keyʟ-shape ψ k' (fst ar) (pr (fst a) (fst b)) (sym q  sh)
              g  = get ψ (r .fst)
              a' = g .fst
              b' = g .snd .fst
               = g .snd .snd
              pay = sym (prʟ-fst LCode.⌜ a'  LCode.⌜ b' )
                   cong fst (sym (payOp a' b'))
                   cong  w  fst (LCode.payOf w)) (sym )  r .snd .snd
              inψ : (χ : Formula S m)   fst (keyʟ χ)  fst (Sl ψ) 
                    fst (keyʟ χ)  fst (Sl φ) 
              inψ χ h = incl (fst (keyʟ χ)) h
          in subst  w   w  fst (Sl φ) )
               (sym (key≡ a' (fst ar) (fst a) (r .snd .fst) (sym (pr-inj pay .fst))))
               (inψ a' (subst  w   fst (keyʟ a')  fst (Sl w) ) (sym )
                 (inL a' b' _ (Parts.self B keyʟ a'))))
           , subst  w   w  fst (Sl φ) )
               (sym (key≡ b' (fst ar) (fst b) (r .snd .fst) (sym (pr-inj pay .snd))))
               (inψ b' (subst  w   fst (keyʟ b')  fst (Sl w) ) (sym )
                 (inR a' b' _ (Parts.self B keyʟ b')))) })
        (slot-inv B φ (fst c) c∈))

    andC :  δ  binShapeAt Ci 2 (bothSameAt Ci) 
    andC = binSame 2 _∧̇_  _ m  m)  _ _  refl)
              a' b'  Parts.left B keyʟ (a' ∧̇ b') a' b')
              a' b'  Parts.right B keyʟ (a' ∧̇ b') a' b')

    orC :  δ  binShapeAt Ci 3 (bothSameAt Ci) 
    orC = binSame 3 _∨̇_  _ m  m)  _ _  refl)
             a' b'  Parts.left B keyʟ (a' ∨̇ b') a' b')
             a' b'  Parts.right B keyʟ (a' ∨̇ b') a' b')

    impC :  δ  binShapeAt Ci 4 (bothSameAt Ci) 
    impC = binSame 4 _⇒̇_  _ m  m)  _ _  refl)
              a' b'  Parts.left B keyʟ (a' ⇒̇ b') a' b')
              a' b'  Parts.right B keyʟ (a' ⇒̇ b') a' b')

    unSame : (k' : ) (op :  {m}  Formula S m  Formula S m)
            (∀ {m} (ψ : Formula S m)  LCode.Match k' ψ
               Σ[ a'  Formula S m ] (ψ  op a'))
            (∀ {m} (a' : Formula S m)  LCode.payOf (op a')  LCode.⌜ a' )
            (∀ {m} (a' : Formula S m) (z : V )
                z  fst (Sl a')    z  fst (Sl (op a')) )
             δ  unShapeAt Ci k' (oneSameAt Ci) 
    unSame k' op get payOp inA = unSameClosed-in Ci k' δ
       c ar a c∈ sh  PT.rec (snd (pr (fst ar) (fst a)  fst (Sl φ)))
         { (m , ψ , (q , incl)) 
          let r  = keyʟ-shape ψ k' (fst ar) (fst a) (sym q  sh)
              g  = get ψ (r .fst)
              a' = g .fst
               = g .snd
              pay = cong fst (sym (payOp a'))
                   cong  w  fst (LCode.payOf w)) (sym )  r .snd .snd
          in subst  w   w  fst (Sl φ) )
               (sym (key≡ a' (fst ar) (fst a) (r .snd .fst) (sym pay)))
               (incl (fst (keyʟ a'))
                 (subst  w   fst (keyʟ a')  fst (Sl w) ) (sym )
                   (inA a' _ (Parts.self B keyʟ a')))) })
        (slot-inv B φ (fst c) c∈))

    unSucc : (k' : ) (op :  {m}  Formula S (suc m)  Formula S m)
            (∀ {m} (ψ : Formula S m)  LCode.Match k' ψ
               Σ[ a'  Formula S (suc m) ] (ψ  op a'))
            (∀ {m} (a' : Formula S (suc m))  LCode.payOf (op a')  LCode.⌜ a' )
            (∀ {m} (a' : Formula S (suc m)) (z : V )
                z  fst (Sl a')    z  fst (Sl (op a')) )
             δ  unShapeAt Ci k' (oneSuccAt Ci) 
    unSucc k' op get payOp inA = unSuccClosed-in Ci k' δ
       c ar a c∈ sh  PT.rec (snd (pr (sucV (fst ar)) (fst a)  fst (Sl φ)))
         { (m , ψ , (q , incl)) 
          let r  = keyʟ-shape ψ k' (fst ar) (fst a) (sym q  sh)
              g  = get ψ (r .fst)
              a' = g .fst
               = g .snd
              pay = cong fst (sym (payOp a'))
                   cong  w  fst (LCode.payOf w)) (sym )  r .snd .snd
          in subst  w   w  fst (Sl φ) )
               (sym (keyS≡ a' (fst ar) (fst a) (r .snd .fst) (sym pay)))
               (incl (fst (keyʟ a'))
                 (subst  w   fst (keyʟ a')  fst (Sl w) ) (sym )
                   (inA a' _ (Parts.self B keyʟ a')))) })
        (slot-inv B φ (fst c) c∈))

    binSucc : (k' : )
             (op :  {m}  Term S m  Formula S (suc m)  Formula S m)
             (∀ {m} (ψ : Formula S m)  LCode.Match k' ψ
                Σ[ t  Term S m ] (Σ[ a'  Formula S (suc m) ] (ψ  op t a')))
             (∀ {m} (t : Term S m) (a' : Formula S (suc m))
                LCode.payOf (op t a')  prʟ LCode.⌜ t ⌝ᵗ LCode.⌜ a' )
             (∀ {m} (t : Term S m) (a' : Formula S (suc m)) (z : V )
                 z  fst (Sl a')    z  fst (Sl (op t a')) )
              δ  binShapeAt Ci k' (succSndAt Ci) 
    binSucc k' op get payOp inA = binSuccClosed-in Ci k' δ
       c ar a b c∈ sh  PT.rec (snd (pr (sucV (fst ar)) (fst b)  fst (Sl φ)))
         { (m , ψ , (q , incl)) 
          let r  = keyʟ-shape ψ k' (fst ar) (pr (fst a) (fst b)) (sym q  sh)
              g  = get ψ (r .fst)
              t  = g .fst
              a' = g .snd .fst
               = g .snd .snd
              pay = sym (prʟ-fst LCode.⌜ t ⌝ᵗ LCode.⌜ a' )
                   cong fst (sym (payOp t a'))
                   cong  w  fst (LCode.payOf w)) (sym )  r .snd .snd
          in subst  w   w  fst (Sl φ) )
               (sym (keyS≡ a' (fst ar) (fst b) (r .snd .fst)
                 (sym (pr-inj pay .snd))))
               (incl (fst (keyʟ a'))
                 (subst  w   fst (keyʟ a')  fst (Sl w) ) (sym )
                   (inA t a' _ (Parts.self B keyʟ a')))) })
        (slot-inv B φ (fst c) c∈))

    negC :  δ  unShapeAt Ci 5 (oneSameAt Ci) 
    negC = unSame 5 ¬̇_  _ m  m)  _  refl)
              a'  Parts.only B keyʟ (¬̇ a') a')

    exC :  δ  unShapeAt Ci 8 (oneSuccAt Ci) 
    exC = unSucc 8 ∃̇_  _ m  m)  _  refl)
             a'  Parts.only B keyʟ (∃̇ a') a')

    allC :  δ  unShapeAt Ci 9 (oneSuccAt Ci) 
    allC = unSucc 9 ∀̇_  _ m  m)  _  refl)
              a'  Parts.only B keyʟ (∀̇ a') a')

    allInC :  δ  binShapeAt Ci 10 (succSndAt Ci) 
    allInC = binSucc 10 ∀̇∈  _ m  m)  _ _  refl)
                t a'  Parts.only B keyʟ (∀̇∈ t a') a')

    exInC :  δ  binShapeAt Ci 11 (succSndAt Ci) 
    exInC = binSucc 11 ∃̇∈  _ m  m)  _ _  refl)
               t a'  Parts.only B keyʟ (∃̇∈ t a') a')

    slotClosed :  δ  closedAt Ci 
    slotClosed = andC , (orC , (impC , (negC
               , (exC , (allC , (allInC , exInC))))))