MathLabs

数学の基礎

型理論

すべての項が型を持つ、数学と計算のための基礎理論で、証明支援系に用いられる。

直観すべての値にはラベルがある

ほとんどのプログラミング言語では、33 は `int` で `"hello"` は `string` である——コンパイラはプログラムが実行される前に `3 + "hello"` を拒否する。型理論はこの日常的な発想を数学全体の基礎へと変える:集合と所属関係(x∈Ax \in A)から始める代わりに、項と型(t:At : A、「tt は型 AA を持つ」)から始める。注目すべきことに、型が十分に豊かになると、型が数学的な命題を符号化でき、その型の項が証明になる——プログラムと証明が同じ種類の対象になるのである。

各頂点に型判断を持つ型付け導出の木構造図。
型付け導出を木として表す:各頂点は判断 Γ⊢t:A\Gamma \vdash t : A であり、各辺は項をその部分項に結びつける型付け規則である。

大学単純型付きラムダ計算

定義: 型判断

型判断 Γ⊢t:A\Gamma \vdash t : A は「文脈 Γ\Gamma(変数と型のペアのリスト x1:A1,…,xn:Anx_1:A_1,\dots,x_n:A_n)のもとで、項 tt は型 AA を持つ」ことを表す。核となる規則:変数は文脈が割り当てた型を持つ;抽象 λx:A. t\lambda x{:}A.\,t は、x:Ax:A で拡張された文脈のもとで tt が型 BB を持つときに型 A→BA\to B を持つ;適用 f uf\,u は f:A→Bf:A\to B かつ u:Au:A のときに型 BB を持つ。

Γ,x:A⊢t:BΓ⊢λx:A. t:A→BΓ⊢f:A→BΓ⊢u:AΓ⊢f u:B\dfrac{\Gamma, x{:}A \vdash t : B}{\Gamma \vdash \lambda x{:}A.\,t : A\to B} \qquad \dfrac{\Gamma \vdash f : A\to B \quad \Gamma \vdash u : A}{\Gamma \vdash f\,u : B}

マルティン゠レーフの依存型理論はこれをさらに一般化する:関数の結果の型が引数の値に依存しうる。**Π\Pi型**(依存関数型)∏x:AB(x)\prod_{x:A} B(x) は、各 x:Ax:A を型 B(x)B(x) の項へ送る関数を集めたものである——BB が xx に言及しないとき、これは通常の A→BA\to B に帰着する。双対的に、**Σ\Sigma型**(依存対型)∑x:AB(x)\sum_{x:A} B(x) は a:Aa:A、b:B(a)b:B(a) である対 ⟨a,b⟩\langle a,b\rangle を集めたものである——第2成分の型が第1成分に依存する対である;BB が xx に言及しないとき、これは通常の直積 A×BA\times B に帰着する。

∏x:AB(x),∑x:AB(x)\prod_{x:A} B(x), \qquad \sum_{x:A} B(x)
依存型とそのCurry–Howard的解釈
型構成子非依存な特殊な場合Curry–Howard的解釈
∏x:AB(x)\prod_{x:A} B(x)A→BA\to B(BB が定数のとき)∀x:A, B(x)\forall x{:}A,\ B(x)
∑x:AB(x)\sum_{x:A} B(x)A×BA\times B(BB が定数のとき)∃x:A, B(x)\exists x{:}A,\ B(x)
univalence: (A≃B)≃(A=UB)(A\simeq B) \simeq (A =_{\mathcal U} B)—同値な型は同一視される

単純型付きラムダ計算において Γ⊢t:A\Gamma \vdash t : A ならば、tt は強正規化可能である:tt から始まるあらゆる β\beta簡約列は有限ステップで終了する。

なぜ正しいのか?

これが、単純型付きラムダ計算が関数適用や再帰的な入れ子を持つにもかかわらずチューリング完全ではない理由である——型付けされた項は決して無限に走ることができず、これこそがこの断片における型検査器が常に停止することを保証する。

証明

