単純型付きラムダ計算とカリー=ハワード対応:証明はプログラムである
対象読者: 本テーマの型なしラムダ計算の章(β 簡約・チャーチ=ロッサー)と、数学的帰納法を学んだ人。自然演繹や型理論は仮定しません。
前提となる記事:型なしラムダ計算:関数の適用と置換だけで計算を書き尽くす、証明の技術:数学的帰納法と背理法はなぜ正しいのか、不変量の原理
0. この記事の要点
Section titled “0. この記事の要点”プログラムの関数に「整数を受け取って整数を返す」といった型を付けると、型の合わない呼び出しは最初から排除されます。この記事は、そうした型の付いた関数だけからなる小さな計算体系を調べ、型の付いた関数の計算は必ず終わること、そして型の付いた関数が数学の証明とまったく同じ形をしていることを示します。読み終えると、Lean で定理を書くことがなぜプログラムを書くことなのかを説明できるようになります。
- 単純型付きラムダ計算(STLC)は、λ 項に「型」 を付け、型の合う適用だけを許す体系です。型付けは簡約で保たれ(主部簡約定理、定理 2.5)、型の付く項はどの順に簡約しても必ず止まります(強正規化定理、定理 3.1)。後者はテイトの還元可能性の方法で証明します。
- カリー=ハワード対応(定理 4.2):型 を命題「 ならば 」と読むと、型 の項は直観主義の自然演繹(仮定から決まった規則で結論を導く形の証明体系)における の証明と一対一に対応し、β 簡約は証明の「回り道の除去」に対応します。
- この対応から、強正規化定理は「すべての証明は回り道のない正規な証明に直せる」という定理になり、そこから論理の無矛盾性や、パースの法則 が直観主義論理で証明できないことが導けます。
- BHK 解釈は「 の証明とは、 の証明を の証明に変える方法である」という証明の意味論で、カリー=ハワード対応はその精密化です。排中律がここに含まれない理由もこの観点から説明できます。
- Lean で
theoremを書くことは、この対応のもとでプログラムを書くことにほかなりません。記事中の Lean 4 のコードは、標準ライブラリだけで動作を確認したものです。
1. 動機:証明とプログラムが同じものだったら
Section titled “1. 動機:証明とプログラムが同じものだったら”1.1. 二つの見慣れた作業
Section titled “1.1. 二つの見慣れた作業”数学の証明を書くことと、プログラムを書くことは、ふつう別の作業だと考えられています。けれども、次の二つを並べてみてください。
- 命題「 ならば( ならば )」の証明。「 を仮定する。さらに を仮定する。最初の仮定から 。」
- プログラム「 を受け取り、 を受け取って、 を返す関数」。λ 記法で 。
証明は「仮定を受け取って結論を作る手続き」になっていて、プログラムはまさにその手続きです。もう一つ、三段論法(モーダス・ポネンス)「 と から 」は、「関数 に引数 を適用すると 」とそっくりです。
この類似は偶然ではありません。命題を型と読み、証明をその型のプログラムと読むと、論理の規則と型付けの規則が完全に一致するのです。カリー (1934, 1958) が組合せ論理(変数を使わず、K や S といった少数の記号だけで関数を表す体系)で気づき、ハワード (1969) が自然演繹と λ 計算の対応として定式化しました。これがカリー=ハワード対応で、この記事の主題です。
1.2. Lean では実際にそう書く
Section titled “1.2. Lean では実際にそう書く”証明支援系 Lean は、この対応をそのまま実装しています。次の Lean 4 のコードはどれも、標準ライブラリだけでそのまま通ります。
theorem k_comb (A B : Prop) : A → B → A := fun a _ => a
theorem s_comb (A B C : Prop) : (A → B → C) → (A → B) → A → C := fun f g a => f a (g a)
theorem k_tac (A B : Prop) : A → B → A := by intro a _ exact a#print k_tac -- theorem k_tac : ∀ (A B : Prop), A → B → A := fun A B a a_1 => atheorem の : の後ろが命題(型)、:= の後ろが証明(項)です。fun a _ => a は前章の λ 項 に型を付けたもので、_ は使わない引数の名前です。3 つ目は同じ定理を tactic(by 以下の命令列)で証明したもので、intro は仮定を導入し、exact は結論そのものの項を与えます。#print で中身を表示すると、tactic が組み立てたのは結局 fun A B a a_1 => a という λ 項だと分かります。Lean のカーネルが確認しているのは、「この項がこの型をもつか」という型検査だけです。
1.3. なぜ型が要るのか
Section titled “1.3. なぜ型が要るのか”前章の型なしラムダ計算では、どんな項にも不動点がありました。論理として読むと、「 は の否定に等しい」という文が作れてしまい、矛盾します(型なしラムダ計算 の 注意 6.8[型なしラムダ計算])。型はこの自己適用 を禁止します。その代償として計算能力は落ちますが、代わりにすべての計算が止まるという強い性質が得られます。論理として使うにはこの性質こそが必要で、それが無矛盾性の源になります。
2. 単純型付きラムダ計算
Section titled “2. 単純型付きラムダ計算”2.1. 型と型付け規則
Section titled “2.1. 型と型付け規則”型を、基本型 から で作られるものとする( は右結合)。項は型なしの λ 項と同じだが、抽象に束縛変数の型を書いて とする。文脈 は変数と型の組 の有限列(変数は相異なる)で、型付け判断 を次の 3 規則で帰納的に定める。
β 簡約 と置換は型なしの場合と同じに定める。
規則は項の形で決まります。変数なら (var)、抽象なら (abs)、適用なら (app) しか使えません。したがって次が成り立ちます。
証明(補題 2.2)
(1) 項の形ごとに、最後に使える規則が一つしかないことから従う。(2) の構成に関する帰納法。変数は の中の型が一つ。抽象 は (1) と帰納法の仮定で が一意。適用 は、帰納法の仮定により の型 が一意なので も一意。導出の一意性も同じ帰納法で、各段の規則とその前提が項から決まることによる。
例 2.3(自己適用には型が付かない)
にどんな型 を与えても には型が付きません。 とすると、(1) から は と の両方の型をもち、型の一意性から 。ところが右辺の型は左辺より真に長い記号列なので、これは不可能です。こうして や不動点結合子 は締め出されます。
2.2. 主部簡約定理
Section titled “2.2. 主部簡約定理”証明(補題 2.4)
(1) 導出に関する帰納法。(abs) では束縛変数を と異なるように選ぶ(変数の規約)。
(2) に関する帰納法。 なら で 。 なら 。 なら 補題 2.2 (1) で 、 に分け、帰納法の仮定と (app)。 なら 、。文脈の順序を入れ替えても導出は変わらないので 、(1) で 、帰納法の仮定で 、(abs) で結論を得る。
証明(定理 2.5)
の定義(定義 3.1[型なしラムダ計算])に関する帰納法。β 基の縮約 のとき、補題 2.2 (1) を 2 回使うと 、。補題 2.4 (2) で 。部分項の中の簡約の場合は、生成補題で型付けを分解し、帰納法の仮定を当てはめて同じ規則で組み直す。
「型の付いたプログラムは、実行の途中でも型が付いたまま」という意味で、型安全性の半分にあたる定理です。逆向き(簡約先に型が付けば元にも付く)は成り立ちません(演習)。
3. 強正規化定理
Section titled “3. 強正規化定理”項 が強正規化可能 (SN) であるとは、 から始まる β 簡約(定義)の無限列が存在しないことをいいます。前章の はもちろん SN ではなく、 は正規形をもつが SN ではありません。
型の大きさや項の大きさに関する素朴な帰納法は失敗します。 では が何か所にもコピーされ、項は大きくなりうるからです。テイト (1967) のアイデアは、型ごとに「十分によい項」の集合を定め、「よい」という性質のほうを型に沿って帰納的に定義することでした。
以下、SN な項についての帰納法を使います。SN な項全体の上で、関係 には無限下降列がありません。したがって、性質 について「 のすべての 1 ステップ簡約先 で ならば 」が SN な各 で成り立てば、すべての SN な で が成り立ちます( を満たさない SN な項があれば、 を満たさない 1 ステップ簡約先を次々にとって無限列が得られ、矛盾)。これを SN 帰納法と呼びます。また、抽象でない項を中立と呼びます。中立な項 と任意の について、 は β 基ではありません。
次の定義がなぜ型ごとに集合を作るのかを先に述べます。基本型 の項については「止まる(SN)」ことを求めれば十分ですが、 のような関数の型の項には、「よい引数を渡すとよい結果を返す」という性質を求めたい。そこで「よい項」の意味を、型が大きくなるにつれて一段ずつ定めていきます。
次の補題は、この定義を使いやすくする 3 つの性質です。(CR1) は還元可能なら止まること、(CR2) は簡約しても還元可能のままであること、(CR3) は「簡約先がすべてよい中立な項は、それ自身もよい」ことを述べています。証明は型に関する帰納法で、矢印型の (CR3) では引数 の簡約についての SN 帰納法が内側に入ります(外側の帰納法は型、内側は の簡約です)。
すべての型 について次が成り立つ。
- (CR1) ならば は SN。
- (CR2) かつ ならば 。
- (CR3) が中立で、 の 1 ステップ簡約先がすべて に属するならば、。
とくに (CR3) から、変数はすべての に属する(変数は中立で、簡約先をもたない)。
証明(補題 3.3)
型 に関する帰納法で 3 条件を同時に示す。
の場合。 (CR1) は定義そのもの。(CR2) SN な項の簡約先は SN( からの無限列は からの無限列を与える)。(CR3) からの簡約列は必ず最初に 1 ステップ簡約先を通り、そこから先は SN なので有限で止まる。
の場合。 では 3 条件が成り立つとする。
(CR1) とする。変数 は の (CR3) により に属するから、 で、 の (CR1) により は SN。 からの無限列 があれば も無限列になるので、 は SN。
(CR2) について で 。 の (CR2) で 。よって 。
(CR3) を中立とし、その 1 ステップ簡約先はすべて に属するとする。 について を示せばよい。 は の (CR1) により SN なので、 に関する SN 帰納法を使う。 が中立だから も中立で、 の 1 ステップ簡約先は (i) による と (ii) による しかない( 自身は β 基でない)。(i) は仮定 から 。(ii) は の (CR2) で 、SN 帰納法の仮定で 。 の (CR3) により 。
次の補題は、関数 がよいかどうかを、中身 に還元可能な項を代入した結果がよいかどうかに帰着させます。 の 1 ステップ簡約先は、 の中での簡約、 の中での簡約、代入の 3 通りしかないので、 と の両方を同時に追う必要があり、その組で SN 帰納法を回します。
証明(補題 3.4)
について を示す。変数 を代入すると なので、(CR1) より と はともに SN である。「 と は SN で、すべての について かつ 」という状況で、対 に関する SN 帰納法( か の一方を 1 ステップ簡約する関係にも無限下降列はない)で示す。
は中立なので (CR3) を使う。1 ステップ簡約先は 3 種類しかない。
- :仮定から に属する。
- ():各 について なので (CR2) により 。 も同じ状況にあるので帰納法の仮定が使える。
- ():(CR2) で 、帰納法の仮定が使える。
(CR3) により 。
2 番目の場合で、 ならば を使いました(β 基の縮約は置換と両立します。 に関する帰納法で確かめられます)。 の各ステップに (CR2) を繰り返し使えば、還元可能性は保たれます。
次の基本補題が、強正規化定理の本体です。同時置換とは、複数の変数に対して一度に置換を行うことです。主張は、型の付く項の自由変数に還元可能な項を代入すれば、結果も還元可能になる、というものです。項の形ごとに、これまでの補題を一つずつ当てはめて示します。
証明(補題 3.5)
型付けの導出に関する帰納法。(var) なら で 。(app) なら 、帰納法の仮定で 、 なので、 の定義から積は に属する。(abs) なら 、 で、 の文脈で 。任意の について帰納法の仮定から ( は に自由に現れないように選ぶ)。補題 3.4 により 。
注意 3.6(テイトの方法の要点)
還元可能性 の定義は「よい引数に適用するとよい値を返す」という、BHK 解釈(§5)そのものの形をしています。SN という性質そのものは帰納法の仮定として弱すぎ(SN な の積 が SN とは限らない。 が反例)、「適用で閉じた SN」に強めると帰納法が回るのです。この方法はジラールによって多相型の体系 F に拡張され、さらに依存型理論の正規化証明の基本的な道具になっています。
4. カリー=ハワード対応
Section titled “4. カリー=ハワード対応”4.1. 直観主義の自然演繹
Section titled “4.1. 直観主義の自然演繹”命題変数 から で作られる論理式を考える。仮定の集まり は論理式の有限集合で、判断 を次の規則で帰納的に定める。
は「 を仮定して を示したら、仮定を解消して 」、 はモーダス・ポネンスである。
型付けの文脈 は変数と型の列、ここでの仮定の集まり は論理式の集合です。仮定に名前(変数)を付けて並べたものが文脈にあたり、仮定に重複がない場合は、どの論理式を仮定しているかという同じ情報を表します。次の定理で「 には重複がない」と置くのはそのためです。
一階述語論理と完全性定理 で使ったヒルベルト流の体系は公理を多く置いて推論規則を減らしていました。自然演繹は逆に、各論理記号に「導入」と「除去」の規則を一組ずつ与え、人間が書く証明の形に近づけたものです(ゲンツェン 1935)。
型付け規則と見比べると、型付き項の型から項を消したものが自然演繹そのものです。逆に、自然演繹の証明の各仮定に名前(変数)を付けると項が復元できます。
型の基本型 を命題変数 と同一視する。
- ならば 。
- ならば、ある項 について ( には重複がないとする)。
- さらに、仮定に名前を付けた自然演繹の導出と、型付けの導出(したがって、補題 2.2 により型付き項)とは一対一に対応する。この対応のもとで、β 基 は「 で を導いた直後に で使う」という回り道に対応し、その縮約 は「 の仮定を使っていた箇所に の証明 を直接差し込む」ことに対応する。
証明(定理 4.2)
(1) 型付けの導出に関する帰納法。各規則から項を消すと、(var) は (Ax)、(abs) は 、(app) は になる。(abs) で文脈から が消えることが、 で仮定 が解消されることに対応する。
(2) 導出に関する帰納法。仮定の集まり に対し、各 に変数 を一つずつ割り当てた文脈を とする。(Ax) なら について 。 なら帰納法の仮定の項 、 から 。 で から を得るとき、 なら新しい変数 を に割り当てて帰納法の仮定の から 。(たとえば )なら が得られているので、新しい変数 について弱化(補題 2.4 (1))で とし、 をとる( は使われない仮定)。
(3) (1) と (2) の構成は、名前付きの仮定をもつ導出の上では互いに逆である(どちらも規則を一つずつ置き換えるだけ)。β 基 の型付けの導出は、 の導出の下に (abs)、その右に の導出、最後に (app) という形で、これが記述どおりの回り道である。縮約後の項 の導出は、補題 2.4 (2) の証明のとおり、 の導出の (var) の葉を の導出で置き換えたものになっている。
4.2. 正規な証明とその帰結
Section titled “4.2. 正規な証明とその帰結”強正規化定理をカリー=ハワード対応で読み替えると、「どの証明も、回り道を一つずつ除いていけば有限回で回り道のない証明(正規な証明)になる」という定理になります。これはプラヴィッツ (1965) が自然演繹で直接示した正規化定理にあたります。正規な証明は形がきわめて制限されているので、そこから論理についての情報が引き出せます。
次の補題は、これ以上簡約できない項がどんな形をしているかを調べます。式 のように、適用を左へ左へとたどると、先頭にある に着きます。この先頭が変数であることが、下の無矛盾性の証明で使われます。
証明(補題 4.3)
外側の をすべて外すと、抽象でない項 が残る。 を適用の左側へたどって ( は適用でない)と書く。 は変数か抽象である。 が抽象なら、 は抽象でないので で、 が β 基になり正規形であることに反する。よって は変数で、 は正規形の部分項だから正規形である。
証明(系 4.4)
「 が証明できない」は小さな主張に見えますが、「どんな命題でも証明できるわけではない」、すなわち論理が無矛盾であることを、証明の構文だけを調べて示しています。同じ方法で、パースの法則 は直観主義論理では証明できないことが示せます(演習)。この法則は真理値表では恒真なので、直観主義論理は古典論理より真に弱いことが分かります。
4.3. 論理積・論理和・矛盾への拡張
Section titled “4.3. 論理積・論理和・矛盾への拡張”対応は他の論理記号にも広がります。型に積 、直和 、空の型 を加え、それぞれに導入と除去の項を用意します。
| 論理 | 型 | 導入(証明の作り方) | 除去(証明の使い方) |
|---|---|---|---|
| 関数型 | 適用 | ||
| 積 | 組 | 射影 、 | |
| 直和 | 、 | 場合分け | |
| (矛盾) | 空の型 | なし | |
| 適用 |
簡約規則は「導入の直後の除去」を消すもの(、 など)で、主部簡約・強正規化・正規形の形の議論はそのまま拡張されます(Girard–Lafont–Taylor の第 6・10 章)。Lean 4 では次のように書けます。
theorem and_swap (A B : Prop) : A ∧ B → B ∧ A := fun ⟨a, b⟩ => ⟨b, a⟩
theorem or_swap (A B : Prop) : A ∨ B → B ∨ A := fun h => h.elim (fun a => Or.inr a) (fun b => Or.inl b)
theorem nn_em (A : Prop) : ¬¬(A ∨ ¬A) := fun h => h (Or.inr (fun a => h (Or.inl a)))
#print axioms nn_em -- 'nn_em' does not depend on any axioms⟨a, b⟩ が組、Or.inl / Or.inr が / 、h.elim が です。Lean の ¬A は定義により A → False です。#print axioms は、その証明が依存する公理を表示するコマンドで、nn_em は公理を一つも使わない純粋な λ 項だと分かります。
5. BHK 解釈:証明とは何か
Section titled “5. BHK 解釈:証明とは何か”カリー=ハワード対応の背後には、ブラウワー、ハイティング、コルモゴロフにさかのぼる証明の解釈があります。
論理式 の証明とは何かを、論理記号に沿って次のように説明する(形式的な定義ではなく、意味の説明である)。
- の証明とは、 の証明と の証明の組である。
- の証明とは、 の証明か の証明のどちらかと、どちらであるかの印である。
- の証明とは、 の任意の証明を の証明に変換する方法(構成)である。
- の証明は存在しない。 の証明は、 の証明を の証明に変える方法である。
- の証明とは、各 に の証明を対応させる方法、 の証明とは、具体的な と の証明の組である。
この表を §4.3 の表と比べると、BHK の「方法」が λ 項、「組」が対、「印付きのどちらか」が直和に置き換わっているだけです。カリー=ハワード対応は、BHK 解釈の「方法」を λ 計算という特定の計算体系で具体化し、それが論理の規則と正確に一致することを定理として示したもの、と読めます。
この解釈では、排中律 の証明は「 の証明か、 の証明のどちらかを実際に示すこと」になります。任意の についてそれを一様に行う方法はありません(たとえば が未解決の予想なら、どちらも手元にない)。だから排中律は BHK 解釈では正当化されず、直観主義論理の規則にも含まれません。一方で には上の nn_em という具体的な証明があります。「排中律の否定は矛盾する」までは構成的に言えるが、そこから排中律そのものには進めない、ということです。証明の技術 で注意した、背理法のどこが古典論理に固有か(注意 6.3[証明の技術])という区別が、ここで正確になります。
注意 5.2(Lean での古典論理)
ふつうの数学は排中律を自由に使います。Lean では排中律 Classical.em は公理から導かれる定理として用意されています。#print axioms Classical.em を実行すると propext、Classical.choice、Quot.sound の三つの公理に依存していると表示されます。純粋な λ 項としての証明(カリー=ハワード対応の内側)と、公理を使う証明(外側)の境界を、Lean は公理の依存関係として正確に記録しています。この三つの公理の意味と、そこから排中律が導かれる仕組み(ディアコネスクの定理)は、依存型理論 と 証明支援系 Lean の仕組み で扱います。
単純型だけでは、 と を型として表せません。「各 に の証明を対応させる関数」の型は、値 によって行き先の型 が変わる関数の型、つまり依存型を必要とします。これが次章の主題です。
項 が型 をもつことを型付け規則で確かめ、対応する自然演繹の証明を言葉で述べよ。
解答
とする。(var) と (app) で 、、さらに (app) で 。(abs) を 3 回使えば主張の型を得る。自然演繹では、「、、 を仮定する。モーダス・ポネンスで と を得て、もう一度使って 。三つの仮定を順に解消して結論を得る」という証明になる。§1.2 の Lean の s_comb はこの項そのものです。
演習 6.2標準
主部簡約の逆( かつ ならば )が成り立たないことを、例を挙げて示せ。
解答
の文脈で を考える。 で、これは型 をもつ。一方 には型が付かない。生成補題(補題 2.2)により、 に型が付くなら引数 に型が付くが、 で は矢印型でないので には型が付かない。縮約で捨てられる部分に型の付かない項を置けばよいわけです。
を異なる命題変数とする。パースの法則 が含意の自然演繹で(仮定なしに)証明できないことを、補題 4.3 を使って示せ。
演習 6.4標準
§4.3 の Lean の証明 nn_em を、λ 項として読み下せ。仮定 をどのように 2 回使っているかを説明せよ。
解答
項は である。目標は で、手元の道具は だけなので、 の証明を作って に渡すしかない。 の証明はないので右側 を選び、 の証明として「 を受け取ったら を作って に渡す」関数を作る。こうして は内側( を受け取った後)と外側で 2 回使われる。BHK の言葉では、「排中律の反証 があるなら、それ自身を使って反証の反証が作れる」という構成になっています。
- J.-Y. Girard, Y. Lafont and P. Taylor, Proofs and Types, Cambridge University Press, 1989 — 第 2〜4 章(自然演繹とカリー=ハワード対応)、第 6 章(強正規化)。
- M. H. Sørensen and P. Urzyczyn, Lectures on the Curry–Howard Isomorphism, Elsevier, 2006 — 第 2〜4 章。
- W. W. Tait, “Intensional interpretations of functionals of finite type I”, The Journal of Symbolic Logic 32 (1967), 198–212.
- W. A. Howard, “The formulae-as-types notion of construction”, in J. P. Seldin and J. R. Hindley (eds.), To H. B. Curry: Essays on Combinatory Logic, Lambda Calculus and Formalism, Academic Press, 1980, 479–490.
- D. Prawitz, Natural Deduction: A Proof-Theoretical Study, Almqvist & Wiksell, 1965.
- A. S. Troelstra and D. van Dalen, Constructivism in Mathematics, Vol. 1, North-Holland, 1988 — 第 1 章(BHK 解釈)。
執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12
この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記
© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。