Z3 为什么如果注释一个中间的`(check-sat)`调用,查询结果会改变?
在调试UNSAT查询时,我注意到查询状态中有一个有趣的差异。查询结构为:Z3 为什么如果注释一个中间的`(check-sat)`调用,查询结果会改变?,z3,smt,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) 查询
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
调用。触发此行为的查询是
为什么
注意:我实际上不需要递增,它只是用于调试目的。Z3版本是3.2。这是一个量词推理引擎中的错误。此错误将被修复。同时,您可以通过使用数据类型而不是未解释的排序+基数约束来避免该错误。也就是说,您将
Q
和T
声明为:
(声明数据类型()((Q Q_accept_S13 Q_T0_init Q_accept_S7
q_接受_S6 q_接受_S5 q_接受_S4 q_T0_S3 q_接受_S12 q_接受_S10
q_接受(9 q_接受))
(声明数据类型()((T_0 T_1 T_2 T_3 T_4 T_5 T_6 T_7)))
上面的声明本质上定义了两种“枚举”类型。
通过这些声明,您将获得第二个查询的一致答案