已签名的部门在 z3py 中不起作用

Signed division not working in z3py

我正在尝试使用 z3py。我遇到了一个奇怪的问题。我读到操作 / 在 z3py 中被视为位向量的有符号除法。我试图给出以下命令:

a = z3.BitVec('a',2)

b = z3.BitVec('b',2)

solver = z3.Solver()

solver.add((a + b)/2 == 3)

solver.check()

z3给出的结果是unsat

在我看来这是不正确的,因为它有解 a = 2, b = 0a = 2 在 2 的补码中表示 a = -2,所以 (a+b)/2 必须等于 -13 签名表示。

谁能帮我看看这里出了什么问题?

我终于自己找到了解决方案!

问题出在表达式 (a+b)/2 中。这里 ab 是大小为 2 的位向量。因此表达式的分母 2 也被 z3 视为 2 位位向量。所以分母中的2实际上是-2。因此我试图解决的约束是 (a+b)/(-2) == -1 这实际上是 unsat.