使用Z3,Z3py对并入的BitVec的结果不正确

时间:2015-08-07 11:19:14

标签: sum z3 z3py bitvector

我使用以下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的回答。这是一个快速解决方法:

  • 提取物(3,3,x) - > ZeroExt(SZ,Extract(3,3,x))其中SZ是RHS的位宽减去1.

1 个答案:

答案 0 :(得分:0)

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

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

此示例的问题是位向量的宽度。 xy都是4位变量,4位向量的数字160(模2 ^ 4),所以确实是{{当x + y16时,1}}等于x=0

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