可以解决以下SMT2实例(它是UNSAT),但是如果我使用qfnra
解算器,结果是未知的。
(declare-fun NONDET_INT_32_1 () Int)
(declare-fun lv_n_1_1 () Int)
(declare-fun lv_n_8_1 () Bool)
(declare-fun lv_n_9_1 () Int)
(declare-fun lv_n_10_1 () Bool)
(declare-fun lv_n_18_1 () Bool)
(declare-fun lv_n_19_1 () Int)
(declare-fun lv_n_15_1 () Real)
(declare-fun lv_n_14_1 () Int)
(assert (and true
(not (distinct lv_n_19_1 0))
(= lv_n_14_1 (* lv_n_1_1 lv_n_1_1))
(= lv_n_15_1 (to_real lv_n_14_1))
(= lv_n_18_1 (distinct (- lv_n_15_1 2.0) 0.0))
(= lv_n_19_1 (ite lv_n_18_1 1 0))
lv_n_10_1
(= lv_n_9_1 (ite lv_n_8_1 1 0))
(= lv_n_10_1 (distinct lv_n_9_1 0))
(= lv_n_8_1 (<= lv_n_1_1 10))
(>= lv_n_1_1 (- 10))
(= lv_n_1_1 NONDET_INT_32_1)
))
;(check-sat-using (then simplify sat qfnra))
(check-sat)
为什么会这样?
答案 0 :(得分:0)
您的问题不在于QF_NRA
逻辑,因为您的问题包含整数。第(check-sat-using (then simplify sat qfnra))
行会强制Z3
仅使用simplify
,sat
和qfnra
策略。如果您只是写(check-sat)
,Z3将使用其内置的default
策略,该策略应用多个预处理步骤,然后使用最强大的适用解算器。
qfnra
求解器确实可以证明某些涉及整数的问题是不可靠的,因为如果没有满足给定公式的实数,那么也没有满足该公式的整数,假设整数是实力的子集。但是,这是一种特殊的情况,显然你的公式不属于这一类。
通常,使用Z3中的默认策略可以获得最佳效果,因此您的结果对我来说并不奇怪。如果您想将其与其他专业策略结合使用,可以使用(check-sat)
或(check-sat-using default)
来使用默认策略。