Reading a hierarchy formula inside L

编码诸章把读式写成关于层级的:常元是 V 的集合,求值时量词遍历整个 V。而此后消费它们的诸章谈论的是 L:常元是模型的元素,求值时量词只遍历 L。这是两门不同的语言,总得有东西把一条读式从其中一门运到另一门。

两件事就够,且两件都已证毕。常量变换把公式的每个常元换成模型的元素,只要那个常元确实是一个;那是有界公式那套机器,此处所用的界是「可构造」而非「落在某阶段内」。而 Δ₀ 绝对性说:有界公式在传递类之内与之外含义相同,正是这一点使那次替换无害。

于是常元可构造的 Δ₀ 读式可以运过去,而这次搬运是一条四步的链,自身不含任何归纳。此后每一章想在 L 的对象语言里说「这个集合是那两个的对」,或「这个码具有某种形状」,都只需引用一条读式,再施以本章。

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

open import Base.Prelude
open import Base.Truth

module L.Absoluteness { : Level} where

open import FOL.ZFStructure using ( module hPropStructure )
open import FOL.Syntax using ( Formula )
open import FOL.LevyHierarchy using ( Δ₀ )
open import FOL.Manipulation.Bounding using ( BoundedFo; module Relabel )
open import FOL.Manipulation.Relabelling using ( ⊨-map )
import FOL.Absoluteness
import FOL.Semantics
open import V.Hierarchy {} using ( 𝒮ᵥ )
open import L.Constructible {} using ( 𝒮ʟ; isL; isL-trans )

open import Cubical.Data.Vec using ( map )
open import Cubical.HITs.CumulativeHierarchy.Base using ( V )

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

module SemV = FOL.Semantics (hPropAlgebra (ℓ-suc )) 𝒮ᵥ
open SemV using ( _^_ )
open SemV.At (V ) id using () renaming ( _⊨_ to _⊨v_ )

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

界就是可构造性

常量变换只实例化一次。层级的一个常元合格,指它可构造;它所变成的模型元素,就是该常元与它的证书之对;而往返是 refl,因为取那个对的底集就把常元原样取回。关于 L 再没有用到别的。

完全不含常元的读式白白合格,这值得点名,因为大多数结构性读式正是这一类:它们全靠变元与有界量词说话,压根没有东西需要可构造。

InL : V   Type (ℓ-suc )
InL c =  isL c 

module ToL = Relabel {K = V } {K' = S} {W = V }
  id fst InL  c p  c , p)  c p  refl)

open ToL public using ( liftFo; Δ₀-liftFo )

搬运

四步,自模型向外读。绝对性把抬升后的公式从「在 L 中满足」搬到「在层级中、于投影后的环境处满足」。随后沿投影的常量变换被撤销两次:一次是认出抬升后的公式就是原公式换掉常元的样子,一次是反方向地看出原公式就是它自己。中间那一步是常量变换自身的正确性登场之处,也是唯一看常元的地方。

最后一步的恒等变换不是白费。一条公式并不按定义等于它在常元恒等映射下的像,因为那个映射是递归施加的;但它的含义等于,而那正是常量变换定理在 f = id 处所说的话。

transferFo :  {n} (φ : Formula (V ) n) (h : BoundedFo InL φ)  Δ₀ φ
            (γ : S ^ n)  (γ  liftFo φ h)  ((map fst γ) ⊨v φ)
transferFo φ h  γ =
    abs₀ (Δ₀-liftFo h ) γ
   sym (⊨-map (hPropAlgebra (ℓ-suc )) 𝒮ᵥ fst id (liftFo φ h) (map fst γ))
   cong  ψ  (map fst γ) ⊨v ψ) (ToL.liftFo-correct φ h)
   ⊨-map (hPropAlgebra (ℓ-suc )) 𝒮ᵥ id id φ (map fst γ)

小结

liftFo 把关于层级的 Δ₀ 公式运进 L 的对象语言,只要它的常元可构造,而 transferFo 说两者说的是同一件事。编码诸章写在层级一侧,就留在那里;这便是从 L 一侧引用它们的读式的办法,代价是一条四步的链,而非重新陈述一遍。

有一件事它做,也不该被要求去做。它只管 Δ₀,因为绝对性只管 Δ₀。这已不再是对「在 L 中能说什么」的限制,因为那边的概括字段接受任意复杂度的公式;它限制的是「能从层级白白进口什么」。一个写成无界更省事的谓词,就该无界地、直接在模型上写,绝不该绕经此处。