我仍然是Z3的新手,并且有一个问题:是否可以使用Z3进行等效性检查?
如果可能的话,你能给我一个检查2个等价公式的例子吗?
感谢。
答案 0 :(得分:13)
是的,有可能。使用Z3可以实现许多目标。最简单的方法是使用Z3 Python API中的prove
过程。例如,假设我们要显示公式x >= 1 and x == 2*y
和x - 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
为真。
通常,任何可满足性检查器都可用于表明两个公式是等价的。
为了表明两个公式F
和G
使用Z3是等价的,我们表明F != G
是不可满足的(即,没有任何赋值/解释会使F
与G
)。
这就是在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())