h5i
本中文版由作者借助 AI 翻译而成。作者并非中文母语者,译文未经人工逐句校对,可能存在错误。如发现问题,请在 GitHub 上提交 issue。

附录 C

Hurkens 悖论

第 13 章断言:若一个宇宙包含自身,类型理论就会变得不一致,也就是存在一个类型为 Π(p:Type). p\tPi{p}{\mathsf{Type}}{p} 的闭项,它是对一切命题的证明。本附录完整给出这个项,解释其背后的思想,并精确指出规则 Type:Type\mathsf{Type} : \mathsf{Type} 用在哪里,让你看清宇宙层级为何能挡住它。

设定

在整个附录中,内核的宇宙被替换为单一宇宙 Type\mathsf{Type},并以下面两条规则

⊢Γ;okΓ⊢Type:TypeΓ⊢A:TypeΓ,x:A⊢B:TypeΓ⊢Π(x:A). B:Type\dfrac{\ctxok{\Gamma}}{\Gamma \vdash \mathsf{Type} : \mathsf{Type}} \qquad \dfrac{\Gamma \vdash A : \mathsf{Type} \qquad \Gamma, x : A \vdash B : \mathsf{Type}}{\Gamma \vdash \tPi{x}{A}{B} : \mathsf{Type}}

取代 T-Sort 与 T-Pi。其余一切,包括 T-Lam、T-App、T-Conv、替换和 β\beta 归约,都保持不变。目标是构造一个闭项 tHt_{\mathrm{H}},使得

⊢tH:⊥,⊥=Π(p:Type). p.\vdash t_{\mathrm{H}} : \bot, \qquad \bot = \tPi{p}{\mathsf{Type}}{p}.

这样的项能证明任意命题 CC,因为 tH  C:Ct_{\mathrm{H}}\;C : C。

这一构造源于 Girard,他把集合论中的 Burali-Forti 悖论移植到了带有 Type:Type\mathsf{Type} : \mathsf{Type} 的类型理论 [Girard 1972]。下面的项是 Hurkens 的简化版本 [Hurkens 1995],一页纸即可写下,并且只用到 Π\Pi、λ\lambda 和应用。

类型理论中的幂集

把函数 p:S→Typep : S \to \mathsf{Type} 读作 SS 上的一个谓词(predicate),或等价地读作 SS 的一个子集:使 p  xp\;x 有证明的那些元素 xx 就是它的成员。所有这类谓词构成的类型就是 SS 的幂集(power set):

℘S  =  S→Type.\wp S \;=\; S \to \mathsf{Type}.

套用两次,℘℘S=(S→Type)→Type\wp\wp S = (S \to \mathsf{Type}) \to \mathsf{Type} 就是“SS 的子集族”的类型。

在集合论中,康托尔(Cantor)定理说,没有任何集合包含自身幂集的副本,更不用说二重幂集了:℘S\wp S 总是严格大于 SS。这个悖论建立在一个违反该定理的类型 UU 之上,它包含 ℘℘U\wp\wp U 的一个副本:函数 τ:℘℘U→U\tau : \wp\wp U \to U 把 UU 的一个子集族打包成 UU 的单个元素,函数 σ:U→℘℘U\sigma : U \to \wp\wp U 再把它解包。类型

U  =  Π(X:Type). ((℘℘X→X)→℘℘X)U \;=\; \tPi{X}{\mathsf{Type}}{\bigl((\wp\wp X \to X) \to \wp\wp X\bigr)}

通过对整个 Type\mathsf{Type} 量化做到了这一点。UU 一边对 Type\mathsf{Type} 量化,一边又是 Type\mathsf{Type} 的成员,这正是 Type:Type\mathsf{Type} : \mathsf{Type} 所允许、而第 13 章的层级所禁止的。

该项

下列缩写都在原处展开;内核看到的只有 Π\Pi、λ\lambda、变量和应用。我们用 ¬φ\neg\varphi 表示 φ→⊥\varphi \to \bot。

