对码化有序对分量与有穷公式族量化

可以直接阅读本章,也可以通过阅读指南和依赖地图选择其他路线。

阅读指南 · 依赖地图

本章提供码化公式共用的有穷槽位工具:为深层嵌套的槽位命名,把有穷公式族折叠成合取与析取,并定义拆出码化有序对分量的有界公式及隐藏容器见证的读式。

码化语法需要反复量化一个配对的分量。本章以码化词汇与配对表达式为基础,构造这些量词共用的槽位运算、有界公式与语义读式。塔规格最先使用这些读式,随后码域、满足子句与码化图诸章继续复用。它们都能按分量陈述数学内容,无须重复有界语法所需的容器见证。

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

open import Base.Prelude

module L.Coding.Quantification { : Level} where

open import FOL.ZFStructure using ( module hPropStructure )
open import FOL.Syntax using
  ( Formula; var; _∧̇_; _∨̇_; _⇒̇_; ∃̇∈; ∀̇∈ )
open import FOL.LevyHierarchy using
  ( Δ₀; δ-∧; δ-⇒; δ-∀∈; δ-∃∈ )
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.Absoluteness {} using ( Δ₀-liftFo )
open import L.Coding.PairFormulas {} using ( Δ₀-prAt; ∈pair-introL; ∈pair-introR )
open import L.Coding.Environment {} using ( Δ₀-sucAt )
open import L.Coding.Model {} using ( prAtL; prAtL-adequate )
open import L.Coding.Expressions {} using ( sucAtL; sucAtL-adequate )
open import L.Coding.Model {} using ( container )
import L.Coding.Expressions {} as CodingExpressions
module E = CodingExpressions.PairExpression

open import Cubical.Data.Nat using ( _+_ )
open import Cubical.Data.Vec using ( _∷_; lookup )
open import Cubical.Data.Sigma using ( _×_ )
open import Cubical.Data.Sum using ( inl; inr )
import Cubical.HITs.PropositionalTruncation as PT
open PT using ( ∥_∥₁; ∣_∣₁; squash₁ )
open import Cubical.HITs.CumulativeHierarchy.Base using ( V; _∈_ )
open import Cubical.HITs.CumulativeHierarchy.Constructions
  using ( ⁅_,_⁆; ⁅_⁆s; module InfinitySet )
open InfinitySet {} using ( sucV )

open hPropStructure 𝒮ʟ using ( S )

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

槽位索引与基本读式

移位运算与具名内部槽位组织深层嵌套的绑定,而有序对与后继读式把相应原子公式读回为集合等式。

英文原文

Slot arithmetic. sh k pushes an outer slot past k binders; the names i0 .. i19 are the innermost slots at any arity.

i0 :  {j}  Fin (suc j)
i0 = zero
i1 :  {j}  Fin (2 + j)
i1 = suc i0
i2 :  {j}  Fin (3 + j)
i2 = suc i1
i3 :  {j}  Fin (4 + j)
i3 = suc i2

pr-out :  {m} (q u v : Fin m) (γ : S ^ m)   γ  prAtL q u v 
        fst (lookup q γ)  pr (fst (lookup u γ)) (fst (lookup v γ))
pr-out q u v γ h = subst ⟨_⟩ (prAtL-adequate q u v γ) h

pr-in :  {m} (q u v : Fin m) (γ : S ^ m)
       fst (lookup q γ)  pr (fst (lookup u γ)) (fst (lookup v γ))
        γ  prAtL q u v 
pr-in q u v γ e = subst ⟨_⟩ (sym (prAtL-adequate q u v γ)) e

down : (x : S) (y : V )   y  fst x   S
down x y h = y , isL-trans {x = fst x} {y = y} h (snd x)
英文原文

The components of a pair held as an element of L, as elements of L.

fstS sndS : (x : S) (u v : V )  fst x  pr u v  S
fstS x u v e = down (down x  u , v  (subst  z    u , v   z ) (sym e) (∈pair-introR {u =  u ⁆s} {v =  u , v } refl))) u (∈pair-introL {u = u} {v = v} refl)
sndS x u v e = down (down x  u , v  (subst  z    u , v   z ) (sym e) (∈pair-introR {u =  u ⁆s} {v =  u , v } refl))) v (∈pair-introR {u = u} {v = v} refl)
sh :  {m} (k : )  Fin m  Fin (k + m)
sh zero i = i
sh (suc k) i = suc (sh k i)

