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

数学は呪われている

2025年7月31日原文(overreacted.io)

概要

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

Hacker Newsで議論の続きを見る