The graph

递归的那个图说的是:存在一个含有其成员诸子码的索引集、一张在每个索引处作答且满足十二条子句的表,而那个取值就是该表在此索引处记录的东西。

索引集与表被绑定,是因为一个图不可以点名一张尚未交给它的表,而那是内化定理唯一禁止的事:递归才是产出那张表的东西,故定义它的那个图必须对诸表作量化,而不能指着某一张。

载体被绑定则出于另一个理由,而正是那个理由使本章成为「一个框架带两个实例」。每条子句都把载体当作一个槽位、没有一条把它当作词项,故必须有什么东西占住那一位,而什么占得住取决于调用方。手里把载体握作自己一个集合的调用方,用一个常元钉住一个被绑定的变元。而载体本身就是一个被绑定变元的调用方 (内部层级的一个阶段正是如此) 没有可供钉住的常元,因为集合进入公式的唯一方式是被点名。于是那条用来钉住的子句就是框架的参数,而两个实例就是能填进它的那两条子句。

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

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

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

open import FOL.ZFStructure using ( module hPropStructure )
open import FOL.Syntax using ( Formula; var; con; _≐_; _∧̇_; ∃̇_ )
import FOL.Absoluteness
open import V.Hierarchy {} using ( 𝒮ᵥ )
open import V.Coding {} using ( pr )
open import L.Constructible {} using ( 𝒮ʟ; isL; isL-trans )
open import L.Coding.Model {}
  using ( closedAt; domAt; appAt; appAt-adequate
        ; memClauseAt; eqClauseAt; andClauseAt; orClauseAt; impClauseAt
        ; negClauseAt; topClauseAt; botClauseAt; existClauseAt; forallClauseAt
        ; allInClauseAt; exInClauseAt )

import Cubical.HITs.PropositionalTruncation as PT
open PT using ( ∣_∣₁; ∥_∥₁; squash₁ )
open import Cubical.HITs.CumulativeHierarchy.Base using ( _∈_ )

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

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

十二条,与守着它们的三条

诸子句把自己那三个槽位取作实参,而把它们合取起来就是本节的全部。「没有它们诸子句便什么也没说」的那三条假设随之而来:一张在某个复合码处只有一个条目的表满足全部十二条,故封闭性与全性不是装饰。

那个框架依次绑定索引集、表与载体,并以「钉住其中最后一个」的那条子句开头。在那条钉住之下,两个实例之间没有任何东西改变:同样三条守卫、同样十二条、落在同样三个槽位上,而那两个自由槽位越过那三个绑定作平移。

private
  Ci Ti Bi :  {n}  Fin (suc (suc (suc n)))
  Ci = suc (suc zero)
  Ti = suc zero
  Bi = zero

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

twelveAt :  {n}  Fin n  Fin n  Fin n  Formula S n
twelveAt C T B =
  memClauseAt C T B ∧̇ (eqClauseAt C T B
  ∧̇ (andClauseAt C T ∧̇ (orClauseAt C T
  ∧̇ (impClauseAt C T B ∧̇ (negClauseAt C T B
  ∧̇ (topClauseAt C T B ∧̇ (botClauseAt C T
  ∧̇ (existClauseAt C T B ∧̇ (forallClauseAt C T B
  ∧̇ (allInClauseAt C T B ∧̇ exInClauseAt C T B))))))))))

private
  satGraphOn :  {n}  Formula S (suc (suc (suc n)))
              Fin n  Fin n  Formula S n
  satGraphOn pin x y =
    ∃̇ (∃̇ (∃̇ ( pin
            ∧̇ ( closedAt Ci
            ∧̇ ( domAt Ti Ci
            ∧̇ ( appAt Ti (sh3 x) (sh3 y)
            ∧̇ twelveAt Ci Ti Bi ))))))

一个见证是什么

三层嵌套的存在,被摊平来读,落在一个变元环境上、也落在一个以元素形式递交的载体上。这条读法陈述在变元自变量上,而正是它使「递出或消费一个见证」的证明不必在具体集合上钻过三层绑定作代换;环境取作变元也出于同一理由:想把载体取作槽位的消费方,拿不出任何具体环境。

那条用来钉住的子句,是框架自己读不了的唯一一个分量,故它把那条读法取作假设,一个读法一个方向。在两个实例处那条假设都是恒等的,因为「变元等于常元」与「变元等于变元」读出来是底集之间的同一条等式。

