Z3 4.0模型中的额外输出

4
当我尝试获取一个模型字符串时,除了我定义的变量外,我在模型中会得到额外的输出 -
 z3name!0=3, z3name!1=-2, z3name!10=0, z3name!11=0, z3name!12=0, z3name!13=0, z3name!14=0, z3name!15=0, z3name!2=0, z3name!3=0, z3name!4=2, z3name!5=2, z3name!6=0, z3name!7=-3, z3name!8=2, z3name!9=0

我想知道这是否是错误的输出?或者这是Z3正在使用的一些中间变量吗?

因为我定义的变量的值对我来说似乎都是正确的。我以前从未见过这样的输出,因此我产生了疑问。

2个回答

5

Z3有几个预处理步骤。其中一些步骤会引入新的变量。这些新变量通常会从最终模型中删除。如果它们没有被删除,那么这是一个错误。然而,这个错误并不影响正确性,它只是一个不便之处。

如果您能发布您的问题,那就太好了。我们将能够确定哪个预处理步骤没有消除引入的辅助变量。


1
我知道这是一个旧话题,但我发现自己也遇到了Leonardo所说的同样的“错误”。由于原始帖子没有发布他的代码,我想我的代码可能可以帮助解决它(即使对我来说这个额外的输出不是问题,只要正确性确实得到保留)。似乎如果我将最终断言中的“/”更改为“+”运算符,则问题会消失。
(declare-fun fun0!0 () Int)
(declare-fun fun0!-1 () Int)
(declare-fun var0 () Int)

(assert (and
    (and
        (or (= fun0!0 0) (= fun0!0 1) (= fun0!0 2))
        (or (= fun0!-1 0) (= fun0!-1 1) (= fun0!-1 2))
        (or (= var0 1) (= var0 -1))
    )
    (and (or (= var0 0) (= var0 -1)))
))

(define-fun fun0 ((i! Int)) Int
    (ite
        (= i! 0)
        fun0!0
        (ite
            (= i! -1)
            fun0!-1
            (- 0 1)
        )
    )
)

(assert (=
    (fun0 var0)
    (/ var0 var0)
))
(check-sat)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接