可以直接阅读本章,也可以通过交互式目录和依赖图选择其他路线。

交互式目录 · 依赖图

知道一族类型中的每个类型都有元素,与拥有一个同时为它们选取元素的函数,是不同的两件事。命题截断把区别表达得很准确:∥ B x ∥₁ 断言某个指标处有元素,∥ ((x : X) → B x) ∥₁ 则断言整个选择函数存在。本章先陈述以 h-集合为指标、取值也为 h-集合的选择原理,再证明高一宇宙层级的选择原理蕴含当前层级的选择原理,最后证明选择原理蕴含排中律。

原理

对于族 B : X → Type ℓ,值得区分三种数据。如果每个 B x 的元素已经作为 x 的函数给出,那么这个函数本身就是选择函数。额外的原理针对的是较弱的、经过截断的输入。

陈述给出的内容
(x : X) → B x可以求值的选择函数
(x : X) → ∥ B x ∥₁逐个指标处的存在
∥ ((x : X) → B x) ∥₁一个同时处理全部指标的函数的存在
三种选择数据:可求值的函数、逐点的仅仅存在,以及整个函数的仅仅存在

定义 (SetChoice) 层级 ℓ 上的集合值族的选择断言:对每个 h-集合 X : Type ℓ 及每个取值 B x 都是 h-集合的族 B : X → Type ℓ,上表的第二行蕴含第三行。

SetChoice : ∀ ℓ → Type (ℓ-suc ℓ)
SetChoice ℓ = (X : Type ℓ) → isSet X → (B : X → Type ℓ)
            → ((x : X) → isSet (B x))
            → ((x : X) → ∥ B x ∥₁) → ∥ ((x : X) → B x) ∥₁

截断移到了依值函数类型之外,但并没有消失。因此,假设 sc : SetChoice ℓ 给出的是选择函数的仅仅存在。若要用 rec₁ 利用这一存在,目标就必须是命题。由于量化了 Type ℓ,整条原理位于 Type (ℓ-suc ℓ)。

引理 (lowerSetChoice) 高一个宇宙层级的选择蕴含原层级的选择。

lowerSetChoice : ∀ {ℓ} → SetChoice (ℓ-suc ℓ) → SetChoice ℓ

证明 给定 sc : SetChoice (ℓ-suc ℓ)。为证明 SetChoice ℓ,即须证明:对任意给定的 h-集合指标 X 和 h-集合值族 B,由前提 inh : (x : X) → ∥ B x ∥₁ 得到 ∥ ((x : X) → B x) ∥₁。inh 取自 inhabited,只提供逐点的仅仅存在,而未选定具体元素。由于 sc 处理的是高一层级的族,我们用 Lift 将这道选择问题移到它能够处理的层级。下图展示从原层上行、应用选择原理、再返回原层的过程。

$$\widehat B\,\hat x := \operatorname{Lift}(B(\operatorname{lower}\,\hat x))$$
$$(x:X)\to\|B\,x\|_1$$
$\operatorname{map}_1\,\operatorname{lift}$
$$(\hat x:\operatorname{Lift}X)\to\|\widehat B\,\hat x\|_1$$
$\operatorname{sc}$
$$\|(\hat x:\operatorname{Lift}X)\to\widehat B\,\hat x\|_1$$
$\operatorname{map}_1$
$$\|(x:X)\to B\,x\|_1$$

高层级的选择如何导出原层级的选择:提升输入,应用选择原理,再将结果送回原层级

要在高一层应用 sc,还须证明 lift 后的指标与族的每个取值都是 h-集合。下表着重展示这些 h-集合性证明如何由原层级已有的性质得到,同时列出其余实参的对应。

层级 ℓ层级 ℓ-suc ℓ
XLift X
setXisOfHLevelLift 2 setX
B xLift (B (lower x̂)),其中 x̂ : Lift X
setB xisOfHLevelLift 2 (setB (lower x̂))
inh xmap₁ lift (inh (lower x̂))
高层级的实参由原层级已有的数据构造

下面的 Agda 代码把图示与表格接在一起:表格右列给出中间选择步骤所需的输入,代码的嵌套结构则对应图中的上行、应用选择、返回原层。整个表达式的类型正是图底部的目标。

