对子公式封闭

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

阅读指南 · 依赖地图

公式编码上的递归需要一个索引集,其中包含每个构造子所要求的直接子公式键。本章先对任意具有 Peel 性质的集合证明七条对象语言闭包条件,再把结果用于公式的实际子公式闭包。

证明之所以短,是因为它所需的两个部分本就是为在此处结合而构造的。闭包的元素是某条公式的键,而该公式自身带有含于其中的闭包;给定构造子形状的键有已知的诸子键,具体是哪几个由该形状的标签算出。故七条子句里的每一条都是同样四步:把元素拆开、读出它的标签、由该标签确定需要什么,再给出该公式自己的闭包早已含有的那些键。

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

open import Base.Prelude

module L.Coding.SubformulaClosure { : Level} where

open import FOL.ZFStructure using ( module hPropStructure )
open import FOL.Syntax using ( 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.Coding.Closure {} using ( closedAt; binShapeAt; unShapeAt; bothSameAt; oneSameAt; oneSuccAt; succSndAt; binSameClosed-in; unSameClosed-in; unSuccClosed-in; binSuccClosed-in )
open import L.Coding.CodeConstructibility {}
  using ( closure; closureL; closure-inv; byTag; Concl; key )

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

open hPropStructure 𝒮ʟ using ( S )

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

作为模型元素的闭包

clo φ 把外部构造的集合 closure f h φ 与其可构造性证明封装起来,使其成为 L 的元素,因而可以在它上面求值 closedAt

module _ {K : Type } (f : K  V ) (h : (k : K)   isL (f k) ) where
  private
    Cl :  {n}  Formula K n  V 
    Cl = closure f h

  clo :  {n}  Formula K n  S
  clo φ = closure f h φ , closureL f h φ

恢复子公式键

Peel C 表示 C 的每个成员都是某个公式的键,而且该公式自身的闭包包含于 C。这恰是根据构造子标签恢复所需直接子公式键的信息。

把它单独陈述出来不是为了整洁。后面有一章从一层里切出一个码集,须为它证同一条封闭性,而那个集合不是任何东西的闭包;它手上有的是「其诸成员即诸键」这条刻画,而 Peel 正是一条刻画所化成的东西。故七条子句只证一次,对任何可剥开的集合成立,而闭包是那两个实例中的头一个,不是主角。

  Peel : V   Type (ℓ-suc )
  Peel C = (x : V )   x  C 
           (Σ[ m   ] Σ[ ψ  Formula K m ]
               ((x  key f h ψ) × ((z : V )   z  Cl ψ    z  C ))) ∥₁

七条闭包子句

辅助构造 sameoneupsndUp 把剥出的公式键转成二元、一元、提升元数及有界量词构造子所需的子键;它们在七个标签上的实例证明七条闭包条件。

剥开所返回的那个截断当场消掉,这是允许的,因为要产出的是一条隶属、或一对隶属,而隶属是命题。

  module _ (D : S) (peel : Peel (fst D)) where
    private
      C : V 
      C = fst D

      viaKey : (k : ) (c : S) (ar p : V )
               fst c  C   fst c  pr ar (pr (# k) p)
              (T : Type (ℓ-suc ))  isProp T
              (Concl f h C k ar p  T)  T
      viaKey k c ar p c∈ sh T pT g = PT.rec pT
         { (m , ψ , q , incl) 
          g (byTag f h C ψ k ar p incl (sym q  sh)) })
        (peel (fst c) c∈)

      same :  {m} (γ : S ^ m) (k : )
            ((ar a b : V )  Concl f h C k ar (pr a b)
                pr ar a  C  ×  pr ar b  C )
             (D  γ)  binShapeAt zero k (bothSameAt zero) 
      same γ k use = binSameClosed-in zero k (D  γ)
         c ar a b c∈ sh 
          viaKey k c (fst ar) (pr (fst a) (fst b)) c∈ sh _
            (isProp× (snd (pr (fst ar) (fst a)  C))
                     (snd (pr (fst ar) (fst b)  C)))
            (use (fst ar) (fst a) (fst b)))

      one :  {m} (γ : S ^ m) (k : )
           ((ar a : V )  Concl f h C k ar a   pr ar a  C )
            (D  γ)  unShapeAt zero k (oneSameAt zero) 
      one γ k use = unSameClosed-in zero k (D  γ)
         c ar a c∈ sh 
          viaKey k c (fst ar) (fst a) c∈ sh _
            (snd (pr (fst ar) (fst a)  C)) (use (fst ar) (fst a)))

      up :  {m} (γ : S ^ m) (k : )
          ((ar a : V )  Concl f h C k ar a   pr (sucV ar) a  C )
           (D  γ)  unShapeAt zero k (oneSuccAt zero) 
      up γ k use = unSuccClosed-in zero k (D  γ)
         c ar a c∈ sh 
          viaKey k c (fst ar) (fst a) c∈ sh _
            (snd (pr (sucV (fst ar)) (fst a)  C)) (use (fst ar) (fst a)))

      sndUp :  {m} (γ : S ^ m) (k : )
             ((ar a b : V )  Concl f h C k ar (pr a b)
                 pr (sucV ar) b  C )
              (D  γ)  binShapeAt zero k (succSndAt zero) 
      sndUp γ k use = binSuccClosed-in zero k (D  γ)
         c ar a b c∈ sh 
          viaKey k c (fst ar) (pr (fst a) (fst b)) c∈ sh _
            (snd (pr (sucV (fst ar)) (fst b)  C))
            (use (fst ar) (fst a) (fst b)))

七条子句的合取

closedOf 把七个标签实例合成任意底层集合满足 Peel 的模型元素的合取 closedAtclosureClosed 提供 closure-inv,得到 clo φ 的结论。

closureClosed 于是就是落在闭包处的那个实例,而它的剥开就是原样的 closure-inv:两条陈述是同一个类型,因为 Peel 本就是照着那条引理的结论读出来的。

    closedOf :  {m} (γ : S ^ m)   (D  γ)  closedAt zero 
    closedOf γ =
        same γ 2  _ a b r  r a b refl)
      , ( same γ 3  _ a b r  r a b refl)
      , ( same γ 4  _ a b r  r a b refl)
      , ( up γ 6  _ _ r  r)
      , ( up γ 7  _ _ r  r)
      , ( sndUp γ 8  _ a b r  r a b refl)
      , sndUp γ 9  _ a b r  r a b refl) )))))

  closureClosed :  {n m} (φ : Formula K n) (γ : S ^ m)
                  (clo φ  γ)  closedAt zero 
  closureClosed φ γ = closedOf (clo φ) (closure-inv f h φ) γ

小结

closedOf 给出对子码递归的索引集所需的假设,并适用于任何可剥开的集合;closureClosed 则将该结论用于闭包。两者都不涉及满足关系:七条子句只说明给定形状的键会引入哪些键,而可剥开的集合恰好包含这些键。

它的代价值得记下,因为满足关系那个实例要付的是同样的形状。四个读式、七行实例化、每个读式一条引理;内容在早一章的 byTag 里,那里把十个构造子与七项要求一次性对上,而不是对上十乘七次。byTag 本就是对着任意目标集写的,这正是此处的一般性免费的原因:闭包从来不是主角,只是头一个被递进来的东西。