【发布时间】:2016-12-12 22:09:42
【问题描述】:
我目前正在使用 Z3py 来推断一些不变量,这些不变量被编码为角子句的结合,同时还为不变量提供了模板。如果您看到下面的代码 sn-p,我首先从一个简单的示例开始。
x = 0;
while(x < 5){
x += 1
}
assert(x == 5)
这翻译成喇叭子句
x = 0 => Inv(x)
x Inv(x +1)
非(x x = 5
这里的不变量是 x
我为 a*x + b
但是,当我对其进行编码时,我总是感到不安。如果尝试断言 Not (x==5) 我得到 a=2 , b = 1/8 和 c = 2 这对我来说作为反例毫无意义。
我在下面提供我的代码,如果能帮助我纠正我的编码,我将不胜感激。
x = Real('x')
x_2 = Real('x_2')
a = Real('a')
b = Real('b')
c = Real('c')
s = Solver()
s.add(ForAll([x],And(
Implies(x == 0 , a*x + b <= c),
Implies(And(x_2 == x + 1, x < 5, a*x + b <= c), a*x_2 + b <= c),
Implies(And(a*x + b <= c, Not(x < 5)), x==5)
)))
if (s.check() == sat):
print(s.model())
编辑:它对我来说变得陌生。如果我删除 x_2 定义并在第二个 horn 子句中将 x_2 替换为 (x + 1) 并删除 x_2 = x_2 + 1,那么无论我写 Not(x==5) 还是 x==5,我都会感到不安在最后的号角子句中。
【问题讨论】:
-
我想我修好了。我将所有 Reals 更改为 Ints 并删除了 x_2 定义,如我的编辑中所述。突然它起作用了,我得到了 x
标签: logic z3 z3py logic-programming