世界を動かす技術を、日本語で。

数学は呪われている

概要

Leanは数学を形式化するための プログラミング言語。 数学者が 証明や定理をコード化 し、GitHubで共有可能。 証明は tactic(戦術) と呼ばれるコマンドで構築。 不適切な公理追加で 矛盾した数学 も構築できる。 正しい公理とLeanのチェックで 信頼性ある証明 が保証される。

Leanで数学をプログラミングする体験

  • Lean は主に数学者が使う 形式化言語
  • 数学の定理・証明を 構造化されたコード として記述、管理。
  • 証明や定理を GitHub で共有し、他人の成果を import 可能。
  • 人類の数学知識 をコードとして蓄積、検証、再利用する構想。
  • コードとしての数学: 静的検証再利用性合成性 の確保。

Leanの基本的な証明の書き方

  • 定理の例:theorem two_eq_two : 2 = 2 := by sorry

    • theorem:定理宣言
    • ::定理内容の開始
    • := by:証明開始
    • sorry:証明未完了の印
  • sorry任意のゴールを閉じる が、実際の証明ではない。

  • rfl反射律(reflexivity) を利用し、a = a型のゴールを閉じる。

  • 証明完了例:theorem two_eq_two : 2 = 2 := by rfl

  • 証明済み定理は 他の証明で再利用 可能(exact two_eq_two)。

    • 例:
      • theorem two_eq_two_again : 2 = 2 := by exact two_eq_two

Leanのtactic(戦術)

  • tactic とは証明を進めるためのコマンド群。
    • rfl:同値のゴールを閉じる
    • exact:既存の証明を利用
    • sorry:強制的にゴールを閉じる(非推奨)
  • 証明は tacticの列 で構成され、全てのゴールを閉じる必要。

Leanで矛盾した数学を作る

  • 公理(axiom)を追加することで 独自の数学体系 も構築可能。
    • 例:axiom math_is_haunted : 2 = 3
  • 公理は 証明不要の事実 として扱われる。
  • この公理を使えば 2 = 32 + 2 = 6 も証明可能。
  • rewrite tacticで ゴールの書き換え が可能。
    • 例:rewrite [math_is_haunted]2 + 2 = 6の証明を3 + 3 = 6に変換。
  • 矛盾した公理 を入れると何でも証明できるため、 公理の選択が重要

公理の削除と健全な数学

  • 矛盾した公理を削除すると、それに依存した証明は 壊れる
  • 正しい公理体系下では、 正しい定理のみ証明可能
  • Leanは 論理的に正しい結論のみ を導けることを保証。

Leanの証明の意義と発展

  • Leanは 証明チェッカー として、与えられた公理から論理的帰結のみを許容。
  • tactic を駆使し、複雑な定理も分解・構成可能。
  • 公理とLean自体が健全であれば、 証明も健全
  • 小さな証明から 大規模な数学的成果 まで拡張可能。

Fermat’s Last Theoremの形式化

  • Fermat’s Last Theorem(フェルマーの最終定理)の形式化も進行中。
  • 証明例:
    • theorem PNat.pow_add_pow_ne_pow (x y z : ℕ+) (n : ℕ) (hn : n > 2) : x^n + y^n ≠ z^n := by sorry
  • 現段階ではsorryを含むが、最終的には 完全な証明 を目指す。
  • 証明が完成すれば、 全てのサブ証明も正しく埋められる

Leanを学ぶためのリソース

  • Natural Numbers Game :Leanの入門に最適なゲーム形式教材。

  • Mathematics in Lean :基礎から学べるチュートリアル。

  • Tao’s Analysis Lean Companion :Taoの解析学本のLean版。

  • Lean Zulip の「new members」チャンネル:初心者歓迎のコミュニティ。

  • Leanは プログラミングと数学の融合 を楽しめる新しい体験。

    • 興味が湧いたら、まずは Natural Numbers GameMathematics in Lean から始めると良い。

Hackerたちの意見

Leanを学ぶ上での一つの問題は、戦術、例えば例に出てくるrflみたいなやつが過剰に使われていて、その完全な意味がチュートリアルからはあまり説明されていないことなんだ。Cプログラミングみたいに、プログラムの状態がビット単位でどうなるか理解できるのとは違って、ちょっと曖昧に感じる。あと、rewrite(rw)戦術の構文もあんまり自然じゃないな。

そうだね、ドキュメントも結構バラバラだよ。戦術がユーザー定義できるから、LeanのものとMathlibのものが混ざってたりするし。基本的なものはかなり使えるようになったけど、時々Zulipでうまくいかないことを聞いたりしてる。

