【问题标题】:Incorrect result of sum int-casted BitVec using Z3, Z3py使用 Z3、Z3py 的 sum int-casted BitVec 结果不正确
【发布时间】:2015-08-07 11:19:14
【问题描述】:

我正在使用以下 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。

【问题讨论】:

    标签: sum z3 z3py bitvector


    【解决方案1】:

    (旁白:auto-cfgig 应该是自动配置。)

    请注意,bv2int 和 int2bv 本质上被视为未解释,因此如果这部分对您的问题至关重要,请不要使用它们(请参阅 documentationprevious questions)。

    这个例子的问题是位向量的宽度。 xy 都是 4 位变量,作为 4 位向量的数字 160(模 2^4),所以,确实 x + y 等于 16x=0y=0

    此外,Extract(...) 项提取 1 位向量,这意味着和 Ex.. + Ex.. 再次是 1 位值,而数字 2 作为 1 位向量是 0(模 2 ^1),即Ex... + Ex... = 2确实是这样。

    【讨论】:

    • 非常感谢!克里斯托弗。那么第二种情况类似吗?那就是我们提取了 1 位。用 BV2Int 结束后,我们得到一个 1 位整数,所以我们仍然需要将 RHS 切分成为 1 位整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多