Z3 通过假设时,检查sat的错误

Z3 通过假设时,检查sat的错误,z3,smt,Z3,Smt,我们今天遇到了这个看起来很严重的错误 考虑一下。(为完整起见,复制如下。) 这个公式是不正确的。我们首先用一个附加的假设检查公式,得到预期的unsat。然而,当我们第二次检查它时,没有任何假设,Z3现在报告sat。当我们要求一个模型时,我们得到了一个明显错误的模型(本质上与(distinct 1 1))相矛盾) 如果我们用(推)和(弹出)包围第一个(检查sat…),结果与预期一致。这表明当check-sat通过附加假设时,它会对上下文进行不合理的简化 我们是否以错误的方式使用了检查sat (se

我们今天遇到了这个看起来很严重的错误

考虑一下。(为完整起见,复制如下。)

这个公式是不正确的。我们首先用一个附加的假设检查公式,得到预期的
unsat
。然而,当我们第二次检查它时,没有任何假设,Z3现在报告
sat
。当我们要求一个模型时,我们得到了一个明显错误的模型(本质上与
(distinct 1 1)
)相矛盾)

如果我们用
(推)
(弹出)
包围第一个
(检查sat…
),结果与预期一致。这表明当
check-sat
通过附加假设时,它会对上下文进行不合理的简化

我们是否以错误的方式使用了
检查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)
(设置选项:生成unsat核心为真)
(设置选项:生成模型为真)
(宣布常数开始25布尔)
(申报常数bf07布尔)
(申报常数bf19布尔)
(声明常数lt06 Int)
(声明常量ef08 Int)
(声明常量ef110 Int)
(声明乐趣4(Int)Int)
(断言开始25)
(断言(=>start25(不同的lt06 1)))
(断言(=>start25(=lt06(whilem40)))
(断言(=>(非bf07)(=ef08 0)))
(assert(=>bf07(=ef08(whileM4(+01()))))
(断言(=>start25(而不是(<(whileM4 0)1)))
(断言(=>start25(=(whileM4 0)ef08)))
(断言(=>start25(和(=>bf07(<01))(=>(<01)bf07)))
(断言(=>(非bf19)(=ef110(+01)))
(assert(=>bf19(=ef110(whileM4(+(+01)1(()))))
(断言(=>bf07(不是(<(whileM4(+01))1)))
(断言(=>bf07(=(whileM4(+01))ef110)))
(断言(=>bf07(和(=>bf19(<(+01)1))(=>(<(+01)1)bf19)))
(推);注释掉以产生错误
(检查sat(非bf19))
(流行音乐);注释掉以产生错误
(检查sat)

感谢您报告此错误。这个bug影响了所有的Z3。你知道吗,4.3.1(和git上的master)是我们尝试的最新版本:)谢谢!我的意思是,在你报告它之后,我修复了这个bug:“我看到了:”顺便问一下,我们观察到用推/ POP来防止bug是正确的,或者这是巧合吗?是的,你是正确的。按下/弹出按钮将防止该错误。在Z3中,有两种推送方式:内部推送和用户/外部推送。我们无法在不一致的上下文中执行内部
推送
,因为在执行(内部)
pop
时,我们将丢失描述不一致性的所有信息。对于用户/外部推送,Z3将保留所有必要的信息。通过在检查sat之前执行用户/外部
推送
,可以防止触发错误的场景。我在“发行说明”中描述了这个场景(……作为一名优秀的学者,我应该指出,这是第一个注意到不一致结果的人。)
git clone https://git01.codeplex.com/z3 -b unstable