i4 :  {j}  Fin (5 + j)
i4 = suc i3
i5 :  {j}  Fin (6 + j)
i5 = suc i4
i6 :  {j}  Fin (7 + j)
i6 = suc i5
i7 :  {j}  Fin (8 + j)
i7 = suc i6
i8 :  {j}  Fin (9 + j)
i8 = suc i7
i9 :  {j}  Fin (10 + j)
i9 = suc i8
i10 :  {j}  Fin (11 + j)
i10 = suc i9
i11 :  {j}  Fin (12 + j)
i11 = suc i10
i12 :  {j}  Fin (13 + j)
i12 = suc i11
i13 :  {j}  Fin (14 + j)
i13 = suc i12
i14 :  {j}  Fin (15 + j)
i14 = suc i13
i15 :  {j}  Fin (16 + j)
i15 = suc i14
i16 :  {j}  Fin (17 + j)
i16 = suc i15
i17 :  {j}  Fin (18 + j)
i17 = suc i16
i18 :  {j}  Fin (19 + j)
i18 = suc i17
i19 :  {j}  Fin (20 + j)
i19 = suc i18

十个具名槽位与有穷联结词折叠

模式 f0f9 命名构造子族使用的十个位置,而 bigOrbigAnd 把任意非空有穷公式族折叠起来。相应读式选出一个析取项或恢复每个合取项,并不依赖任何特定编码方案。

pattern f0 = zero
pattern f1 = suc f0
pattern f2 = suc f1
pattern f3 = suc f2
pattern f4 = suc f3
pattern f5 = suc f4
pattern f6 = suc f5
pattern f7 = suc f6
pattern f8 = suc f7
pattern f9 = suc f8

bigOr bigAnd :  {m} (n : )  (Fin (suc n)  Formula S m)  Formula S m
bigOr 0 φ = φ zero
bigOr (suc n) φ = φ zero ∨̇ bigOr n  k  φ (suc k))
bigAnd 0 φ = φ zero
bigAnd (suc n) φ = φ zero ∧̇ bigAnd n  k  φ (suc k))

module _ {m : } (γ : S ^ m) where
  bigOr-in : (n : ) (φ : Fin (suc n)  Formula S m) (k : Fin (suc n))
             γ  φ k    γ  bigOr n φ 
  bigOr-in 0 φ zero h = h
  bigOr-in (suc n) φ zero h =  inl h ∣₁
  bigOr-in (suc n) φ (suc k) h =  inr (bigOr-in n  j  φ (suc j)) k h) ∣₁

  bigOr-out : (n : ) (φ : Fin (suc n)  Formula S m)   γ  bigOr n φ 
              Σ[ k  Fin (suc n) ]  γ  φ k  ∥₁
  bigOr-out 0 φ h =  zero , h ∣₁
  bigOr-out (suc n) φ = PT.rec squash₁
     { (inl h)   zero , h ∣₁
       ; (inr h)  PT.map  { (k , hk)  suc k , hk }) (bigOr-out n  j  φ (suc j)) h) })

  bigAnd-in : (n : ) (φ : Fin (suc n)  Formula S m)
             ((k : Fin (suc n))   γ  φ k )   γ  bigAnd n φ 
  bigAnd-in 0 φ h = h zero
  bigAnd-in (suc n) φ h = h zero , bigAnd-in n  j  φ (suc j))  k  h (suc k))

  bigAnd-out : (n : ) (φ : Fin (suc n)  Formula S m)   γ  bigAnd n φ 
              (k : Fin (suc n))   γ  φ k 
  bigAnd-out 0 φ h zero = h
  bigAnd-out (suc n) φ h zero = h .fst
  bigAnd-out (suc n) φ h (suc k) = bigAnd-out n  j  φ (suc j)) (h .snd) k

有界原子与后继语义

有序对与后继原子取得 Δ₀ 见证,而 suc-outsuc-in 给出变元环境处的两个语义方向。

英文原文

The atoms and their certificates.

Δ₀-prAtL :  {m} (q u v : Fin m)  Δ₀ (prAtL q u v)
Δ₀-prAtL q u v = Δ₀-liftFo _ (Δ₀-prAt q u v)

Δ₀-sucAtL :  {m} (i j : Fin m)  Δ₀ (sucAtL i j)
Δ₀-sucAtL i j = Δ₀-liftFo _ (Δ₀-sucAt i j)
英文原文

The successor reader, both ways, at a variable environment.

suc-out :  {m} (i j : Fin m) (γ : S ^ m)   γ  sucAtL i j 
         fst (lookup j γ)  sucV (fst (lookup i γ))
suc-out i j γ h = subst ⟨_⟩ (sucAtL-adequate i j γ) h

