如果a1 == a + b
,则两个公式a1 == b
和a == 0
是等效的。我想用Z3 python找到这个必需条件(a == 0
)。我写了下面的代码:
from z3 import *
def equivalence(F, G):
s = Solver()
s.add(Not(F == G))
r = s.check()
if r == unsat:
print 'Equ'
print s.model()
else:
print 'Not Equ'
a, b = BitVecs('a b', 32)
g = True
tmp = BitVec('tmp', 32)
g = And(g, tmp == a)
tmp1 = BitVec('tmp1', 32)
g = And(g, tmp1 == b)
tmp2 = BitVec('tmp2', 32)
g = And(g, tmp2 == (tmp1 + tmp))
a1 = BitVec('a1', 32)
g = And(g, a1 == tmp2)
f = True
f = And(f, a1 == b)
equivalence(Exists([a], g), f)
但是,上面的代码总是返回"Not Equ"
作为输出。然后显然我无法将模型(a === 0
)作为"f"
和"g"
的条件相等。
有关代码错误的位置以及如何修复它的任何想法?非常感谢!
答案 0 :(得分:0)
帖子中的代码与提出的问题不符。 在smt-lib邮件列表上询问并回答了类似的问题。