在 SMT 中表达不关心的位向量
Expressing bitvectors with don't care in SMT
我想定义一个接受位向量的函数,如果特定位置的位满足某些值,returns 为真。
例如:如果 bitvector 是 1x00x01x,我需要 return 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.提取函数会减慢求解器的速度吗?有没有更好的方法来实现这个?
没关系。更紧凑的方式是 (i & 1101) == 1000(强制第一位 1、第二位 0 和最后 0、第三位可以是 0 或 1)
我想定义一个接受位向量的函数,如果特定位置的位满足某些值,returns 为真。 例如:如果 bitvector 是 1x00x01x,我需要 return 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.提取函数会减慢求解器的速度吗?有没有更好的方法来实现这个?
没关系。更紧凑的方式是 (i & 1101) == 1000(强制第一位 1、第二位 0 和最后 0、第三位可以是 0 或 1)