如果注释中间的`(check-sat)`调用,为什么查询结果会改变?

时间:2012-04-30 14:54:27

标签: z3 smt

在调试UNSAT查询时,我发现查询状态存在一些有趣的差异。查询结构是:

assert(...)
(push)      ; commenting any of these two calls
(check-sat) ; makes the whole query UNSAT, otherwise it is SAT

assert(...)
(check-sat) ; SAT or UNSAT depending on existence of previous call
(exit)

查询中没有pop次调用。触发此行为的查询是here

想法为什么?

注意:我实际上不需要增量,它仅用于调试目的。 Z3版本是3.2。

1 个答案:

答案 0 :(得分:4)

这是其中一个量词推理引擎中的错误。这个bug将被修复。在此期间,您可以通过使用数据类型而不是未解释的排序+基数约束来避免错误。也就是说,您将QT声明为:

  

(declare-datatypes()((q q_accept_S13 q_T0_init q_accept_S7   q_accept_S6 q_accept_S5 q_accept_S4 q_T0_S3 q_accept_S12 q_accept_S10   q_accept_S9 q_accept_all)))

     

(declare-datatypes()((T t_0 t_1 t_2 t_3 t_4 t_5 t_6 t_7)))

上面的声明基本上定义了两个“枚举”类型。 通过这些声明,您将获得第二个查询的一致答案。