我正在尝试在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,但不确定如何修复)
您对此有何看法:
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
您对此有何看法:
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
您正在让Z3(除其他事项外)找到一个a1,它对于b的所有值都等于b。这是不可能的。您的问题不是Z3,而是基本逻辑。
如果仅想验证所有可能的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'
此代码眨眼间即可运行,但是您的代码使求解器超载,并且需要相对较长的时间才能完成。