我正在使用 Z3 Python 接口作为我正在编写的研究工具的一部分,当我在同一个查询上重复运行 Z3 求解器时,我注意到一些非常奇怪的行为:特别是,我似乎每次都没有得到相同的结果,即使我在运行前明确重置了求解器。作为参考,这是我的代码:
import z3
with open("query.smt", "r") as smt_reader:
query_lines = "".join(smt_reader.readlines())
for i in xrange(3):
solver = z3.Solver()
solver.reset()
queryExpr = z3.parse_smt2_string(query_lines)
equivalences = queryExpr.children()[:-1]
for equivalence in equivalences:
solver.add(equivalence)
# Obtain the Boolean variables associated with the constraints.
constraintVars = [equivalence.children()[0] for equivalence
in equivalences]
# Check the satisfiability of the query.
querySatResult = solver.check(*constraintVars)
print solver.model().sexpr()
print solver.statistics()
print ""
上面的代码三次重新创建 Z3 求解器并检查同一查询的可满足性。查询位于此处。
虽然上面的代码部分并不是我将如何使用 Z3 Python 接口,但问题源于一个认识,即 Z3 求解器在同一查询的代码的不同点被调用两次时,会返回不同的结果。我想知道这是否是故意的,是否有任何方法可以禁用它或确保确定性。