定理証明

形式手法の一種。プログラムの性質を数学的に証明する。

プログラマ向けの一言

「この関数は絶対にバグらない」をコンパイラに検証させる。 証明もコードで書き、型チェッカーが証明の正しさを機械的に検証する。

コードで理解する

// 普通のプログラミング: テストで「たぶん正しい」
function reverse<T>(arr: T[]): T[] {
  return [...arr].reverse();
}
// test: reverse(reverse([1,2,3])) === [1,2,3]  ← この入力では正しい
// でも「すべての入力で reverse(reverse(x)) === x」は示せない

// 定理証明: 「すべての入力で正しい」ことを証明する
// TypeScript では書けないが、概念を示すと:

// 命題: ∀ xs. reverse(reverse(xs)) === xs
// 証明:
//   base case: reverse(reverse([])) = reverse([]) = []  ✓
//   inductive step:
//     reverse(reverse(x :: xs))
//     = reverse(reverse(xs) ++ [x])    ← reverse の定義
//     = x :: reverse(reverse(xs))      ← 補題
//     = x :: xs                        ← 帰納法の仮定
//   QED

// この証明をコードとして書いて、コンパイラが検証するのが定理証明系

定理証明系の例

-- Coq (Gallina) での証明の雰囲気:
Theorem rev_involutive : forall (A : Type) (l : list A),
  rev (rev l) = l.
Proof.
  induction l as [| x xs IH].
  - simpl. reflexivity.
  - simpl. rewrite rev_app_distr. simpl. rewrite IH. reflexivity.
Qed.
(* Qed でコンパイラが証明を検証し、正しければ通る *)

主要な定理証明系の比較

系基盤論理スタイル自動 / 対話主用途・特色
CoqCIC(Calculus of Inductive Constructions, 依存型)tactic 言語 Ltac で証明を組む対話中心(auto/lia/omega 等の局所自動あり)CompCert(検証済み C コンパイラ)、四色定理。プログラム抽出で OCaml/Haskell を生成
Lean(Lean 4)CIC ベースの依存型tactic + 関数型言語そのもの(Lean 4 は自身を Lean で実装)対話 + 強力な simp/decide/型クラス自動化mathlib による巨大な現代数学形式化。数学者コミュニティで急成長
AgdaMartin-Löf 型理論(依存型)証明を直接プログラムとして書く(tactic を基本使わない)ほぼ対話・手動(dependent pattern match)型理論の研究・教育。Haskell 風構文。証明 = 全域関数
Isabelle/HOL高階論理 (HOL)(依存型ではない)Isar(人間可読な宣言的証明)+ tactic自動化が最強: auto/blast/Sledgehammer が外部 ATP・SMT を呼ぶseL4(検証済み OS マイクロカーネル)。大規模で実務的な証明に強い

軸の読み方:

自動証明 vs 対話証明

定理証明の労力を左右する最大の軸:

自動証明(automated)対話証明(interactive, ITP)
誰が証明を進めるかソルバ・ATP が探索人間が tactic / 証明項で指示
代表SMT(Z3)、ATP(E, Vampire)、SATCoq, Lean, Agda, Isabelle
扱える論理決定可能 / 半決定可能な断片高階・依存型まで任意
長所人手ゼロ、速い任意の深い定理を証明できる
短所表現力が限定、unknown/発散証明が長大、専門知識が要る

両者は対立でなく協調するのが現代的: Isabelle の Sledgehammer はゴールを外部 ATP/SMT に投げて自動で片付け、当たれば証明を Isar に逆輸入する。篩型(Liquid Haskell/F*)は「決定可能な部分は SMT に丸投げ、残りだけ人間」という思想で、自動証明を型システムに組み込んだ形。対話証明系の中に自動証明エンジンを埋め込み、人間は「どこを自動に任せどこを手で示すか」を設計する。

主要な定理証明系(要点)

押さえどころ(カード化候補)

関連

Graph