⊥=Π(p:Type). p℘S=S→TypeU=Π(X:Type). ((℘℘X→X)→℘℘X)τ=λ(t:℘℘U). λ(X:Type). λ(f:℘℘X→X). λ(p:℘X). t  (λ(x:U). p  (f  (x  X  f)))σ=λ(s:U). s  U  τΔ=λ(y:U). ¬ (Π(p:℘U). σ  y  p→p  (τ  (σ  y)))Ω=τ  (λ(p:℘U). Π(x:U). σ  x  p→p  x)\begin{array}{rcl} \bot &=& \tPi{p}{\mathsf{Type}}{p} \\[4pt] \wp S &=& S \to \mathsf{Type} \\[4pt] U &=& \tPi{X}{\mathsf{Type}}{((\wp\wp X \to X) \to \wp\wp X)} \\[4pt] \tau &=& \tLam{t}{\wp\wp U}{\tLam{X}{\mathsf{Type}}{\tLam{f}{\wp\wp X \to X}{\tLam{p}{\wp X}{t\;(\tLam{x}{U}{p\;(f\;(x\;X\;f))})}}}} \\[4pt] \sigma &=& \tLam{s}{U}{s\;U\;\tau} \\[4pt] \Delta &=& \tLam{y}{U}{\neg\,(\tPi{p}{\wp U}{\sigma\;y\;p \to p\;(\tau\;(\sigma\;y))})} \\[4pt] \Omega &=& \tau\;(\tLam{p}{\wp U}{\tPi{x}{U}{\sigma\;x\;p \to p\;x}}) \end{array}

借助这些缩写,类型为 ⊥\bot 的项是

tH=(λ(h0:Π(p:℘U). (Π(x:U). σ  x  p→p  x)→p  Ω).  h0  Δ  (λ(x:U). λ(h2:σ  x  Δ). λ(h3:Π(p:℘U). σ  x  p→p  (τ  (σ  x))). h3  Δ  h2  (λ(p:℘U). h3  (λ(y:U). p  (τ  (σ  y)))))h0  Δ  (λ(p:℘U). h0  (λ(y:U). p  (τ  (σ  y)))))(λ(p:℘U). λ(h1:Π(x:U). σ  x  p→p  x). h1  Ω  (λ(x:U). h1  (τ  (σ  x))))\begin{array}{rcl} t_{\mathrm{H}} &=& (\lambda (h_0 : \tPi{p}{\wp U}{(\tPi{x}{U}{\sigma\;x\;p \to p\;x}) \to p\;\Omega}).\; \\ && \qquad h_0\;\Delta\;(\tLam{x}{U}{\tLam{h_2}{\sigma\;x\;\Delta}{\tLam{h_3}{\tPi{p}{\wp U}{\sigma\;x\;p \to p\;(\tau\;(\sigma\;x))}}{ h_3\;\Delta\;h_2\;(\tLam{p}{\wp U}{h_3\;(\tLam{y}{U}{p\;(\tau\;(\sigma\;y))})})}}}) \\ && \qquad\phantom{h_0\;\Delta\;}(\tLam{p}{\wp U}{h_0\;(\tLam{y}{U}{p\;(\tau\;(\sigma\;y))})})) \\ && (\tLam{p}{\wp U}{\tLam{h_1}{\tPi{x}{U}{\sigma\;x\;p \to p\;x}}{h_1\;\Omega\;(\tLam{x}{U}{h_1\;(\tau\;(\sigma\;x))})}}) \end{array}

它的外形是一个应用:一个绑定 h0h_0 的 λ\lambda,作用于(最后一行的)一个参数,该参数的类型正是 h0h_0 所要求的。在内部,h0h_0 作用于两个参数,即 Δ\Delta 和一个关于 Δ\Delta 的证明,所得结果再作用于另一个参数。下面逐一解释。

该项如何运作

