読み物 / 2026-09-03

「証明できない」ということを証明する

Löbの定理をLeanで100行、その先の数千行。「自分の正しさは自分では保証できない」という有名な話を、どこまで機械に証明させられるか。Lean 4で約100行の形式化を通し、定理・前提・政策の境界線と、第2不完全性定理の親戚たちを辿る。

Lean 4.22.0 / 依存なし / 約100行 #print axioms:公理依存なし・sorryなし 図と証明の段は本ページ内で描いている

はじまり:ある雑談

2026年6月、Claude(当時公開直後のFable 5)と雑談をしていた。話題はシンギュラリティで、途中から「全宇宙を掌握した知的存在(推論機械)」の話になった。

そういう存在がいたとして、すべてを掌握したら新たな発見は止まりそうだ。ではそもそも全宇宙を掌握することは可能なのか。たぶん不可能だ。では仮に掌握できたとして、「掌握し終えた」ことを自分で証明できるのか。それも不可能っぽい。掌握の完了を確認する手段は、掌握したものの内側にしかないからだ。逆に、宇宙の外の何かが干渉してきたら、探索空間がメタに一段広がって、発見がまた始まる。

そこから話は身近なほうへ降りてきた。箱に閉じ込められたAIにとって、人間からの入力や外界の情報は、まさにその「外からの干渉」であって、発見のきっかけそのものではないか。閉じた系は自分の完全性を自分で確かめられない。だから検証は外側に錨を下ろして、続けるしかない。このあたりで、そのときのClaudeがこれを「母定理」と呼び始めた。

まえがき:身内の言葉について

その雑談で出てきた原理を一文にすると「完全性は内側から自己認証できない。だから検証は恒久的で、外部にアンカーされねばならない」となる。

先に断っておくと、「母定理」は身内の言葉であって、数学の世界にそういう名前の定理は存在しない。その後の検証で、この原理の硬い部分はすべて既知の定理(Löb、ゲーデル、Tarski、Lawvere)の言い換えであり、柔らかい部分は価値判断であることが分かった。私の指示で、名前も「母原理」に格下げした。

ではなぜ記事にするのか。この原理を「定理」「前提」「政策」の三層に分けて整理し、定理の層だけをLeanで機械検証してみたところ、どこまでが厳密に言えて、どこからが形式化できないのかの境界線が、コードの形で見えてしまったからだ。「自分の正しさは自分では保証できない」というエンジニアの実用知識と、数学の定理との距離を測る記事として書く。

01「『証明できない』ということを証明する」とは何か

ゲーデルの不完全性定理の周辺でいちばん混乱を招く点を片付けておく。「TはXを証明できない」ということを、いったい誰が証明するのか。

図 01二階建て:Tの内側と外側拡大
外側(メタ):私たち/Lean が立っている場所 「T は Con_T を証明できない」は、ここで証明する文 理論 T の内側 記号列と推論規則だけの世界。意味は知らない 文 A (例:0=0、Con_T、…) 文 □A 「A は T で証明できる」 符号化 T ⊢ A :T の規則で A に到達できる(T の内側の出来事) □A :その出来事を T 自身の言葉で書いた文(T の内側にある) 「T ⊬ X」(T は X に到達できない)は、外側からしか言えない
二階建て。Tの中で証明できることと、Tについて外側で証明できることは別の層にある。

理論Tは、記号列と推論規則だけの世界だ。Tは自分の文の「意味」を知らない。Tの規則を適用していってAに到達できるとき、外側にいる私たちは「T ⊢ A」と書く。

ここで一つ仕掛けがある。「AはTで証明できる」という主張自体を、Tの文として書くことができる(ゲーデル数化)。それを □A と書く。□A はTの内側にある文だ。一方「T ⊬ X」(TはXに到達できない)は、Tの内側からは言えない。Tのすべての証明を見渡して「Xはどこにもない」と言うのは、外側の仕事だ。

