当我组合数组和量词时,Z3经常会生成包含array-ext
应用程序的模型。例如,this test case生成以下模型:
(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
中的k!3
是什么意思?我拼凑了(array-ext a b)
是某个索引 x ,其中 a [ x ]!= b [ x ],但是我拼凑在一起的不正确或者我无法理解上面k!0
和k!3
的循环定义。< / p>
其次,如何从这些模型中提取具体值?我知道通常不可能直接在模型中表示数组的具体值,但我想至少理解它的具体值是什么,并能够从模型中以某种形式提取它。即使查询单个数组索引似乎也没有帮助:
model.evaluate(pipeid[1]) => If(array-ext(as-array, as-array) = 3, 4, 1)
感谢。
答案 0 :(得分:2)
array-ext
是一个内部函数符号。它用于实现数组扩展性。
话虽如此,它不应该出现在模型中。基于模型的量词实例化(MBQI)模块意外地将array-ext
“泄漏”到模型中。我解决了这个问题。
此修复程序已在unstable
(正在进行中)分支中提供。
它也可以在nightly builds中找到。
以下是错误修复后的输出:
(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
0)
(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)))
pipeid[0] => 1
pipeid[1] => 1