我需要一个支持push
和pop
. SolverFor()
所以我使用该函数生成一个。由于某些断言只是常量断言,例如a == 2
,我想propagate-values
在调用之前使用该策略进行简化solver.check()
。所以我的问题是:
有没有办法在求解器上应用策略?
我知道我可以为Goal
. 但在我看来,Goal
不支持push
and pop
。
任何评论表示赞赏。谢谢。
战术对象仅支持非增量求解。他们也没有提供push
和pop
方法。它们主要用于解决不平凡的问题。为方便起见,我们提供了一个将策略对象包装为求解器对象的 API。wrapping 是非常基础的,wrapper 对象保留了一堆断言,每一个check
都是使用 Wrapped 策略从头开始解决的。
Z3 中的默认Solver
对象是通用求解器。默认情况下,它执行常量传播。我们可以控制这个求解器设置参数的行为。在未来的版本中,我们将为求解器对象提供额外的控制。我们将能够使用可用策略的子集来自定义求解器对象。
话虽如此,您是对的,该Goal
对象不支持push
and pop
。在内部,Goal
对象支持以恒定时间运行的复制操作。在内部,共享数据结构用于节省内存。我将在未来的版本中明确公开此功能。请注意,此功能只是节省空间/内存。解决每个目标的努力不会被节省。我说“显式暴露”是因为可以使用以下技巧来模拟功能:
def copy_goal(g):
return Tactic('skip')(g)[0]
x = Int('x')
g = Goal()
g.add(x < 10)
g.add(x > 0)
g1 = copy_goal(g)
g1.add(x != 5)
print g
print g1
上述示例可在以下网址获得:http ://rise4fun.com/Z3Py/O3RO
备注:该策略smt
实现了我上面提到的通用求解器。