在Z3 python中修改变量

时间:2013-02-26 00:04:27

标签: python z3

我正在编写某种模拟某些规则的应用程序。我发现Z3py的定点是我的帮助。我的应用程序大纲如下: (fp = Fixedpoint())

  1. 声明一些整数变量,例如:a,b,c = Ints('a b c')并注册到固定点 - fp。(a,b,c)

  2. 遵循某些变量的属性(事实),增加或减少其他一些变量。例如: 如果(a> 0且b> 0)则c = c + 1

  3. 查询目标变量是否满足某些条件,例如查询(目标&0)

  4. 我不知道如何使用规则来指定2.有人可以告诉我这可能吗?

1 个答案:

答案 0 :(得分:1)

我拿了你概述的例子并创建了一个例子:

我希望这会有所帮助。

Z3打印UNSAT,因为无法访问查询。 然后它会显示一个证明该值的不变量 查询无法访问。

更详细

要声明具有三个参数的属性,请执行以下操作:

P = Function('P', IntSort(), IntSort(), IntSort(), BoolSort())

要为定点引擎注册它:

fp.register_relation(P)

添加您的所有规则:

fp.rule(P(-1,1,-10))
fp.rule(P(a,b,c+1), [a > 0, b > 0, P(a,b,c)])
fp.rule(P(a+1,b,c-1), [a <= 0, b < 0, P(a,b,c)])

第一条规则说明了最初属性的含义。 第二条规则说,如果a> 1,则c可递增。 0,b> 0

最后询问是否可以访问某些属性:

print fp.query(P(a,b,c),c > 0 )