【发布时间】:2015-10-18 08:47:52
【问题描述】:
原来的问题是:
(declare-const a Real)
(declare-const b Bool)
(declare-const c Int)
(assert (distinct a 0.))
(assert (= b (distinct (* a a) 0.)))
(assert (= c (ite b 1 0)))
(assert (not (distinct c 0)))
(check-sat)
结果未知。
但最后两个约束加在一起相当于(assert (= b false)),并且在手动执行这个重写之后
(declare-const a Real)
(declare-const b Bool)
(declare-const c Int)
(assert (distinct a 0.))
(assert (= b (distinct (* a a) 0.)))
(assert (= b false))
;(assert (= c (ite b 1 0)))
;(assert (not (distinct c 0)))
(check-sat)
Z3 现在能够解决这个实例(它是 unsat)。
为什么Z3可以解决第二个实例而不是第一个实例,即使第一个实例可以简化为第二个?
编辑:
在定位问题时,我发现了一些很奇怪的东西。
Z3 解决以下实例并返回“unsat”:
(declare-fun a() Real)
(declare-fun b() Bool)
(declare-fun c() Int)
(assert (distinct a 0.0))
(assert (= b (distinct (* a a) 0.0)))
(assert (= b false))
;(assert (= c 0))
(check-sat)
但如果我取消注释 (assert (= c 0)),求解器将返回“未知”,即使 c=0 与上述断言无关。
【问题讨论】: