奇怪的Z3模型值

奇怪的Z3模型值,z3,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

我正在使用最新的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。

这在Z34.0中已经得到了修复。 Z34.0即将发布。同时,您可以在线使用它:

此链接可用于执行您的示例。Z34.0产生了预期的结果

关于这个bug,主要的问题是Z3将对象视为一种未解释的类型。 在Z3.2中,您可以通过包括

(设置选项:自动配置错误)


在脚本的开头。

这已在Z34.0中修复。 Z34.0即将发布。同时,您可以在线使用它:

此链接可用于执行您的示例。Z34.0产生了预期的结果

关于这个bug,主要的问题是Z3将对象视为一种未解释的类型。 在Z3.2中,您可以通过包括

(设置选项:自动配置错误)


在脚本的开头。

感谢您的快速回答!添加上面的live解决了这个问题。感谢您的快速回答!添加live Upper解决了目前的问题。