找出2个公式的逻辑条件是否相同?

时间:2013-06-14 16:05:12

标签: z3 z3py

我发布了related question,但后来我觉得不太清楚。我想改写这样的问题:

如果a1 == a + b,则两个公式a1 == b(1)和a == 0(2)是等效的。给定这些公式(1)和(2),我如何使用Z3 python来找出这个必需条件(a == 0),以便上面的公式变得相同?

我认为a1ab的格式均为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(或量词),有没有办法做到这一点?

由于

1 个答案:

答案 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