使用z3证明布尔/算术公式的身份

时间:2015-02-02 14:33:27

标签: python z3 z3py

我正在尝试使用z3来证明以下身份:

  

x + y == x ^ y + 2 *(x& y)

也就是说,我们可以用布尔和算术指令的混合替换任何加法(例子来自第2.2章,Hacker's Delight)。

我正在使用以下z3 python片段:

from z3 import *

x = BitVec("x", 32)
y = BitVec("y", 32)

lhs = x ^ y + (2*(x&y))
rhs = x + y
s = Solver()
s.add(lhs != rhs)
print s.check()
print s.model()

然而,z3给了我这个:

  

     

[y = 1509949440,x = 1040187384]

所以我想我在某种程度上错误地使用了API。知道我的错误是什么吗?

1 个答案:

答案 0 :(得分:2)

显然这是^运算符优先级的问题。使用

lhs = (x ^ y) + (2*(x&y))

让这个例子适合我。