我正在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,但不确定如何修复它)
答案 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'
此代码在眨眼间运行,但您的代码会使解算器超载并需要相对较长的时间才能完成。