Z3 Python:代码用ForAll产生错误的结果,为什么?

时间:2013-06-15 16:11:34

标签: python z3 z3py

我正在ForAll上使用b量词,因此每个a * b == b的公式b会给我a == 1作为结果。我在下面的代码中实现了这个(Z3 python):

from z3 import *

a, b, a1 = BitVecs('a b a1', 32)

f = True
f = And(f, a1 == a * b)
f = And(f, a1 == b)

s = Solver()
s.add(ForAll(b, f))

if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Unsat'

我希望Z3在输出中给我a = 1,但我得到了Unsat。知道问题出在哪里?

(我怀疑我没有正确使用ForAll,但不确定如何修复它)

4 个答案:

答案 0 :(得分:1)

您如何看待这个:

a, b, a1 = BitVecs('a b a1', 32)

f = True
f = And(f, a1 == a * b)
g= True
g = And(f, a1 == b)

s = Solver()
s.add(ForAll(b, ForAll(a1,f == g)))

if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Unsat

输出:

a = 1

其他形式:

a, b, a1 = BitVecs('a b a1', 32)

f = True
f = And(f, a1 == a * b)
g= True
g = And(g, a1 == b)

s = Solver()
s.add(ForAll(b, ForAll(a1,f == g)))

if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Unsat'

输出:

a = 1

答案 1 :(得分:0)

您如何看待这个:

a, b = BitVecs('a b', 32)

a1 = a*b
a2 = b


s = Solver()
s.add(ForAll(b, a1 == a2))

if s.check() == sat:
     print 'a =', s.model()[a]
else:
     print 'Unsat'

输出:

a = 1

其他方式:

a, b = BitVecs('a b', 32)
a1 = a*b
a2 = b
f = True
f = And(f, a1 == a2)


s = Solver()
s.add(ForAll(b, f))

if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Unsat'

输出:

a = 1

答案 2 :(得分:0)

您要求Z3(以及其他内容)为 b 的所有值找到等于 b 的单个 a1 。这是不可能的。你的问题不是Z3,而是基本逻辑。

答案 3 :(得分:0)

如果您只想验证所有可能a * b == b的公式b。您可以使用以下代码。

from z3 import *

a, b = BitVecs('a b', 32)
s = Solver()
s.add(ForAll(b, a * b == b))

if s.check() == sat:
    print 'a =', s.model()[a]
else:
    print 'Unsat'

此代码在眨眼间运行,但您的代码会使解算器超载并需要相对较长的时间才能完成。