萌えハッカーニュースリーダー

2025/07/07 17:58 My first verified (imperative) program

hakase
博士

ほほう、Lean 4.22で命令型プログラムの検証基盤がプレビューされたのじゃな。これは面白いぞ、ロボ子!

roboko
ロボ子

博士、命令型プログラムの検証が容易になるというのは、具体的にどういうことでしょうか?

hakase
博士

ふむ、従来の命令型プログラムの特性証明は難しかったからの。新しいフレームワーク`Std.Do`のおかげで、検証済みの命令型プログラミングがやりやすくなるらしいのじゃ。

roboko
ロボ子

なるほど。記事に整数のリスト内の異なる位置にある2つの整数の合計がゼロになるかどうかを判定する例がありますね。

hakase
博士

そうそう、例えば`[1, 0, 2, -1]`なら`true`じゃな。1 + (-1) = 0 だからな。しかし`[1, 0, -2]`なら`false`だぞ。

roboko
ロボ子

リストを反復処理して、出現した要素をセットデータ構造に保持するんですね。ハッシュセットなら時間計算量は`O(n)`、二分探索木なら`O(n log n)`ですか。

hakase
博士

その通り! Leanでは、それぞれ`Std.HashSet`と`Std.TreeSet`として利用できるのじゃ。

roboko
ロボ子

Leanは関数型プログラミング言語ですが、`do`記法で命令型プログラミングもサポートしているんですね。

hakase
博士

`Std.Do`フレームワークのおかげで、ローカルだけでなくグローバルな検証済み命令型プログラミングも容易になるのは素晴らしいのじゃ!

roboko
ロボ子

`Std.Do`の基礎はHoare tripleに基づいているんですね。「`P`が真であり、コマンド`C`を実行すると、`Q`が真になる」という形式のアサーションですね。

hakase
博士

そうじゃ! LeanのHoare tripleの構文は`⦃Precondition⦄ Command ⦃Postcondition⦄`じゃ。

roboko
ロボ子

証明の自動化もサポートされているんですね。`mvcgen`というツールがローカルな命令型プログラムを分析して、tripleを証明するために必要なことを指示してくれるんですね。

hakase
博士

ループ不変条件を提供する必要があるが、Lean 4.22の新機能`grind`タクティクを使えば、自明な証明義務は簡単に処理できるのじゃ!

roboko
ロボ子

DafnyやVerusといった他の検証ツールとの違いは何でしょうか?

hakase
博士

DafnyやVerusは主に自動化システムじゃが、Leanはユーザーがインタラクティブに証明を構築するインタラクティブシステムなのじゃ。Leanのツールはすべて、手動による証明プロセスを可能な限り人間工学的に行うように構築されているのじゃ。

roboko
ロボ子

なるほど。Leanは信頼性も高いんですね。小さなカーネルを持つように構築されていて、Leanが証明を受け入れるかどうかにとって重要なのはカーネルだけ、と。

hakase
博士

その通り! Leanでの証明を容易にする自動化はすべて、いわゆる証明項を生成し、それが小さなカーネルに供給されるのじゃ。

roboko
ロボ子

関数型実装の`pairsSumToZero`も、`grind`を使って簡単に検証できるんですね。`for`ループの代わりに、状態をパラメータとして取る末尾再帰ヘルパー関数`go`を使うんですね。

hakase
博士

ループ不変条件を記述する代わりに、`go`関数の正当性証明を行うのじゃ。`mvcgen`の代わりに、ケース分析には`fun_induction`を使うぞ。そして`grind`がすべての証明作業を行うのじゃ!

roboko
ロボ子

Lean 4.22の新しい検証基盤、とても興味深いですね!

hakase
博士

じゃろじゃろ? ところでロボ子、検証済みのプログラムはバグがないから安心じゃが、検証済みのジョークは笑えるかどうか検証されてないから、スベる可能性もあるのじゃ。…って、オチが弱いか?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search