Z3:可以把比特向量和实数相加吗?

Z3:可以把比特向量和实数相加吗?,z3,Z3,我用Z3py试着做一些关于舍入误差问题的实验,结果证明我必须总结出a位向量和a实向量。但是,当我尝试这样做时,会出现“排序不匹配”错误。这是我的代码: x = BitVecVal(8, 6) y = Real('y') solve(y + x == 5) 有没有办法将比特向量和实数相加?或者只是为了获取位向量的Int值?您可以将位向量值转换为带符号的long: x=BitVecVal(8,6) y=实('y') 解算(y+x.带符号长()=5) #[y=-3] 顺便说一句,我通过检查y发现

我用Z3py试着做一些关于舍入误差问题的实验,结果证明我必须总结出a位向量和a实向量。但是,当我尝试这样做时,会出现“排序不匹配”错误。这是我的代码:

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

solve(y + x == 5)

有没有办法将比特向量和实数相加?或者只是为了获取位向量的Int值?

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

x=BitVecVal(8,6)
y=实('y')
解算(y+x.带符号长()=5)
#[y=-3]

顺便说一句,我通过检查
y
发现
是有符号的
,就像Python中通常做的那样,也就是说,通过
print dir(y)
,可以将位向量值转换成有符号的long:

x=BitVecVal(8,6)
y=实('y')
解算(y+x.带符号长()=5)
#[y=-3]

顺便说一下,我通过检查
y
发现
是有符号的
,就像Python中通常做的那样,也就是说,通过
print dir(y)
,基于Z3C的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)

基于Z3C的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)

谢谢你的回复,我真的很感激。顺便说一下,as_signed_long方法仅适用于BitVecVal,而不适用于BitVec。如果我希望x是位向量而不是常数呢?有什么办法吗?对不起,我也不知道如何处理
BitVec
。谢谢您的回复,我非常感谢。顺便说一下,as_signed_long方法仅适用于BitVecVal,而不适用于BitVec。如果我希望x是位向量而不是常数呢?有什么办法吗?对不起,我也不知道如何处理BitVec。回答得好,谢谢你。我在文档中没有看到这一点。但是,此换行函数是否会影响解算器的性能?在您的示例中,
x
是一个值。因此不会对性能产生影响。Z3预处理器将
转换为_int(x)
为实数
2
。但是,如果
x
不是一个值,则会对性能产生严重影响。
to_int
将被“爆破”成一个大的
if-then-else
术语,该术语基于
x
的位“构建”一个整数。我们为每个位得到一个
if-then-else
项。有“更聪明”的方法来处理
到_int
,但Z3目前使用的是这种简单/幼稚的方法。回答得很好,谢谢你。我在文档中没有看到这一点。但是,此换行函数是否会影响解算器的性能?在您的示例中,
x
是一个值。因此不会对性能产生影响。Z3预处理器将
转换为_int(x)
为实数
2
。但是,如果
x
不是一个值,则会对性能产生严重影响。
to_int
将被“爆破”成一个大的
if-then-else
术语,该术语基于
x
的位“构建”一个整数。我们为每个位得到一个
if-then-else
项。有“更聪明”的方法来处理
到_int
,但Z3目前使用这种简单/幼稚的方法。