Z3返回不同的答案WITH和WITHOUT使用push / pop?

时间:2015-07-01 09:54:38

标签: 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))
(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会返回unknownhttp://rise4fun.com/Z3/epyh0

有没有人知道Z3为什么会这样?

非常感谢!

1 个答案:

答案 0 :(得分:2)

此问题包含通用量词(不是......(存在...)),Z3会在认为无法解决问题时放弃这些问题(这就是为什么你会得到{ {1}})。根据使用的策略/策略/解算器,它可能决定早晚放弃。在这种特殊情况下,它使用一个不支持push / pop的求解器,添加它们会使它回退到一个让它放弃的不同求解器(或参数设置)上。

关于此问题和相关问题,StackOverflow上存在多个问题,例如z3 produces unknown for assertions without quantifiersDifferent check-sat answers when asserting same property in betweenWhy does Z3 return “unknown” on this simple input?