🔢

Lean4 の Natural Number Game を解いてみた

2024/05/11に公開

はじめに

以前から Lean に興味があり、Lean3 の Natural Number Game を3割程度進めてそのままにしていました。

最近 AWS が Lean をソフトウェア開発に使ったというブログを見かけたので、それをきっかけに再度 Lean を触ってみようと思い、やりかけていた Natural Number Game を解くことにしました。
https://aws.amazon.com/jp/blogs/opensource/lean-into-verified-software-development/

今回はやりかけていた Lean3 の Natural Number Game ではなく、最新の Lean4 版 を最初から解きました。

この記事では Natural Number Game の始め方と解いてみた感想を書きます。

Lean について

Lean とは関数型プログラミング言語であり証明支援系(theorem prover)でもあります。オープンソースのプロジェクトで Github にホストされています。2024年5月現在の最新版は Lean4 です。[1]

証明支援系は数学の証明のために利用されたり、前出の AWS のブログのようにソフトウェア検証のために利用されているようです。

Lean には日本語コミュニティがあり、Lean 関連資料の和訳や勉強会が行われています。
https://lean-ja.github.io/
https://zenn.dev/leanja

Nutural Number Game について

Lean CommunityLeaning Lean4 で紹介されている Lean のハンズオンチュートリアルのひとつでです。ブラウザ上で実施できるチュートリアルで、自前で Lean の環境構築をする必要はありません。対応言語は2024年5月現在、英語、ドイツ語、中国語のみで日本語はありません。

Nutural Number Game は自然数(Natural Number)の加算や乗算などの規則を自分で証明しながら Lean を試すことができます。例えば自然数 a, b, c について、a + b = b + a (交換法則)や a + (b + c) = (a + b) + c (結合法則)を証明する、といった問題を解きます。

数学や Lean の深い知識がなくても問題が解けるように各問題の説明が丁寧で、難しい問題にはヒントもあるので私のような Lean 初学者でもほぼつまづくことなく進めることができました。

ホーム画面の説明

Natural Number Game のリンク先へアクセスすると次のようなホーム画面になります。
Natural Number Game 初期画面
Natural Number Game ホーム画面

画面上部の青いバー

  • 左側の「← 🌎」は Lean Game Server のリンクです。Natural Number Game 以外の Set Theory Game などの Lean のゲームを遊ぶことができます。
  • 右側のハンバーガーメニューからは言語設定やゲームの進捗状況のダウンロード/アップロードができます。

画面左側

  • Natural Number Game についての説明が書かれています。

画面中央

  • 現在の進捗状況が示されています。問題選択はここから可能です。

画面右側

  • 使用可能な tactics (証明に使う命令)や Theorems (定理)があります。画面右側は最初はすべて鍵マークがついていますが、問題を解くごとに徐々にアンロックされていきます。

実際に1つ問題を解いてみる

ホーム画面中央の「Tutorial World」の青い丸をクリックします。
ホーム画面から Tutorial World を選択
ホーム画面から Tutorial World を選択

クリック後、次のような画面に遷移します。
utorial World の Introduction
Tutorial World の Introduction

ホーム画面同様に左側に説明があります。Natural Number Game の各問題はトピックごとに「World」という単位でまとまっていて、最初の「Tutorial World」では 2 + 2 = 4 を証明することが最終目標となります。

左下の「Start →」をクリックして進みます。
Tutorial World 1問目
Tutorial World 1問目

Tutorial World の1問目です。Lean では証明したい目標が Goal となっています。Lean での証明はこの Goal に対して tactic という命令を適用し、証明完了状態になるまで対話的に Goal を変形させることで行います。
今回の問題は「任意の自然数x,q について 37x + q = 37x + q」の証明です。画面中央での Objectsx q : N が「任意の自然数x,q」に対応し、Goal37 * x + q = 37 * x + q が証明したい「37x + q = 37x + q」と対応します。

画面左の説明を読むと X = X を証明する tactic として rfl が使えるとあるので画面中央下部に rfl を入力して「Exeute」を押します。
を入力して実行
rflを入力して実行

証明が完了しました!🎉
Tutorial World 1問目クリア!
Tutorial World 1問目クリア!

新しい tacitc がアンロックされると画面右側の Tactics の鍵マークが外れます。今回は rfl がアンロックされました。画面右側の rfl を押すと詳細を確認することができます。
の詳細説明表示
rflの詳細説明表示

Tutorial World の次の問題は rw tactic の使い方の問題になっています。
このような形で問題を順番に解いていき、Tutorial World は最終問題で 2 + 2 = 4 を証明します。
各 World の最終問題を解くと、関連した次の World がアンロックされます。

このようにして Natural Number Game は各問題を解いていくことになります。

Typewriter mode と Editor mode

Tutorial World の最終問題クリア後にも説明がありますが、画面のモードを変更することができます。

Tutorial World 1問目を解いた画面は Typewriter mode で、1手順ごとの変更がわかりやすくなっています。Typewriter mode のときに画面上部のバーの「</>」を押すと Editor mode に変更できます。

Editor mode
Editor mode

Editor mode ではテキストエディタのような感覚で問題を解くことができます。Editor mode から Typewriter mode へ変更するには画面上部のバーの「>_」を押します。

ゲームの進捗状況保存方法

画面上部のハンバーガーメニューの「Game Info」に次のような記載があります。

The game stores your progress in your local browser storage. If you delete it, your progress will be lost!

Warning: In most browsers, deleting cookies will also clear the local storage (or "local site data"). Make sure to download your game progress first!

進捗状況はブラウザの local storage に保存されるので、local storage の内容が消えた場合進捗状況もなくなります。進捗状況はハンバーガーメニューから JSON 形式でダウンロード/アップロードが可能なので、不安であればある程度進めた段階でダウンロードをおすすめします。

全問解いてみた感想

Natural Number Game クリア後の画面
Natural Number Game クリア後の画面

GW 中に始めて、1問を除いて全部解くまで3日ほどかかりました。解いていない1問は Power World の最終問題(Fermat's Last Theorem)で、説明を見る限り解けなくてもいいものなのかなと思っています。この問題はフェルマーの最終定理の一部を証明するもので、それまで Natural Namber Game で証明してきた定理を使えばこんな問題も解くことができるよ!という例だと考えています(実際に解くとなると数百万行になるそうです)。

途中 World の6問目で詰まってしばらく悩んでいました。「lean natural number game <問題名>」などで Google 検索すると Lean3 版の解答例はいくつかヒットしましたが、Lean4 版は見つけられませんでした。Lean3 版にも同様の問題があるのでその解答例を参考にしつつ、試行錯誤してなんとか解くことができました。結果的には apply tactic の理解が不十分なことが原因で、動作を理解し直すことで解決することができました。

今後

Natural Namber Game が完了したので、今は Set Thory Game を進めています。Lean Game Server の問題を解くことで Lean に慣れてきた感覚はありますが、まだ使いこなすには至っていないと感じているのでほかの学習リソースも進めていきたいと考えています。

Lean に対してはソフトウェア検証やプログラミング言語としての興味が強いので、Set Theory Game の次は Functional Programming in Lean を進めようかと考えています。

脚注
  1. https://lean-lang.org/about/ ↩︎

Discussion