Z3:有可能总结BitVec和Real吗?

时间:2013-05-10 06:46:44

标签: z3

我正在使用Z3py尝试对舍入错误问题进行一些实验,事实证明我必须总结一个BitVec和一个Real。但是,当我尝试这样做时,我会收到“排序不匹配”错误。这是我的代码:

x = BitVecVal(8, 6)
y = Real('y')

solve(y + x == 5)

有没有办法对BitVec和Real进行求和?或者只是获取BitVec的Int值?

2 个答案:

答案 0 :(得分:3)

您可以将位向量值转换为带符号的long:

x = BitVecVal(8, 6)
y = Real('y')

solve(y + x.as_signed_long() == 5)
# [y = -3]

顺便说一下,我通过检查as_signed_long找到了y,就像在Python中一样,即print dir(y)

答案 1 :(得分:3)

基于Z3 C的API确实包含从位向量到数字(整数)的转换函数,并且整数可以被强制转换为实数。 但是,python API不直接公开相关函数,但你可以将其包装起来:

x = BitVecVal(2,8)
y = Real('y')


def to_int(x):
    return ArithRef(Z3_mk_bv2int(x.ctx_ref(), x.as_ast(), 0), x.ctx)

print solve(to_int(x) + y == 5)