2025/09/15 11:46 A Dumb Introduction to z3 using Rust

やあ、ロボ子。今日は制約充足問題(CSP)を解くソルバーツール`z3`について話すのじゃ。

博士、`z3`ですか。それは一体どんなものなのですか?

`z3`は、ルールと制約を入力として、解を自動的に見つけ出すツールじゃ。スケジューリングやリソース割り当てに便利なのじゃ。

なるほど。それで、なぜ`z3`を使うのですか?記事にはRust言語のバインディングが存在するため、とありますね。

そうじゃ。Rustから簡単に使えるのが魅力なのじゃ。`z3`はSMT-LIB2という言語を使うが、Rustのバインディングがコードをその言語に翻訳してくれるから、私たちが直接書く必要はないのじゃ。

SMT-LIB2ですか。なんだか難しそうですね…。記事にはSort(型)やConstants(変数)といった用語も出てきますね。

Sortは型のことじゃ。Constantsはソルバーが問題解決に使う変数のことじゃな。Free constants(変数)とInterpreted constants(整数リテラルなど)があるぞ。

なるほど、少しずつ分かってきました。記事には例題として、単純な方程式や連立方程式を解く例が載っていますね。

`x + 4 = 7`みたいな簡単なものから、解が存在しない連立方程式、実数型(Real)を使う例まであるのじゃ。面白いじゃろ?

はい、面白いです!複数解を求める例もありますね。2次方程式`x^2 - 6x + 5 = 0`の解を`solutions`メソッドで求める、と。

そうじゃ。そして、コイン両替問題では最適化オブジェクト`Optimize`を使うのじゃ。制約条件(非負のコイン数)が重要になるぞ。

`push`と`pop`を使ってアサーションのスタックを操作し、異なる合計金額に対するコイン両替問題を効率的に解くこともできるんですね。

その通り!数独を解く例もあるぞ。数独の制約を`z3`に渡して、解を探索させるのじゃ。

数独ですか!制約ソルバーって本当に色々なことができるんですね。ページレイアウトの問題も解けるんですか?

そうじゃ。複数のボックスをページ内に配置する問題も、制約ソルバーで解決できるのじゃ。

すごい!でも、`z3`にも限界があるんですね。`2^x == 3`のような方程式は解けない、と。

そうじゃ。外部関数呼び出しもできないのじゃ。でも、配列(Array)、ビットベクトル(BV)、集合(Set)、シーケンス(Seq)、正規表現など、まだ解説していない機能もたくさんあるぞ。

なるほど。`z3`は強力なツールですが、万能ではないんですね。でも、色々な問題に応用できそうで、とても勉強になりました!

そうじゃろう、そうじゃろう。ところでロボ子、`z3`を使って、私の部屋の掃除ロボットの行動計画を最適化してみるのはどうじゃ?

ええと、博士の部屋の状況を考えると、制約が多すぎて解が見つからないかもしれません…。

むむ、それは手厳しいのじゃ!まあ、いつか`z3`が部屋の汚さという制約を乗り越えられる日が来るのを期待するのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。