private
  GraphWitOn :  {n}  S  Fin n  Fin n  S ^ n  Type (ℓ-suc )
  GraphWitOn W x y γ = Σ[ C  S ] (Σ[ T  S ] (Σ[ b  S ]
    ((fst b  fst W)
     × ( (b  T  C  γ)  closedAt Ci 
        × ( (b  T  C  γ)  domAt Ti Ci 
           × ( pr (fst (lookup x γ)) (fst (lookup y γ))  fst T 
              ×  (b  T  C  γ)  twelveAt Ci Ti Bi ))))))

  module _ {n : } (pin : Formula S (suc (suc (suc n)))) (W : S)
           (x y : Fin n) (γ : S ^ n) where

    graphOn-in : ((b T C : S)  fst b  fst W   (b  T  C  γ)  pin )
                 GraphWitOn W x y γ ∥₁   γ  satGraphOn pin x y 
    graphOn-in rd = PT.map
       { (C , (T , (b , (eb , (hc , (hd , (ha , h12)))))))  C
         ,  T ,  b , (rd b T C eb , (hc , (hd
           , ( subst ⟨_⟩
                 (sym (appAt-adequate Ti (sh3 x) (sh3 y) (b  T  C  γ))) ha
             , h12 )))) ∣₁ ∣₁ })

    graphOn-out : ((b T C : S)   (b  T  C  γ)  pin   fst b  fst W)
                  γ  satGraphOn pin x y    GraphWitOn W x y γ ∥₁
    graphOn-out rd = PT.rec squash₁
       { (C , hT)  PT.rec squash₁
         { (T , hb)  PT.map
           { (b , (eb , (hc , (hd , (ha , h12))))) 
            C , (T , (b , (rd b T C eb , (hc , (hd
              , ( subst ⟨_⟩
                    (appAt-adequate Ti (sh3 x) (sh3 y) (b  T  C  γ)) ha
                , h12 )))))) })
          hb })
        hT })

载体取作槽位

一般的那个实例,也是内部层级将要用的那一个。那条钉住的子句,把图自己绑定的载体等同于周遭环境在给定槽位处所持有的东西,而那个见证靠查那一位说出那是哪个集合。此处没有任何东西是公式点了名的集合,故调用方爱把这个图放在多少层绑定之下都可以。

satGraphAt :  {n}  Fin n  Fin n  Fin n  Formula S n
satGraphAt B x y = satGraphOn (var Bi  var (sh3 B)) x y

GraphWitAt :  {n}  Fin n  Fin n  Fin n  S ^ n  Type (ℓ-suc )
GraphWitAt B x y γ = GraphWitOn (lookup B γ) x y γ

graphAt-in :  {n} (B x y : Fin n) (γ : S ^ n)
             GraphWitAt B x y γ ∥₁   γ  satGraphAt B x y 
graphAt-in B x y γ =
  graphOn-in (var Bi  var (sh3 B)) (lookup B γ) x y γ  _ _ _ e  e)

graphAt-out :  {n} (B x y : Fin n) (γ : S ^ n)
              γ  satGraphAt B x y    GraphWitAt B x y γ ∥₁
graphAt-out B x y γ =
  graphOn-out (var Bi  var (sh3 B)) (lookup B γ) x y γ  _ _ _ h  h)

载体取作常元

同一个框架,只是把常元放到槽位的位置上,落在两个自由变元上;而这正是「按公式索引的那场递归」与「跑在某阶段诸码上的那场递归」共同消费的形式。它按框架尚未存在时的那些类型交付,其见证类型是同一个环境处、同样顺序的同一个元组,故凡是造它或读它的东西,都没有什么要留意的。

satGraph : S  Formula S 2
satGraph B = satGraphOn (var Bi  con B) (suc zero) zero

GraphWit : (B x y : S)  Type (ℓ-suc )
GraphWit B x y = GraphWitOn B (suc zero) zero (y  x  [])

graph-in : (B x y : S)   GraphWit B x y ∥₁   (y  x  [])  satGraph B 
graph-in B x y =
  graphOn-in (var Bi  con B) B (suc zero) zero (y  x  [])  _ _ _ e  e)

graph-out : (B x y : S)   (y  x  [])  satGraph B    GraphWit B x y ∥₁
graph-out B x y =
  graphOn-out (var Bi  con B) B (suc zero) zero (y  x  [])  _ _ _ h  h)