Z3 存在数组时Bizzare位向量查询的慢度

Z3 存在数组时Bizzare位向量查询的慢度,z3,Z3,使用以下查询以奇怪的行为运行: (declare-const M1 (Array Int Int)) (declare-const M2 (Array Int Int)) ; Unrelated assertion. Comment it out, and the query returns unsat instantly. (assert (= M1 M2)) (declare-const CB32 (_ BitVec 32)) (declare-const CA32 (_ BitVec

使用以下查询以奇怪的行为运行:

(declare-const M1 (Array Int Int))
(declare-const M2 (Array Int Int))

; Unrelated assertion. Comment it out, and the query returns unsat instantly.
(assert (= M1 M2)) 

(declare-const CB32 (_ BitVec 32))
(declare-const CA32 (_ BitVec 32))

(declare-const CA16 (_ BitVec 16))
(declare-const CB16 (_ BitVec 16))
(declare-const VA16 (_ BitVec 16))
(declare-const VB16 (_ BitVec 16))

(assert (= CA16 VA16))
(assert (= CB16 VB16))
(assert (= CA32 ((_ sign_extend 16) CA16)))
(assert (= CB32 ((_ sign_extend 16) CB16)))

(assert (not (= ((_ extract 15 0) (bvmul CA32 CB32)) (bvmul VA16 VB16))))
(check-sat)
如果对第一个断言进行注释,查询将立即返回unsat。如果你把它放在里面,它至少跑了10个小时才被我杀死。令人费解的是,被注释掉的断言甚至与不可满足谓词无关,也与任何其他谓词无关,并且基本上是可满足的。有什么帮助吗


谢谢

Z3在这些情况下使用两种不同的发动机: 对于只使用位向量的公式,它使用了更高效的引擎。 对于混合了多种理论的公式,它使用了一个通用引擎,该引擎对位向量约束的效率较低