我试图与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标准(我相信),我是否失去了一些东西明显。