我正在尝试使用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。知道我的错误是什么吗?
答案 0 :(得分:2)
显然这是^
运算符优先级的问题。使用
lhs = (x ^ y) + (2*(x&y))
让这个例子适合我。