(タイトの被還元性の方法。)型の構造に関する帰納法により、各型 AA に対して「被還元項」の集合 REDA\mathrm{RED}_A を定義する:基本型 oo については、REDo\mathrm{RED}_o をすべての強正規化可能な項からなる集合 SNSN とする;関数型については、REDA→B={t:for every u∈REDA, t u∈REDB}\mathrm{RED}_{A\to B} = \{t : \text{for every } u \in \mathrm{RED}_A,\ t\,u \in \mathrm{RED}_B\} とする。

まず AA に関する帰納法により、3つの技術的性質をまとめて証明する:(CR1) REDA\mathrm{RED}_A のすべての項は強正規化可能である;(CR2) REDA\mathrm{RED}_A は β\beta簡約について閉じている(t∈REDAt\in\mathrm{RED}_A かつ t→t′t\to t' ならば t′∈REDAt'\in\mathrm{RED}_A);(CR3) 1段階簡約先がすべてすでに REDA\mathrm{RED}_A に属する「中立的な」項(抽象ではなく変数または適用)は、それ自身も REDA\mathrm{RED}_A に属する。基本の場合は SNSN の定義から直ちに従う;関数型の場合は REDA→B\mathrm{RED}_{A\to B} の定義を展開し、より小さい型 AA、BB に関する帰納法の仮定を用いる。

次に、自由変数に被還元項を代入したとき、あらゆる型付けされた項が被還元であることを示す:Γ⊢t:A\Gamma \vdash t:A の型付け導出に関する帰納法により、σ\sigma が Γ\Gamma の各変数 xx に項 σ(x)∈REDΓ(x)\sigma(x)\in\mathrm{RED}_{\Gamma(x)} を割り当てるならば、tσ∈REDAt\sigma \in \mathrm{RED}_A。変数の場合は直ちに従う。適用の場合は REDA→B\mathrm{RED}_{A\to B} の定義から直接従う。抽象の場合が最も注意を要する:(λx. t)σ(\lambda x.\,t)\sigma を任意の u∈REDAu\in\mathrm{RED}_A に適用すると、項は1回の β\betaステップで t(σ,x:=u)t(\sigma,x{:=}u) に簡約され、これは(拡張された代入に適用した)帰納法の仮定により REDB\mathrm{RED}_B に属する;性質(CR3)——簡約先がすべてすでに被還元である項の「展開」についての閉性——により、(λx. t)σ u(\lambda x.\,t)\sigma\,u 自身が REDB\mathrm{RED}_B に置かれ、したがって定義により (λx. t)σ∈REDA→B(\lambda x.\,t)\sigma \in \mathrm{RED}_{A\to B}。

最後に、これを恒等代入に適用する:各変数 x:Ax{:}A はそれ自身が中立的であり簡約先を一切持たないので、(CR3) により自明に REDA\mathrm{RED}_A に属する。したがって任意の閉じた導出 Γ⊢t:A\Gamma \vdash t:A について、σ\sigma が各 xx をそれ自身へ送るとすれば t=tσ∈REDAt = t\sigma \in \mathrm{RED}_A が得られる。(CR1) により REDA⊆SN\mathrm{RED}_A \subseteq SN なので t∈SNt \in SN:あらゆる型付けされた項は強正規化可能である。■\blacksquare

発展Curry–Howard対応

A→BA\to B を「AA ならば BB」、A×BA\times B を「AA かつ BB」と読み、ある命題の証明は対応する型の型付けされたプログラムになる——これが命題は型である、証明はプログラムであるという対応である。証明の検査は項の型検査に帰着し、証明の構成は正しい型のプログラムを書くことに帰着する。

原子、∧\wedge、→\to から構成される命題論理式 φ\varphi を考え、原子を基本型へ、∧\wedge を直積 ×\times へ、→\to を関数型 →\to へ翻訳して得られる単純型を AφA_\varphi とする。このとき、φ\varphi が直観主義命題論理で証明可能であることと、AφA_\varphi が住人を持つこと(閉じた項 tt が存在し ⊢t:Aφ\vdash t : A_\varphi であること)は同値である。

なぜ正しいのか?

これは「証明支援系は単なる型検査器である」という言葉の背後にある正確な主張である:Coq、Agda、Leanは、対応する型の項を受理するときにちょうど、定理の機械検査済み証明を受理する。そして型検査は(一般の定理証明とは異なり)小さく高速で機械的、かつ極めて信頼できるアルゴリズムである。

