在某些条件下证明2个等效的公式?

时间:2013-06-13 08:31:09

标签: z3 z3py

如果a1 == a + b,则两个公式a1 == ba == 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"的条件相等。

有关代码错误的位置以及如何修复它的任何想法?非常感谢!

1 个答案:

答案 0 :(得分:0)

帖子中的代码与提出的问题不符。 在smt-lib邮件列表上询问并回答了类似的问题。