我遇到了一个我非常喜欢Z3 Solver复制功能的情况。我的意思是,我有一个实例化了一些约束的求解器。我现在想复制它,以便我有两个独立的解算器。目前,我正在通过创建一个新的求解器并迭代s.assertions并将它们重新添加来做到这一点。对于小解算器,这很好。对于较大的求解器,这可能会严重影响复制的时间,因为Z3正在重新创建它已经完成的工作。
虽然这不是一个显示停止,但能够直接复制解算器将是非常有益的。普通的deepcopy方法会抛出一个关于无法深度复制ctypes的错误(这很有意义),所以我猜测任何更好的解决方案都必须由z3或z3py实现。
任何人都知道如何更有效地复制解决方案,并且不会产生Z3重新解决它已经知道的内容的开销吗?
答案 0 :(得分:1)
如果您构建最新的Z3源,Solver对象有一个translate方法,它将一个新的上下文作为参数(它可以是相同的上下文),并在该上下文中创建一个求解器的副本。
s = Solver()
...add some assertions...
solver2 = s.translate(main_ctx()) # create a copy in the same context
solver3 = s.translate(ctx) # create a copy in some other context