LeanでPyTorchのEagerモードっぽくニューラルネットワークを書けるようにしたTorchLeanというプロジェクトがある。
Leanは、定理証明(形式的証明)とプログラミングを一体化した言語・環境であり、関数型プログラミング言語に近い文法を用いて、証明と実装を同じコードで扱える。
TorchLeanは、LeanでPyTorchのようなコードを書けるフレームワークを提供する。このフレームワークを使ってニューラルネットワークのコードを書くと、実際にそのコードを実行して機械学習を動かせるだけでなく、同時に証明や検証も可能となる、というのがコンセプト。論文によれば、自動微分による逆伝播の検証や、FP32の誤差境界の証明を行った、としている。
このTorchLeanはさておき、Leanがいつのまにか4になっているのを知らなかった。このバージョン4は2021年にリリースされた。LeanはもともとはIsabelleやRocq(旧Coq)1のような定理証明支援系のソフトだったと記憶しているけど、4から「照明もできる汎用プログラミング言語」となっている。檜山正幸氏のまとめが分かりやすかった。
というわけで、昔遊んだコードや3から4への更新ガイドとにらめっこしながら、愚直に探索するだけの数独ソルバーをLean4で書いてみた。
探索部分は下の感じで、普通のプログラミングっぽさはある。
partial def solve (b : Board) : Option Board :=
match findEmpty b with
| none => some b
| some (r, c) =>
let rec tryDigits (ds : List Nat) : Option Board :=
match ds with
| [] => none
| d :: ds' =>
if isValid b r c d then
let b' := setCell b r c d
match solve b' with
| some sol => some sol
| none => tryDigits ds'
else
tryDigits ds'
tryDigits ((List.range N).map (· + 1)) -- [1..N]
このCoqも2023年にRocqに名称変更されていたのを今さら知った。> Renaming Coq - Announcements - Rocq Prover ↩︎
