我发布了related question,但后来我觉得不太清楚。我想改写这样的问题:
如果a1 == a + b
,则两个公式a1 == b
(1)和a == 0
(2)是等效的。给定这些公式(1)和(2),我如何使用Z3 python来找出这个必需条件(a == 0
),以便上面的公式变得相同?
我认为a1
,a
和b
的格式均为BitVecs(32)
。
编辑:我想出了这样的代码:
from z3 import *
a, b = BitVecs('a b', 32)
a1 = BitVec('a1', 32)
s = Solver()
s.add(ForAll(b, a + b == b))
if s.check() == sat:
print 'a =', s.model()[a]
else:
print 'Not Equ'
输出为:a = 0
,正如所料。
然而,当我修改代码以使用两个公式时,它不再起作用了:
from z3 import *
a, b = BitVecs('a b', 32)
a1 = BitVec('a1', 32)
f = True
f = And(f, a1 == a * b)
g = True
g = And(g, a1 == b)
s = Solver()
s.add(ForAll(b, f == g))
if s.check() == sat:
print 'a =', s.model()[a]
else:
print 'Not Equ'
现在输出不同:a = 1314914305
所以问题是:
(1)为什么第二个代码产生不同的(错误的)结果?
(2)如果不使用ForAll(或量词),有没有办法做到这一点?
由于
答案 0 :(得分:0)
这两个代码产生相同的正确答案a = 0.你有一个错字:你在写 a1 = a * b,必须是a1 = a + b。你同意吗?
不使用ForAll的可能代码:
a, b = BitVecs('a b', 32)
a1 = BitVec('a1', 32)
s = Solver()
s.add(a + b == b)
if s.check() == sat:
print 'a =', s.model()[a]
else:
print 'Not Equ'
s1 = Solver()
s1.add(a==0, Not(a + b == b))
print s1.check()
输出:
a = 0
unsat