Z3在使用和不使用push/pop时返回不同的答案?

Z3在使用和不使用push/pop时返回不同的答案?,z3,smt,Z3,Smt,使用Z3检查以下问题时,通过一对push/pop (declare-fun sz_53 () Int) (declare-fun x () Int) (declare-fun u () Int) (declare-fun y () Int) (assert (> u 0)) (assert (= (+ y (- 0 0)) 0)) (assert (or (= (- x u) 0) (> x 0))) (assert (<= (* (- 0 1) sz_53) 0)) (ass

使用Z3检查以下问题时,通过一对
push/pop

(declare-fun sz_53 () Int)
(declare-fun x () Int)
(declare-fun u () Int)
(declare-fun y () Int)
(assert (> u 0))
(assert (= (+ y (- 0 0)) 0))
(assert (or (= (- x u) 0) (> x 0)))
(assert (<= (* (- 0 1) sz_53) 0))
(assert (or (= (- x u) 0) (not (= (- x u) 0))))
(assert (not (and (and (and (and (exists ((sz_64 Int)) (and (= sz_64 0) (exists ((sz_62 Int)) (and (exists ((sz_55 Int)) (and (<= (* (- 0 1) sz_55) 0) (= (+ sz_53 (- sz_62 sz_55)) 0))) (= (+ sz_62 (- (- 0 1) sz_64)) 0))))) (>= y 0)) (or (= (+ x (* (- 0 1) y)) 0) (> x 0))) (not (= (+ u (* (- 0 1) y)) 0))) (not (= (+ u (* (- 0 1) y)) 0)))))
(assert (not false))
(check-sat)
(声明fun sz_53()Int)
(声明funx()Int)
(声明funu()Int)
(声明funy()Int)
(断言(>u0))
(断言((+y(-0))0)
(断言(或((-xu)0)(>x0)))
(断言(x 0))(非((+u(*-01)y))0))(非((+u(*-01)y))0(x 0)))
(断言(非虚假))
(检查sat)
特别是,当直接检查它时(不是通过
push/pop
包装),Z3返回
unsat
(这里是在线链接:)

但是,当通过
push/pop
包装它时,Z3返回
unknown
()

有人知道Z3为什么会这样吗


多谢各位

这个问题包含通用量词(不是…(存在…),当Z3认为无法解决它时,它会放弃这些问题(这就是为什么你得到
未知的
)。根据使用的策略/战术/解决方案,它可能会决定早晚放弃。在这种特殊情况下,它使用不支持推/弹出的解算器,添加它们会使其返回到另一个使其放弃的解算器(或参数设置)


关于StackOverflow以及相关问题,有多个问题,例如,

谢谢您的详细回答!我已经阅读了你提到的相关问题和答案,但对于这种情况没有任何好的解决方案。我觉得在这种情况下,Z3放弃了。。。这么快。希望在以后的版本中对其进行改进。