lowerSetChoice sc X setX B setB inh = map₁ (λ f x → lower (f (lift x)))
         (sc (Lift X) (isOfHLevelLift 2 setX)
             (λ x̂ → Lift (B (lower x̂)))
             (λ x̂ → isOfHLevelLift 2 (setB (lower x̂)))
             (λ x̂ → map₁ lift (inh (lower x̂))))

Diaconescu 定理

选取代表元为什么能判定任意命题?上一章在取得判定之后,用布尔值编码命题。这里反过来:先由命题构造商,无须判定它,再由选择提供布尔值,最后比较这些值而得到判定。

私有子模块 Diaconescu 先固定任意 P : hProp ℓ,构造相应的商及辅助结果。最后的定理利用这些结果,把选择转化为对 P 的判定。

private module Diaconescu {ℓ} (P : hProp ℓ) where

先引入下文要用的集合商与二元关系工具。给定类型 A 与关系 R,商 A / R 中有点 [ a ];R a b 的证明给出路径 [ a ] ≡ [ b ],squash/ 则保证结果是 h-集合。BinaryRelation 提供随后验证关系定律所用的表述。这里引入的同构定理 isEquivRel→effectiveIso 说:若 R 是取值于命题的等价关系,则商中 [ a ] ≡ [ b ] 的路径与 R a b 的证明同构。由此可以通过原关系理解商中两点的相等。

open import Cubical.HITs.SetQuotients
  using ( _/_; [_]; squash/; []surjective; isEquivRel→effectiveIso )
open import Cubical.Relation.Binary.Base using ( module BinaryRelation )

构造 (_~_) 在 Bool 上定义关系,对角格始终有元素,非对角格则是 ⟨ P ⟩。这样,两个不同的布尔值是否相关就由 P 控制。

_~_ : Bool → Bool → Type ℓ
true  ~ true  = ⊤*
false ~ false = ⊤*
_     ~ _     = ⟨ P ⟩

构造 (Glued) 按这个关系取商。我们希望用 P 的证明来刻画两个特殊点 [ true ] 与 [ false ] 之间的路径。只要验证 _~_ 是取值于命题的等价关系,就能应用同构定理。

Glued : Type ℓ
Glued = Bool / _~_

引理 (~-prop) 对于刚构造的商,同构定理要求关系取值于命题并满足等价律。验证只需查看 _~_ 的定义:对角格是命题 ⊤*,非对角格是 P 所打包的命题。

~-prop : BinaryRelation.isPropValued _~_
~-prop true  true  = isProp⊤*
~-prop false false = isProp⊤*
~-prop true  false = ⟨ P ⟩isProp
~-prop false true  = ⟨ P ⟩isProp

引理 (~-refl) 对角格有元素 tt*,这就证明了自反性。

~-refl : (a : Bool) → a ~ a
~-refl true  = tt*
~-refl false = tt*

引理 (~-sym) 交换输入不改变格中的类型。对角格返回 tt*,非对角格复用所给的 P 的证明。

~-sym : (a b : Bool) → a ~ b → b ~ a
~-sym true  true  _ = tt*
~-sym false false _ = tt*
~-sym true  false p = p
~-sym false true  p = p

引理 (~-trans) 传递性先看两端 a 与 c。两端相同时,tt* 证明 a ~ c。

~-trans : (a b c : Bool) → a ~ b → b ~ c → a ~ c
~-trans true  _     true  _ _ = tt*
~-trans false _     false _ _ = tt*

两端不同时,中间的布尔值必等于其中一端,因而两个前提中已有一个是 P 的证明,返回它即可。

~-trans true  false false p _ = p
~-trans false true  true  p _ = p
~-trans true  true  false _ p = p
~-trans false false true  _ p = p

引理 (~-equivRel) 三条定律组成同构定理所需的等价关系记录。

~-equivRel : BinaryRelation.isEquivRel _~_
~-equivRel = BinaryRelation.equivRel ~-refl ~-sym ~-trans

引理 (quotientPath≃P) 验证这些定律后,就能应用同构定理。它给出 [ true ] 与 [ false ] 之间的路径类型与 true ~ false 的同构,而后者按定义就是 ⟨ P ⟩。再用 isoToEquiv 将这个同构转为下面的类型等价。

