Python z3可变类型开关

Python z3可变类型开关,python,python-3.x,z3,z3py,Python,Python 3.x,Z3,Z3py,在使用Z3时,我发现了变量改变类型时的问题。我已经能够得到Int来很好地玩Real。我还将Int转换为BitVec并返回。然而,似乎一旦我达到在Int和BitVec之间转换的阈值,z3解算器就会偏离轨道,不再返回 我的解算器状态示例如下所示: [271733878 == a, 562383102 == b, 4023233417 == c, 1732584193 == d, e == BV2Int(int2bv(d) ^ int2bv(BV2Int(int2bv(b) &

在使用Z3时,我发现了变量改变类型时的问题。我已经能够得到
Int
来很好地玩
Real
。我还将
Int
转换为
BitVec
并返回。然而,似乎一旦我达到在
Int
BitVec
之间转换的阈值,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来补救?

对于int2bv和bv2int转换没有特别的调整,因此您通常会使用回退机制,即位爆炸,然后进行位向量和算术推理的精细组合。我建议您尝试延迟从位向量到整数的转换,直到前端的最后手段。在本例中,没有特别的理由继续将中间位向量转换为整数。Z3没有检测到这种冗余。它还必须考虑到整数到位向量的转换可能会有损,因为它是按位宽度模转换的。

感谢您的反馈。如你所说,我一定会推迟转换。然而,我也确实希望在某个时候会在这些转换上投入更多的精力,因为我觉得未来可能会更多地利用更有效的转换方法(甚至是两者之间的隐式转换)。只是出于兴趣,您是否有一个应用程序实际上需要在两种理论之间进行转换,或者您是否只是为了方便而在它们之间进行转换,并且所有操作都可以仅在其中一种理论中完成?