我正在使用z3进行研究,我遇到了以下问题。我正在分析一个包含数组和未解释函数的可满足公式的模型。我想检查特定的数组条目。
在z3指南的示例中,可以访问这些值 例如,对于像
这样的问题(get-value ((select my_array 0)))
得到像
这样的答案(((select my_array 0) 1))
表示位置my_array
的{{1}}值为0
。
然而,我得到的答案似乎是
1
这根本不是很有帮助。
此外,在模型的开头,我得到一个看起来像这样的块:
(((select my_array 0) (select Array!val!0 0)))
我真的不明白这个的含义,但不知怎的,这似乎与我的问题有关,因为类似的块不出现在指南中的简单示例。有谁知道是什么触发了z3的这种行为或者如何避免它?
经过一些实验,我发现了一个表现出不良行为的“最小”例子。它似乎与在索引表达式中使用未解释的函数有关。
;; 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)))
答案 0 :(得分:3)
在SMT中,“逻辑”指定哪些理论可用于构建公式。例如,如果使用命令(set-logic QF_UFLIA)
,则可以使用未解释的函数和线性整数算法。未使用命令set-logic
指定逻辑时。 Z3试图自动为用户猜测逻辑,并且只“安装”必要的理论。在您的示例中,Z3错误地猜测您的示例不需要数组理论。因此,(Array Int Int)
被视为未解释的排序。
这就是为什么Z3假设(Array Int Int)是一个未解释的排序,并在生成的模型中为它提供解释。这是一个错误,我将在下一个版本中修复它。
在此期间,您可以使用以下方法之一来避免此错误:
指定包含数组理论的逻辑。示例:在示例的开头添加(set-logic QF_AUFLIA)
。
禁用自动配置(Z3将安装所有可用的理论)。添加命令(set-option :auto-config false)
。