我刚刚将z3从4.1升级到4.3.1,似乎smtlib2输入已经改变: 现在,pop语句不会删除函数/常量声明。
这是SMTlib2输入,可以与z3 4.1(和其他SMT求解器...)一起使用,但返回时带有z3 4.3.1的错误:(错误“第19行第25列:无效声明,常量'bs_2' (已给出签名)已经宣布“)
(set-option :produce-models true)
(set-option :produce-unsat-cores true)
(set-option :interactive-mode true)
(set-option :print-success false)
(push 1)
(declare-fun bs_1 () Bool)
(push 1)
(declare-fun bs_2 () Bool)
(assert (and bs_1 (not bs_2)))
(check-sat)
(pop 1)
(push 1)
(declare-fun bs_2 () Bool)
(assert (and bs_1 (not bs_2)))
(check-sat)
(pop 1)
(pop 1)
(exit)
删除最后一个bs_2声明适用于z3 4.3.1,但不适用于z3 4.1。 我使用推/弹错了吗?
答案 0 :(得分:4)
在Z3 4.3.1中,我们试图放宽一些SMT-LIB 2.0限制,以使Z3更方便使用。例如,我们现在可以在(+ x 2)
为(+ x 2.0)
时编写x
而不是Real
。声明是全局的,而不是像Z3 4.1中的作用域。动机是允许用户更简洁地编码问题。我们可以使用以下选项来启用范围声明,如Z3 4.1
(set-option :global-decls false)
话虽如此,我理解这种变化对于习惯于其他SMT解算器的用户来说非常混乱和反直觉,或者阅读了描述SMT-LIB标准的手册。因此,我们会将默认值更改回(set-option :global-decls false)
。