証明

(証明はプログラムになる。)⊢φ\vdash \varphi の自然演繹導出に関する帰納法による。最後の規則が →\to導入であり、仮定 ψ\psi のもとでの χ\chi の部分証明から φ=ψ→χ\varphi=\psi\to\chi を導く場合:帰納法の仮定により、その部分証明は x:Aψ⊢t:Aχx{:}A_\psi \vdash t : A_\chi である項 tt へ翻訳される(仮定は自由変数 xx になる);すると λx:Aψ. t\lambda x{:}A_\psi.\,t は閉じており型 Aψ→Aχ=AφA_\psi\to A_\chi=A_\varphi を持つ。最後の規則が ψ→χ\psi\to\chi と ψ\psi からの →\to除去(モーダスポネンス)の場合:帰納法の仮定により項 t1:Aψ→Aχt_1 : A_\psi\to A_\chi と t2:Aψt_2 : A_\psi が得られる;すると t1 t2:Aχt_1\,t_2 : A_\chi。∧\wedge導入と ∧\wedge除去の規則は、対 ⟨t1,t2⟩\langle t_1,t_2\rangle と2つの射影へ対称的に翻訳される。証明体系のすべての規則に対応する項構成規則があるので、導出に関する帰納法は型 AφA_\varphi の型付けされた閉じた項を生成する。

(プログラムは証明になる。)逆に、型付け導出 ⊢t:A\vdash t : A に関する帰納法による。各型付け規則——変数、抽象、適用、対、射影——は自然演繹の規則——仮定、→\to導入、→\to除去、∧\wedge導入、∧\wedge除去——とまったく同じ木の形を持つ。したがって同じ導出木を取り、すべての項を消去し、各型をそれが翻訳された論理式として読めば、これはまさに φ\varphi の妥当な直観主義的証明である(ここで A=AφA=A_\varphi)。

2つの翻訳(証明 →\to 項、および項 →\to 証明)は導出木上で互いに構造的な逆写像である——一方は他方が行うことを規則ごとに正確に取り消す——ので、φ\varphi が証明可能であることと AφA_\varphi が住人を持つことはちょうど同値である。■\blacksquare

大学実世界での応用と具体例

豊かな型システムは、プログラムが実行される前にバグの一群全体を捕らえる:Rustの所有権型はコンパイル時に解放後使用やデータ競合を防ぎ、依存型付き言語は「このリストはちょうど nn 個の要素を持つ」「このインデックスは範囲内である」といった不変条件を直接型に符号化でき、特定の実行時エラーを表現不可能にする。最も深い応用は証明支援系そのものの内部にある:Coq、Agda、Leanは、項の型検査だけを行う小さく注意深く監査されたカーネルを持つ——Curry–Howard対応により、定理の型の項を受理することは機械検査済みの証明を受理することそのものであるため、Feit–Thompsonの定理や四色定理ほどの規模の数学的結果を信頼することは、証明項を構築した(はるかに大きく監査がはるかに難しい)タクティクではなく、わずか数百行の型検査コードを信頼することに帰着する。

例: 通常の関数型では表現できない Π\Pi 型

Vec A n\mathrm{Vec}\,A\,n を型 AA の要素からなる長さ nn のリストの型とする。∏n:N(Vec A n→Vec A n)\prod_{n:\mathbb N} (\mathrm{Vec}\,A\,n \to \mathrm{Vec}\,A\,n)——「すべての長さ nn について、長さ nn のベクトル上の関数」——に住む項を書き下し、単純型(Π\Pi を持たない)がこの仕様をまったく表現できない理由を説明せよ。

解答

項 λn:N. λv:Vec A n. v\lambda n{:}\mathbb N.\,\lambda v{:}\mathrm{Vec}\,A\,n.\,v はうまくいく:各自然数 nn について、長さ nn のベクトル vv を受け取り、そのまま返す——明らかに型付けされている。v:Vec A nv : \mathrm{Vec}\,A\,n が、与えられたどの nn についても型 Vec A n\mathrm{Vec}\,A\,n で返されるからである。

