z3py:在解算器上应用策略

时间:2012-09-17 17:16:47

标签: python z3

我需要一个支持pushpop的特定逻辑的解算器。所以我使用SolverFor()函数生成一个。由于某些断言只是常量断言,例如a == 2,我想在调用propagate-values之前使用solver.check()策略进行简化。所以我的问题是:

有没有办法对解算器应用策略?

我知道我可以为Goal做到这一点。但在我看来,Goal不支持pushpop

任何评论都表示赞赏。感谢。

1 个答案:

答案 0 :(得分:2)

战术对象仅支持非增量解决。他们也不提供pushpop方法。它们主要用于解决非平凡问题。为方便起见,我们提供了一个API,它将一个战术对象包装为一个求解器对象。包装是非常基本的,包装器对象保留一堆断言,并且每个check都是使用包装策略从头开始解决的。

Z3中的默认Solver对象是通用解算器。默认情况下,它执行常量传播。我们可以控制此求解器设置参数的行为。在将来的版本中,我们将为求解器对象提供额外的控制。我们将能够使用可用策略的子集来自定义求解器对象。

话虽如此,你是对的,Goal对象不支持pushpop。 在内部,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实现了我上面提到的通用解算器。