私は、SMTLIB 2言語を使用して、論理QF_BVで表現した問題を解決するのにZ3 SMTソルバを使用しています。z3(論理QF_BV)で「不良」コアを取得する
モデルが満足できないため、ソルバーにunsat-coreを生成させようとしています。
私のモデルは、いくつかの「必須」制約から成ります。これはassert
ステートメントを使って指定します。
アサーションは、コアの生成には、(assert (! (EXPR) :named NAME))
を使用して指定されています。
Z3は、期待通りに私にunsat
を与えます。しかし、Z3は常に、すべての名前付きアサーションで構成される「些細な」unsat-coreをダンプするようです。
私は名前のついたアサーションのサブセットが存在することを知っています。これは、unsat-coreです。私はYicesのSMTソルバーを使ってこのコアを見つけました。これは、比較的小さなunsatコアを頻繁に提供します。 YicesモデルはZ3モデルと同じです(ほとんどSMT2からYices入力言語への行単位変換)。
"良い" unsat-coresをソルバー固有の機能として生成しているか、Z3がより良いコアを提供できるように一般的な提案や変更がありますか?
返信ありがとうございます! サンプルスクリプト[ここ](https://gist.github.com/2fe5ce8cf42af9ffaf59)をアップロードしました。私は理解を助けるための簡単な説明を含んでいます。 あなたは私のためのポインタがあるかどうかを見てみることができますか? – dhrumeel
私はあなたのスクリプトを手に入れました。答えを更新します。ところで、いくつかのビットベクトルリテラルの前に '#'がありません。 –