1

私はいくつかの戦術の助けを借りてチェックしたいいくつかのコードを持っています。発言が多いので、戦術を使いif-then-elseたいです。elim-term-ite

私は以下の戦術を利用しました

(check-sat-using (then (! simplify :arith-lhs true) elim-term-ite solve-eqs lia2pb pb2bv bit-blast sat))

ただし、これでエラーが発生した場合は-"goal is in a fragment unsupported by lia2pb"

したがって、戦術lia2pbとその隣の戦術を削除しようとすると、別のエラーが発生しunknown "incomplete"ます。

を除くすべての戦術を削除しようとしましたがsimplify、それでもincompleteエラーが発生します。

satソルバーが問題を解決するのを助けるために私が試みるべきことは何ですか?別の戦術を試す必要がありますか?

4

1 に答える 1

2

lia2pb(別名線形整数演算から疑似ブール値)を使用するには、すべての整数変数を制限する必要があります。つまり、下限と上限が必要です。

戦術satは、入力ゴールに理論アトムが含まれていない場合にのみ完了します。つまり、目標にはブール接続詞とブール定数のみが含まれます。そうでない場合、(入力のブール抽象化)目標が満たされないことを示すことができない場合は、「不明」を返します。

lia2pb次のコマンドを使用して、Z3に入力目標を表示するように依頼できます。

(apply (then (! simplify :arith-lhs true) elim-term-ite solve-eqs)

一部の数式に無制限の整数変数が含まれている場合は、可能な場合はSATに減らし、それ以外の場合は汎用ソルバーを呼び出す戦略を作成できます。or-elseこれは、コンビネータを使用して実行できます。次に例を示します。

(check-sat-using (then (! simplify :arith-lhs true) elim-term-ite solve-eqs 
                       (or-else (then lia2pb pb2bv bit-blast sat)
                                smt)))

編集:この戦術lia2pbは、すべての有界整数変数の下限がゼロであることも前提としています。normalize-bounds適用する前に戦術を使用できるため、これは実際には大きな問題ではありませんlia2pb。この戦術は、バインドされた変数を、normalize-boundsに置き換えます。ここで、は新しい変数であり、はxの下限です。たとえば、を含む目標では、はに置き換えられます。ここで、は新しい新しい変数です。xy + l_xyl_x3 <= xxy+3y

于 2012-09-18T16:59:57.187 に答える