数组和量词

时间:2012-08-28 15:45:53

标签: z3 smt

我正在尝试在Z3中使用数组和量词,以便在给定的文本中找到子字符串。

我的代码如下:

(declare-const a (Array Int Int))
(declare-const x Int)

;; a|A
(assert (or (= (select a 0) 61) (= (select a 0) 41)))
;; b|B
(assert (or (= (select a 1) 62) (= (select a 1) 42)))
;; c|C
(assert (or (= (select a 2) 63) (= (select a 2) 43)))

(assert (>= x 0))
(assert (< x 3))

(assert (exists ((i Int)) (= (select a i) 72) ))
(check-sat)
<3> Z3说不应该是SAT。我对Z3和SMT理论很新,而且我无法弄清楚我的代码有什么问题。

1 个答案:

答案 0 :(得分:1)

在你的例子中,通过将i作为0,1,2范围之外的任何自然数来实际上是可以满足的。所以,如果你让i = 3例如,因为你没有将数组约束在索引3无论如何,a [3]有可能是72。

这是一个链接,显示Z3 @Rise界面上您的示例的令人满意的分配(模型),以及下面描述的修复:http://rise4fun.com/Z3/E6YI

为了防止这种情况发生,一种方法是将i的范围限制为您已经分配的数组索引之一。也就是说,将i限制在0到2之间。

(declare-const a (Array Int Int))
(declare-const x Int)

;; a|A
(assert (or (= (select a 0) 61) (= (select a 0) 41)))
;; b|B
(assert (or (= (select a 1) 62) (= (select a 1) 42)))
;; c|C
(assert (or (= (select a 2) 63) (= (select a 2) 43)))

(assert (>= x 0))
(assert (< x 3))

(assert (exists ((i Int)) (= (select a i) 72)))
(check-sat)
(get-model) ; model gives i == 3 with a[i] == 72

(assert (exists ((i Int)) (and (>= i 0) (<= i 2) (= (select a i) 72) )))
(check-sat)