Z3Python:ForAll导致我的代码挂起,或者返回Unsat,为什么?
我仍然在努力解决查找Z3Python:ForAll导致我的代码挂起,或者返回Unsat,为什么?,z3,z3py,Z3,Z3py,我仍然在努力解决查找a值的问题,以便a*b==b具有b的所有值。预期结果是a==1。下面我有两个解决方案 (A)我使用下面代码中的所有量词实现了这一点(如果有不使用任何量词的解决方案,请更正我)。这个想法是为了证明f和g是等价的。 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 =
a
值的问题,以便a*b==b
具有b
的所有值。预期结果是a==1
。下面我有两个解决方案
(A)我使用下面代码中的所有量词实现了这一点(如果有不使用任何量词的解决方案,请更正我)。这个想法是为了证明f
和g
是等价的。
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'
然而,这个简单的代码永远不会返回结果。我想这是因为所有的。你知道怎么解决这个问题吗
(B)我用另一个版本再试了一次。这次我没有证明两个公式是等价的,而是把它们都放在一个公式中,逻辑上,我认为这是正确的,但如果我在这里错了,请纠正我:
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”。你知道怎么解决这个问题吗
非常感谢。您问题的直接表述提供了您期望的答案: 您建议的版本使用辅助变量a1、tmp、tmp1和您 对这些变量使用通用量化。这是不相符的
你想要的配方 尼古拉,实际上我要解决的问题不是简单的公式“a*b==b”,而是属于一个更广泛的问题。事实上,我要求解的公式总是有那些辅助变量(a1、tmp等)。请问,您对修改原代码(A)和(B)有什么建议吗?