通过假设时检查坐标的错误

时间:2012-12-17 20:38:21

标签: z3 smt

我们今天遇到了这个看似严重的错误。

考虑this Z3 script。 (完整性转载如下。)

公式不合格。我们首先使用额外的假设检查公式,并按预期获得unsat。但是,当我们第二次检查它时,没有任何假设,Z3现在报告sat。当我们要求一个模型时,我们会得到一个明显错误的模型(基本上与(distinct 1 1)相矛盾。)

如果我们使用(check-sat ...)(push)包围第一个(pop),则结果符合预期。这表明当check-sat通过其他假设时,它会对上下文应用不完整的简化。

我们是否可能以错误的方式使用check-sat

(set-option :produce-unsat-cores true)
(set-option :produce-models true)

(declare-const start25 Bool)
(declare-const bf07 Bool)
(declare-const bf19 Bool)
(declare-const lt06 Int)
(declare-const ef08 Int)
(declare-const ef110 Int)

(declare-fun whileM4 (Int) Int)

(assert start25)
(assert (=> start25 (distinct lt06 1)))
(assert (=> start25 (= lt06 (whileM4 0))))
(assert (=> (not bf07) (= ef08 0)))
(assert (=> bf07 (= ef08 (whileM4 (+ 0 1)))))
(assert (=> start25 (not (< (whileM4 0) 1))))
(assert (=> start25 (= (whileM4 0) ef08)))
(assert (=> start25 (and (=> bf07 (< 0 1)) (=> (< 0 1) bf07))))
(assert (=> (not bf19) (= ef110 (+ 0 1))))
(assert (=> bf19 (= ef110 (whileM4 (+ (+ 0 1) 1)))))
(assert (=> bf07 (not (< (whileM4 (+ 0 1)) 1))))
(assert (=> bf07 (= (whileM4 (+ 0 1)) ef110)))
(assert (=> bf07 (and (=> bf19 (< (+ 0 1) 1)) (=> (< (+ 0 1) 1) bf19))))

(push) ; comment out to produce bug
(check-sat (not bf19))
(pop)  ; comment out to produce bug

(check-sat)

1 个答案:

答案 0 :(得分:4)

感谢您报告错误。该bug影响所有Z3&lt; = v4.3.1。 我修复了这个错误,修复程序已在codeplex中提供。

http://z3.codeplex.com/SourceControl/changeset/8c211dd4fcd3

要获得正在进行的分支,我们使用

git clone https://git01.codeplex.com/z3 -b unstable

使用“正在进行中的工作”分支可能不方便,因为您还可以获得其他更新和修改。因此,另一种选择是手动将修复程序应用于您正在使用的版本。 请注意,此修复程序非常small modification