← 戻る ライブラリ › 数学の基礎 › 計算可能性と証明 数学の基礎
証明支援系による形式証明(Lean) Leanのような証明支援系は、コンパイラがプログラムを検査するのと同じ方法で数学の証明を検査する:「この証明は正しいか」という問いを、型判定 Γ ⊢ t : P \Gamma \vdash t : P Γ ⊢ t : P が成り立つかという問いに帰着させ、小さな信頼されたカーネルが検証する。
直観 読み切れない証明をなぜ信頼できるのか Lean 4の数学ライブラリMathlibは今や数百万行の証明を持ち、誰も一行ずつ読み切れる量ではない。それでも数学者たちはそれを信頼している。エレベーター検査の合格印を信じてケーブルを自分で溶接し直さないのと同じ理由だ:小さく固定された検査手順(カーネル )がすべての一手を確認しており、カーネル自体は手で検証できるほど短い。
検査済み証明の依存グラフ:各ノードは補題、各辺は以前の結果の利用を表し、カーネルはすべての辺をたどる。 大学 帰納的構成の計算 定義: 項、型、そして型判定
Leanの中核論理は帰納的構成の計算 (CIC)であり、型が値に依存できる依存型理論である(依存関数型 Π ( x : A ) B ( x ) \Pi\,(x:A)\,B(x) Π ( x : A ) B ( x ) は「すべての x : A x:A x : A に対し型 B ( x ) B(x) B ( x ) の値がある」と読む)。新しい型は帰納的 宣言(自然数、リスト、命題としての等号型)によって作られる。すべての対象は型判定 Γ ⊢ t : P \Gamma \vdash t : P Γ ⊢ t : P 「文脈 Γ \Gamma Γ のもとで、項 t t t は型 P P P を持つ」によって分類される。
Γ ⊢ t : P \Gamma \vdash t : P Γ ⊢ t : P カリー・ハワード対応 のもとでは、命題 P P P 自体が一つの型であり、P P P の証明とはその型の項 t t t である——証明することはプログラムすることに等しい。これが、プログラムをコンパイルするために元々必要だった型検査アルゴリズムが、証明の検査にも十分である理由である。
⊢ t : P ⟹ P \vdash t : P \;\Longrightarrow\; P ⊢ t : P ⟹ P 証明支援系の二つの層 層 仕事 信頼 エラボレータ/タクティク 高水準タクティクスクリプトから証明項 t t t を探索 非信頼:ここのバグは時間の浪費に過ぎない カーネル t t t が本当に型 P P P を持つか再検査信頼される:これがデ・ブラウン基準
発展 デ・ブラウン基準とEq.recによる等号 デ・ブラウン基準 とは、証明支援系が信頼できるのは、小さく独立に検査可能なカーネル がすべての証明項を確認する場合であり、それゆえ ∣ kernel ∣ ≪ ∣ tactic engine ∣ |\text{kernel}| \ll |\text{tactic engine}| ∣ kernel ∣ ≪ ∣ tactic engine ∣ が成り立つ——健全性は数百行のコードに依拠し、その項を生成したタクティクエンジンには依拠しない、という基準である。帰納的等号 a = b a = b a = b 自体は単一の構成子 r e f l : ∀ a , a = a \mathrm{refl} : \forall\, a,\ a = a refl : ∀ a , a = a によって定義され、その除去子 E q . r e c \mathsf{Eq.rec} Eq.rec (J規則 )は、カーネルが等号の他のすべての性質を導くために必要な唯一の原始概念である。
E q . r e c : { C : ∀ y , a = y → S o r t } → C a ( r e f l a ) → ∀ y ( h : a = y ) , C y h \mathsf{Eq.rec} : \{C : \forall\, y,\ a=y \to \mathrm{Sort}\} \to C\,a\,(\mathrm{refl}\,a) \to \forall\, y\,(h:a=y),\, C\,y\,h Eq.rec : { C : ∀ y , a = y → Sort } → C a ( refl a ) → ∀ y ( h : a = y ) , C y h r e f l a : a = a \mathrm{refl}_a : a = a refl a : a = a と E q . r e c \mathsf{Eq.rec} Eq.rec のみから構成される項 E q . s y m m : a = b → b = a \mathrm{Eq.symm} : a = b \to b = a Eq.symm : a = b → b = a が存在する。対称性は追加の公理ではなくCICの定理である。
なぜ正しいのか? 対称性、推移性、合同性などのために等号ごとに別の公理が必要だとすれば、信頼されたカーネルは = = = に関する新しい事実ごとに肥大化してしまう。すべてを一つの除去子から導くことでカーネルを小さく保てる。
証明 a a a を固定する。任意の b b b について h : a = b h : a = b h : a = b を受け取り b = a b = a b = a の証明を返す関数が欲しい。モチーフ C ( y , h ) : = ( y = a ) C(y, h) := (y = a) C ( y , h ) := ( y = a ) を用いて E q . r e c \mathsf{Eq.rec} Eq.rec を適用する——これは点 y y y と a a a を y y y に結ぶ証明 h h h で添字付けられた命題の族である。
除去子は基底ケース C ( a , r e f l a ) C(a, \mathrm{refl}\,a) C ( a , refl a ) 、すなわち a = a a = a a = a の証明を要求する。r e f l a \mathrm{refl}\,a refl a 自身を与えればよい。基底ケースは常に出発点 a a a における r e f l \mathrm{refl} refl で添字付けられるため、これは正当である。
E q . r e c \mathsf{Eq.rec} Eq.rec は、すべての y y y とすべての h : a = y h : a = y h : a = y に対して C ( y , h ) = ( y = a ) C(y,h) = (y = a) C ( y , h ) = ( y = a ) の証明を返す。y : = b , h : = h y := b,\ h := h y := b , h := h を代入すれば、まさに b = a b = a b = a の証明が得られる。
これを E q . s y m m h : = E q . r e c ( C : = λ y h , y = a ) ( r e f l a ) b h \mathrm{Eq.symm}\,h := \mathsf{Eq.rec}\,(C := \lambda y\, h,\, y = a)\,(\mathrm{refl}\,a)\,b\,h Eq.symm h := Eq.rec ( C := λ y h , y = a ) ( refl a ) b h としてまとめると、型 E q . s y m m : a = b → b = a \mathrm{Eq.symm} : a = b \to b = a Eq.symm : a = b → b = a の項が得られる。カーネルはこの適用を E q . r e c \mathsf{Eq.rec} Eq.rec の型シグネチャと照合するだけで受理し、「対称性」という概念について推論する必要はカーネルの水準では一切ない。
E q . r e c \mathsf{Eq.rec} Eq.rec のみから構成される項 E q . t r a n s : a = b → b = c → a = c \mathrm{Eq.trans} : a = b \to b = c \to a = c Eq.trans : a = b → b = c → a = c が存在する。
なぜ正しいのか? 等式を連鎖させること(a = b = c a=b=c a = b = c ゆえに a = c a=c a = c )はほぼすべての証明で使われる。それが導出された項ではなく公理であれば、カーネルは計算によってそれを検証するのではなく、その公理を信頼せざるを得なくなる。
証明 a , b a,b a , b と h 1 : a = b h_1 : a = b h 1 : a = b を固定する。任意の c c c に対する h 2 : b = c h_2 : b = c h 2 : b = c が与えられたとき、a = c a = c a = c の証明が欲しい。動機 C ( y , h ) : = ( a = y ) C(y, h) := (a = y) C ( y , h ) := ( a = y ) (点 y y y と b b b を y y y に結ぶ証明 h h h で添字付け)を用いて h 2 h_2 h 2 に E q . r e c \mathsf{Eq.rec} Eq.rec を適用する。
必要な基底ケースは C ( b , r e f l b ) C(b, \mathrm{refl}\,b) C ( b , refl b ) 、すなわち a = b a = b a = b であり、これはまさに h 1 h_1 h 1 である。よって h 1 h_1 h 1 が E q . r e c \mathsf{Eq.rec} Eq.rec に与える基底ケースの証明となる。
E q . r e c \mathsf{Eq.rec} Eq.rec は、すべての c c c とすべての h 2 : b = c h_2 : b = c h 2 : b = c に対して C ( c , h 2 ) = ( a = c ) C(c, h_2) = (a = c) C ( c , h 2 ) = ( a = c ) の証明を返す。これがまさに求めていたものである。
よって E q . t r a n s h 1 h 2 : = E q . r e c ( C : = λ y h , a = y ) h 1 c h 2 \mathrm{Eq.trans}\,h_1\,h_2 := \mathsf{Eq.rec}\,(C := \lambda y\, h,\, a = y)\,h_1\,c\,h_2 Eq.trans h 1 h 2 := Eq.rec ( C := λ y h , a = y ) h 1 c h 2 は型 E q . t r a n s : a = b → b = c → a = c \mathrm{Eq.trans} : a = b \to b = c \to a = c Eq.trans : a = b → b = c → a = c を持つ。対称性と共通するパターンに注目せよ:どちらの証明も適切な動機 C C C を選ぶことで事実を等号に沿って「転送」し、実際の作業は r e f l \mathrm{refl} refl における E q . r e c \mathsf{Eq.rec} Eq.rec に対するカーネルの固定された還元規則に委ねている。
大学 実世界での応用:コンパイラから数論まで 形式証明はもはや実験室だけの珍品ではない。Coqで形式検証されたCコンパイラCompCertは、生成されたアセンブリが常にソースプログラムと同じ振る舞いをすることの機械検査済み証明を持つ——これはどんなテストスイートも与えられない保証である。AWSとSignalは形式検証された暗号コード(AWSのs2n TLSライブラリ、HACL、F などのツール)を用い、メモリ安全性とサイドチャネルに関するバグの一群をまるごと排除している。純粋数学では、Leanの液体テンソル実験 (2020–2022)がPeter Scholzeの凝縮数学における難しい定理を形式化し、Terence Taoのチームは2023年に人間による証明が発表されてから数か月のうちに多項式Freiman–Ruzsa (PFR)予想の証明をLeanで形式化した。
例: n + 0 = n n+0=n n + 0 = n の証明の型検査
カーネルの水準で、帰納法により構成された ∀ n : N , n + 0 = n \forall\, n : \mathbb{N},\ n + 0 = n ∀ n : N , n + 0 = n の項がなぜ受理されるかを示せ。
解答 N \mathbb{N} N 上の加法は第二引数に関する再帰で定義される:n + 0 : = n n + 0 := n n + 0 := n 、n + s u c c m : = s u c c ( n + m ) n + \mathrm{succ}\,m := \mathrm{succ}\,(n+m) n + succ m := succ ( n + m ) 。よってゴール n + 0 = n n + 0 = n n + 0 = n の基底ケースは計算によって ちょうど n = n n = n n = n に還元され、それは r e f l n \mathrm{refl}\,n refl n である——カーネルは論理的な作業なしに、単に定義を展開するだけでこれを受理する。
一般的な定理 ∀ n , n + 0 = n \forall n,\ n + 0 = n ∀ n , n + 0 = n については、この基底ケースは上の定義から自明であり、この特定の 命題には帰納法さえ不要である(第二引数に関する再帰であるため帰納法が必要な ∀ n , 0 + n = n \forall n,\ 0 + n = n ∀ n , 0 + n = n とは対照的である)。
カーネルの役割は単に、項 n + 0 n+0 n + 0 に対して + + + を再帰的定義に従って展開し n n n に到達し、ゴールの両辺が定義的に 等しいことを確認することであり、「この証明は正しいか」を停止する計算に帰着させる——これこそデ・ブラウン基準が働いている様子である。
例: 型付き等号としての検証済みコンパイル
CompCertは正しさの定理を意味論保存性として述べる。「証明はその型の項である」ことが、通常のコンパイラテストに比べエンジニアにとって何をもたらすかを説明せよ。
解答 CompCertの定理は「アセンブリ A A A にコンパイルされるすべてのソースプログラム S S S について、A A A の観測可能な振る舞いはすべて S S S の振る舞いである」という形をしており、テストスイートに含まれるものだけでなくすべての ソースプログラムに関する全称量化された言明である。
テストスイートは有限個の ( S , A ) (S,A) ( S , A ) の組しか検査できず、4,000,001番目のプログラムでの誤コンパイルを排除することは決してできない。全称量化された言明のCoq証明項 t t t は、その代わりに量化子全体について一度だけカーネルによって型検査される——他のすべてのCompCertの補題に使われるのと同じカーネルであり、テストケースごとに新しい信頼が持ち込まれることはない。
証明項が全域的であり、定理がコンパイラの実際のCoqソースコード(OCamlに抽出される)について述べているため、保証を破るコンパイラへの変更は単に型検査に失敗する。これは有限の回帰テストスイートが完全に見逃すような回帰を捕捉する——これこそがCompCertが生成するコードにおいて、GCCやClangで数百件見つかったファジングキャンペーンによっても誤コンパイルバグがゼロであった理由である。
よくある誤り. 「エラーなしでコンパイルされた」タクティクスクリプトは自動的に信頼できるわけではない。LeanとCoqのどちらも部分ゴールを飛ばすために 'sorry'/'admit' を書くことを許し、両方とも新しい公理を追加できる。どちらも「エラーなし」では捕らえられない——最終的な項に 'sorry' がないかgrepし、'#print axioms' を確認して、証明が実際にどの公理(理想的には命題外延性、選択公理、商型以外にはない)に依拠しているかを正確に把握しなければならない。 歴史的ノート
ゲーデルの1930年の完全性定理は、一階論理における証明可能性が純粋に構文的で有限な証明計算によって捉えられることを示した——これが機械的に検査可能な証明という発想の種となった。N. G. デ・ブラウンのAutomathシステム(1967年から)は、そのような計算に対して実際に完全な数学文書を実装し機械検査した最初のものであり、その設計原理——小さく独立に検証可能な核——は後に彼にちなんで「デ・ブラウン基準」と名付けられた。これはLCF、HOL、Coq、Leanを直接形作った。
クルト・ゲーデル
研究の最前線 2026年時点
形式化は今や研究をほぼリアルタイムで追えるほど速い:Terence TaoによるPFR予想の形式化(2023年)は数年ではなく数週間で完了し、Leanコミュニティはフェルマーの最終定理の特殊な場合や液体テンソル実験の大部分を、元の議論から数年のうちに形式化した。活発な前線には、カーネルが検査する証明項を提案するAI支援タクティク探索(AlphaProof、DeepSeek-Prover)、フロンティア的な結果の「ブループリント」駆動の協働形式化(フェルマーの最終定理プロジェクト、GrothendieckのオリジナルのEGA/SGA流をLeanプロジェクトとしてやり直すもの)、そして日常的な基盤への形式検証の拡大(Rustの借用チェッカー研究、ブロックチェーンにおける検証済みロールアップ回路)がある。未解決のボトルネックはカーネルではない——デ・ブラウン基準は破られていない——非形式的な議論をそもそもカーネルが検査できる項に変える、人間とAIによるelaboration (詳細化)の労力である。
型判定 Γ ⊢ t : P \Gamma \vdash t : P Γ ⊢ t : P は何を主張するか?
文脈 Γ \Gamma Γ のもとで、項 t t t は型 P P P を持つ t t t と P P P は等しい項であるΓ \Gamma Γ は t t t が停止することを証明するP P P は Γ \Gamma Γ に加えられた公理であるデ・ブラウン基準を最もよく要約すると:
すべてのタクティクを個別に正しいと証明しなければならない 信頼は、すべての証明項を再検証する小さく独立に検査可能なカーネルに依拠する 証明は二つの独立した証明支援系で検査されなければならない 古典論理の証明のみ信頼できる
E q . s y m m : a = b → b = a \mathrm{Eq.symm} : a = b \to b = a Eq.symm : a = b → b = a の証明において、基底ケース C ( a , r e f l a ) C(a, \mathrm{refl}\,a) C ( a , refl a ) に対してどの命題が与えられるか?
b = a b = a b = a a = a a = a a = a 、r e f l a \mathrm{refl}\,a refl a により証明P → P P \to P P → P 対称性の公理 生成されたアセンブリが常にソースプログラムのように振る舞うことの機械検査済み証明に依拠する実世界のシステムはどれか?
CompCert GCC 表計算のマクロ 単体テストスイート