そうそう、私もCoq(今はRocq)での戦術を身につけるのが難しいと感じてる。例えば、「A = B」と「P(A,A)」があって、「P(A,B)」を結論づけたいんだけど、何かよくわからない理由でリライトが失敗しちゃうんだ。中間構造の定義に問題があるんじゃないかな。逆に、最近Metamathとそのset.mmデータベースを触ってみたんだけど、プログラム可能な戦術が全くなくて、証明に使える具体的な推論だけなんだ。例えば、モーダス・ポネンスの推論ax-mpは「|- ph」と「|- ( ph -> ps )」があれば「|- ps」を証明できるって言ってる。ここで「ph」と「ps」は置き換え可能な変数ね。残念ながら、これもあまり良くなくて、必要な補題を全部覚えなきゃいけないんだよね。

だから、私はAgdaの方が好きなんだ。すべてがパターンマッチングに集約されるから。

これがAgdaを好む理由の一つだね。通常は戦術なしで書かれて、Curry–Howard対応を通じて関数型プログラミング言語で証明項を書くんだ。代わりに、役立つ抽象や関数を作るのにもっと規律が必要になるから、そうしないと日常的なことを証明するのも本当に面倒になっちゃう。

少なくとも、戦術の「定義に移動」できて、何をしているのかがわかるのはいいよね。最初は理解するのが大変だけど、全部検査して理解できるんだ。(基本的な型理論に到達するまではね;還元規則は理解するのがもっと難しい。)> リライト(rw)戦術の構文も自然に感じないよね。自然なリライト構文ってどんなのだと思う?

Agdaが好きかもしれないね。君の言う通りだけど、私はLeanの方が好きだな。

私の期待とは違ったから面白かった。数学理論に無知な私としては、反射と再書き換えが加算よりも基本的だと思ってた。でもLeanは加算を前提にしているけど、明示的なrflと再書き換えを要求するみたい。もしかしたら、あなたのためにそれをやってくれるLeanの「前奏曲」があるのかも。

Leanを見たことがないけど、alphaproofから興味を持った者として、イントロがすごく好き!今Leanで何をやってるのか教えてもらえる?

今は数学を学んでるだけだよ!現在、https://github.com/teorth/analysis(タオの教科書に対するLeanの補助教材)を進めていて、演習のsorryを埋めてるところ(私の解答はhttps://github.com/gaearon/analysis-solutionsにあるよ)。

Leanには、信頼できない証明に対して「sorry」を使っていないことを保証するような検証モードってあるの?それに、別の固定された公理のセットに対して、さらなる公理や定義を追加して「証明力」を増すこともないっていう。

どうやらマクロを使えば可能みたい?よくわからないけど:https://github.com/leanprover/lean3/issues/1355

うん、print axiomsを使えば、公理が追加されてないか確認できるし、警告やエラーなしでコンパイルできるかも確認できるよ。もっと徹底的にチェックして、RLシステムが見つけたトリックを捕まえるSafeVerifyユーティリティもある。

記事の最後に出てきた#print axioms some_theoremは該当するのかな?これを使うと、sorryに依存しているかどうか、さらには検証していない公理に依存しているかがわかるよ。

最近まで知らなかったことなんだけど、Leanは形式的な定理が実際に私たちが考えていることを言っているかどうかを確認する問題を解決してないんだよね。場合によっては問題にならないこともあるけど、定理の形式的な表現がすごくシンプルな場合ね。例えば、フェルマーの最終定理は「(x y z : ℕ+) (n : ℕ) (hn : n > 2) : x^n + y^n ≠ z^n」と形式的に表現できる。でも他の場合だと、形式的な表現が私たちが欲しい直感的な非公式な表現と一致しているか確認するのがかなり難しいこともある。もちろん、Leanや似たような言語は形式的な表現が証明可能であることを確認する大きな可能性を提供しているけど、自然言語での意図した非公式な表現と一致するかどうかを確認するのには役立たないんだよね。

一般的に、そういうことを確認する方法ってあるのかな?これが釣り質問に聞こえたらごめんだけど、形式的な表現が受け入れられている理解と一致しているかどうかを確認する方法を考えるのが難しいんだ。両方の専門家と定義をじっくり確認する以外に。

ニュースや他のノンフィクション記事をリライトするために、Lean(もしかしたらただのLeanでも?)のようなものを考えてるんだ。主張を証明が必要な定理として扱う感じで。証明には引用を含められて、「これが事実であるなら、私の承認した三つの情報源がそれを事実として主張した場合」といった複合的なものも可能にしたい。そうすれば、「証明された」主張にハイライトを付けた文書のマークアップ版が得られるはず。確かに完璧ではないけど、出版物の仕事だった厳密さを応用する面白い方法だと思うんだ。

