在SMT中表达不关心的位向量

时间:2018-06-01 11:40:35

标签: z3 smt bitvector

我想定义一个接受位向量的函数,如果某个位置的位满足某些值,则返回true。 例如:如果bitvector是1x00x01x,我需要返回true,其中x表示不关心。

我目前的实施是:

(define-fun function_i ((i (_ BitVec 8))) Bool
    (and true
        (= #b1 ((_ extract 1 1) i))
        (= #b0 ((_ extract 2 2) i))
        (= #b0 ((_ extract 4 4) i))
        (= #b0 ((_ extract 5 5) i))
        (= #b1 ((_ extract 7 7) i))
    )
)

这是一个变量,可能有许多变量具有32个大小的位向量。我担心这种实现会减慢z3的速度。提取函数会降低求解器的速度吗?有没有更好的方法来实现这个?

1 个答案:

答案 0 :(得分:2)

没关系。更紧凑的方式是(i& 1101)== 1000(强制第一位,第二位0和最后一位,第三位可以是0或1)