使用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)
特别是,当直接检查它(不是由push/pop
包裹)时,Z3返回unsat
(这是在线链接:http://rise4fun.com/Z3/cDt3)
但是,当按push/pop
换行时,Z3会返回unknown
(http://rise4fun.com/Z3/epyh0)
有没有人知道Z3为什么会这样?
非常感谢!
答案 0 :(得分:2)
此问题包含通用量词(不是......(存在...)),Z3会在认为无法解决问题时放弃这些问题(这就是为什么你会得到{ {1}})。根据使用的策略/策略/解算器,它可能决定早晚放弃。在这种特殊情况下,它使用一个不支持push / pop的求解器,添加它们会使它回退到一个让它放弃的不同求解器(或参数设置)上。
关于此问题和相关问题,StackOverflow上存在多个问题,例如z3 produces unknown for assertions without quantifiers,Different check-sat answers when asserting same property in between,Why does Z3 return “unknown” on this simple input?