z3变量类型切换

时间:2016-03-15 03:31:37

标签: python python-3.x z3 z3py

在玩Z3时,我发现变量更改类型时出现问题。我能够IntReal玩得很开心。我还得Int转换为BitVec并返回。但是,一旦我达到IntBitVec之间的转换阈值,z3解算器就会离开轨道并且不会返回。

我的求解器状态的一个例子如下:

[271733878 == a,
562383102 == b,
4023233417 == c,
1732584193 == d,
e ==
BV2Int(int2bv(d) ^
    int2bv(BV2Int(int2bv(b) &
                  int2bv(BV2Int(int2bv(c) ^
                                int2bv(a)))))),
f == e,
305419896 == g]

实际上工作正常。但是,如果我再做一次int2bv转换,Z3永远不会返回,我必须杀死python。同样,这些变量的问题实际上是非常不稳定的,只要它们可能采用什么类型。我曾经考虑过只使用BitVec,但如果我想一起添加BitVec和Real,会导致问题。

我是否尝试将Z3用于不适用的东西?有没有办法用Z3来挽救这类问题?

1 个答案:

答案 0 :(得分:1)

对于int2bv和bv2int转换没有特别的调整,因此你经常会留下bit-blasts的回退机制,然后进行精确的位向量和算术推理组合。我建议您尝试将转换从位向量延迟到整数,直到前端的最后手段。在该示例中,没有特别的理由继续将中间位向量转换为整数。 Z3未检测到此冗余。它还必须考虑到整数到位向量转换可能是有损的,因为它是模宽位宽。