Z3Py定点计算太弱了

时间:2013-09-02 19:00:14

标签: fixed-point z3py

我使用z3py API来计算一组归纳注释。我将我的约束映射到广义Horn子句的结合。 在这些约束中,需要推断出一些关系(l6和iwc1)。涉及的变量(incr1,t1和wc1)都是整数。我希望推断的谓词是区间关系。 谓词l6(incr,t1)应该捕获incr = 0和t1> = 0的事实。我正在将其定义为以下规则:

fp.rule(l6(incr,t1), [incr==0, t1>=0])

推断的谓词l6是:

And(0 <= Var(0), Var(0) <= 0, 0 <= Var(1))

同样,iwc1是一个涉及变量wc1的谓词,它试图捕获wc1 == incr + t1这一事实,其中incr和t1的值过度近似为l6。换句话说,

fp.rule(iwc1(wc1), And(wc1==(incr+t1), l6(incr,t1)))

由于wc1 == incr + t1和l6推断incr = 0且t1&gt; = 0,我预计iwc1为wc1&gt; = 0。相反,推断的谓词是True。为什么iwc1会变弱?

完整的程序可用in this online z3py code

相反,如果我修改iwc1的规则如下:

fp.rule(iwc1(wc1), And(wc1==incr+t1, incr==0, t1>=0))

然后,我收到以下错误:

z3types.Z3Exception: 'rule with unbound variable #2 in interpreted tail: iwc1(#0) :- \n (= #2 0),\n (= #0 (+ #2 #1)),\n (>= #1 0).\n'

具有iwc1规则更改的程序可用here. Z3Py抱怨变量incr不受限制。我在哪里弄错了?

1 个答案:

答案 0 :(得分:0)

您已使用Datalog引擎指定。它需要变量 在体内被束缚在谓词中。