据我所知,有3种方法可以将值关联到z3中的数组。
assert
将值关联到某些单元格:(declare-const a1 (Array Int Int))
(declare-const a2 (Array Int Int))
(assert (= 1 (select a1 0)))
(assert (= 2 (select a2 0)))
在添加约束unsat
时,z3返回(assert (= a1 a2))
。
as const
首先初始化数组,然后将值分配给特定的单元格:(declare-const a3 (Array Int Int))
(assert
(=
(store ((as const (Array Int Int)) 64) 0 3)
a3
)
)
(declare-const a4 (Array Int Int))
(assert
(=
(store ((as const (Array Int Int)) 64) 0 4)
a4
)
)
添加(assert (= a3 a4))
,我们再次获得unsat
。
(define-const a5 (Array Int Int)
(lambda ((i Int))
(ite (= i 0) 5 64)))
(define-const a6 (Array Int Int)
(lambda ((i Int))
(ite (= i 0) 6 64)))
但是,如果我们添加(assert (= a5 a6))
,则z3返回sat
。为什么?
顺便问一下,有什么(更好)的方法可以将值分配给z3中的数组?