用Z3进行等价检查

时间:2012-12-18 09:37:02

标签: z3

我仍然是Z3的新手,并且有一个问题:是否可以使用Z3进行等效性检查?

如果可能的话,你能给我一个检查2个等价公式的例子吗?

感谢。

1 个答案:

答案 0 :(得分:13)

是的,有可能。使用Z3可以实现许多目标。最简单的方法是使用Z3 Python API中的prove过程。例如,假设我们要显示公式x >= 1 and x == 2*yx - 2*y == 0, x >= 2是等价的。我们可以使用以下Python程序(您可以在rise4fun在线试用)。

x, y = Ints('x y')
F = And(x >= 1, x == 2*y)
G = And(2*y - x == 0, x >= 2)
prove(F == G)

我们还可以证明两个公式是等价的一些边条件。 例如,对于位向量(即机器整数),如果x / 2,则x >> 1相当于x >= 0 (也可用online)。

x = BitVec('x', 32)
prove(Implies(x >= 0, x / 2 == x >> 1))

请注意,x / 2不等同于x >> 1。如果我们试图证明它,Z3将产生一个反例。

x = BitVec('x', 32)
prove(x / 2 == x >> 1)
>> counterexample
>> [x = 4294967295]

Z3 Python tutorial包含一个更复杂的示例:当且仅当x != 0 and x & (x - 1) == 0是2的幂时,它显示x为真。

通常,任何可满足性检查器都可用于表明两个公式是等价的。 为了表明两个公式FG使用Z3是等价的,我们表明F != G是不可满足的(即,没有任何赋值/解释会使FG)。 这就是在Z3 Python API中实现prove命令的方式。以下是基于Solver API的脚本:

s = Solver()
s.add(Not(F == G))
r = s.check()
if r == unsat:
    print("proved")
else:
    print("counterexample")
    print(s.model())