Z3 为什么这个非线性实例不能由QF_NRA解算器解算,而可以由默认解算器解算?
下面的SMT2实例可以求解(它是UNSAT),但是如果我使用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
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)
,如果您想将其与其他专门策略相结合