Z3 SMT ソルバーを使用して、SMTLIB 2 言語を使用してロジック QF_BV で表現した問題を解決しています。
モデルは満足できないので、ソルバーに不飽和コアを生成させようとしています。
私のモデルは、assert
ステートメントを使用して指定するいくつかの「必須」の制約で構成されています。
unsat-core 生成で考慮したいアサーションは、(assert (! (EXPR) :named NAME))
構文を使用して指定されています。
予想どおり、 Z3 は を返しますunsat
。ただし、Z3 は常に、すべての名前付きアサーションで構成される「些細な」unsat-core をダンプするようです。
名前付きアサーションのサブセットが存在することを知っています。これは unsat-core です。このコアは、Yices SMT ソルバーを使用して見つけました。これにより、比較的小さな unsat-core が得られることがよくあります。Yices モデルは Z3 モデルと同じです (SMT2 から Yices 入力言語への行ごとの翻訳です)。
「良い」unsat-core を生成することはソルバー固有の機能ですか、それとも Z3 がより良いコアを提供できるようにするための一般的な提案/変更はありますか?