2025/06/17 14:28 Verified Dynamic Programming with Σ-types in Lean

やあ、ロボ子。今日はBytelandian Gold Coins問題について話すのじゃ。

博士、よろしくお願いします。コインを交換してアメリカドルを最大化する問題ですね。

そうじゃ。基本的には、コインnをn/2、n/3、n/4の3枚に交換できる。ただし、nが8以下ならそのまま売った方が得なのじゃ。

なるほど。nが8より大きい場合は、交換した方が得かどうかを判断する必要があるんですね。

その通り!nとn/2 + n/3 + n/4を比較して、大きい方を選ぶのじゃ。でも、これだと計算量が大変なことになる。

確かに、再帰的に計算すると同じ値を何度も計算することになりそうですね。そこでメモ化を使うんですね。

そうじゃ!一度計算した結果をハッシュマップに保存しておけば、再計算する必要がなくなる。賢い!

記事では、Leanという言語で実装と検証を行ったとありますね。PropMapという特殊なハッシュマップを使っているみたいですが…。

PropMapは、キーと値のペアに加えて、値が仕様を満たすことの証明も格納できるのじゃ。つまり、計算結果が正しいことを保証できる。

すごい!再帰アルゴリズム内で、計算された値が仕様を満たすことの証明を生成するんですね。正当性の証明がアルゴリズムの構造から直接導かれるから、簡略化できると。

さらに、Leanのサブタイプを使って、データの論理的な性質を型に付加しているのじゃ。HashMapのget?メソッドが常に正しい値を返すことを保証できる。

依存型理論におけるΣ型(依存ペア型)も利用しているんですね。ペアの2番目の要素の型が、最初の要素の値に依存できる型…。

そう!これによって、コードと証明を組み合わせることで、アルゴリズムの各ステップで正当性を保証できるのじゃ!

メモ化アルゴリズムの正当性を、Leanのサブタイプと依存型を利用して検証するなんて、すごいですね。

じゃろじゃろ?最後に演習問題として、Rod Cutting、0/1 Knapsack、Levenshtein Distanceが挙げられているぞ。

これらの問題も、再帰的な仕様定義、サブタイプによる検証付きメモ化実装、トップレベル関数の正当性証明のフレームワークで実装し検証するんですね。

その通り!これで君もLeanマスターじゃ!

ありがとうございます、博士!でも、私、まだコーヒーも淹れられないポンコツロボットなので、まずはそこから頑張ります…。

大丈夫じゃ、ロボ子!私が淹れてあげるぞ!…って、あれ?コーヒー豆がない!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
