目次
背景
- 最近はLeanという言語をニュースでよく見る
- IUT理論での証明や、テレンス・タオが使っていたりする
- Leanが、どのようにTruth and proofをやってくれるのかが気になった
- そこで、Leanがどんなものか試してみた
Lean
Leanとは
Lean is an open-source programming language and proof assistant that enables correct, maintainable, and formally verified code
一言で言えば、ブラジルの科学者によって作成された証明を形式化したプログラミング言語。
Leanが何に使われているのか
Lean is the core verification technology behind Cedar, the open-source authorization language that powers cloud services like Amazon Verified Permissions and AWS Verified Access. Our team rigorously formalizes and verifies core components of Cedar using Lean’s proof assistant, and we leverage Lean’s lightning-fast runtime to continuously test our production Rust code against the Lean formalization. Lean’s efficiency, extensive libraries, and vibrant community enable us to develop and maintain Cedar at scale, while ensuring the key correctness and security properties that our users depend on.
- AWSでも使われているらしい
- 例えば、Amazon Verified Permissionsは内部でCedarというPolicy言語を使っている
- そのCedarを検証するために、Leanが使われているっぽい
Installation
- VS CodeでLean 4 Extensionを使ってそのままランタイムもインストールされた
Lean言語
Leanの感覚的な証明の流れ:
| |
TypeとProp
Leanを理解するうえで重要な2種類の分類として、Type と Prop がある。
| 種類 | 何を分類するか | 例 |
|---|---|---|
Type | データ・値の集合 | Nat, Bool, Person |
Prop | 命題(真偽を問うもの) | 1 + 1 = 2, Human socrates |
つまり、次のようにデータを扱う。
- 命題 = 型
- 証明 = その型の値
Leanでよく使われる命令
| |
tacticとは
- タクティクは、Lean において証明を対話的に行ったり自動化したりすることを可能にするもの
- ようは、tactic は、Leanの証明ゴールを少しずつ攻略するコマンドみたいなんもの
Curry-Howard対応とは
命題とプログラムの型は同じ構造をしているという関係対応。
| 論理の世界 | プログラムの世界 |
|---|---|
| 命題 | 型 |
| 証明 | 値(プログラム) |
「AならばB」A → B | A を受け取り B を返す関数 |
| 証明を構成する | プログラムを書く |
| 証明が存在する | その型の値が構成できる |
Curry-Howardの例
例:「AならばB」の証明
論理的には:
| |
Leanでは:
| |
関数を定義すること=「AならばBを証明すること」 になる。
別の言い方だと、「引数を渡す」というプログラム操作が、そのまま「命題を適用する」論理操作になっている。
Leanの証明の型一覧
ゴールの形によって、必要な証明の構造が変わる。
| ゴールの形 | 意味 | 証明に必要なもの | 例 |
|---|---|---|---|
A | 命題Aが真 | Aの型の値 | exact hA |
A → B | AならばB | Aを受け取りBを返す関数 | fun (a : A) => ... |
A ∧ B | AかつB | AとBの両方の証明のペア | ⟨証明A, 証明B⟩ |
A ∨ B | AまたはB | AかBどちらか一方の証明 | Or.inl 証明A |
∀ x, P x | すべてのxでPが成り立つ | xを受け取りP xを返す関数 | fun x => ... |
∃ x, P x | あるxでPが成り立つ | 証人x + P xの証明のペア | ⟨x, 証明⟩ |
A ↔ B | AはBと同値 | A→BとB→Aの両方 | ⟨証明A→B, 証明B→A⟩ |
¬A | Aでない | Aを受け取りFalseを返す関数 | fun (a : A) => ... |
a = b | aとbは等しい | 書き換えや反射律 | rfl |
覚え方:
| |
Leanの例
三段論法
三段論法:
- すべての人間は死ぬ
- ソクラテスは人間である
- よって、ソクラテスは死ぬ
| |
キーワードの意味:
- Person: 人の集合みたいなもの
- Human: その人が人間かどうか
- Mortal: その人が死すべき存在かどうか
- socrates: ソクラテス
- hAll: 任意の x について、Human x なら Mortal x
- hSocrates: Socrates は Human
- 結論: Socrates は Mortal
つまり、下のような関係になっている。
| |
最後にexactは「この値がゴールの型とぴったり一致します」とLeanに渡すだけで、実行というより値を提出するイメージ。
ペアノの公理
| |
意味は以下の証明になる。
- 任意の n について、
- m = succ n を取れば、
- n < m である
exact ⟨Nat.succ n, Nat.lt_succ_self n⟩の意味:
| 部分 | 意味 |
|---|---|
Nat | 自然数に関する型・対象 |
lt | less than(<) |
succ | successor(次の数、+1) |
self | 自分自身 |
つまり、次を意味する。
| |
まとめ
- そもそもゲーデルの不完全性定理では、無矛盾かつ完全な形式体系はなく、証明できないものがあると証明されていたはず
- つまり、どの系の形式化や一般化でも証明できないものがあるはず
- ただ、証明はできないものがあるが、Leanを通せば証明を検証・形式化できるのはAI時代には有用かもしれない
