当我尝试获取模型字符串以及我定义的变量时,我在模型中获得了额外的输出 -
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正在使用的一些中间变量?
因为我定义的变量的值对我来说似乎没问题。 我以前没见过任何这样的输出,因此我怀疑了。
答案 0 :(得分:5)
Z3有几个预处理步骤。其中一些引入了新的变量。通常会从结果模型中删除新变量。如果他们不是,这是一个错误。但是,此错误不会影响正确性。这只是一个不便之处。
如果你能发布你的问题会很棒。我们将能够确定哪个预处理步骤没有消除引入的辅助变量。
答案 1 :(得分:1)
我意识到这是一个古老的话题,但我发现自己也有同样的错误"正如莱昂纳多所说的那样。由于OP没有发布他的代码,我认为我可以帮助修复它(即使这个额外的输出对我来说不是问题,只要确实保留了正确性。)
看来如果我改变" /"在最后的断言中,让我们说一个" +"操作员,问题就消失了。
(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)