← 戻る ライブラリ › 数学の基礎 › 計算可能性と証明 数学の基礎
型理論 すべての項が型を持つ、数学と計算のための基礎理論で、証明支援系に用いられる。
直観 すべての値にはラベルがある ほとんどのプログラミング言語では、3 3 3 は `int` で `"hello"` は `string` である——コンパイラはプログラムが実行される前に `3 + "hello"` を拒否する。型理論 はこの日常的な発想を数学全体の基礎へと変える:集合と所属関係(x ∈ A x \in A x ∈ A )から始める代わりに、項と型 (t : A t : A t : A 、「t t t は型 A A A を持つ」)から始める。注目すべきことに、型が十分に豊かになると、型 が数学的な命題 を符号化でき、その型の項 が証明 になる——プログラムと証明が同じ種類の対象になるのである。
型付け導出を木として表す:各頂点は判断 Γ ⊢ t : A \Gamma \vdash t : A Γ ⊢ t : A であり、各辺は項をその部分項に結びつける型付け規則である。 大学 単純型付きラムダ計算 定義: 型判断
型判断 Γ ⊢ t : A \Gamma \vdash t : A Γ ⊢ t : A は「文脈 Γ \Gamma Γ (変数と型のペアのリスト x 1 : A 1 , … , x n : A n x_1:A_1,\dots,x_n:A_n x 1 : A 1 , … , x n : A n )のもとで、項 t t t は型 A A A を持つ」ことを表す。核となる規則:変数は文脈が割り当てた型を持つ;抽象 λ x : A . t \lambda x{:}A.\,t λ x : A . t は、x : A x:A x : A で拡張された文脈のもとで t t t が型 B B B を持つときに型 A → B A\to B A → B を持つ;適用 f u f\,u f u は f : A → B f:A\to B f : A → B かつ u : A u:A u : A のときに型 B B B を持つ。
Γ , 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} Γ ⊢ λ x : A . t : A → B Γ , x : A ⊢ t : B Γ ⊢ f u : B Γ ⊢ f : A → B Γ ⊢ u : A マルティン゠レーフの依存型理論はこれをさらに一般化する:関数の結果 の型が引数の値 に依存しうる。**Π \Pi Π 型**(依存関数型)∏ x : A B ( x ) \prod_{x:A} B(x) ∏ x : A B ( x ) は、各 x : A x:A x : A を型 B ( x ) B(x) B ( x ) の項へ送る関数を集めたものである——B B B が x x x に言及しないとき、これは通常の A → B A\to B A → B に帰着する。双対的に、**Σ \Sigma Σ 型**(依存対型)∑ x : A B ( x ) \sum_{x:A} B(x) ∑ x : A B ( x ) は a : A a:A a : A 、b : B ( a ) b:B(a) b : B ( a ) である対 ⟨ a , b ⟩ \langle a,b\rangle ⟨ a , b ⟩ を集めたものである——第2成分の型 が第1成分に依存する対である;B B B が x x x に言及しないとき、これは通常の直積 A × B A\times B A × B に帰着する。
∏ x : A B ( x ) , ∑ x : A B ( x ) \prod_{x:A} B(x), \qquad \sum_{x:A} B(x) x : A ∏ B ( x ) , x : A ∑ B ( x ) 依存型とそのCurry–Howard的解釈 型構成子 非依存な特殊な場合 Curry–Howard的解釈 ∏ x : A B ( x ) \prod_{x:A} B(x) ∏ x : A B ( x ) A → B A\to B A → B (B B B が定数のとき)∀ x : A , B ( x ) \forall x{:}A,\ B(x) ∀ x : A , B ( x ) ∑ x : A B ( x ) \sum_{x:A} B(x) ∑ x : A B ( x ) A × B A\times B A × B (B B B が定数のとき)∃ x : A , B ( x ) \exists x{:}A,\ B(x) ∃ x : A , B ( x ) univalence: ( A ≃ B ) ≃ ( A = U B ) (A\simeq B) \simeq (A =_{\mathcal U} B) ( A ≃ B ) ≃ ( A = U B ) — 同値な型は同一視される
単純型付きラムダ計算において Γ ⊢ t : A \Gamma \vdash t : A Γ ⊢ t : A ならば、t t t は強正規化可能 である:t t t から始まるあらゆる β \beta β 簡約列は有限ステップで終了する。
なぜ正しいのか? これが、単純型付きラムダ計算が関数適用や再帰的な入れ子を持つにもかかわらずチューリング完全ではない 理由である——型付けされた項は決して無限に走ることができず、これこそがこの断片における型検査器が常に停止することを保証する。
証明 (タイトの被還元性の方法。)型の構造に関する帰納法により、各型 A A A に対して「被還元項」の集合 R E D A \mathrm{RED}_A RED A を定義する:基本型 o o o については、R E D o \mathrm{RED}_o RED o をすべての強正規化可能な項からなる集合 S N SN S N とする;関数型については、R E D A → B = { t : for every u ∈ R E D A , t u ∈ R E D B } \mathrm{RED}_{A\to B} = \{t : \text{for every } u \in \mathrm{RED}_A,\ t\,u \in \mathrm{RED}_B\} RED A → B = { t : for every u ∈ RED A , t u ∈ RED B } とする。
まず A A A に関する帰納法により、3つの技術的性質をまとめて証明する:(CR1) R E D A \mathrm{RED}_A RED A のすべての項は強正規化可能である;(CR2) R E D A \mathrm{RED}_A RED A は β \beta β 簡約について閉じている(t ∈ R E D A t\in\mathrm{RED}_A t ∈ RED A かつ t → t ′ t\to t' t → t ′ ならば t ′ ∈ R E D A t'\in\mathrm{RED}_A t ′ ∈ RED A );(CR3) 1段階簡約先がすべてすでに R E D A \mathrm{RED}_A RED A に属する「中立的な」項(抽象ではなく変数または適用)は、それ自身も R E D A \mathrm{RED}_A RED A に属する。基本の場合は S N SN S N の定義から直ちに従う;関数型の場合は R E D A → B \mathrm{RED}_{A\to B} RED A → B の定義を展開し、より小さい型 A A A 、B B B に関する帰納法の仮定を用いる。
次に、自由変数に被還元項を代入したとき、あらゆる型付けされた項が被還元であることを示す:Γ ⊢ t : A \Gamma \vdash t:A Γ ⊢ t : A の型付け導出に関する帰納法により、σ \sigma σ が Γ \Gamma Γ の各変数 x x x に項 σ ( x ) ∈ R E D Γ ( x ) \sigma(x)\in\mathrm{RED}_{\Gamma(x)} σ ( x ) ∈ RED Γ ( x ) を割り当てるならば、t σ ∈ R E D A t\sigma \in \mathrm{RED}_A t σ ∈ RED A 。変数の場合は直ちに従う。適用の場合は R E D A → B \mathrm{RED}_{A\to B} RED A → B の定義から直接従う。抽象の場合が最も注意を要する:( λ x . t ) σ (\lambda x.\,t)\sigma ( λ x . t ) σ を任意の u ∈ R E D A u\in\mathrm{RED}_A u ∈ RED A に適用すると、項は1回の β \beta β ステップで t ( σ , x : = u ) t(\sigma,x{:=}u) t ( σ , x := u ) に簡約され、これは(拡張された代入に適用した)帰納法の仮定により R E D B \mathrm{RED}_B RED B に属する;性質(CR3)——簡約先がすべてすでに被還元である項の「展開」についての閉性——により、( λ x . t ) σ u (\lambda x.\,t)\sigma\,u ( λ x . t ) σ u 自身が R E D B \mathrm{RED}_B RED B に置かれ、したがって定義により ( λ x . t ) σ ∈ R E D A → B (\lambda x.\,t)\sigma \in \mathrm{RED}_{A\to B} ( λ x . t ) σ ∈ RED A → B 。
最後に、これを恒等代入に適用する:各変数 x : A x{:}A x : A はそれ自身が中立的であり簡約先を一切持たないので、(CR3) により自明に R E D A \mathrm{RED}_A RED A に属する。したがって任意の閉じた導出 Γ ⊢ t : A \Gamma \vdash t:A Γ ⊢ t : A について、σ \sigma σ が各 x x x をそれ自身へ送るとすれば t = t σ ∈ R E D A t = t\sigma \in \mathrm{RED}_A t = t σ ∈ RED A が得られる。(CR1) により R E D A ⊆ S N \mathrm{RED}_A \subseteq SN RED A ⊆ S N なので t ∈ S N t \in SN t ∈ S N :あらゆる型付けされた項は強正規化可能である。■ \blacksquare ■
発展 Curry–Howard対応 A → B A\to B A → B を「A A A ならば B B B 」、A × B A\times B A × B を「A A A かつ B B B 」と読み、ある命題の証明 は対応する型の型付けされたプログラム になる——これが命題は型である、証明はプログラムである という対応である。証明の検査は項の型検査に帰着し、証明の構成は正しい型のプログラムを書くことに帰着する。
原子、∧ \wedge ∧ 、→ \to → から構成される命題論理式 φ \varphi φ を考え、原子を基本型へ、∧ \wedge ∧ を直積 × \times × へ、→ \to → を関数型 → \to → へ翻訳して得られる単純型を A φ A_\varphi A φ とする。このとき、φ \varphi φ が直観主義命題論理で証明可能であることと、A φ A_\varphi A φ が住人を持つ こと(閉じた項 t t t が存在し ⊢ t : A φ \vdash t : A_\varphi ⊢ t : A φ であること)は同値である。
なぜ正しいのか? これは「証明支援系は単なる型検査器である」という言葉の背後にある正確な主張である:Coq、Agda、Leanは、対応する型の項を受理するときにちょうど、定理の機械検査済み証明を受理する。そして型検査は(一般の定理証明とは異なり)小さく高速で機械的、かつ極めて信頼できるアルゴリズムである。
証明 (証明はプログラムになる。)⊢ φ \vdash \varphi ⊢ φ の自然演繹導出に関する帰納法による。最後の規則が → \to → 導入であり、仮定 ψ \psi ψ のもとでの χ \chi χ の部分証明から φ = ψ → χ \varphi=\psi\to\chi φ = ψ → χ を導く場合:帰納法の仮定により、その部分証明は x : A ψ ⊢ t : A χ x{:}A_\psi \vdash t : A_\chi x : A ψ ⊢ t : A χ である項 t t t へ翻訳される(仮定は自由変数 x x x になる);すると λ x : A ψ . t \lambda x{:}A_\psi.\,t λ x : A ψ . t は閉じており型 A ψ → A χ = A φ A_\psi\to A_\chi=A_\varphi A ψ → A χ = A φ を持つ。最後の規則が ψ → χ \psi\to\chi ψ → χ と ψ \psi ψ からの → \to → 除去(モーダスポネンス)の場合:帰納法の仮定により項 t 1 : A ψ → A χ t_1 : A_\psi\to A_\chi t 1 : A ψ → A χ と t 2 : A ψ t_2 : A_\psi t 2 : A ψ が得られる;すると t 1 t 2 : A χ t_1\,t_2 : A_\chi t 1 t 2 : A χ 。∧ \wedge ∧ 導入と ∧ \wedge ∧ 除去の規則は、対 ⟨ t 1 , t 2 ⟩ \langle t_1,t_2\rangle ⟨ t 1 , t 2 ⟩ と2つの射影へ対称的に翻訳される。証明体系のすべての規則に対応する項構成規則があるので、導出に関する帰納法は型 A φ A_\varphi A φ の型付けされた閉じた項を生成する。
(プログラムは証明になる。)逆に、型付け導出 ⊢ t : A \vdash t : A ⊢ t : A に関する帰納法による。各型付け規則——変数、抽象、適用、対、射影——は自然演繹の規則——仮定、→ \to → 導入、→ \to → 除去、∧ \wedge ∧ 導入、∧ \wedge ∧ 除去——とまったく同じ木の形を持つ。したがって同じ導出木を取り、すべての項を消去し、各型をそれが翻訳された論理式として読めば、これはまさに φ \varphi φ の妥当な直観主義的証明である(ここで A = A φ A=A_\varphi A = A φ )。
2つの翻訳(証明 → \to → 項、および項 → \to → 証明)は導出木上で互いに構造的な逆写像である——一方は他方が行うことを規則ごとに正確に取り消す——ので、φ \varphi φ が証明可能であることと A φ A_\varphi A φ が住人を持つことはちょうど同値である。■ \blacksquare ■
大学 実世界での応用と具体例 豊かな型システムは、プログラムが実行される前にバグの一群全体を捕らえる:Rustの所有権型はコンパイル時に解放後使用やデータ競合を防ぎ、依存型付き言語は「このリストはちょうど n n n 個の要素を持つ」「このインデックスは範囲内である」といった不変条件を直接型に符号化でき、特定の実行時エラーを表現不可能 にする。最も深い応用は証明支援系 そのものの内部にある:Coq、Agda、Leanは、項の型検査だけを行う小さく注意深く監査されたカーネルを持つ——Curry–Howard対応により、定理の型の項を受理することは機械検査済みの証明を受理することそのもの であるため、Feit–Thompsonの定理や四色定理ほどの規模の数学的結果を信頼することは、証明項を構築した(はるかに大きく監査がはるかに難しい)タクティクではなく、わずか数百行の型検査コードを信頼することに帰着する。
例: 通常の関数型では表現できない Π \Pi Π 型
V e c A n \mathrm{Vec}\,A\,n Vec A n を型 A A A の要素からなる長さ n n n のリストの型とする。∏ n : N ( V e c A n → V e c A n ) \prod_{n:\mathbb N} (\mathrm{Vec}\,A\,n \to \mathrm{Vec}\,A\,n) ∏ n : N ( Vec A n → Vec A n ) ——「すべての長さ n n n について、長さ n n n のベクトル上の関数」——に住む項を書き下し、単純型(Π \Pi Π を持たない)がこの仕様をまったく表現できない理由を説明せよ。
解答 項 λ n : N . λ v : V e c A n . v \lambda n{:}\mathbb N.\,\lambda v{:}\mathrm{Vec}\,A\,n.\,v λn : N . λ v : Vec A n . v はうまくいく:各自然数 n n n について、長さ n n n のベクトル v v v を受け取り、そのまま返す——明らかに型付けされている。v : V e c A n v : \mathrm{Vec}\,A\,n v : Vec A n が、与えられたどの n n n についても型 V e c A n \mathrm{Vec}\,A\,n Vec A n で返されるからである。
これが通常の関数型ではなく Π \Pi Π の真の使用例である理由は、第2引数の型 (V e c A n \mathrm{Vec}\,A\,n Vec A n )が第1引数(n n n )の値 に言及しているからである。単純型付きラムダ計算では、関数の引数の型と結果の型は一度きり固定される——A , B A,B A , B は型 A A A のどんな値かが分かる前に選ばれた A → B A\to B A → B である。「自然数 n n n をください、そしてあなたが与えた数に応じて、ちょうどその長さのベクトルを要求します」ということを → \to → だけで書く方法はない:あらゆる n n n に同時に対応するような単一の固定型 V e c A n \mathrm{Vec}\,A\,n Vec A n が必要になってしまうが、それは V e c \mathrm{Vec} Vec が意味することではない。
具体的に、通常の関数型でこれを書こうとすると、せいぜい1つの固定されたプレースホルダー長についての N → ( V e c A ? → V e c A ? ) \mathbb N \to (\mathrm{Vec}\,A\,? \to \mathrm{Vec}\,A\,?) N → ( Vec A ? → Vec A ?) しか得られない——他のどんな長さのベクトルも拒否するか、間違った長さのベクトルを受け入れてしまうので役に立たない。Π \Pi Π 型 ∏ n : N ( ⋯ ) \prod_{n:\mathbb N}(\cdots) ∏ n : N ( ⋯ ) こそが、値域が受け取った n n n の具体的な値を「振り返る」ことを可能にする型構成子であり、これがまさに単純型が表現できない依存性である。
例: 関数合成に対するCurry–Howard
論理式 ( A → B ) → ( ( B → C ) → ( A → C ) ) (A\to B)\to((B\to C)\to(A\to C)) ( A → B ) → (( B → C ) → ( A → 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) t = λ f : A → B . λ g : B → C . λ x : A . g ( f x ) である——まさに x x x に適用された関数合成 g ∘ f g\circ f g ∘ f である。
内側から外側へ型を導出する。文脈 f : A → B , g : B → C , x : A f{:}A\to B,\,g{:}B\to C,\,x{:}A f : A → B , g : B → C , x : A において:f : A → B f:A\to B f : A → B かつ x : A x:A x : A なので、適用により f x : B f\,x:B f x : B 。g : B → C g:B\to C g : B → C かつ f x : B f\,x:B f x : B なので、適用により g ( f x ) : C g\,(f\,x):C g ( f x ) : C 。
次に内側から外側へ抽象を解消する。λ x : A . g ( f x ) \lambda x{:}A.\,g\,(f\,x) λ x : A . g ( f x ) は文脈 f : A → B , g : B → C f{:}A\to B,\,g{:}B\to C f : A → B , g : B → C のもとで型 A → C A\to C A → C を持つ。次に λ g : B → C . ( ⋯ ) \lambda g{:}B\to C.\,(\cdots) λ g : B → C . ( ⋯ ) は文脈 f : A → B f{:}A\to B f : A → B のもとで型 ( B → C ) → ( A → C ) (B\to C)\to(A\to C) ( B → C ) → ( A → C ) を持つ。最後に λ f : A → B . ( ⋯ ) \lambda f{:}A\to B.\,(\cdots) λ f : A → B . ( ⋯ ) は自由な仮定を一切残さず型 ( A → B ) → ( ( B → C ) → ( A → C ) ) (A\to B)\to((B\to C)\to(A\to C)) ( A → B ) → (( B → C ) → ( A → C )) を持つ——閉じた項である。
したがって ⊢ t : ( A → B ) → ( ( B → C ) → ( A → C ) ) \vdash t : (A\to B)\to((B\to C)\to(A\to C)) ⊢ t : ( A → B ) → (( B → C ) → ( A → C )) であり、t t t は推移性のCurry–Howard証明である:「A A A ならば B B B 、かつ B B B ならば C C C ならば、A A A ならば C C C 」——これは関数型プログラマが2つの関数を合成するために書くのとまったく同じ項である。
よくある誤り. Π x : A B ( x ) \Pi_{x:A}B(x) Π x : A B ( x ) と Σ x : A B ( x ) \Sigma_{x:A}B(x) Σ x : A B ( x ) を、すでに存在する集合の宇宙に付け足しただけの単なる量化子と混同してはならない——それらは新しい型形成操作 であり、それらの非依存な特殊な場合(Π → \Pi\to Π → 通常の関数型、Σ → \Sigma\to Σ → 通常の直積)は、「依存型」の議論が実際には依存性をまったく使っていないなら疑うべき兆候そのものである。もう一つのよくある混同:univalence公理 ( A ≃ B ) ≃ ( A = U B ) (A\simeq B)\simeq(A=_{\mathcal U}B) ( A ≃ B ) ≃ ( A = U B ) は型の命題的 等式 = U =_{\mathcal U} = U (それ自体で計算できる経路/同一視)についてであり、型検査器が自動的に用いるはるかに厳格な定義上の (判断的な)等式についてではない——univalenceは呼び出す 必要があり、型付け規則だけから自動的に得られるものではない。歴史的ノート
アロンゾ・チャーチは1940年、型なしラムダ計算のパラドックスを避けるために単純型を導入した。クルト・ゲーデルの1958年の「Dialectica解釈」は、原始再帰関数汎関数の型付き計算——型付き証明解釈の直接の祖先——を用いて、算術の構成的無矛盾性証明を与えた。1972年、ペール・マルティン゠レーフは、Π \Pi Π 型とΣ \Sigma Σ 型により論理と計算を統一する依存型理論を発表した。型付きプログラムと論理的証明が同じ対象であるという観察は、通常ハスケル・カリー(1958年)とウィリアム・ハワード(1969年執筆、1980年出版)に帰せられ、この対応に名前を与えている。2013年、Vladimir Voevodskyのunivalence公理に続き、Univalent Foundations Programによる「HoTT本」がホモトピー型理論を数学の新しい候補基礎として提案した。
クルト・ゲーデル
研究 現在の研究 研究の最前線 2026年時点
ホモトピー型理論とVoevodskyのUnivalent Foundationsプログラムは、ZFC集合論を(まだ置き換えるのではなく)並走する数学の候補基礎として発展し続けており、キュービカル型理論 (おおよそ2015年以降)は、区間型から直接型の等式を構築することで、univalence公理に真の計算的内容を与えている——長年の未解決問題だった——そしてこの計算的な扱いは2026年現在もなお洗練され、より豊かな型構成子へと拡張され続けている。大規模な形式化の取り組みは、作業用数学インフラとしての型理論の力を実証している:Leanベースの`mathlib`ライブラリは形式化された数学の最大級の集積の一つへと成長し、Peter ScholzeとDustin Clausenによる2020〜2022年の「Liquid Tensor Experiment」はLeanを用いて凝縮数学の難しい定理を形式的に検証し、(Kevin Buzzardが主導するものを含む)フェルマーの最終定理の完全な形式化を目指すコミュニティの取り組みは2020年代半ば現在も活発である。別途、高次帰納型と総合的ホモトピー論(型理論の内部で球面のホモトピー群を直接計算する)に関する研究や、決定可能な型検査を犠牲にすることなく通常の数学的実践をより多く支えるよう依存型理論を強化する研究も続いている。
単純型付きラムダ計算において、f : A → B f : A \to B f : A → B かつ a : A a : A a : A のとき、f a f\,a f a の型は何か?
A A A B B B A → B A \to B A → B A × B A \times B A × B Coq、Agda、Leanのような証明支援系は、なぜ数千行にわたる機械検査済みの証明を信頼できるのか?
証明の検査は、小さく信頼できるカーネルによって行われる、定理の型に対する項の型検査に帰着するから 証明はその都度AIモデルによって再導出されるから 証明は多くの異なる証明器の多数決によって検査されるから 定理の主張は証明なしに単に仮定されるから
B ( x ) B(x) B ( x ) が実際には x x x に依存しないとき、∏ x : A B ( x ) \prod_{x:A} B(x) ∏ x : A B ( x ) は何に帰着するか?
A × B A \times B A × B A → B A \to B A → B A A A B B B univalence公理 ( A ≃ B ) ≃ ( A = U B ) (A\simeq B) \simeq (A =_{\mathcal U} B) ( A ≃ B ) ≃ ( A = U B ) が述べているのは...
同値な(同型な)型は命題的に等しいものとして扱える すべての型は有限である すべての関数は定数時間で計算可能である 型検査は決定不可能である