z3模型中数组项的值

z3模型中数组项的值,z3,Z3,我正在使用z3进行研究,我有以下问题。我正在分析一个包含数组和未解释函数的可满足公式的模型。我想检查特定的数组条目 在z3指南的示例中,可以访问这些值。 例如,对于以下问题: (get-value ((select my_array 0))) 一个人得到的答案是 (((select my_array 0) 1)) 指示位置0处的my_数组的值为1 然而,我得到的答案是 (((select my_array 0) (select Array!val!0 0))) 这一点帮助都不大 此外,在

我正在使用z3进行研究,我有以下问题。我正在分析一个包含数组和未解释函数的可满足公式的模型。我想检查特定的数组条目

在z3指南的示例中,可以访问这些值。
例如,对于以下问题:

(get-value ((select my_array 0)))
一个人得到的答案是

(((select my_array 0) 1)) 
指示位置
0
处的
my_数组的值为
1

然而,我得到的答案是

(((select my_array 0) (select Array!val!0 0)))
这一点帮助都不大

此外,在模型的开头,我得到一个块,它看起来像这样:

  ;; universe for (Array Int Int):
  ;;   Array!val!10 Array!val!6 Array!val!0 Array!val!5 Array!val!9 Array!val!1 Array!val!11 Array!val!4 Array!val!2 Array!val!7 Array!val!3 Array!val!8 
  ;; -----------
  ;; definitions for universe elements:
  (declare-fun Array!val!10 () (Array Int Int))
  (declare-fun Array!val!6 () (Array Int Int))
  (declare-fun Array!val!0 () (Array Int Int))
  (declare-fun Array!val!5 () (Array Int Int))
  (declare-fun Array!val!9 () (Array Int Int))
  (declare-fun Array!val!1 () (Array Int Int))
  (declare-fun Array!val!11 () (Array Int Int))
  (declare-fun Array!val!4 () (Array Int Int))
  (declare-fun Array!val!2 () (Array Int Int))
  (declare-fun Array!val!7 () (Array Int Int))
  (declare-fun Array!val!3 () (Array Int Int))
  (declare-fun Array!val!8 () (Array Int Int))
  ;; cardinality constraint:
  (forall ((x (Array Int Int)))
          (and (= x Array!val!10)
               (= x Array!val!6)
               (= x Array!val!0)
               (= x Array!val!5)
               (= x Array!val!9)
               (= x Array!val!1)
               (= x Array!val!11)
               (= x Array!val!4)
               (= x Array!val!2)
               (= x Array!val!7)
               (= x Array!val!3)
               (= x Array!val!8)))
  ;; -----------
我真的不明白这是什么意思,但不知怎么的,这似乎与我的问题有关,因为指南中的简单示例没有出现类似的块。有人知道是什么触发了z3的这种行为,或者如何避免这种行为吗

经过一些实验,我发现了一个“最小”的例子,展示了不希望出现的行为。这似乎与在索引表达式中使用未解释的函数有关

(declare-fun my_function ((Int)(Int)) Int)
(declare-fun my_array () (Array Int Int))

(assert
  (=
    (select my_array (my_function 0 1))
    (select my_array (my_function 1 0))
  )
)

(check-sat)  
(get-model)
(get-value ((select my_array (my_function 0 1))))
(get-value ((my_function 0 1)))
z3对此的回应是:

sat 
(model
 ;; universe for (Array Int Int):
 ;; Array!val!0
 ;; -----------
 ;; definitions for universe elements:
 (declare-fun Array!val!0 () (Array Int Int))
 ;; cardinality constraint:
 (forall ((x (Array Int Int))) (= x Array!val!0))
 ;; -----------
 (define-fun my_array () (Array Int Int)
 Array!val!0)
 (define-fun my_function ((x!1 Int) (x!2 Int)) Int
 (ite (and (= x!1 0) (= x!2 1)) 2
 (ite (and (= x!1 1) (= x!2 0)) 3
 2)))
 )
 (((select my_array (my_function 0 1)) (select Array!val!0 2)))
 (((my_function 0 1) 2))
在SMT中,“逻辑”指定哪些理论可用于构造公式。例如,如果使用命令
(set logic QF_UFLIA)
,则可以使用未解释的函数和线性整数算法。未使用命令
设置逻辑时。Z3试图为用户自动猜测逻辑,并且只“安装”必要的理论。在您的示例中,Z3错误地猜测您的示例不需要数组理论。因此,
(Array Int)
被视为未解释的排序。 这就是为什么Z3假设(Array Int)是一个未解释的排序,并在生成的模型中为其提供解释。这是一个bug,我将在下一版本中修复它。 同时,您可以使用以下方法之一来避免此错误:

  • 指定包含数组理论的逻辑。示例:在示例开头添加
    (设置逻辑QF_AUFLIA)

  • 禁用自动配置(Z3将安装所有可用理论)。添加命令
    (设置选项:自动配置错误)