Z3 整数/bv混合基准的可靠性问题?

Z3 整数/bv混合基准的可靠性问题?,z3,Z3,我有以下SMT-Lib2脚本: (set-option :produce-models true) (declare-fun s0 () Int) (declare-fun table0 (Int) (_ BitVec 8)) (assert (= (table0 0) #x00)) (assert (let ((s3 (ite (or (< s0 0) (<= 1 s0)) #x01 (table0 s0)))) (let ((s5 (ite (bvuge s3 #x0

我有以下SMT-Lib2脚本:

(set-option :produce-models true)
(declare-fun s0 () Int)
(declare-fun table0 (Int) (_ BitVec 8))
(assert (= (table0 0) #x00))
(assert
   (let ((s3 (ite (or (< s0 0) (<= 1 s0)) #x01 (table0 s0))))
   (let ((s5 (ite (bvuge s3 #x02) #b1 #b0)))
   (= s5 #b1))))
(check-sat)
(get-model)
说明s0=-1是一个模型。然而,对于s0=-1,我们有s3=1和s5=#b0,这使得断言是错误的。事实上,我很确定所述基准是不可满足的

我在Z3输出中注意到的一点是它给出的基数约束的量化公式。它说:

  ;; cardinality constraint:
  (forall ((x (_ BitVec 8)))
          (and (= x bv!val!2) (= x bv!val!3) (= x bv!val!0) (= x bv!val!1)))

这个断言是一个连接词,听起来很奇怪;这不应该是一种分离吗?我不确定这是否是问题的根本原因,但听起来确实可疑。

Z3中有两个问题。 首先,你是对的,模型打印机有一个输入错误。它应该是“或”而不是“和”。第二个问题是Z3没有安装位向量理论,并将
(\uBitvec 8)
视为一种未解释的排序。这是用于确定问题所在逻辑的预处理器中的一个bug。您可以通过在文件开头添加以下命令来解决此错误:

(set-option :auto-config false)

这些bug已经修复,下一个版本中将提供修复。

Z3中有两个问题。 首先,你是对的,模型打印机有一个输入错误。它应该是“或”而不是“和”。第二个问题是Z3没有安装位向量理论,并将
(\uBitvec 8)
视为一种未解释的排序。这是用于确定问题所在逻辑的预处理器中的一个bug。您可以通过在文件开头添加以下命令来解决此错误:

(set-option :auto-config false)
这些bug已经被修复,并且将在下一版本中提供修复