Z3将数组的默认值设置为零

时间:2019-02-25 10:07:30

标签: z3

我正在尝试求解数组表达式的模型,其中数组的默认值等于0。

例如,我正在尝试解决此示例,但是我一直都得到未知的结果

(declare-const arr (Array Int Int))
(declare-const arr2 (Array Int Int))
(declare-const a Int)
(declare-const b Int)

(assert (forall ((x Int)) (= (select arr x) 0)))

(assert (> a 0))
(assert (<= a 10))

(assert (= arr2 (store arr a 1337)))

(assert (> b 0))
(assert (<= b 10))


(assert (= (select arr2 b) 0))

(check-sat)
(get-model)

1 个答案:

答案 0 :(得分:2)

帕特里克关于不使用量词的建议已成真!他们会让您的生活更艰难。但是,您很幸运,因为z3支持用例的常量数组,这很常见。语法为:

(assert (= arr ((as const (Array Int Int)) 0)))

这可以确保arr的所有条目都为0;无需量化,z3可以在内部对其进行处理。

因此,您的基准将是:

(declare-const arr (Array Int Int))
(declare-const arr2 (Array Int Int))
(declare-const a Int)
(declare-const b Int)

(assert (= arr ((as const (Array Int Int)) 0)))

(assert (> a 0))
(assert (<= a 10))

(assert (= arr2 (store arr a 1337)))

(assert (> b 0))
(assert (<= b 10))


(assert (= (select arr2 b) 0))

(check-sat)
(get-model)

可以立即解决。这样,您可以使整个数组以0开头,并修改您感兴趣的范围;可以像往常一样依赖变量,并且不需要提前知道。