为什么这个非线性实例不能通过QF_NRA求解器求解,但可以通过默认求解器求解?

时间:2015-10-20 08:15:35

标签: z3

可以解决以下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)

为什么会这样?

1 个答案:

答案 0 :(得分:0)

您的问题不在于QF_NRA逻辑,因为您的问题包含整数。第(check-sat-using (then simplify sat qfnra))行会强制Z3仅使用simplifysatqfnra策略。如果您只是写(check-sat),Z3将使用其内置的default策略,该策略应用多个预处理步骤,然后使用最强大的适用解算器。

qfnra求解器确实可以证明某些涉及整数的问题是不可靠的,因为如果没有满足给定公式的实数,那么也没有满足该公式的整数,假设整数是实力的子集。但是,这是一种特殊的情况,显然你的公式不属于这一类。

通常,使用Z3中的默认策略可以获得最佳效果,因此您的结果对我来说并不奇怪。如果您想将其与其他专业策略结合使用,可以使用(check-sat)(check-sat-using default)来使用默认策略。