可以直接阅读本章,也可以通过交互式目录和依赖图选择其他路线。
交互式目录 · 依赖图固定宇宙层级 ℓ。保留这个层级参数,使构造可以在所需的各个大小处实例化,而不必把不同的宇宙视为同一个。
module L.Coding.SubformulaClosure {ℓ : Level} where
公式编码上的递归需要一个索引集,其中包含每个构造子所要求的直接子公式键。本章先对任意具有 Peel 性质的集合证明七条对象语言闭包条件,再把结果用于公式的实际子公式闭包。
证明之所以短,是因为它所需的两个部分本就是为在此处结合而构造的。闭包的元素是某条公式的键,而该公式自身带有含于其中的闭包;给定构造子形状的键有已知的诸子键,具体是哪几个由该形状的标签算出。故七条子句里的每一条都是同样四步:把元素拆开、读出它的标签、由该标签确定需要什么,再给出该公式自己的闭包早已含有的那些键。
open import Cubical.HITs.CumulativeHierarchy.Base using ( V; _∈_ )
open import Cubical.HITs.CumulativeHierarchy.Constructions using ( module InfinitySet )
open InfinitySet using ( #_; sucV )
open hPropView 𝒮ʟ 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 ⟩))) ∥₁
七条闭包子句
辅助构造 same、one、up 与 sndUp 把剥出的公式键转成二元、一元、提升元数及有界量词构造子所需的子键;它们在七个标签上的实例证明七条闭包条件。
剥开所返回的那个截断当场消掉,这是允许的,因为要产出的是一条成员关系、或一对成员关系,而成员关系是命题。
module _ (D : S) (peel : Peel (D .fst)) where
private
C : V ℓ
C = D .fst
viaKey : (k : ℕ) (c : S) (ar p : V ℓ)
→ ⟨ c .fst ∈ C ⟩ → c .fst ≡ 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 = rec₁ pT
(λ { (m , ψ , q , incl) →
g (byTag f h C ψ k ar p incl (sym q ∙ sh)) })
(peel (c .fst) c∈)
same : ∀ {m} (γ : Vec 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 (ar .fst) (pr (a .fst) (b .fst)) c∈ sh _
(isProp× ((pr (ar .fst) (a .fst) ∈ C) .snd)
((pr (ar .fst) (b .fst) ∈ C) .snd))
(use (ar .fst) (a .fst) (b .fst)))
one : ∀ {m} (γ : Vec 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 (ar .fst) (a .fst) c∈ sh _
((pr (ar .fst) (a .fst) ∈ C) .snd) (use (ar .fst) (a .fst)))
up : ∀ {m} (γ : Vec 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 (ar .fst) (a .fst) c∈ sh _
((pr (sucV (ar .fst)) (a .fst) ∈ C) .snd) (use (ar .fst) (a .fst)))
sndUp : ∀ {m} (γ : Vec 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 (ar .fst) (pr (a .fst) (b .fst)) c∈ sh _
((pr (sucV (ar .fst)) (b .fst) ∈ C) .snd)
(use (ar .fst) (a .fst) (b .fst)))
七条子句的合取
closedOf 把七个标签实例合成任意底层集合满足 Peel 的模型元素的合取 closedAt;closureClosed 提供 closure-inv,得到 clo φ 的结论。
closureClosed 于是就是落在闭包处的那个实例,而它的剥开就是原样的 closure-inv:两条陈述是同一个类型,因为 Peel 本就是照着那条引理的结论读出来的。
closedOf : ∀ {m} (γ : Vec 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) (γ : Vec S m)
→ ⟨ (clo φ ∷ γ) ⊨ closedAt zero ⟩
closureClosed φ γ = closedOf (clo φ) (closure-inv f h φ) γ
小结
closedOf 给出对子码递归的索引集所需的假设,并适用于任何可剥开的集合;closureClosed 则将该结论用于闭包。两者都不涉及满足关系:七条子句只说明给定形状的键会引入哪些键,而可剥开的集合恰好包含这些键。
它的代价值得记下,因为满足关系那个实例要付的是同样的形状。四个读式、七行实例化、每个读式一条引理;内容在早一章的 byTag 里,那里把十个构造子与七项要求一次性对上,而不是对上十乘七次。byTag 本就是对着任意目标集写的,这正是此处的一般性免费的原因:闭包从来不是主角,只是头一个被递进来的东西。
{-# OPTIONS --cubical --safe --guardedness #-}open import Base.Preludeopen import FOL.ZFStructure using ( module hPropView )open import FOL.Syntax using ( Formula )import FOL.Absolutenessopen 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 )