なんで君がダウンボートされてるのか分からないけど、これは面白いアイデアだと思うよ。完全に不可能だけど、探求するのは面白いし。こういうことをするのにLeanの力は必要ないよ。PrologとかRDFトリプルから始めるのをお勧めする。

「Leanのようなもの(もしかしたらLeanそのものでも)で、ニュースや他のノンフィクションの記事を書き直すアイデアを考えてる。文を証明が必要な定理として扱うんだ。大学で数学を学んでから、ノンフィクションを書くのがずっと上手くなった気がする。私の彼女や妹のエッセイや提出物を校正するのを手伝って、あなたが言うような厳密さを適用してた。例えば、『ここでCがBから導かれることは示してるけど、BがAから導かれる理由を実際には示してないから、CがAから導かれるとは言えないよ』って感じ。LLMを使えば、これをプログラムにするのは実現可能なタスクに思えるけど、幻覚の問題がその計画を台無しにするね。」

ニュースから導き出すべき最も重要な信念が、絶対的な文の集合によって正当化されることはかなり珍しいと思う。ベイジアン推論の連鎖を計算するためのツールの方が役立つんじゃないかな。数値推定のためにこれをやるツールを見たことがあるよ。

自然言語の表現を形式化するのは、めっちゃ難しいことが多いよね。リアルな世界とやり取りするコードを書くのが難しいのと同じ理由だと思う。アイデンティティや時間、因果関係みたいな当たり前の概念も、形式の中でしっかりと具体化しないと、事実同士が関連付けられないし、そもそも表現もできない。あんまり discouragement したくないけど、面白い問題だよ!OpenCogみたいなプロジェクトがこの分野に挑戦してたし、KRR(知識表現と推論)っていう学問の分野もある。IJCAIのジャーナルには似たような研究がたくさん載ってるよ。(時間やモダリティ、確率に関する議論を形式化するために哲学者が使うさまざまな論理も見てみて。たくさんあるけど、あんまり「モジュラー」じゃなくて、簡単に組み合わせるのは難しいかも。最近解決されたかは知らないけど。)

待って…つまり、私たちは基本的に少数の自明な真実から派生した証明の辞書を編纂しているってこと? そして、さらに進む証明はすべて以前の証明の論理的な集約に過ぎないの? 誰かこれをZachtronicsスタイルのゲームにしてくれないかな?! すごく、すごく欲しい。三角法のためのEuclideaというゲームがあって、論理の塔を築くという全体の前提が私にはすごく魅力的なんだ。これが純粋数学の本質なの? 数学の教授になる人たちが魂で感じていることなの? あの証明の辞書に加えることのスリル? 余談だけど、有名な数学者が真実だと信じる基本的な証明のリストを作ったことを思い出すんだけど、誰だったか、そしてそのリストは何て呼ばれているか教えてくれる人いる? おそらく公理と考えられているんだろうね。

おそらく、君は「プリンキピア・マテマティカ」をぼんやりと指してるんだろうね。

君が考えてるのはユークリッドの公理かもしれないね。公理では点、直線、平面などを定義して、直線が平行であり得ることも言ってる。この話は面白いよ。なぜなら、空間が平坦じゃないとシステムが破られるから。例えば、球面にいるときとかね。あと、ゼルメロ=フレンケル集合論(ZF/ZFC)を考えてるかもしれない。現代数学の多くはこれに基づいてるから。

誰かこれをザクトロニクス風のゲームにしてくれない?そのゲームは数学って呼ばれてるんだ :) 半分冗談だけど、ゲーム版があったら楽しそうだと思う。 > これが純粋数学のことなの?まあ、学部生にとってはそうだね。でも研究に入ると感じが違ってくるよ。 > これがすごく、めっちゃ欲しい! 抽象代数の本をチェックしてみるといいよ。ダミットとフートとか、他の人気の本でもいいかも。代数の証明は、ゲームみたいな満足感があることが多いから。人気の本には、詰まったときにオンラインで見つけられる解答があるよ。

僕の中では、これが数学そのものだと思ってる。公理から始めて、結論を導き出すんだ。もっと深いことがあるかもしれないけど、今はそんな理解に至ってるよ。

テレンス・タオの『Analysis』って本をチェックしてみて。時々難しいけど、私にとってはその世界を開いてくれたよ。

もうゲームはあるけど、あなたが求めているものとはちょっと違うかも(目標は「すべての既知の数学を生成する」じゃないし)。私も少し遊んでみたけど、結構楽しいと思うよ。実際、記事にも載ってるよね: https://adam.math.hhu.de/#/g/leanprover-community/nng4