quotientPath≃P : ([ true ] ≡ [ false ]) ≃ ⟨ P ⟩
quotientPath≃P = isoToEquiv
  (isEquivRel→effectiveIso ~-prop ~-equivRel true false)

图中的 $e$ 简记 quotientPath≃P:正向映射把路径变为 P 的证明,逆向映射把证明变为路径。下面分别展示有 P 的证明或反驳时的情形,并不预先断定我们已经取得了其中一种。

$$([\mathsf{true}] \equiv [\mathsf{false}]) \simeq \langle P\rangle$$
$$p : \langle P\rangle$$
$\mathsf{Glued}$ $[\mathsf{true}]$ $[\mathsf{false}]$ $e^{-1}(p)$
$$n : \neg\langle P\rangle$$
$\mathsf{Glued}$ $[\mathsf{true}]$ $[\mathsf{false}]$

左图通过 $e$ 的逆映射得到路径;右图中若存在连接路径,$e$ 就会把它变为与 n 矛盾的证明

构造 (Pick) 接下来要使 Glued 中的相等变得可判定。点 x : Glued 的代表元由布尔值 b 与路径 [ b ] ≡ x 组成。它们的依值对类型 Pick x 恰是商映射 [_] : Bool → Glued 在 x 上的一束纤维。第二分量证明这个布尔值代表的是指定的商类。

Pick : Glued → Type ℓ
Pick x = Σ[ b ∶ Bool ] ([ b ] ≡ x)

引理 (pickIsSet) 族 Pick 取值于 h-集合。这里将 isSetClass 用于 h-集合 Bool:固定布尔值后的第二分量是 h-集合 Glued 中的路径,因而是命题。

pickIsSet : (x : Glued) → isSet (Pick x)
pickIsSet x = isSetClass isSetBool (λ b → squash/ [ b ] x)
  where
    open import Cubical.Data.Bool.Properties using ( isSetBool )

引理 (pickable) []surjective 保证每个商点都有代表元,其存在性以命题截断表达。

pickable : (x : Glued) → ∥ Pick x ∥₁
pickable = []surjective

引理 (merePicker) 以 Glued 为指标类型,squash/ 为其 h-集合性证书,Pick 为所选的族,pickIsSet 为逐点的 h-集合性证书,应用 sc。这是针对 P 的论证中唯一一次使用选择;得到的是为每个商点选取代表元的函数的仅仅存在。

merePicker : SetChoice ℓ → ∥ ((x : Glued) → Pick x) ∥₁
merePicker sc = sc Glued squash/ Pick pickIsSet pickable

接下来暂设已取得实际函数 g : (x : Glued) → Pick x,而不只是知道它仅仅存在。里面的带参数子模块将 g 固定为共同参数;_ 表示模块本身无须命名。离开子模块后,使用这些私有辅助定义仍须传入 g,所以这里并未凭空假设全局选择函数。稍后再消去截断,去掉这个暂设而得到判定。

private module _ (g : (x : Glued) → Pick x) where

构造 (b₀ b₁)

b₀ : Bool
b₀ = g [ true ] .fst

b₁ : Bool
b₁ = g [ false ] .fst

构造 (agree→P P→agree)

agree→P : b₀ ≡ b₁ → ⟨ P ⟩
agree→P q = equivFun quotientPath≃P
  (sym (g [ true ] .snd) ∙ cong [_] q ∙ g [ false ] .snd)

P→agree : ⟨ P ⟩ → b₀ ≡ b₁
P→agree p = cong (λ x → g x .fst) (invEq quotientPath≃P p)
$$q:b_0\equiv b_1$$
$\mathsf{Glued}$ $[\mathsf{true}]$ $[b_0]$ $[b_1]$ $[\mathsf{false}]$ $\mathsf{sym}(s_0)$ $\mathsf{cong}\,[{-}]\,q$ $s_1$
$$p:\langle P\rangle$$
$\mathsf{Glued}$ $e^{-1}(p)$ $[\mathsf{true}]$ $[\mathsf{false}]$ $x\mapsto g(x).\mathsf{fst}$ $\mathsf{Bool}$ $b_0$ $b_1$

左图由 $e$ 把复合路径送到 P 的证明;右图沿 $e^{-1}(p)$ 读取所选布尔值,得到二者相等

