用Z3进行等价性检验

用Z3进行等价性检验,z3,Z3,我对Z3还是新手,有一个问题:是否可以使用Z3进行等价性检查 如果可能的话,你能给我举一个例子来检查两个公式的等价性吗 谢谢。是的,这是可能的。使用Z3有很多方法可以实现这一点。最简单的方法是在中使用过程prove。例如,假设我们想证明公式x>=1和x==2*y和x-2*y==0,x>=2是等价的。我们可以使用下面的Python程序来实现这一点(您可以在上在线尝试) x,y=Ints('xy') F=和(x>=1,x==2*y) G=和(2*y-x==0,x>=2) 证明(F==G) 我们还可

我对Z3还是新手,有一个问题:是否可以使用Z3进行等价性检查

如果可能的话,你能给我举一个例子来检查两个公式的等价性吗


谢谢。

是的,这是可能的。使用Z3有很多方法可以实现这一点。最简单的方法是在中使用过程
prove
。例如,假设我们想证明公式
x>=1和x==2*y
x-2*y==0,x>=2
是等价的。我们可以使用下面的Python程序来实现这一点(您可以在上在线尝试)

x,y=Ints('xy')
F=和(x>=1,x==2*y)
G=和(2*y-x==0,x>=2)
证明(F==G)
我们还可以证明这两个公式在某些边条件下是等价的。 例如,对于位向量(即机器整数),
x/2
相当于
x>>1
,如果
x>=0
(也可提供)

x=BitVec('x',32)
证明(意味着(x>=0,x/2==x>>1))
请注意,
x/2
并不等同于
x>>1
。如果我们试图证明它,Z3将产生一个反例

x=BitVec('x',32)
证明(x/2==x>>1)
>>反例
>>[x=4294967295]
包含一个更复杂的示例:它显示
x!=0和x&(x-1)=0
为真当且仅当
x
为二的幂时

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

s=Solver()
s、 加(非(F==G))
r=s.检查()
如果r==unsat:
打印(“证明”)
其他:
打印(“反例”)
打印(s.model())

@LeonardodeMoura到Rise4fun的链接不起作用。他们取消服务了吗?