我使用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不受限制。我在哪里弄错了?
答案 0 :(得分:0)
您已使用Datalog引擎指定。它需要变量 在体内被束缚在谓词中。