ゲーム「Bombe」をチェックしてみて。これはマインスイーパーのバリエーションで、セルを直接フラグ付けしたり開けたりする代わりに、セルをフラグ付けできるルールを定義するんだ。進むにつれて、互いに暗黙的に連鎖する補題を構築することになるよ。そして、あなたがもっと進むと(ゲームがツールセットのいくつかの恣意的な制限を取り除くと)、ルールを一般化して、すでに構築したものを簡略化できるようになるよ。 [1] https://steamcommunity.com/app/2262930

スレッドの他のところでも良い言及があったけど、もう一つチェックすべきは「The Incredible Proof Machine」だよ。 https://incredible.pm/

なんでこんな質問してるのに、ロボティクスの専門家で自律移動ロボット業界の主力ソフトウェアエンジニアなの?君の質問からは高校生だと思ったよ。

既存の数学的証明を追加できる標準的なライブラリやリポジトリってあるの?

いくつかあるよ。Leanのやつはここにあるよ:https://github.com/leanprover-community/mathlib4

もしトリックや変なことに頼らないとしたら、ランダムなものをLeanに投げて、承認されるかどうかで面白い観察を見つけることは可能かな?自動化されたシステムや、いろんな証明や理論を試すLLMを使って、それがうまくいくか見るとか?もしかしたら、私が間違った質問をしているか、うまく表現できてないかもしれないけど…これは私の理解を超えてる。プロログを理解するのもやっとだったから。

プロとして認定プログラミングをやってる者として、生成AIと形式手法は最高の組み合わせだと思ってる。人間のプログラマーがLLMベースのAIに取って代わられるかどうかは、これらのAIが認定プログラミングや構成的推論にどれだけ上手くなるかにかかってるとさえ思う。> ランダムなものをLeanに投げて、承認されたら面白い観察ができるかって?従来のAIはチェッカーには簡単に対応できるけど、チェスはちょっと難しい。囲碁は非機械学習AIではまだ手が出せない。で、洗練された形式言語の探索空間(利用可能な手の数と探索可能な状態の多様性)は計り知れないほど大きくなる。問題が特定の性質を持つことが分かっているときは、しばしばSMTソルバーを使って効率的にブルートフォースできる。従来、SMTソルバーと証明アシスタントは形式手法の別々の分野だったけど、やっとお互いの強みを活かし始めてるみたい(SledgehammerやLean-SMTを参照)。> 自動化システムや、いろんな奇抜な証明や理論を試すLLMを使ってみるのはどう?それがうまくいくか見てみるのも面白そう。こういう研究がもっと一般的になってほしいな。実際、これらのアイデアには数年前から大きな資金提供者がついてたし、LLMが流行る前からそうだったよ。「学習して検索戦略を洗練することで証明や定理を見つける」っていう以前の研究や、最近のDeepSeek-Proverの試みも参考にしてみて。私は機械学習の専門家じゃないけど、これらをどうやって最適に訓練するか、将来の可能性がどうなるかはまだまだオープンな質問だと思う。全体的に、主流のLLMはRocqやLeanのような言語にはまだまだ mediocre だし、間違ったときの証明スクリプトはトラブルシュートや修正がめっちゃ面倒だよ。でも、形式手法におけるAIツールが時間とともに大きく成長することを期待してる。

AGIができる前に、アンドリューの証明をLeanに翻訳してくれるAIが必要かもね。扱いやすくて、チェックも簡単で、役に立つし、さらに発展させられるやつ。

その方向での作業はもう始まってるよ:https://github.com/deepseek-ai/DeepSeek-Prover-V2 それに、https://deepmind.google/discover/blog/alphaevolve-a-gemini-p... テレンス・タオもこの分野でたくさんの研究をしてるね。

Leanの証明を非対話的に読む方法ってあるのかな?自然数ゲームをちょっと遊んでみたけど、証明がすぐに「rw [x]」コマンドの不透明なシーケンスになっちゃって、読みにくかった。エディタが異なるポイントで状態をインタラクティブに見ることを許可してくれるのはいいけど、各行をクリックしないといけないのは読書の流れを壊しちゃうよね。もしインデントやブレースが全くないPythonコードを読む必要があって、if文がどこで終わるのか、elseブロックがどこから始まるのかを知るためには各行をクリックしなきゃいけないと想像してみて。私の印象は、自然数ゲームの初期レベルが提供する限られた語彙に影響されてるかもしれない。フルLeanが提供するリッチなツールセットは、各行をクリックしなくても証明を読みやすくするのに役立つのかな?