手動の「追跡」変数を明示的に使用せずに、名前付き式を使用してソフト制約を実装できるかどうか疑問に思っています。
- Z3のSoft/Hard制約のメッセージで、Leonardoは、補助ブール値を使用して手動でソフト制約を実装する方法を説明しています。
- 次のメッセージで: unsatコアの要求に応じてz3の動作が変化する、Leonardoは、名前付き式は基本的にモデル検索の目的での含意として扱われると述べています。
上記の最初のメッセージで説明したように手動追跡を使用するのはかなり面倒です。ソルバーへの複数の呼び出しが必要になるためです(実際2^n
、ソフト制約がある場合に可能な限り多くのソフト制約のセットを取得するには、最悪の場合に呼び出しが必要になる場合がありn
ます) )。これらの2つのアイデアを組み合わせて、Z3にはるかに簡単な方法でソフト制約を実装させることは可能でしょうか?これらの2つのメッセージからのアイデアに基づいて、私は素朴に次のことを試みました。
(set-option :produce-models true)
(set-option :produce-unsat-cores true)
(assert (! false :named absurd))
(check-sat)
モデルに参加することでこの不自然な例が満たされるsat
ので、z3が教えてくれることを期待していました。しかし、代わりに生成されました。これは合理的ですが、それほど有用ではありません。absurd
false
unsat
あなたが提供するかもしれない洞察に感謝します。または、z3が名前付き式をどのように使用するかについての詳細なドキュメントを教えてください。(私はマニュアルをざっと読みましたが、どこにも詳細に説明されているのを見ませんでした。)