我正在使用 Z3 的 Python API,试图在我正在编写的研究工具中包含对它的支持。我有一个关于使用 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”函数收到空列表:[]。我是否错误地使用了此功能?该函数的文档字符串表明我应该改为做类似的事情
solver.add(z3.Implies(p1, z3.Not(0 == 0)))
但是,我想知道是否仍然可以按原样使用查询,因为它符合 SMT-LIB v2.0 标准(我相信),以及我是否遗漏了一些明显的东西。