使用 Z3、Z3py 的 sum int-casted BitVec 结果不正确
Incorrect result of sum int-casted BitVec using Z3, Z3py
我正在使用以下 python 代码来查找两个二进制数:
- 总和到一定数
- 转换为整数的最高位总和必须为 2
第二个约束对我来说更重要;在我的例子中,它会扩展:假设它可能变成 [N] 个数字的最高位总和必须达到 [M].
我不确定为什么 z3 没有给出正确的结果。有什么提示吗?非常感谢。
def BV2Int(var):
return ArithRef(Z3_mk_bv2int(ctx.ref(), var.as_ast(), 0), var.ctx)
def main():
s = Solver()
s.set(':models', True)
s.set(':auto-cfgig', False)
s.set(':smt.bv.enable_int2bv',True)
x = BitVec('x',4)
y = BitVec('y',4)
s = Solver()
s.add(x+y == 16, Extract(3,3,x) + Extract(3,3,y) == 2)
s.check()
print s.model()
# result: [y = 0, x = 0], fail both constraint
s = Solver()
s.add(x+y == 16, BV2Int(Extract(3,3,x)) + BV2Int(Extract(3,3,y)) == 2)
s.check()
print s.model()
# result: [y = 15, x = 1], fail the second constraint
更新: 感谢 Christoph 的回答。这是一个快速修复:
- Extract(3,3,x) -> ZeroExt(SZ, Extract(3,3,x)) 其中 SZ 是 RHS 的位宽减 1。
(旁白:auto-cfgig 应该是自动配置的。)
请注意,bv2int 和 int2bv 基本上被视为未解释,因此如果这部分对您的问题至关重要,则不要使用它们(请参阅 documentation and )。
这个例子的问题是位向量的宽度。 x
和y
都是4位变量,数字16
作为4位向量是0
(模2^4),所以,确实[=当 x=0
和 y=0
.
时,14=] 等于 16
此外,Extract(...)
项提取 1 位向量,这意味着和 Ex.. + Ex..
再次是 1 位值,数字 2
是 1 位向量是 0
(模 2^1),即 Ex... + Ex... = 2
.
确实如此
我正在使用以下 python 代码来查找两个二进制数:
- 总和到一定数
- 转换为整数的最高位总和必须为 2
第二个约束对我来说更重要;在我的例子中,它会扩展:假设它可能变成 [N] 个数字的最高位总和必须达到 [M].
我不确定为什么 z3 没有给出正确的结果。有什么提示吗?非常感谢。
def BV2Int(var):
return ArithRef(Z3_mk_bv2int(ctx.ref(), var.as_ast(), 0), var.ctx)
def main():
s = Solver()
s.set(':models', True)
s.set(':auto-cfgig', False)
s.set(':smt.bv.enable_int2bv',True)
x = BitVec('x',4)
y = BitVec('y',4)
s = Solver()
s.add(x+y == 16, Extract(3,3,x) + Extract(3,3,y) == 2)
s.check()
print s.model()
# result: [y = 0, x = 0], fail both constraint
s = Solver()
s.add(x+y == 16, BV2Int(Extract(3,3,x)) + BV2Int(Extract(3,3,y)) == 2)
s.check()
print s.model()
# result: [y = 15, x = 1], fail the second constraint
更新: 感谢 Christoph 的回答。这是一个快速修复:
- Extract(3,3,x) -> ZeroExt(SZ, Extract(3,3,x)) 其中 SZ 是 RHS 的位宽减 1。
(旁白:auto-cfgig 应该是自动配置的。)
请注意,bv2int 和 int2bv 基本上被视为未解释,因此如果这部分对您的问题至关重要,则不要使用它们(请参阅 documentation and
这个例子的问题是位向量的宽度。 x
和y
都是4位变量,数字16
作为4位向量是0
(模2^4),所以,确实[=当 x=0
和 y=0
.
16
此外,Extract(...)
项提取 1 位向量,这意味着和 Ex.. + Ex..
再次是 1 位值,数字 2
是 1 位向量是 0
(模 2^1),即 Ex... + Ex... = 2
.