これが通常の関数型ではなく Π\Pi の真の使用例である理由は、第2引数の型(Vec A n\mathrm{Vec}\,A\,n)が第1引数(nn)の値に言及しているからである。単純型付きラムダ計算では、関数の引数の型と結果の型は一度きり固定される——A,BA,B は型 AA のどんな値かが分かる前に選ばれた A→BA\to B である。「自然数 nn をください、そしてあなたが与えた数に応じて、ちょうどその長さのベクトルを要求します」ということを →\to だけで書く方法はない:あらゆる nn に同時に対応するような単一の固定型 Vec A n\mathrm{Vec}\,A\,n が必要になってしまうが、それは Vec\mathrm{Vec} が意味することではない。

具体的に、通常の関数型でこれを書こうとすると、せいぜい1つの固定されたプレースホルダー長についての N→(Vec A ?→Vec A ?)\mathbb N \to (\mathrm{Vec}\,A\,? \to \mathrm{Vec}\,A\,?) しか得られない——他のどんな長さのベクトルも拒否するか、間違った長さのベクトルを受け入れてしまうので役に立たない。Π\Pi 型 ∏n:N(⋯ )\prod_{n:\mathbb N}(\cdots) こそが、値域が受け取った nn の具体的な値を「振り返る」ことを可能にする型構成子であり、これがまさに単純型が表現できない依存性である。

例: 関数合成に対するCurry–Howard

論理式 (A→B)→((B→C)→(A→C))(A\to B)\to((B\to C)\to(A\to C)) は含意の推移性を表す。Curry–Howardのもとで、これを証明する λ\lambda項を見つけ、その型導出を段階的に検証せよ。

解答

その項は t=λf:A→B. λg:B→C. λx:A. g (f x)t = \lambda f{:}A\to B.\,\lambda g{:}B\to C.\,\lambda x{:}A.\,g\,(f\,x) である——まさに xx に適用された関数合成 g∘fg\circ f である。

内側から外側へ型を導出する。文脈 f:A→B, g:B→C, x:Af{:}A\to B,\,g{:}B\to C,\,x{:}A において:f:A→Bf:A\to B かつ x:Ax:A なので、適用により f x:Bf\,x:B。g:B→Cg:B\to C かつ f x:Bf\,x:B なので、適用により g (f x):Cg\,(f\,x):C。

次に内側から外側へ抽象を解消する。λx:A. g (f x)\lambda x{:}A.\,g\,(f\,x) は文脈 f:A→B, g:B→Cf{:}A\to B,\,g{:}B\to C のもとで型 A→CA\to C を持つ。次に λg:B→C. (⋯ )\lambda g{:}B\to C.\,(\cdots) は文脈 f:A→Bf{:}A\to B のもとで型 (B→C)→(A→C)(B\to C)\to(A\to C) を持つ。最後に λf:A→B. (⋯ )\lambda f{:}A\to B.\,(\cdots) は自由な仮定を一切残さず型 (A→B)→((B→C)→(A→C))(A\to B)\to((B\to C)\to(A\to C)) を持つ——閉じた項である。

したがって ⊢t:(A→B)→((B→C)→(A→C))\vdash t : (A\to B)\to((B\to C)\to(A\to C)) であり、tt は推移性のCurry–Howard証明である:「AA ならば BB、かつ BB ならば CC ならば、AA ならば CC」——これは関数型プログラマが2つの関数を合成するために書くのとまったく同じ項である。

研究現在の研究

単純型付きラムダ計算において、f:A→Bf : A \to B かつ a:Aa : A のとき、f af\,a の型は何か?

Coq、Agda、Leanのような証明支援系は、なぜ数千行にわたる機械検査済みの証明を信頼できるのか?

B(x)B(x) が実際には xx に依存しないとき、∏x:AB(x)\prod_{x:A} B(x) は何に帰着するか?

univalence公理 (A≃B)≃(A=UB)(A\simeq B) \simeq (A =_{\mathcal U} B) が述べているのは...

参考文献

  1. The Univalent Foundations Program (2013). Homotopy Type Theory: Univalent Foundations of Mathematics
  2. Wikipedia contributors (2024). Curry–Howard correspondence
  3. Wikipedia contributors (2024). Intuitionistic type theory