打包与解包。 两个函数 τ:℘℘U→U\tau : \wp\wp U \to U 和 σ:U→℘℘U\sigma : U \to \wp\wp U 互逆的程度足以支撑整个论证。展开定义并做 β\beta 归约,对每个 t:℘℘Ut : \wp\wp U 和 p:℘Up : \wp U 都有

σ  (τ  t)  p  ≡  t  (λ(x:U). p  (τ  (σ  x))).\sigma\;(\tau\;t)\;p \;\conv\; t\;(\tLam{x}{U}{p\;(\tau\;(\sigma\;x))}).

内核在 tHt_{\mathrm{H}} 中的多处通过 T-Conv 使用这个等式;它是一次计算,而不是一条公理。

UU 上的一种序。 把 σ  x  p\sigma\;x\;p 读作“谓词 pp 对 xx 以下的一切都成立”,这给了 UU 某种类似序的结构,并让我们能对谓词和元素各说一件事。

  • 谓词 p:℘Up : \wp U 是归纳的(inductive),如果只要它对 xx 以下的一切成立,就对 xx 成立:即 Π(x:U). σ  x  p→p  x\tPi{x}{U}{\sigma\;x\;p \to p\;x}。
  • 元素 x:Ux : U 是良基的(well-founded),如果每个归纳谓词都对 xx 成立:即 Π(p:℘U). (Π(x:U). σ  x  p→p  x)→p  x\tPi{p}{\wp U}{(\tPi{x}{U}{\sigma\;x\;p \to p\;x}) \to p\;x}。

元素 Ω\Omega 被构造出来扮演“全体良基元素的汇集”这一角色:它打包了由全部归纳谓词组成的族。在 Burali-Forti 悖论中,这对应于全体序数的集合,它本身是一个序数,因此是自身的成员,因此不是良基的,尽管所有序数都是良基的。

三个要素。 自下而上地读 tHt_{\mathrm{H}}:

  1. 最后一行 λ(p:℘U). λ(h1:⋯ ). h1  Ω  (λ(x:U). h1  (τ  (σ  x)))\tLam{p}{\wp U}{\tLam{h_1}{\cdots}{h_1\;\Omega\;(\tLam{x}{U}{h_1\;(\tau\;(\sigma\;x))})}} 证明 Ω\Omega 是良基的,它的类型是 Π(p:℘U). (Π(x:U). σ  x  p→p  x)→p  Ω\tPi{p}{\wp U}{(\tPi{x}{U}{\sigma\;x\;p \to p\;x}) \to p\;\Omega},也就是 h0h_0 的类型,所以 h0h_0 代表“Ω\Omega 是良基的”。
  2. 谓词 Δ  y\Delta\;y 说的是“yy 不在自身之下”(严格地说,它谈论的是 τ  (σ  y)\tau\;(\sigma\;y),由上面的等式,它的行为与 yy 相同)。h0h_0 的第二个参数,即以 λ(x:U). λ(h2:⋯ ). ⋯\tLam{x}{U}{\tLam{h_2}{\cdots}{\cdots}} 开头的那个长 λ\lambda,证明 Δ\Delta 是归纳的。于是 h0  Δ  (⋯ ):Δ  Ωh_0\;\Delta\;(\cdots) : \Delta\;\Omega,也就是说,Ω\Omega 不在自身之下。
  3. 余下的参数 λ(p:℘U). h0  (λ(y:U). p  (τ  (σ  y)))\tLam{p}{\wp U}{h_0\;(\tLam{y}{U}{p\;(\tau\;(\sigma\;y))})} 证明 Ω\Omega 确实在自身之下:把 Ω\Omega 的良基性应用于一个经打包等式变换过的谓词即可。

由于 Δ  Ω\Delta\;\Omega 是“Ω\Omega 在自身之下”的否定,把第 2 步的结果应用于第 3 步的结果,就得到一个类型为 ⊥\bot 的项。

Type : Type 用在何处