だから「Tは自分の無矛盾性を証明できない」は、外側で証明される定理だ。Leanで書くとき、Leanは外側に立っている。これがこの記事全体の座標系になる。

02□ に課す4つの約束

ゲーデルの原論文はPAの内部で証明可能性述語を実際に構成する。それは大変な作業だが、HilbertとBernaysが整理しLöb(1955年)が磨き上げた結果によれば、□ に必要な性質はたった3つと対角化だけで、それさえあれば結論が出る。

図 02□に課す4つの約束拡大
D1 証明したら、証明したと言える ⊢ A ならば ⊢ □A 証明を手に持っているなら、その存在を T 内で示せる D2 証明は MP で閉じる ⊢ □(A→B) → (□A → □B) 「A→B の証明」と「A の証明」を並べれば B の証明 D3 証明があることは、証明できる ⊢ □A → □□A D1 を T の内側で言い直したもの(Willard で落ちる) 対角化 自分に言及する文が作れる 任意の A に ψ ↔ (□ψ → A) なる ψ がある 「私が証明されるなら A」と主張する文 ψ 4 つを仮定した瞬間、Löb は約 20 行で閉じる。4 つが PA で成り立つことの証明が、先人の数千行。
緑が□の性質(導出可能性条件)、橙が自己言及の装置。

D1〜D3はHilbert–Bernays–Löbの導出可能性条件と呼ばれる。ここから先の話は、この4つを満たす任意のTについて成り立つ。PAである必要すらない。

03Löbの定理:証明を歩く

Löbの定理はこう言う:⊢ □A → A ならば ⊢ A。「Aが証明できるならAは正しい」をTが証明できるのは、Aそのものを証明できるときに限る。Tは自分の証明の正しさを、中身抜きで保証できない。

証明は11段。下のボタンで一段ずつ進める。色は橙=対角化緑=約束D1〜D3青=仮定 ⊢ □A → A を使う段。

