第 13 章断言:若一个宇宙包含自身,类型理论就会变得不一致,也就是存在一个类型为 Π(p:Type).p 的闭项,它是对一切命题的证明。本附录完整给出这个项,解释其背后的思想,并精确指出规则 Type:Type 用在哪里,让你看清宇宙层级为何能挡住它。
设定
在整个附录中,内核的宇宙被替换为单一宇宙 Type,并以下面两条规则
Γ⊢Type:Type⊢Γ;okΓ⊢Π(x:A).B:TypeΓ⊢A:TypeΓ,x:A⊢B:Type
取代 T-Sort 与 T-Pi。其余一切,包括 T-Lam、T-App、T-Conv、替换和 β 归约,都保持不变。目标是构造一个闭项 tH,使得
⊢tH:⊥,⊥=Π(p:Type).p.
这样的项能证明任意命题 C,因为 tHC:C。
这一构造源于 Girard,他把集合论中的 Burali-Forti 悖论移植到了带有 Type:Type 的类型理论 [Girard 1972]。下面的项是 Hurkens 的简化版本 [Hurkens 1995],一页纸即可写下,并且只用到 Π、λ 和应用。
类型理论中的幂集
把函数 p:S→Type 读作 S 上的一个谓词(predicate),或等价地读作 S 的一个子集:使 px 有证明的那些元素 x 就是它的成员。所有这类谓词构成的类型就是 S 的幂集(power set):
℘S=S→Type.
套用两次,℘℘S=(S→Type)→Type 就是“S 的子集族”的类型。
在集合论中,康托尔(Cantor)定理说,没有任何集合包含自身幂集的副本,更不用说二重幂集了:℘S 总是严格大于 S。这个悖论建立在一个违反该定理的类型 U 之上,它包含 ℘℘U 的一个副本:函数 τ:℘℘U→U 把 U 的一个子集族打包成 U 的单个元素,函数 σ:U→℘℘U 再把它解包。类型
U=Π(X:Type).((℘℘X→X)→℘℘X)
通过对整个 Type 量化做到了这一点。U 一边对 Type 量化,一边又是 Type 的成员,这正是 Type:Type 所允许、而第 13 章的层级所禁止的。
该项
下列缩写都在原处展开;内核看到的只有 Π、λ、变量和应用。我们用 ¬φ 表示 φ→⊥。
⊥℘SUτσΔΩ=======Π(p:Type).pS→TypeΠ(X:Type).((℘℘X→X)→℘℘X)λ(t:℘℘U).λ(X:Type).λ(f:℘℘X→X).λ(p:℘X).t(λ(x:U).p(f(xXf)))λ(s:U).sUτλ(y:U).¬(Π(p:℘U).σyp→p(τ(σy)))τ(λ(p:℘U).Π(x:U).σxp→px)
借助这些缩写,类型为 ⊥ 的项是
tH=(λ(h0:Π(p:℘U).(Π(x:U).σxp→px)→pΩ).h0Δ(λ(x:U).λ(h2:σxΔ).λ(h3:Π(p:℘U).σxp→p(τ(σx))).h3Δh2(λ(p:℘U).h3(λ(y:U).p(τ(σy)))))h0Δ(λ(p:℘U).h0(λ(y:U).p(τ(σy)))))(λ(p:℘U).λ(h1:Π(x:U).σxp→px).h1Ω(λ(x:U).h1(τ(σx))))
它的外形是一个应用:一个绑定 h0 的 λ,作用于(最后一行的)一个参数,该参数的类型正是 h0 所要求的。在内部,h0 作用于两个参数,即 Δ 和一个关于 Δ 的证明,所得结果再作用于另一个参数。下面逐一解释。
该项如何运作
打包与解包。 两个函数 τ:℘℘U→U 和 σ:U→℘℘U 互逆的程度足以支撑整个论证。展开定义并做 β 归约,对每个 t:℘℘U 和 p:℘U 都有
σ(τt)p≡t(λ(x:U).p(τ(σx))).
内核在 tH 中的多处通过 T-Conv 使用这个等式;它是一次计算,而不是一条公理。
U 上的一种序。 把 σxp 读作“谓词 p 对 x 以下的一切都成立”,这给了 U 某种类似序的结构,并让我们能对谓词和元素各说一件事。
- 谓词 p:℘U 是归纳的(inductive),如果只要它对 x 以下的一切成立,就对 x 成立:即 Π(x:U).σxp→px。
- 元素 x:U 是良基的(well-founded),如果每个归纳谓词都对 x 成立:即 Π(p:℘U).(Π(x:U).σxp→px)→px。
元素 Ω 被构造出来扮演“全体良基元素的汇集”这一角色:它打包了由全部归纳谓词组成的族。在 Burali-Forti 悖论中,这对应于全体序数的集合,它本身是一个序数,因此是自身的成员,因此不是良基的,尽管所有序数都是良基的。
三个要素。 自下而上地读 tH:
- 最后一行 λ(p:℘U).λ(h1:⋯).h1Ω(λ(x:U).h1(τ(σx))) 证明 Ω 是良基的,它的类型是 Π(p:℘U).(Π(x:U).σxp→px)→pΩ,也就是 h0 的类型,所以 h0 代表“Ω 是良基的”。
- 谓词 Δy 说的是“y 不在自身之下”(严格地说,它谈论的是 τ(σy),由上面的等式,它的行为与 y 相同)。h0 的第二个参数,即以 λ(x:U).λ(h2:⋯).⋯ 开头的那个长 λ,证明 Δ 是归纳的。于是 h0Δ(⋯):ΔΩ,也就是说,Ω 不在自身之下。
- 余下的参数 λ(p:℘U).h0(λ(y:U).p(τ(σy))) 证明 Ω 确实在自身之下:把 Ω 的良基性应用于一个经打包等式变换过的谓词即可。
由于 ΔΩ 是“Ω 在自身之下”的否定,把第 2 步的结果应用于第 3 步的结果,就得到一个类型为 ⊥ 的项。
Type : Type 用在何处
tH 中的每一步定型都很平常,只有一处例外:在 σ=λ(s:U).sUτ 中,变量 s:U 被应用于类型 U 自身,而 s 的类型以 Π(X:Type).⋯ 开头,所以 T-App 要求 U:Type。但 U 是一个对 Type 量化的 Π 类型,而在带宇宙层级的系统里,这样的类型位于它所量化的宇宙之上一层:
Γ⊢Π(X:Sortu).B:Sortmax(u+1,v)Γ⊢Sortu:Sort(u+1)Γ,X:Sortu⊢B:Sortv
按第 13 章的 T-Pi 规则,U 至多在 Sort(u+1) 中,绝不会在 Sortu 中,于是 sU 类型不正确,σ 根本写不出来。整个构造在这一个应用处崩塌。Sort0 的非谓词性也不会重新打开这扇门:U 的体是 (℘℘X→X)→℘℘X,其结果 ℘℘X 是一个以宇宙为值域的函数类型,因而不是命题,所以 imax 不会把 U 放进 Sort0。Coquand 证明了底层只有一个非谓词宇宙时系统是一致的 [Coquand 1988];Hurkens 的项则表明,两个非谓词层级已经太多 [Hurkens 1995]。
用内核重现它
你可以亲眼看到内核接受和拒绝这个项。唯一要改的规则是 T-Sort,它由 src/typecheck.rs 中 infer 的 Term::Sort(u) 分支实现:
// T-Sort,发布版本:每个宇宙都位于下一个宇宙之中。
Term::Sort(u) => Ok(Term::Sort(u.checked_add(1).ok_or("universe overflow")?)),
把右侧换成 Ok(Term::Sort(*u)),使得 Sort0:Sort0,并在全文中以 Sort0 充当 Type。其他什么都不用改:当每个类型都在 Sort0 中时,带 imax 的 T-Pi 规则已经把 Sort0 赋给每个 Π 类型,这正是本附录的第二条规则。只改这一行后,infer 对 tH 恰好返回 Π(p:Sort0).p。未修改的内核则如上文所料,在 σ 内部的应用 sU 处以类型不匹配拒绝该项。
为什么没有范式
第 14 章证明真实系统的一致性,方法是证明没有范式闭项具有类型 Π(P:Sort0).P。该证明中分析范式形状的那部分不使用强规范化,对 Type:Type 照样成立。所以,如果 tH 有范式,这个范式将是一个类型为 ⊥ 的闭范式项,而这样的项不可能存在。类型保持性依然成立,所以归约也无法逃离类型 ⊥。唯一剩下的可能是 tH 永远归约下去:强规范化失效,类型检查器的终止性随之失效。因此,Girard 悖论不仅是逻辑上的缺陷,也是计算上的缺陷;这也是第 13 章的宇宙设计对算法和对逻辑同样重要的原因。
要点回顾
- 在 Type:Type 之下,类型 U 对所有类型量化,同时自己也是其中之一,于是它包含自身二重幂集的副本,而没有任何集合能做到这一点。
- Hurkens 的项 tH 把这一点变成 Burali-Forti 悖论:Ω,即全部归纳谓词打包而成的族,既是良基的,又在自身之下。
- 规则 Type:Type 只用在一处,即 σ 中的应用 sU;宇宙层级使该应用类型不正确。
- 该项没有范式,所以这个悖论除一致性外也破坏了内核的终止性。