当我组合数组和量词时,Z3 通常会生成包含array-ext
. 例如,此测试用例生成以下模型:
(define-fun pipeid () (Array Int Int)
(_ as-array k!2))
(define-fun valid () (Array Int Bool)
(_ as-array k!0))
(define-fun ispipe () (Array Int Bool)
(_ as-array k!1))
(define-fun pipeid_ab () Int
2)
(define-fun fd () Int
0)
(define-fun k!3 ((x!1 Int)) Int
(ite (= x!1 0) 0
(array-ext (_ as-array k!0) (_ as-array k!1))))
(define-fun k!0!4 ((x!1 Int)) Bool
(ite (= x!1 3) false
true))
(define-fun k!0 ((x!1 Int)) Bool
(k!0!4 (k!3 x!1)))
(define-fun k!1 ((x!1 Int)) Bool
true)
(define-fun k!2!5 ((x!1 Int)) Int
(ite (= x!1 3) 4
1))
(define-fun k!2 ((x!1 Int)) Int
(k!2!5 (k!3 x!1)))
首先,array-ext
ink!3
是什么意思?我拼凑了(array-ext a b)
一些索引x,其中a [ x ] != b [ x ],但要么我拼凑的内容不正确,要么我无法理解以上的循环k!0
定义k!3
。
其次,如何从这些模型中提取具体值?我知道通常不可能直接在模型中表示数组的具体值,但我想至少了解它的具体值是什么,并能够以某种形式从模型中提取它。即使查询单个数组索引似乎也无济于事:
model.evaluate(pipeid[1]) => If(array-ext(as-array, as-array) = 3, 4, 1)
谢谢。