Satisfaction, one formula at a time

表将要记录的那个取值。给定元语言的一条公式,以及诸环境所落之上的 L 的一个集合,这就是满足它的那些环境构成的集合,沿公式递归造出。

此处没有任何内部的东西。递归沿一条 Agda 看得见的公式进行,故每一步都可以把前几步产出的集合以常元点名,而对象语言从不必对码作量化。正是这一点使每一步只是「在周遭集合上作一次分离」,也正是这一点使内部递归那十二条子句到来时成为等式而非定义。

出于同样理由,此处的原子比内部子句短。元语言的一个词项要么是变元、要么是常元,而递归知道是哪个,故读它取值的读式只有一种情形,不是两种。

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

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

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

open import FOL.ZFStructure using ( module hPropStructure )
open import FOL.Syntax
  using ( Term; con; var; Formula
        ; _∈̇_; _≐_; _∧̇_; _∨̇_; _⇒̇_; ¬̇_; ⊤̇; ⊥̇; ∃̇_; ∀̇_; ∀̇∈; ∃̇∈ )
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.Axioms.Full {} lem using ( hasSeparationL )
open import L.Coding.Model {} using ( appAt; appAt-adequate; consAtL; numL )
open import L.Coding.EnvSet {} lem using ( envSet )

open import Cubical.Data.FinData using ( toℕ )
import Cubical.HITs.PropositionalTruncation as PT
open PT using ( ∣_∣₁; ∥_∥₁; squash₁ )
open import Cubical.HITs.CumulativeHierarchy.Base using ( _∈_ )
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 _⊨_ )

读一个递归看得见的词项

两条子句,而适用哪一条由元语言决定,不由对象语言去匹配标签。变元的取值是环境在它序号处记录的东西;常元的取值就是它自己。

private
  nn :   S
  nn k = # k , numL k

tmIs :  {n m}  Term S n  Fin m  Fin m  Formula S m
tmIs (var i) v e =
  ∃̇ ((var zero  con (nn (toℕ i))) ∧̇ appAt (suc e) zero (suc v))
tmIs (con c) v e = var v  con c