tHt_{\mathrm{H}} 中的每一步定型都很平常,只有一处例外:在 σ=λ(s:U). s  U  τ\sigma = \tLam{s}{U}{s\;U\;\tau} 中,变量 s:Us : U 被应用于类型 UU 自身,而 ss 的类型以 Π(X:Type). ⋯\tPi{X}{\mathsf{Type}}{\cdots} 开头,所以 T-App 要求 U:TypeU : \mathsf{Type}。但 UU 是一个对 Type\mathsf{Type} 量化的 Π\Pi 类型,而在带宇宙层级的系统里,这样的类型位于它所量化的宇宙之上一层:

Γ⊢Sort u:Sort (u+1)Γ,X:Sort u⊢B:Sort vΓ⊢Π(X:Sort u). B:Sort max⁡(u+1,v)\dfrac{\Gamma \vdash \Sort{u} : \Sort{(u+1)} \qquad \Gamma, X : \Sort{u} \vdash B : \Sort{v}}{\Gamma \vdash \tPi{X}{\Sort{u}}{B} : \Sort{\max(u+1, v)}}

按第 13 章的 T-Pi 规则,UU 至多在 Sort (u+1)\Sort{(u+1)} 中,绝不会在 Sort u\Sort{u} 中,于是 s  Us\;U 类型不正确,σ\sigma 根本写不出来。整个构造在这一个应用处崩塌。Sort 0\Sort{0} 的非谓词性也不会重新打开这扇门:UU 的体是 (℘℘X→X)→℘℘X(\wp\wp X \to X) \to \wp\wp X,其结果 ℘℘X\wp\wp X 是一个以宇宙为值域的函数类型,因而不是命题,所以 imax\mathrm{imax} 不会把 UU 放进 Sort 0\Sort{0}。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)),使得 Sort 0:Sort 0\Sort{0} : \Sort{0},并在全文中以 Sort 0\Sort{0} 充当 Type\mathsf{Type}。其他什么都不用改:当每个类型都在 Sort 0\Sort{0} 中时,带 imax\mathrm{imax} 的 T-Pi 规则已经把 Sort 0\Sort{0} 赋给每个 Π\Pi 类型,这正是本附录的第二条规则。只改这一行后,infer 对 tHt_{\mathrm{H}} 恰好返回 Π(p:Sort 0). p\tPi{p}{\Sort{0}}{p}。未修改的内核则如上文所料,在 σ\sigma 内部的应用 s  Us\;U 处以类型不匹配拒绝该项。

为什么没有范式

第 14 章证明真实系统的一致性,方法是证明没有范式闭项具有类型 Π(P:Sort 0). P\tPi{P}{\Sort{0}}{P}。该证明中分析范式形状的那部分不使用强规范化,对 Type:Type\mathsf{Type} : \mathsf{Type} 照样成立。所以,如果 tHt_{\mathrm{H}} 有范式,这个范式将是一个类型为 ⊥\bot 的闭范式项,而这样的项不可能存在。类型保持性依然成立,所以归约也无法逃离类型 ⊥\bot。唯一剩下的可能是 tHt_{\mathrm{H}} 永远归约下去:强规范化失效,类型检查器的终止性随之失效。因此,Girard 悖论不仅是逻辑上的缺陷,也是计算上的缺陷;这也是第 13 章的宇宙设计对算法和对逻辑同样重要的原因。

要点回顾

  • 在 Type:Type\mathsf{Type} : \mathsf{Type} 之下,类型 UU 对所有类型量化,同时自己也是其中之一,于是它包含自身二重幂集的副本,而没有任何集合能做到这一点。
  • Hurkens 的项 tHt_{\mathrm{H}} 把这一点变成 Burali-Forti 悖论:Ω\Omega,即全部归纳谓词打包而成的族,既是良基的,又在自身之下。
  • 规则 Type:Type\mathsf{Type} : \mathsf{Type} 只用在一处,即 σ\sigma 中的应用 s  Us\;U;宇宙层级使该应用类型不正确。
  • 该项没有范式,所以这个悖论除一致性外也破坏了内核的终止性。