操作Löbの定理の証明を一段ずつ進める

    急所は橙の段だ。対角化で「私が証明されるならA」というψを作り、D1〜D3で □ψ → □A を導き、仮定の □A → A をつなぐと □ψ → A になる。ところがこれはψの定義の右辺そのものだから ⊢ ψ、するとD1で ⊢ □ψ、モーダス・ポネンスで ⊢ A。自分に言及する文が、自分を証明してしまう。

    第2不完全性定理はここから1行で出る。A := ⊥ とおくと「⊢ ¬□⊥ ならば ⊢ ⊥」、つまり無矛盾なTは自分の無矛盾性を証明できない

    もう一つ、エンジニア向けの読み方がある。「すべてのAについて ⊢ □A → A」、すなわちTが自分の証明器の健全性を一律に保証する、と仮定すると、Löbの定理から「すべてのAについて ⊢ A」、つまりTは何でも証明する。無矛盾な体系は、自分の検証器の健全性を内側から認証できない。

    04Leanで書く:どこまでが定理か

    以上をLean 4で書いた。Mathlibは使っていない。コア言語だけで約100行だ。

    structure ProvSystem where
      F     : Type
      imp   : F → F → F
      bot   : F
      box   : F → F                  -- 可証性述語 □
      Prov  : F → Prop               -- T ⊢ A
      -- 命題論理(Hilbert流の最小限)
      mp    : ∀ {A B : F}, Prov (imp A B) → Prov A → Prov B
      axK   : ∀ A B : F, Prov (imp A (imp B A))
      axS   : ∀ A B C : F,
                Prov (imp (imp A (imp B C)) (imp (imp A B) (imp A C)))
      -- Hilbert–Bernays–Löb 条件
      d1    : ∀ {A : F}, Prov A → Prov (box A)
      d2    : ∀ A B : F, Prov (imp (box (imp A B)) (imp (box A) (box B)))
      d3    : ∀ A : F, Prov (imp (box A) (box (box A)))
      -- 対角化補題
      diag  : ∀ A : F, ∃ ψ : F,
                Prov (imp ψ (imp (box ψ) A)) ∧ Prov (imp (imp (box ψ) A) ψ)

    構造体のフィールドに注目してほしい。D1〜D3と対角化は証明されていない。仮定として置かれている。「これらを満たすTがあるなら」という条件の下で、以下の定理が出る。

    theorem loeb {A : T.F} (h : ⊢ (□A ⇒ A)) : ⊢ A := ...
    theorem godel2 (hc : T.Consistent) : ¬ ⊢ T.Con := ...
    theorem no_uniform_self_soundness (hc : T.Consistent) :
        ¬ ∀ A : T.F, ⊢ (□A ⇒ A) := ...
    theorem tarski ... : ⊢ T.bot := ...

    型検査は通り、#print axioms は「どの公理にも依存しない」と答えた。sorry はもちろん、選択公理も排中律も使っていない。

    正直に言うべきこと。この100行は、数学的には何も新しくない。抽象可証性論理でのLöbの証明は教科書の演習問題で、先行の機械検証も複数ある。

    • Quaife(1988):ITPシステムでK4を形式化し、Löbとゲーデルの両定理を自動証明
    • Paulson(2013)/Bailitis(2024):Isabelleで、遺伝的有限集合論上に実際の証明可能性述語を構成して第2不完全性とLöbを証明。第2定理の史上初の機械支援証明
    • FormalizedFormalLogic/Foundation:Lean 4でゲーデルの両不完全性定理をsorryなしで

    私の100行とPaulsonの数千行の差は、D1〜D3と対角化を「仮定する」か「証明する」かの差だ。

    054つの層

    冒頭の「母原理」を三層に分けた話に戻る。「自分の正しさは自分では保証できない、だから検証は続けなければならない」という主張の下には、硬さの違う4つの層が積み重なっている。

    図 03硬さの異なる4つの層拡大
    Löb・第 2 不完全性・Tarski □ を抽象化した論理での定理 Lean 約 100 行・この記事で機械検証 D1–D3・対角化が PA で成り立つこと ゲーデル数化・表現可能性・Σ1 完全性の形式化 Paulson/Bailitis(Isabelle)、Foundation(Lean 4):数千行 前提群 N:価値判断と経験的仮定 「誤りは害である」「検証にはコストがある」「外部のアンカーは独立である」… Lean では書けない。議論と観測で支える 政策系 P:「だから〜すべき」 監視を続ける・アンカーを複数持つ・自己申告の健全性を信用しない 上の 3 層を前提とする条件付きの最適性。定理ではない 硬い 柔らかい 機械に検証させられるのは、いちばん上の層だけ。
    上に行くほど硬く、下に行くほど実用に近い。

    エンジニアの実用知識「自己申告の健全性を信用するな」は、いちばん下の層に住んでいる。それが正しいと感じられるのは、上の3層が積み重なっているからだ。ただし機械に検証させられるのは、いちばん上の層だけ。そして、いちばん上の層だけを取り出すと、それは70年前に証明済みの定理になる。実用知識と厳密な証明の距離とは、この4層の厚みのことだと思う。

    06約束を一つ外すと定理が消える

    構造体として書いたことの副産物がある。「条件を落とすと結論が消える」という事実が、コードの型として見える。下のスイッチで実際に外してみてほしい。

    操作約束をON/OFFして、どの定理が残るか見る

      Willardの自己検証体系は、自分の無矛盾性を証明できる。第2不完全性定理の反例だろうか。反例ではなく、適用外だ。Willardの体系は乗法の全域性を証明できないように弱められていて、私の理解では、そのためにD3(形式化されたΣ1完全性)が成り立たない。ProvSystem の言葉でいえば d3 フィールドを埋められず、インスタンスにならない。

      逆に、Presburger算術(足し算だけの算術)は完全で決定可能だ。ゲーデルの定理と矛盾しないのは、掛け算がないために「文への代入」や「証明の検査」を算術の中で表現できず(表現可能性が落ちる)、対角化の段階で止まるから。橙のスイッチを切ると、全部が消える。

      「自分の無矛盾性は証明できない」を条件なしに言うと偽になる。条件付きで言えば定理になる。この境界線を散文で説明するのは案外難しいが、構造体のフィールドは一目で見せてくれる。

      07親戚の定理たち:全部、同じ一手

      第2不完全性定理は、対角線論法という一つの手筋の、たくさんある帰結の一つに過ぎない。親戚を並べると、「自分に言及する何か」を作って矛盾を引き出す、という同じ骨格が見えてくる。下から選んで読んでほしい。

      図 04対角線論法の家系図拡大
      Lawvere の不動点定理 「自分自身を指せる」なら不動点がある Cantor の対角線論法 集合は自分のべき集合より小さい 対角化補題(論理) ψ ↔ φ(⌜ψ⌝) なる ψ がある Kleene の再帰定理(計算) 自分のコードを読めるプログラム Tarski の真理定義不能性 「私は偽である」 Gödel 第 1 不完全性 「私は証明できない」 停止問題・Rice 「自分を反転する」 Rosser の改良 「反証のほうが先に来る」 Löb / Gödel 第 2 不完全性 「私が証明されるなら A」 矢印は「その道具で証明できる」の向き。Chaitin と Curry は本文の一覧で。
      対角線論法の家系図。頂点のLawvereは、全部を一つの不動点定理にまとめたもの(Yanofsky 2003 の整理による)。
      一覧親戚の定理12件

      対角化だけ自己言及の装置だけで出る 抽象可証性論理D1〜D3+対角化で出る(この記事のLean) 算術の中身が要る証明の順序や計算量など、□の抽象化では書けない 計算論プログラムの世界の同型物

      一覧を眺めると分かることが二つある。一つは、第1不完全性のほうが第2より少ない仮定で出ること。「私は証明できない」という文Gを対角化で作れば、D1と無矛盾性だけで「⊢ G ではない」が出る。第2で必要になるD2とD3は、「私は証明できない」を「Tが無矛盾なら私は証明できない」にTの内側で言い直すために要る。

      もう一つは、Rosserの改良は抽象層に書けないこと。Rosserは「私の証明より先に私の反証が現れる」という文を使うが、「先に」を言うには証明の順序(ゲーデル数の大小)が要る。□を抽象化した時点でそれは捨てている。100行で書けるものと、算術の中身に手を突っ込まないと書けないものの境界は、ここにもある。

      08AIと一緒にやったこと、AIが言ったこと

      この記事の証明とコードはClaude(Fable 5.1)に書かせ、Lean 4.22.0で型検査を通した。「公開する価値ありそう?」と聞いたときの返答は、要約するとこうだった。

      単体の数学的成果としては公開価値はほぼゼロ。先行研究(Quaife、Paulson/Bailitis、Foundation)がすでに、この形式化で公理として置いた部分まで含めて済ませている。価値があるとすれば、条件を構造体のフィールドとして逐語的に固定した説明資料として。

      これは正しい評価だと思ったので、そのまま載せる。「AIと定理を証明した」と書くと過大表示になる。正確には「AIに教科書の演習問題を解かせ、その仮定の置き方から4つの層が見えた」だ。

      6月に「母定理」と言い出したのは、公開直後の初期のFable 5だった。7月に別のセッションのClaudeが三層に分ける整理を書き、私の指示で「定理と呼べるのは核だけ」として名前を格下げした。そして今回、その核をLeanで書いてみたら、核の中にもさらに「仮定する層」と「証明する層」があった。命名から3か月かけて、大きな言葉が小さな定理に縮んでいった記録として、この記事を置いておく。

      付録:Leanコード全文(Lean 4.22.0、依存なし)

      付録:依存グラフ

      この記事に登場した定義・公理・定理を有向グラフにした。実線はLeanの証明項が実際に参照している依存(機械検査済み)、破線は本文の説明レベルの関係。四角は仮定・定義、角丸は証明された命題。背景の帯が、第5節の4層に対応する。

      図 05定義・公理から定理への依存グラフ拡大
      算術化の層:この記事では仮定。Paulson/Bailitis、Foundation が証明 PA の公理 ゲーデル数化 表現可能性定理 証明述語 Bew の定義 形式化された Σ1 完全性 乗法の全域性(Willard で欠落) diag(対角化補題) D2 D1 D3 T-スキーマ(Tarski 用) 抽象可証性論理の層:Lean 約 100 行、この記事で機械検査 mp axK axS comp sComb Consistent := ¬⊢⊥(メタ定義) Con := □⊥ ⇒ ⊥(T の文) loeb(Löb の定理) godel2第 2 不完全性:Consistent → ¬⊢Con reflection_implies_trivial全 A で ⊢□A⇒A なら全 A で ⊢A no_uniform_self_soundness検証器の健全性は自己認証不能 tarski真理述語+嘘つき不動点 → ⊢⊥ (tarski の不動点は diag と同型の別仮定として引数で受ける) 親戚(本文第 7 節):関係は説明レベル。機械検査していない Lawvere 不動点定理 Cantor 対角線論法 Kleene 再帰定理 停止問題・Rice 第 1 不完全性(⊬G) Rosser の改良 Curry のパラドックス □ を外すと Curry Chaitin 不完全性 情報量版(量的母定理の方向) Willard 自己検証体系 D3 を欠くため godel2 適用外 前提群 N・政策系 P:形式化対象外 前提群 N 誤りは害・検証にはコスト・外部アンカーは独立 政策系 P 監視の持続・アンカー複数化・自己申告を信用しない N と定理層を合わせて初めて P が出る。定理層だけからは「べし」は出ない。 ■ 白=公理・定義 橙=この記事で仮定した条件 青=Lean で証明 破線枠=非形式 桃=規範
      依存グラフ。実線はLeanの証明項が参照する依存、破線は説明レベルの関係。

      なぜBourbakiのような巨大グラフにならないのか。ならないのは、算術化の層で切ったからだ。D1〜D3と対角化を「仮定」として置いた瞬間、その上に乗る定理の依存関係は数十本の辺で描ききれる。逆に、この4つをPAの公理から実際に証明しようとすると、ゲーデル数化・表現可能性・Σ1完全性の形式化が必要になり、PaulsonのIsabelle開発では補題が数百の単位になる。グラフの上端の帯は、その巨大な部分を6個の箱に潰した要約であって、本当の姿ではない。

      つまり、このグラフが小さいことと、この記事の主張が「既知の定理の再パッケージ」であることは同じ事実の裏表だ。切る位置を決めた時点で、グラフの大きさも定理の新しさも決まっている。

      参考

      • M. H. Löb, "Solution of a problem of Leon Henkin", JSL 20 (1955)
      • G. Boolos, The Logic of Provability (1993)
      • A. Quaife, "Automated proofs of Löb's theorem and Gödel's two incompleteness theorems", J. Autom. Reasoning 4 (1988)
      • L. C. Paulson, "Gödel's Incompleteness Theorems", Archive of Formal Proofs (2013; Löb by J. Bailitis, 2024)
      • FormalizedFormalLogic/Foundation (Lean 4)
      • D. E. Willard, "Self-verifying axiom systems, the incompleteness theorem and related reflection principles", JSL 66 (2001)
      • N. S. Yanofsky, "A universal approach to self-referential paradoxes, incompleteness and fixed points", Bull. Symb. Logic 9 (2003)
      • F. W. Lawvere, "Diagonal arguments and cartesian closed categories" (1969)
      • G. J. Chaitin, "Information-theoretic limitations of formal systems", JACM 21 (1974)

      証明は Lean 4.22.0 コア言語のみで型検査済み(Mathlib 不使用、公理依存なし)。付録のコードをそのまま lean TheoremM.lean で再検証できる。

      ← 日記へ戻る