我需要一个支持push
和pop
的特定逻辑的解算器。所以我使用SolverFor()
函数生成一个。由于某些断言只是常量断言,例如a == 2
,我想在调用propagate-values
之前使用solver.check()
策略进行简化。所以我的问题是:
有没有办法对解算器应用策略?
我知道我可以为Goal
做到这一点。但在我看来,Goal
不支持push
和pop
。
任何评论都表示赞赏。感谢。
答案 0 :(得分:2)
战术对象仅支持非增量解决。他们也不提供push
和pop
方法。它们主要用于解决非平凡问题。为方便起见,我们提供了一个API,它将一个战术对象包装为一个求解器对象。包装是非常基本的,包装器对象保留一堆断言,并且每个check
都是使用包装策略从头开始解决的。
Z3中的默认Solver
对象是通用解算器。默认情况下,它执行常量传播。我们可以控制此求解器设置参数的行为。在将来的版本中,我们将为求解器对象提供额外的控制。我们将能够使用可用策略的子集来自定义求解器对象。
话虽如此,你是对的,Goal
对象不支持push
和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
实现了我上面提到的通用解算器。