suc-in :  {m} (i j : Fin m) (γ : S ^ m)
        fst (lookup j γ)  sucV (fst (lookup i γ))   γ  sucAtL i j 
suc-in i j γ e = subst ⟨_⟩ (sym (sucAtL-adequate i j γ)) e

对有序对分量的有界量化

四个宏 sndExsndAllbothExbothAll 通过内部容器绑定有序对分量;它们给出的存在与全称形式均保持为 Δ₀。

英文原文

The pair as a container. Both components of pr u v lie in the member ⁅ u , v ⁆ of it. This is what lets a Δ₀ formula bind the components of a pair it holds, with no ambient bound at all.

英文原文

The opaque pair container is supplied by L.Coding.Model and shared with its structural pair-expression reader.

英文原文

The destructors. Four macros bind the components of a pair held at a slot: the second component alone (the first is a slot already), or both, each under an existential or a universal. The body sits at v ∷ s ∷ γ, or at v ∷ u ∷ s ∷ γ, with s the container. Every reader is at a variable environment; the container is junk the reader supplies.

sndEx :  {m}  Fin m  Fin m  Formula S (2 + m)  Formula S m
sndEx x u body =
  ∃̇∈ (var x) (∃̇∈ (var i0) (prAtL (sh 2 x) (sh 2 u) i0 ∧̇ body))

sndAll :  {m}  Fin m  Fin m  Formula S (2 + m)  Formula S m
sndAll x u body =
  ∀̇∈ (var x) (∀̇∈ (var i0) (prAtL (sh 2 x) (sh 2 u) i0 ⇒̇ body))

bothEx :  {m}  Fin m  Formula S (3 + m)  Formula S m
bothEx x body =
  ∃̇∈ (var x) (∃̇∈ (var i0) (∃̇∈ (var i1) (prAtL (sh 3 x) i1 i0 ∧̇ body)))

bothAll :  {m}  Fin m  Formula S (3 + m)  Formula S m
bothAll x body =
  ∀̇∈ (var x) (∀̇∈ (var i0) (∀̇∈ (var i1) (prAtL (sh 3 x) i1 i0 ⇒̇ body)))

Δ₀-sndEx :  {m} (x u : Fin m) (body : Formula S (2 + m))  Δ₀ body  Δ₀ (sndEx x u body)
Δ₀-sndEx x u body d = δ-∃∈ (δ-∃∈ (δ-∧ (Δ₀-prAtL (sh 2 x) (sh 2 u) i0) d))

Δ₀-sndAll :  {m} (x u : Fin m) (body : Formula S (2 + m))  Δ₀ body  Δ₀ (sndAll x u body)
Δ₀-sndAll x u body d = δ-∀∈ (δ-∀∈ (δ-⇒ (Δ₀-prAtL (sh 2 x) (sh 2 u) i0) d))

Δ₀-bothAll :  {m} (x : Fin m) (body : Formula S (3 + m))  Δ₀ body  Δ₀ (bothAll x body)
Δ₀-bothAll x body d = δ-∀∈ (δ-∀∈ (δ-∀∈ (δ-⇒ (Δ₀-prAtL (sh 3 x) i1 i0) d)))

module _ {m : } (x u : Fin m) (body : Formula S (2 + m)) (γ : S ^ m) where
  private
    X = fst (lookup x γ)
    U = fst (lookup u γ)

读取分量量词

存在式的 out 引理从满足关系返回分量数据的命题截断,只记录合适分量的仅仅存在性;全称式读引理则接收明确的分量。相应的 in 引理从明确的数据重建满足关系,并应用有序对的单射性得到相应的取值等式。

英文原文

Out: the witness's second component is pinned by pair injectivity.

  sndEx-out :  γ  sndEx x u body 
              Σ[ v  S ] Σ[ s  S ] ((X  pr U (fst v)) ×  (v  s  γ)  body ) ∥₁
  sndEx-out = PT.rec squash₁  { (s , (s∈ , h))  PT.map
     { (v , (v∈ , (e , hb)))  v , s , (pr-out (sh 2 x) (sh 2 u) i0 (v  s  γ) e , hb) })
    h })

  sndEx-in : (v s : S)   fst s  X    fst v  fst s   X  pr U (fst v)
             (v  s  γ)  body    γ  sndEx x u body 
  sndEx-in v s s∈ v∈ e hb =  s , (s∈ ,  v , (v∈ , (pr-in (sh 2 x) (sh 2 u) i0 (v  s  γ) e , hb)) ∣₁) ∣₁

  sndAll-out :  γ  sndAll x u body 
              (v s : S)   fst s  X    fst v  fst s   X  pr U (fst v)
               (v  s  γ)  body 
  sndAll-out h v s s∈ v∈ e = h s s∈ v v∈ (pr-in (sh 2 x) (sh 2 u) i0 (v  s  γ) e)

  sndAll-in : ((v s : S)   fst s  X    fst v  fst s   X  pr U (fst v)
                 (v  s  γ)  body )
              γ  sndAll x u body 
  sndAll-in k s s∈ v v∈ e = k v s s∈ v∈ (pr-out (sh 2 x) (sh 2 u) i0 (v  s  γ) e)