构造 (decide) 给定 g : (x : Glued) → Pick x,现在用 _≟_ 判定选出的两个布尔值是否相等。刚证明的两个私有辅助映射把比较结果转换如下:

布尔值的比较对 P 的判定
yes qyes (agree→P g q)
no neno (λ p → ne (P→agree g p))
布尔值比较的两种结果分别给出对命题的肯定或否定判定

第二行中,P 的证明会迫使两个布尔值相等,而这正是 ne 所反驳的。因此得到传给 mapDec 的否定方向。

decide : ((x : Glued) → Pick x) → Dec ⟨ P ⟩
decide g = mapDec (agree→P g) (λ ne p → ne (P→agree g p)) (b₀ g ≟ b₁ g)
  where
    open import Cubical.Data.Bool using ( _≟_ )

《基础词汇》中经由截断的分解,在这里有了一个具体实例。图中的 $G$ 简记类型 (x : Glued) → Pick x。decide 以实际函数为输入。由于 isPropDec ⟨ P ⟩isProp 证明目标 Dec ⟨ P ⟩ 是命题,rec₁ (isPropDec ⟨ P ⟩isProp) decide 也能接收函数的仅仅存在。

$G$ $\|G\|_1$ $\mathsf{Dec}\,\langle P\rangle$ $|{-}|_1$ $\mathsf{decide}$ $\mathsf{rec}_1\,\cdots$

选择提供 $\|G\|_1$ 的元素,右侧函数由此返回 P 的判定

定理 (Diaconescu) (SetChoice→LEM) 集合值族的选择蕴含同一宇宙层级上的排中律。

证明 把 rec₁ (isPropDec ⟨ P ⟩isProp) decide 应用于 merePicker sc。由于 P 任意,得到的正是 LEM ℓ。

SetChoice→LEM : ∀ {ℓ} → SetChoice ℓ → LEM ℓ
SetChoice→LEM sc P = rec₁ (isPropDec ⟨ P ⟩isProp) decide (merePicker sc)
  where open Diaconescu P

证明完成后,再回看一个看似直接的做法:为什么不在 [ true ] 处选 true,在 [ false ] 处选 false?下图从逐点找到代表元,经 SetChoice 走到商上的同一个函数。先假设 P 成立,沿同一个商点的两种写法之间的路径看一看。

若 $P$ 成立,商中有路径 $p:[\mathsf{true}]\equiv[\mathsf{false}]$

逐点分别存在

$(x : \mathsf{Glued})\to\|\mathsf{Pick}\,x\|_1$

即使暂时分别找到代表元:

$[\mathsf{true}]$$\mathsf{true}$
$[\mathsf{false}]$$\mathsf{false}$
当 $P$ 成立时,两种写法是同一个商点。分别找到不同代表元并不矛盾;若按写法指定输出,同一个输入却会同时得到 true 和 false,因而不是商上的函数。
$\mathsf{SetChoice}$ 仅仅存在一个统一的函数

商上的同一个函数

$\|((x : \mathsf{Glued})\to\mathsf{Pick}\,x)\|_1$

在剩余的外层截断内部,看同一个函数 $g$:

$f:\mathsf{Glued}\to\mathsf{Bool}$$f(x)=(g\,x).\mathsf{fst}$
$[\mathsf{true}]$ $[\mathsf{false}]$ $p$ $f$ $f$ $b_0$ $b_1$ $\operatorname{cong}\,f\,p$
$b_0\equiv b_1\quad\Longleftrightarrow\quad P$
代表元证书给出反向蕴含;比较 $b_0$ 与 $b_1$ 就能判定 $P$。

同一个函数把商点间的路径送成布尔输出间的路径;判定是命题,因此可以消去外层截断

小结

本章针对 h-集合指标与 h-集合值族陈述了 SetChoice ℓ:从逐点的仅仅存在,得到整个选择函数的仅仅存在。lowerSetChoice 证明 SetChoice (ℓ-suc ℓ) 蕴含 SetChoice ℓ。为证明 SetChoice→LEM,我们把命题 P 编码为两个商点的相等;选择给出布尔代表元,比较它们便可判定 P。由于 Dec ⟨ P ⟩ 是命题,rec₁ 允许消去截断。因此,SetChoice ℓ 蕴含 LEM ℓ。