在Z3中的索引i处设置位

在Z3中的索引i处设置位,z3,Z3,我试图在z3中的位向量中的特定索引处设置一个位 目前,我使用bit-wise或来实现这一点。我使用的是大位向量(超过1000位),我相信这会导致解算器花费大量时间。我希望他们的方法能够更快地在位向量中设置任意位(类似于数组使用的存储) 有没有更好的方法来实现这一点,或者我只是在使用逐位或?我不确定它是否会更快,但您始终可以这样执行断言: (assert (= ((_ extract i i) bv) #b1)) 告诉解算器ibv的第th位高。当然,这在您的特定应用程序中是否可用取决于这些新表达

我试图在z3中的位向量中的特定索引处设置一个位

目前,我使用bit-wise或来实现这一点。我使用的是大位向量(超过1000位),我相信这会导致解算器花费大量时间。我希望他们的方法能够更快地在位向量中设置任意位(类似于数组使用的存储)


有没有更好的方法来实现这一点,或者我只是在使用逐位或?

我不确定它是否会更快,但您始终可以这样执行断言:

(assert (= ((_ extract i i) bv) #b1))

告诉解算器
i
bv的第th位高。当然,这在您的特定应用程序中是否可用取决于这些新表达式的传递方式。如果这个技巧对您不起作用,我认为您只能使用按位or。

此外,对于位向量,可以使用提取和串联的组合,从旧的位向量中形成新的位向量。比如说

   (concat ((_ extract n-1 k+1) x) y ((_ extract k-1 0) x))
其中,y是长度为1的位向量,应具有形成等于x的位向量的效果,但位置k除外,其由y定义