第 4 章では、型付け規則が論理を実装すること、そしてこの体系が受け入れられるのは整合的である場合に限ることを示した。本章では、第 2 章から先送りにしてきた問いを扱う。S o r t 0 \Sort{0} Sort 0 の型は何か。最も単純な答え、つまり自分自身を含む単一の宇宙は、体系を不整合にする。Lean の答え、つまり最下層の宇宙が非述語的な階層 S o r t 0 : S o r t 1 : S o r t 2 : ⋯ \Sort{0} : \Sort{1} : \Sort{2} : \cdots Sort 0 : Sort 1 : Sort 2 : ⋯ は、そうならない。あわせて本章では、T-Pi の中で唯一奇妙に見える部品、関数 i m a x \imax imax を説明する。
Sort 0 の型は何か
命題変数は、型理論では仮定 P : S o r t 0 P : \Sort{0} P : Sort 0 として現れるが、その場所は二つあり、下の左の判断のように文脈の中か、右の判断のように λ \lambda λ や Π \Pi Π に束縛されてかである。
P : S o r t 0 ⊢ λ ( h : P ) . h : P → P versus ⊢ λ ( P : S o r t 0 ) . λ ( h : P ) . h : Π ( P : S o r t 0 ) . P → P . P : \Sort{0} \vdash \tLam{h}{P}{h} : P \to P
\qquad\text{versus}\qquad
\vdash \tLam{P}{\Sort{0}}{\tLam{h}{P}{h}} : \tPi{P}{\Sort{0}}{P \to P}. P : Sort 0 ⊢ λ ( h : P ) . h : P → P versus ⊢ λ ( P : Sort 0 ) . λ ( h : P ) . h : Π ( P : Sort 0 ) . P → P .
左の判断は、外から与えられた一つの固定された P P P について P → P P \to P P → P を証明するのに対し、右の判断は一つの閉じた項であり、すべての P P P についてそれを証明するので、後から任意の特定の命題に適用できる。図 4.1 の ∀ \forall ∀ の行が必要とするのはこちらである。
どちらの形も S o r t 0 \Sort{0} Sort 0 が型であることを要求する。文脈に P : S o r t 0 P : \Sort{0} P : Sort 0 を加える C-Ext も、P : S o r t 0 P : \Sort{0} P : Sort 0 を束縛する T-Lam と T-Pi も、新しい変数の型 A A A について前提 Γ ⊢ A : S o r t u \Gamma \vdash A : \Sort{u} Γ ⊢ A : Sort u を持つ。A = S o r t 0 A = \Sort{0} A = Sort 0 とすると、この前提は、ある u u u について Γ ⊢ S o r t 0 : S o r t u \Gamma \vdash \Sort{0} : \Sort{u} Γ ⊢ Sort 0 : Sort u となるので、命題の宇宙はそれ自身が型を持たなければならない。問題はどの型か、である。
Type は型ではない
すべての宇宙を、自分自身を含む単一の宇宙 T y p e \mathsf{Type} Type で置き換えたとしよう。
⊢ Γ ; o k Γ ⊢ T y p e : T y p e Γ ⊢ A : T y p e Γ , x : A ⊢ B : T y p e Γ ⊢ Π ( x : A ) . B : T y p e \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}} Γ ⊢ Type : Type ⊢ Γ ; ok Γ ⊢ Π ( x : A ) . B : Type Γ ⊢ A : Type Γ , x : A ⊢ B : Type
∀ P . φ \forall P.\,\varphi ∀ P . φ を Π ( P : T y p e ) . φ ∗ \tPi{P}{\mathsf{Type}}{\varphi^\ast} Π ( P : Type ) . φ ∗ と翻訳すると、P P P は、T y p e \mathsf{Type} Type 自身とそこから作られるあらゆる型を含む集まりを動く。このような集まりは、型理論における「すべての集合の集合」にあたり、素朴集合論ではこうした集まりが矛盾を導くことが知られている。最もよく知られた例がラッセルのパラドックス であり、R = { x ∣ x ∉ x } R = \{\, x \mid x \notin x \,\} R = { x ∣ x ∈ / x } とすると、R ∈ R R \in R R ∈ R も R ∉ R R \notin R R ∈ / R も矛盾を導く。
型理論には x ∉ x x \notin x x ∈ / x のような所属判定がないので、ラッセルの議論はそのままでは移らない。Girard は代わりに、すべての整列順序の集まりに関する Burali-Forti の関連するパラドックスを翻案し [Girard 1972]、Hurkens が得られた項を簡略化した [Hurkens 1995]。結果は
⊢ t H : Π ( P : T y p e ) . P , \vdash t_{\mathrm{H}} : \tPi{P}{\mathsf{Type}}{P}, ⊢ t H : Π ( P : Type ) . P ,
を満たす閉じた項 t H t_{\mathrm{H}} t H であり、体系は不整合である。⊥ \bot ⊥ には証明がないのに ⊥ ∗ \bot^\ast ⊥ ∗ には項があり、これらの規則の上に作られたカーネルはあらゆる文の証明を受け入れてしまう。本質的な材料は、T y p e \mathsf{Type} Type 全体を量化しながら T y p e \mathsf{Type} Type の要素でもある型 U U U であり、これにより U U U は自身の二重冪集合の複製を含むことができる。集合には決してできないことである。付録 C では t H t_{\mathrm{H}} t H を完全な形で示し、その仕組みを説明し、カーネルの一行を変えるだけでこの結果を再現する方法を示す。
被害はアルゴリズムにも及ぶ。型保存性は依然として成り立つので、もし t H t_{\mathrm{H}} t H に正規形があれば、それは型 Π ( p : T y p e ) . p \tPi{p}{\mathsf{Type}}{p} Π ( p : Type ) . p の正規な閉じた項になる。付録 D の整合性の証明のうち正規な項を分析する部分は強正規化を使っておらず、T y p e : T y p e \mathsf{Type} : \mathsf{Type} Type : Type にもそのまま移り、そのような正規な項が存在しないことを示す。したがって t H t_{\mathrm{H}} t H には正規形がなく、強正規化は破れ、N o r m a l i z e \Normalize Normalize はこの項に対して永遠に走り続ける。T y p e : T y p e \mathsf{Type} : \mathsf{Type} Type : Type を持つカーネルは不健全であるだけでなく、入力によっては停止しない。
Martin-Löf の 1971 年の最初の型理論はこの規則を持っており、翌年、それに対して Girard のパラドックスが発見された。それ以来、すべての依存型理論は、宇宙の階層か、自己言及を断ち切る何らかの別の仕掛けを備えている。このパラドックスは珍奇な話ではなく、自分自身を含む宇宙は自明な 設計であり、その自明な設計が間違っているのである。
最下層が非述語的な階層
第二の答えは、S o r t 0 \Sort{0} Sort 0 はより大きな宇宙に住み、その宇宙はさらに大きな宇宙に住む、というものである。
⊢ Γ ; o k Γ ⊢ S o r t u : S o r t ( u + 1 ) ; (T-Sort) so S o r t 0 : S o r t 1 : S o r t 2 : ⋯ . \dfrac{\ctxok{\Gamma}}{\Gamma \vdash \Sort{u} : \Sort{(u+1)}}\rulename{T-Sort}
\qquad\text{so}\qquad
\Sort{0} : \Sort{1} : \Sort{2} : \cdots. Γ ⊢ Sort u : Sort ( u + 1 ) ⊢ Γ ; ok ; (T-Sort) so Sort 0 : Sort 1 : Sort 2 : ⋯ .
自分自身を含む宇宙はない。Π \Pi Π 型はある宇宙から引数を取り、別の宇宙の型を返すので、T-Pi は Π \Pi Π 型それ自身がどの宇宙に属するかも言わなければならず、Lean の答えは関数 i m a x \imax imax を使う。
Γ ⊢ A : S o r t u Γ , x : A ⊢ B : S o r t v Γ ⊢ Π ( x : A ) . B : S o r t i m a x ( u , v ) ; (T-Pi) i m a x ( u , v ) = { 0 if v = 0 , max ( u , v ) otherwise. \dfrac{\Gamma \vdash A : \Sort{u} \qquad \Gamma, x : A \vdash B : \Sort{v}}{\Gamma \vdash \tPi{x}{A}{B} : \Sort{\imax(u, v)}}\rulename{T-Pi}
\qquad
\imax(u, v) =
\begin{cases}
0 & \text{if } v = 0, \\
\max(u, v) & \text{otherwise.}
\end{cases} Γ ⊢ Π ( x : A ) . B : Sort imax ( u , v ) Γ ⊢ A : Sort u Γ , x : A ⊢ B : Sort v ; (T-Pi) imax ( u , v ) = { 0 max ( u , v ) if v = 0 , otherwise.
i m a x \imax imax の場合分けにより、Π \Pi Π 型は本体が命題のとき非述語的 になり、それ以外のとき述語的 になる。下で A A A と B B B の宇宙を選び、Π \Pi Π 型がどこに落ち着くかを見てほしい。
命題は非述語的である。 本体 B B B が命題なら(v = 0 v = 0 v = 0 )、何を量化していようと Π \Pi Π 全体が命題になり、特に ( ∀ P . φ ) ∗ = Π ( P : S o r t 0 ) . φ ∗ (\forall P.\,\varphi)^\ast = \tPi{P}{\Sort{0}}{\varphi^\ast} ( ∀ P . φ ) ∗ = Π ( P : Sort 0 ) . φ ∗ は、S o r t 0 \Sort{0} Sort 0 全体を量化しているにもかかわらず S o r t 0 \Sort{0} Sort 0 に属する。自分自身を量化する型を含む宇宙を非述語的 (impredicative)と呼ぶ。翻訳された式はすべて S o r t 0 \Sort{0} Sort 0 に属するので、∀ \forall ∀ 除去の前提 ψ ∗ : S o r t 0 \psi^\ast : \Sort{0} ψ ∗ : Sort 0 は常に成り立ち、全称文は任意の命題で、自分自身でさえも、具体化できる。たとえば i d = λ ( P : S o r t 0 ) . λ ( h : P ) . h \mathit{id} = \tLam{P}{\Sort{0}}{\tLam{h}{P}{h}} id = λ ( P : Sort 0 ) . λ ( h : P ) . h とすると、
i d : Π ( P : S o r t 0 ) . P → P and Π ( P : S o r t 0 ) . P → P : S o r t 0 , \mathit{id} : \tPi{P}{\Sort{0}}{P \to P}
\qquad\text{and}\qquad
\tPi{P}{\Sort{0}}{P \to P} : \Sort{0}, id : Π ( P : Sort 0 ) . P → P and Π ( P : Sort 0 ) . P → P : Sort 0 ,
なので、i d ( Π ( P : S o r t 0 ) . P → P ) i d \mathit{id}\;(\tPi{P}{\Sort{0}}{P \to P})\;\mathit{id} id ( Π ( P : Sort 0 ) . P → P ) id は型が付き、その型は Π ( P : S o r t 0 ) . P → P \tPi{P}{\Sort{0}}{P \to P} Π ( P : Sort 0 ) . P → P である。同じ場合分けにより、N a t \Nat Nat が S o r t 1 \Sort{1} Sort 1 に属するにもかかわらず ∀ n : N a t , n + 0 = n \forall n : \Nat,\, n + 0 = n ∀ n : Nat , n + 0 = n は命題になり、第 7 章 の帰納法はこれに依存していた。
# 「すべての命題は自分自身を含意する」はそれ自身が命題なので、
# 自分自身で具体化できる。
def id : forall (P : Sort 0), P -> P := fun (P : Sort 0) => fun (h : P) => h
def self : forall (P : Sort 0), P -> P := id (forall (P : Sort 0), P -> P) id
# 一つ上のレベルの同様の文は、自分自身の実例では「ない」。
# forall (A : Sort 1), A -> A は Sort 1 ではなく Sort 2 に属する。
def idT : forall (A : Sort 1), A -> A := fun (A : Sort 1) => fun (a : A) => a
def selfT : forall (A : Sort 1), A -> A := idT (forall (A : Sort 1), A -> A) idT
型は述語的である。 本体が命題でなければ(v ≥ 1 v \ge 1 v ≥ 1 )、Π \Pi Π は二つの宇宙のうち大きいほうに属するので、S o r t u \Sort{u} Sort u を量化する型は S o r t ( max ( u + 1 , v ) ) \Sort{(\max(u+1, v))} Sort ( max ( u + 1 , v )) に属し、これは決して S o r t u \Sort{u} Sort u にはならない。
Γ ⊢ S o r t u : S o r t ( u + 1 ) ; (T-Sort) Γ , x : S o r t u ⊢ B : S o r t v Γ ⊢ Π ( x : S o r t u ) . B : S o r t ( max ( u + 1 , v ) ) ; (T-Pi) \dfrac{
\dfrac{}{\Gamma \vdash \Sort{u} : \Sort{(u+1)}}\rulename{T-Sort}
\qquad
\Gamma, x : \Sort{u} \vdash B : \Sort{v}
}{\Gamma \vdash \tPi{x}{\Sort{u}}{B} : \Sort{(\max(u+1, v))}}\rulename{T-Pi} Γ ⊢ Π ( x : Sort u ) . B : Sort ( max ( u + 1 , v )) Γ ⊢ Sort u : Sort ( u + 1 ) ; (T-Sort) Γ , x : Sort u ⊢ B : Sort v ; (T-Pi)
この性質を述語性 (predicativity)と呼ぶ。たとえば型上の恒等関数 λ ( A : S o r t 1 ) . λ ( a : A ) . a \tLam{A}{\Sort{1}}{\tLam{a}{A}{a}} λ ( A : Sort 1 ) . λ ( a : A ) . a の型は Π ( A : S o r t 1 ) . A → A \tPi{A}{\Sort{1}}{A \to A} Π ( A : Sort 1 ) . A → A で、これは S o r t 2 \Sort{2} Sort 2 に属するので、自分自身の型には適用できないが、S o r t 2 \Sort{2} Sort 2 での複製なら適用できる。各レベルはその下のレベルを含み、実際には数レベルあれば足り、より高いレベルが現れるのは、すべての小さい圏の圏のような、大きな集まりを量化するときである。
なぜ安全なのか。 非述語性は前節が警告した自己言及に似ているが、閉じ込められており、S o r t 0 \Sort{0} Sort 0 は S o r t 0 \Sort{0} Sort 0 を量化する型を含むが、S o r t 0 \Sort{0} Sort 0 は自分自身の要素ではない。Coquand は、最下層に非述語的な宇宙が一つあっても整合的であることを示した [Coquand 1988] が、二つ のレベルが非述語的になると、すでに Girard のパラドックスが導出できる [Hurkens 1995]。これらの規則のもとで体系は整合的かつ強正規化的である(第 14 章 )。
なぜ命題は非述語的でよく、型はそうではないのか。命題の証明にはプログラムが取り出せるデータがなく、第 8 章の消去制限もその性質を守っている。すべての命題を量化して命題を定義するのは、すべての集合に言及する性質で集合を定義するのに似ている。作ったものが量化の対象に含まれ、しかも中身を調べられるなら危険だが、仮定として使うことしかできなければ同じ問題は起きない。パラドックスには作ったものを調べる 操作が必要であり、命題の証明ではそれができない。
Lean との比較
Lean [de Moura and Ullrich 2021] では、S o r t 0 \Sort{0} Sort 0 が Prop、S o r t ( u + 1 ) \Sort{(u+1)} Sort ( u + 1 ) が Type u であり、Π \Pi Π 型には上と同じく i m a x \imax imax で宇宙が割り当てられる。違いは二つ残る。
第一に、Lean の Prop には定義的証明無関係性 (definitional proof irrelevance)があり、同じ命題の任意の二つの証明は定義的に等しい。本書の変換は証明を同一視しないが、これを加えると変換が型に依存するようになり、第 12 章 の単純な「正規化して比較する」検査では足りなくなる。
第二に、Lean には宇宙多相 (universe polymorphism)があり、定義をすべてのレベル u u u について一度に述べられるので、i m a x \imax imax はレベル変数 に対しても重要になり、i m a x ( u , v ) ≤ w \imax(u, v) \le w imax ( u , v ) ≤ w のような制約が記号的に解かれる。本書の体系では、すべてのレベルは具体的な数である。
次の表に設計の選択肢をまとめる。
設計
量化できる範囲
欠点
宇宙なし
値のみ
「すべての命題について」と言えない
T y p e : T y p e \mathsf{Type} : \mathsf{Type} Type : Type
すべて
不整合
二つのソート ∗ : □ \ast : \square ∗ : □
∗ \ast ∗ のみ
□ \square □ 自身に型がない
max \max max を使う S o r t u : S o r t ( u + 1 ) \Sort{u} : \Sort{(u+1)} Sort u : Sort ( u + 1 )
任意のレベル
命題を量化する ∀ \forall ∀ が命題にならない
i m a x \imax imax を使う S o r t u : S o r t ( u + 1 ) \Sort{u} : \Sort{(u+1)} Sort u : Sort ( u + 1 ) (Lean)
任意のレベル
正規化の証明が難しくなる
本章の内容はすべて、src/typecheck.rs の infer の二行に収まる。Sort(u) の場合は Sort(u + 1) を返し、Pi の場合は本体のレベルが 0 なら Sort(0) を、そうでなければ最大値を返す。付録 C は、最初の行を Sort(u) を返すように変えるとカーネルが Hurkens の項を受け入れるようになることを示す。
演習
Π ( A : S o r t 1 ) . Π ( P : A → S o r t 0 ) . Π ( a : A ) . P a \tPi{A}{\Sort{1}}{\tPi{P}{A \to \Sort{0}}{\tPi{a}{A}{P\;a}}} Π ( A : Sort 1 ) . Π ( P : A → Sort 0 ) . Π ( a : A ) . P a の宇宙を計算せよ。これは「すべての型の上のすべての述語がいたるところで成り立つ」という文である(偽だが整形式である)。
解答
最も内側から。P a : S o r t 0 P\;a : \Sort{0} P a : Sort 0 なので Π ( a : A ) . P a : S o r t i m a x ( 1 , 0 ) = S o r t 0 \tPi{a}{A}{P\;a} : \Sort{\imax(1, 0)} = \Sort{0} Π ( a : A ) . P a : Sort imax ( 1 , 0 ) = Sort 0 である。次に A → S o r t 0 A \to \Sort{0} A → Sort 0 の宇宙は i m a x ( 1 , 1 ) = 1 \imax(1, 1) = 1 imax ( 1 , 1 ) = 1 (本体 S o r t 0 \Sort{0} Sort 0 の型は S o r t 1 \Sort{1} Sort 1 )なので、真ん中の Π \Pi Π の宇宙は i m a x ( 1 , 0 ) = 0 \imax(1, 0) = 0 imax ( 1 , 0 ) = 0 である。最後に S o r t 1 : S o r t 2 \Sort{1} : \Sort{2} Sort 1 : Sort 2 で本体は S o r t 0 \Sort{0} Sort 0 にあるので、i m a x ( 2 , 0 ) = 0 \imax(2, 0) = 0 imax ( 2 , 0 ) = 0 を得るので、文全体は命題である。i m a x \imax imax の代わりに max \max max なら S o r t 2 \Sort{2} Sort 2 に落ち着く。
プレイグラウンドの selfT の定義が拒否される理由を、関係する規則と二つの宇宙を挙げて説明せよ。
解答
idT は引数 A : S o r t 1 A : \Sort{1} A : Sort 1 を期待するが、与えられた引数は Π ( A : S o r t 1 ) . A → A \tPi{A}{\Sort{1}}{A \to A} Π ( A : Sort 1 ) . A → A で、T-Pi によるその宇宙は max ( 2 , 1 ) = 2 \max(2, 1) = 2 max ( 2 , 1 ) = 2 なので、C h e c k \Check Check は S o r t 2 \Sort{2} Sort 2 と S o r t 1 \Sort{1} Sort 1 を比較して失敗し、カーネルはその適用で型の不一致を報告する。これが述語性であり、S o r t 1 \Sort{1} Sort 1 を量化する型は S o r t 1 \Sort{1} Sort 1 に属さない。
覚えておくこと
命題変数が λ \lambda λ と Π \Pi Π に束縛されるので、S o r t 0 \Sort{0} Sort 0 には型が必要である。
自分自身を含む宇宙は不整合であり(Girard、Hurkens)、正規化も壊す。
階層 S o r t u : S o r t ( u + 1 ) \Sort{u} : \Sort{(u+1)} Sort u : Sort ( u + 1 ) は自己包含を避け、i m a x \imax imax は命題を非述語的に、それ以外をすべて述語的にする。
最下層に非述語的な宇宙が一つなら安全で、二つなら安全でない。Lean は同じ設計の上に証明無関係性と宇宙多相を加えている。