已签名的部门在 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 = 0
,a = 2
在 2 的补码中表示 a = -2
,所以 (a+b)/2
必须等于 -1
即 3
签名表示。
谁能帮我看看这里出了什么问题?
我终于自己找到了解决方案!
问题出在表达式 (a+b)/2
中。这里 a
和 b
是大小为 2 的位向量。因此表达式的分母 2
也被 z3 视为 2 位位向量。所以分母中的2
实际上是-2
。因此我试图解决的约束是 (a+b)/(-2) == -1
这实际上是 unsat
.
我正在尝试使用 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 = 0
,a = 2
在 2 的补码中表示 a = -2
,所以 (a+b)/2
必须等于 -1
即 3
签名表示。
谁能帮我看看这里出了什么问题?
我终于自己找到了解决方案!
问题出在表达式 (a+b)/2
中。这里 a
和 b
是大小为 2 的位向量。因此表达式的分母 2
也被 z3 视为 2 位位向量。所以分母中的2
实际上是-2
。因此我试图解决的约束是 (a+b)/(-2) == -1
这实际上是 unsat
.