如何在无需在 z3 中重复创建新求解器的情况下更改求解器中的断言 Python API

How to alter assertions in a solver without having to repeatedly create a new solver in z3 Python API

我目前 运行 正在解决我创建一个大型 SMT 公式(从外部来源获得)并使用它 运行 Solver.check() 的问题。如果调用失败,我使用 rewrite(s,f,t) 提供的 here.

对求解器中的某些断言执行重写

现在我想知道如何将求解器中失败的断言更改为重写后获得的新断言。那是断言仍然包含与以前的求解器相同的函数 defintions/declarations 等,除了已重写的更新断言。

例如,这就是我现在要做的。我想知道是否有 better/more 有效的方法:

solver = z3.Solver()
f = z3.Function(f, z3.Int(),z3.Int())
solver.add(f(3)== 5)
solver.check()
solver.model()
# I don't like the model let's rewrite
new_assertions = solver.assertions().rewrite(...)
new_solver = z3.Solver()
new_solver.add(new_assertions)
new_solver.check()
...

这就是 pushpop 语句的用途:

  • push:创建一个 back-tracking 点,您可以跳回
  • pop:回到最后一个 push

也就是说,您 push 在添加您的断言之前,以及当您想要更改它们时 pop 回到您原来的位置。您可以根据需要创建任意数量的回溯点。

这种求解器使用方式称为“增量式”,在 SMTLib document 的第 4.1.4 节中进行了描述。为了使用 rewrite 函数简化编程,您可能希望将断言保存在您自己的列表中,以便于操作;但这或多或少与这里的讨论无关。