tmIs-var-in :  {n m} (i : Fin n) (γ : S ^ m) (v e : Fin m)
              pr (# (toℕ i)) (fst (lookup v γ))  fst (lookup e γ) 
              γ  tmIs {n} (var i) v e 
tmIs-var-in i γ v e h =  nn (toℕ i)
  , ( refl
    , subst ⟨_⟩ (sym (appAt-adequate (suc e) zero (suc v) (nn (toℕ i)  γ))) h ) ∣₁

tmIs-var-out :  {n m} (i : Fin n) (γ : S ^ m) (v e : Fin m)
               γ  tmIs {n} (var i) v e 
               pr (# (toℕ i)) (fst (lookup v γ))  fst (lookup e γ) 
tmIs-var-out i γ v e = PT.rec
  (snd (pr (# (toℕ i)) (fst (lookup v γ))  fst (lookup e γ)))
   { (x , (qx , m)) 
    subst  w   pr w (fst (lookup v γ))  fst (lookup e γ) ) qx
      (subst ⟨_⟩ (appAt-adequate (suc e) zero (suc v) (x  γ)) m) })

那个取值

十二条子句,每条都是在周遭集合上作一次分离。命题的那几条把它们下面的诸取值点名,再用对象语言自己的联结词把它们合起来;蕴含那一条因此是 Heyting 箭头,而非「并的补」:写内部诸子句的那一章出于同样理由作了同样的选择,而两者必须一致。

两个量词把载体的一个成员接到环境头上,再问结果是否落在下面那个取值之中,而后者高一个元数。两个有界量词做同样的事,而那个成员取自载体、由界项的取值设防,不是单取自那个取值。单取自那个取值是错的,理由与它在内部诸子句里曾经错的理由相同 (那次由一次审计抓出):界的成员未必是载体的成员,于是被接上去的环境根本不是环境,两侧也就对不上。

private
  opaque
    sep : (a : S)  Formula S 1  S
    sep a φ = hasSeparationL a φ .fst .fst

    sep-mem : (a : S) (φ : Formula S 1) (x : S)
             (x ∈ˢ sep a φ)  ((x ∈ˢ a)  ((x  [])  φ))
    sep-mem a φ = hasSeparationL a φ .fst .snd

module _ (B : S) where
  cond :  {n}  Formula S n  Formula S 1

  Sat :  {n}  Formula S n  S
  Sat {n} φ = sep (envSet B n) (cond φ)

  Sat-mem :  {n} (φ : Formula S n) (x : S)
           (x ∈ˢ Sat φ)  ((x ∈ˢ envSet B n)  ((x  [])  cond φ))
  Sat-mem {n} φ = sep-mem (envSet B n) (cond φ)

  cond (t ∈̇ u) =
    (∃̇ (∃̇ ( tmIs t (suc zero) (suc (suc zero))
          ∧̇ ( tmIs u zero (suc (suc zero))
          ∧̇ (var (suc zero) ∈̇ var zero) ))))
  cond (t  u) =
    (∃̇ (∃̇ ( tmIs t (suc zero) (suc (suc zero))
          ∧̇ ( tmIs u zero (suc (suc zero))
          ∧̇ (var (suc zero)  var zero) ))))
  cond (a ∧̇ b) =
    ((var zero ∈̇ con (Sat a)) ∧̇ (var zero ∈̇ con (Sat b)))
  cond (a ∨̇ b) =
    ((var zero ∈̇ con (Sat a)) ∨̇ (var zero ∈̇ con (Sat b)))
  cond (a ⇒̇ b) =
    ((var zero ∈̇ con (Sat a)) ⇒̇ (var zero ∈̇ con (Sat b)))
  cond (¬̇ a) = ¬̇ (var zero ∈̇ con (Sat a))
  cond ⊤̇ = ⊤̇
  cond ⊥̇ = ⊥̇
  cond (∃̇ a) =
    (∃̇∈ (con B) (∃̇ ( consAtL zero (suc zero) (suc (suc zero))
                  ∧̇ (var zero ∈̇ con (Sat a)) )))
  cond (∀̇ a) =
    (∀̇∈ (con B) (∀̇ ( consAtL zero (suc zero) (suc (suc zero))
                  ⇒̇ (var zero ∈̇ con (Sat a)) )))
  cond (∀̇∈ t a) =
    (∀̇ ( tmIs t zero (suc zero)
      ⇒̇ ∀̇∈ (con B) ( (var zero ∈̇ var (suc zero))
                   ⇒̇ ∀̇ ( consAtL zero (suc zero) (suc (suc (suc zero)))
                       ⇒̇ (var zero ∈̇ con (Sat a)) ) ) ))
  cond (∃̇∈ t a) =
    (∃̇ ( tmIs t zero (suc zero)
      ∧̇ ∃̇∈ (con B) ( (var zero ∈̇ var (suc zero))
                   ∧̇ ∃̇ ( consAtL zero (suc zero) (suc (suc (suc zero)))
                       ∧̇ (var zero ∈̇ con (Sat a)) ) ) ))

每条子句说了什么

诸成员等式,每个构造子一条,也是本章除那个取值本身之外唯一导出的东西。它们是内部诸子句将被对照的对象:一条内部子句说「被记录的取值与被记录的诸子取值处于某种关系」,而这些说的是同一件事、只不过对象是此处造出的诸取值;故验证一条子句就是沿其中之一把另一条搬过去。

每一条都是那次分离自己的规格,且构造子的条件已代入,这就是它们一条一行的原因。

  CondAtom :  {n}  Term S n  Term S n
            (S  S  Type (ℓ-suc ))  S  Type (ℓ-suc )
  CondAtom t u R z = Σ[ v  S ] (Σ[ w  S ]
    ( (w  v  z  [])  tmIs t (suc zero) (suc (suc zero)) 
     × ( (w  v  z  [])  tmIs u zero (suc (suc zero))  × R v w)))

  cond∈-in :  {n} (t u : Term S n) (z : S)
             CondAtom t u  v w   fst v  fst w ) z ∥₁
             (z  [])  cond (t ∈̇ u) 
  cond∈-in t u z = PT.map  { (v , (w , r))  v ,  w , r ∣₁ })

  cond∈-out :  {n} (t u : Term S n) (z : S)
              (z  [])  cond (t ∈̇ u) 
              CondAtom t u  v w   fst v  fst w ) z ∥₁
  cond∈-out t u z = PT.rec squash₁
     { (v , hv)  PT.map  { (w , r)  v , (w , r) }) hv })

  cond≐-in :  {n} (t u : Term S n) (z : S)
             CondAtom t u  v w  fst v  fst w) z ∥₁
             (z  [])  cond (t  u) 
  cond≐-in t u z = PT.map  { (v , (w , r))  v ,  w , r ∣₁ })

  cond≐-out :  {n} (t u : Term S n) (z : S)
              (z  [])  cond (t  u) 
              CondAtom t u  v w  fst v  fst w) z ∥₁
  cond≐-out t u z = PT.rec squash₁
     { (v , hv)  PT.map  { (w , r)  v , (w , r) }) hv })

  CondQuant :  {n}  Formula S (suc n)  S  Type (ℓ-suc )
  CondQuant a z = Σ[ x  S ] ( fst x  fst B 
    × (Σ[ e'  S ] ( (e'  x  z  [])  consAtL zero (suc zero) (suc (suc zero)) 
                    ×  fst e'  fst (Sat a) )))

  cond∃-in :  {n} (a : Formula S (suc n)) (z : S)
             CondQuant a z ∥₁   (z  [])  cond (∃̇ a) 
  cond∃-in a z = PT.map  { (x , (x∈ , (e' , r)))  x , (x∈ ,  e' , r ∣₁) })

  cond∃-out :  {n} (a : Formula S (suc n)) (z : S)
              (z  [])  cond (∃̇ a)    CondQuant a z ∥₁
  cond∃-out a z = PT.rec squash₁
     { (x , (x∈ , hv))  PT.map  { (e' , r)  x , (x∈ , (e' , r)) }) hv })

  cond∀-in :  {n} (a : Formula S (suc n)) (z : S)
            ((x e' : S)   fst x  fst B 
                (e'  x  z  [])  consAtL zero (suc zero) (suc (suc zero)) 
                fst e'  fst (Sat a) )
             (z  [])  cond (∀̇ a) 
  cond∀-in a z k x x∈ e' hc = k x e' x∈ hc

  cond∀-out :  {n} (a : Formula S (suc n)) (z : S)
              (z  [])  cond (∀̇ a) 
             ((x e' : S)   fst x  fst B 
                 (e'  x  z  [])  consAtL zero (suc zero) (suc (suc zero)) 
                 fst e'  fst (Sat a) )
  cond∀-out a z h x e' x∈ hc = h x x∈ e' hc

  CondBnd :  {n}  Formula S (suc n)  S  S  Type (ℓ-suc )
  CondBnd a z w = Σ[ x  S ] (( fst x  fst B  ×  fst x  fst w )
    × (Σ[ e'  S ]
        ( (e'  x  w  z  [])  consAtL zero (suc zero) (suc (suc (suc zero))) 
         ×  fst e'  fst (Sat a) )))

  cond∃∈-in :  {n} (t : Term S n) (a : Formula S (suc n)) (z : S)
              (Σ[ w  S ] ( (w  z  [])  tmIs t zero (suc zero) 
                             ×  CondBnd a z w ∥₁)) ∥₁
              (z  [])  cond (∃̇∈ t a) 
  cond∃∈-in t a z = PT.map
     { (w , (hw , hx))  w , (hw , PT.map
       { (x , ((x∈B , x∈w) , (e' , r)))  x , (x∈B , (x∈w ,  e' , r ∣₁)) })
      hx) })

  cond∃∈-out :  {n} (t : Term S n) (a : Formula S (suc n)) (z : S)
               (z  [])  cond (∃̇∈ t a) 
               (Σ[ w  S ] ( (w  z  [])  tmIs t zero (suc zero) 
                              ×  CondBnd a z w ∥₁)) ∥₁
  cond∃∈-out t a z = PT.map
     { (w , (hw , hx))  w , (hw , PT.rec squash₁
       { (x , (x∈B , (x∈w , hv)))  PT.map
         { (e' , r)  x , ((x∈B , x∈w) , (e' , r)) }) hv })
      hx) })

  cond∀∈-in :  {n} (t : Term S n) (a : Formula S (suc n)) (z : S)
             ((w : S)   (w  z  [])  tmIs t zero (suc zero) 
                (x e' : S)   fst x  fst B    fst x  fst w 
                 (e'  x  w  z  [])
                     consAtL zero (suc zero) (suc (suc (suc zero))) 
                 fst e'  fst (Sat a) )
              (z  [])  cond (∀̇∈ t a) 
  cond∀∈-in t a z k w hw x x∈B x∈w e' hc = k w hw x e' x∈B x∈w hc

  cond∀∈-out :  {n} (t : Term S n) (a : Formula S (suc n)) (z : S)
               (z  [])  cond (∀̇∈ t a) 
              ((w : S)   (w  z  [])  tmIs t zero (suc zero) 
                 (x e' : S)   fst x  fst B    fst x  fst w 
                  (e'  x  w  z  [])
                      consAtL zero (suc zero) (suc (suc (suc zero))) 
                  fst e'  fst (Sat a) )
  cond∀∈-out t a z h w hw x e' x∈B x∈w hc = h w hw x x∈B x∈w e' hc