整数/ bv混合基准的健全性问题?

时间:2012-02-24 06:32:53

标签: 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 #x02) #b1 #b0)))
   (= s5 #b1))))
(check-sat)
(get-model)

在Mac上运行Z3 v3.2后,我得到:

sat
(model 
  ;; universe for (_ BitVec 8):
  ;;   bv!val!2 bv!val!3 bv!val!0 bv!val!1 
  ;; -----------
  ;; definitions for universe elements:
  (declare-fun bv!val!2 () (_ BitVec 8))
  (declare-fun bv!val!3 () (_ BitVec 8))
  (declare-fun bv!val!0 () (_ BitVec 8))
  (declare-fun bv!val!1 () (_ BitVec 8))
  ;; cardinality constraint:
  (forall ((x (_ BitVec 8)))
          (and (= x bv!val!2) (= x bv!val!3) (= x bv!val!0) (= x bv!val!1)))
  ;; -----------
  (define-fun s0 () Int
    (- 1))
  (define-fun table0 ((x!1 Int)) (_ BitVec 8)
    (ite (= x!1 0) bv!val!0
    (ite (= x!1 (- 1)) bv!val!3
      bv!val!0)))
)

其中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)))

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

1 个答案:

答案 0 :(得分:1)

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

(set-option :auto-config false)

这些错误已得到修复,修复程序将在下一版本中提供。