module _ {m : } (x : Fin m) (body : Formula S (3 + m)) (γ : S ^ m) where
  private
    X = fst (lookup x γ)

  bothEx-out :  γ  bothEx x body 
               Σ[ u  S ] Σ[ v  S ] Σ[ s  S ]
                 ((X  pr (fst u) (fst v)) ×  (v  u  s  γ)  body ) ∥₁
  bothEx-out = PT.rec squash₁  { (s , (s∈ , h))  PT.rec squash₁
     { (u , (u∈ , h'))  PT.map
       { (v , (v∈ , (e , hb)))  u , v , s , (pr-out (sh 3 x) i1 i0 (v  u  s  γ) e , hb) })
      h' })
    h })

  bothEx-in : (u v s : S)   fst s  X    fst u  fst s    fst v  fst s 
             X  pr (fst u) (fst v)   (v  u  s  γ)  body    γ  bothEx x body 
  bothEx-in u v s s∈ u∈ v∈ e hb =
     s , (s∈ ,  u , (u∈ ,  v , (v∈ , (pr-in (sh 3 x) i1 i0 (v  u  s  γ) e , hb)) ∣₁) ∣₁) ∣₁

  bothAll-out :  γ  bothAll x body 
               (u v s : S)   fst s  X    fst u  fst s    fst v  fst s 
               X  pr (fst u) (fst v)   (v  u  s  γ)  body 
  bothAll-out h u v s s∈ u∈ v∈ e = h s s∈ u u∈ v v∈ (pr-in (sh 3 x) i1 i0 (v  u  s  γ) e)

  bothAll-in : ((u v s : S)   fst s  X    fst u  fst s    fst v  fst s 
                 X  pr (fst u) (fst v)   (v  u  s  γ)  body )
               γ  bothAll x body 
  bothAll-in k s s∈ u u∈ v v∈ e = k u v s s∈ u∈ v∈ (pr-out (sh 3 x) i1 i0 (v  u  s  γ) e)

供应容器见证

fillSndfillBothuseSnduseBoth 从有序对等式自动构造内部容器,使调用方只须推理其分量。

英文原文

Supplying the junk: a pair at a slot, with its components as elements, fills any of the four.

module _ {m : } (x : Fin m) (γ : S ^ m) (u v : S)
         (e : fst (lookup x γ)  pr (fst u) (fst v)) where
  private
    c = container (lookup x γ) u v e

  fillSnd : (body : Formula S (2 + m))   (v  c .fst  γ)  body 
           (ui : Fin m)  fst (lookup ui γ)  fst u   γ  sndEx x ui body 
  fillSnd body hb ui qu = sndEx-in x ui body γ v (c .fst) (c .snd .fst) (c .snd .snd .snd)
    (e  cong  w  pr w (fst v)) (sym qu)) hb

  fillBoth : (body : Formula S (3 + m))   (v  u  c .fst  γ)  body 
             γ  bothEx x body 
  fillBoth body hb = bothEx-in x body γ u v (c .fst) (c .snd .fst) (c .snd .snd .fst)
    (c .snd .snd .snd) e hb

  useSnd : (body : Formula S (2 + m)) (ui : Fin m)  fst (lookup ui γ)  fst u
           γ  sndAll x ui body    (v  c .fst  γ)  body 
  useSnd body ui qu h = sndAll-out x ui body γ h v (c .fst) (c .snd .fst) (c .snd .snd .snd)
    (e  cong  w  pr w (fst v)) (sym qu))

  useBoth : (body : Formula S (3 + m))   γ  bothAll x body 
            (v  u  c .fst  γ)  body 
  useBoth body h = bothAll-out x body γ h u v (c .fst) (c .snd .fst) (c .snd .snd .fst)
    (c .snd .snd .snd) e

回顾

具名槽位与有穷联结词折叠组织反复出现的公式族。本章的有界配对公式揭示码化有序对的一个或两个分量,相应读式恢复这些分量的语义,而填充引理隐藏了在较大公式中复用这些读式时所需的容器见证。