奇怪的Z3型号值

时间:2012-04-17 19:38:44

标签: z3

我正在使用最新的Z3版本3.2。我从“get-value”命令得到意外的响应。这是我在SMT-LIB2兼容模式下运行的小脚本:

(set-option :produce-models true)
(declare-datatypes () ((Object o0 null)))
(declare-fun IF (Object) Int)
(declare-fun i2 () Int) 
(assert (= (IF o0) i2))
(assert (= (IF null) 0))
(check-sat)
(get-value (i2))

回复是:

((i2 (IF o0)))

我希望能回到“0”。有没有办法让Z3将返回的术语评估为宇宙常数?

以下是完整模型:

(model 
;; universe for Object:
;;   Object!val!0 
;; -----------
;; definitions for universe elements:
(declare-fun Object!val!0 () Object)
;; cardinality constraint:
(forall ((x Object)) (= x Object!val!0))
;; -----------
(define-fun i2 () Int
(IF o0))
(define-fun IF ((x!1 Object)) Int
  (ite (= x!1 Object!val!0) 0
    0))
)

我也很困惑为什么o0没有在模型中定义。

1 个答案:

答案 0 :(得分:1)

这已在Z3 4.0中修复。 Z3 4.0即将发布。在此期间,您可以在线使用它:http://rise4fun.com/Z3/75y

此链接可用于执行您的示例。 Z3 4.0产生预期的结果。

关于bug,主要问题是Z3将Object视为未解释的排序。 在Z3 3.2中,您可以通过包含

来解决此错误
  

(set-option:auto-config false)

在脚本的开头。