Z3 为什么这个非线性实例不能由QF_NRA解算器解算,而可以由默认解算器解算?

Z3 为什么这个非线性实例不能由QF_NRA解算器解算,而可以由默认解算器解算?,z3,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

下面的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)
(声明乐趣不受限制)
(声明乐趣lv_n_1_1()Int)
(宣布有趣的lv_n_8_1()Bool)
(声明乐趣lv_n_9_1()Int)
(宣布有趣的lv_n_10_1()Bool)
(宣布有趣的lv_n_18_1()Bool)
(声明乐趣lv_n_19_1()Int)
(宣布趣味lv_n_15_1()真实)
(声明乐趣lv_n_14_1()Int)
(断言
(非(独立lv_n_19_1 0))
(=lv_n_14_1(*lv_n_1_1 lv_n_1_1))
(=lv_n_15_1(至真实lv_n_14_1))
(=lv_n_18_1(独立(-lv_n_15_1 2.0)0.0))
(=lv_n_19_1(ite lv_n_18_1 0))
lv_n_10_1
(=lv_n_9_1(ite lv_n_8_1 0))
(=lv_n_10_1(不同的lv_n_9_1 0))
(=lv_n_8_1(=lv_n_1_1(-10))
(=lv_n_1_1非内特_32_1)
))
(使用检查sat(然后简化sat qfnra))
(检查sat)

为什么会发生这种情况?

您的问题不在于
QF\u NRA
逻辑,因为您的问题包含整数。行
(使用sat检查sat(然后简化sat qfnra))
将强制
Z3
只使用
简化
sat
qfnra
策略。如果您只是编写
(检查sat)
,Z3将使用其内置的
默认
策略,该策略应用多个预处理步骤,然后使用最强大的适用解算器

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


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

您的问题不在于
QF\u NRA
逻辑,因为您的问题包含整数。行
(使用sat检查sat(然后简化sat qfnra))
将强制
Z3
仅使用
简化
sat
qfnra
策略。如果您只编写
(检查sat)
,Z3将使用其内置的
默认
策略,该策略应用多个预处理步骤,然后使用最强大的适用解算器

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

通常,在Z3中使用默认策略会获得最佳结果,因此您的结果对我来说并不奇怪。您可以使用默认策略,方法是使用
(check sat)
,或者使用
(check sat using default)
,如果您想将其与其他专门策略相结合