Z3 Python:For All导致我的代码挂断,或返回Unsat,为什么?

时间:2013-06-19 04:48:21

标签: z3 z3py

我仍在努力解决查找a值的问题,以便a * b == b的所有值都为b。预期结果为a == 1。我有以下两种解决方案。

(A)我在下面的代码中用ForAll量词实现了这个(如果有一个没有使用任何量词的解决方案,请纠正我)。我们的想法是证明fg是等价的。

from z3 import *

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

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

g= True
g = And(g, a1 == b)

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

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

然而,这个简单的代码永远运行而不会返回结果。我认为那是因为ForAll。关于如何解决问题的任何想法?

(B)我再次尝试使用其他版本。这次我不证明两个公式是等价的,但是把它们全部放在一个公式中f逻辑上,我认为这是真的,但如果我错了,请纠正我:

from z3 import *

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

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

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

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

这次代码没有挂起,但会立即返回'Unsat'。关于如何解决这个问题的任何想法?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您的问题的直接表述提供了您期望的答案:http://rise4fun.com/Z3Py/N07sW

您建议的版本使用辅助变量a1,tmp,tmp1和您 对这些变量使用通用量化。这不符合 你想要的公式。