从包含“array-ext”的模型中获取具体值

时间:2013-06-20 13:59:55

标签: z3

当我组合数组和量词时,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!0k!3的循环定义。< / p>

其次,如何从这些模型中提取具体值?我知道通常不可能直接在模型中表示数组的具体值,但我想至少理解它的具体值是什么,并能够从模型中以某种形式提取它。即使查询单个数组索引似乎也没有帮助:

 model.evaluate(pipeid[1]) => If(array-ext(as-array, as-array) = 3, 4, 1)

感谢。

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