Leanで正規表現エンジンをつくる。そして正しさを証明する
https://fortee.jp/2025fp-matsuri/proposal/af94193a-4acb-4079-82a9-36bacfae3a20
https://github.com/pandaman64/kansuugatamatsuri-2025/blob/main/main.pdf
Lean は 純粋関数型プログラミング言語 と 定理証明支援系 の二面性を持つ
言語として: 依存型、モナド を用いた 手続き型、マクロ
定理証明支援系として: 数学の 定理 やプログラムの 性質 、それらの証明を記述する言語
https://gyazo.com/ebd3b09772c6c8d69e7c77b59f95d816
自作の 正規表現 ライブラリ: GitHub.icon https://github.com/pandaman64/lean-regex
正規表現を オートマトン にコンパイルして実行
Lean 上で実装が正しいことを検証
実装が正しい?
マッチの仕様を厳密に定義し、それを合致することを示す
健全性、安全性 を示す
Lean の最適化
2 つの実行モデル
カーネル による インタプリタ: 照明の検証・IDE での実行
C へのコンパイル: ネイティブコード の生成
オブジェクトを 参照カウンタ で保持
正格 な純粋関数型言語なので 参照サイクル は基本的に発生しない
参照カウンタを見るとデータ構造の更新を 破壊的変更 に最適化できる
なぜ 定理照明 ?
信頼性 の保証
実装の 品質 向上: 照明課程でバグを発見できる
パズル的な面白さ
深い理解が得られる
これが一番重要
証明を書くにはなぜ定理が成立するかを理解しなければならない
書いたプログラムがなぜ正しく動くのかを深く理解する必要がある
プログラムはなぜ正しく動くのか? = 良い 不変条件 が成立しているから
不変条件 = プログラムの各ステップの前後で常に成立している性質
性質はどう見つけるか?
1. 不変条件を見つける
2. 各処理が見つけた不変条件を保存することを示す
3. 見つけた不変条件が所望の性質を導くことを示す
どう不変条件を見つけるか?: 具体例や欲しい性質から逆算する
#関数型まつり_2025