私が書いている調査ツールにPythonAPIのサポートを含めるために、Z3のPythonAPIを使用しています。Pythonインターフェースを使用して満足できないコアを抽出することに関して質問があります。
次の簡単なクエリがあります。
(set-option :produce-unsat-cores true)
(assert (! (not (= (_ bv0 32) (_ bv0 32))) :named __constraint0))
(check-sat)
(get-unsat-core)
(exit)
このクエリをz3実行可能ファイル(Z3 4.1の場合)で実行すると、期待どおりの結果が得られます。
unsat
(__constraint0)
Z3 4.3の場合、セグメンテーション違反が発生します。
unsat
Segmentation fault
それは興味深い観察でしたが、それは主な質問ではありません。次に、クエリを(ファイル内で)次のように変更しました
(assert (! (not (= (_ bv0 32) (_ bv0 32))) :named __constraint0))
(exit)
ファイルハンドラーを使用して、このファイルの内容を(変数 `queryStr'で)次のPythonコードに渡しました。
import z3
...
solver = z3.Solver()
solver.reset()
solver.add(z3.parse_smt2_string(queryStr))
querySatResult = solver.check()
if querySatResult == z3.sat:
...
elif querySatResult == z3.unsat:
print solver.unsat_core()
`unsat_core'関数から空のリストを受け取ります:[]。この機能を間違って使用していますか?関数のdocstringは、代わりに次のようなことを行う必要があることを示しています
solver.add(z3.Implies(p1, z3.Not(0 == 0)))
ただし、SMT-LIB v2.0標準に準拠しているため(私は信じています)、クエリをそのまま使用できるかどうか、そして明らかな何かが欠けているかどうか疑問に思いました。