Z3 用don'表示位向量;SMT中的t-care

Z3 用don'表示位向量;SMT中的t-care,z3,smt,bitvector,Z3,Smt,Bitvector,我想定义一个函数,它接受位向量,如果某个位置的位满足某些值,则返回true。 如果位向量是1x00x01x,其中x表示不关心,我需要返回true 我目前的建议是: (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))

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

我目前的建议是:

(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的速度。提取功能是否会降低解算器的速度?有没有更好的方法来实现这一点?

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