mirror of
https://github.com/Z3Prover/z3
synced 2025-04-29 03:45:51 +00:00
check for logic in solver
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
c0fb2eafe5
commit
51a4085910
6 changed files with 213 additions and 128 deletions
|
@ -45,6 +45,7 @@ Notes:
|
|||
#include"model_params.hpp"
|
||||
#include"th_rewriter.h"
|
||||
#include"tactic_exception.h"
|
||||
#include"smt_logics.h"
|
||||
|
||||
func_decls::func_decls(ast_manager & m, func_decl * f):
|
||||
m_decls(TAG(func_decl*, f, 0)) {
|
||||
|
@ -503,128 +504,32 @@ void cmd_context::load_plugin(symbol const & name, bool install, svector<family_
|
|||
fids.erase(id);
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_arith_core(symbol const & s) const {
|
||||
return
|
||||
s == "QF_LRA" ||
|
||||
s == "QF_LIA" ||
|
||||
s == "QF_RDL" ||
|
||||
s == "QF_IDL" ||
|
||||
s == "QF_AUFLIA" ||
|
||||
s == "QF_ALIA" ||
|
||||
s == "QF_AUFLIRA" ||
|
||||
s == "QF_AUFNIA" ||
|
||||
s == "QF_AUFNIRA" ||
|
||||
s == "QF_ANIA" ||
|
||||
s == "QF_LIRA" ||
|
||||
s == "QF_UFLIA" ||
|
||||
s == "QF_UFLRA" ||
|
||||
s == "QF_UFIDL" ||
|
||||
s == "QF_UFRDL" ||
|
||||
s == "QF_NIA" ||
|
||||
s == "QF_NRA" ||
|
||||
s == "QF_NIRA" ||
|
||||
s == "QF_UFNRA" ||
|
||||
s == "QF_UFNIA" ||
|
||||
s == "QF_UFNIRA" ||
|
||||
s == "QF_BVRE" ||
|
||||
s == "ALIA" ||
|
||||
s == "AUFLIA" ||
|
||||
s == "AUFLIRA" ||
|
||||
s == "AUFNIA" ||
|
||||
s == "AUFNIRA" ||
|
||||
s == "UFLIA" ||
|
||||
s == "UFLRA" ||
|
||||
s == "UFNRA" ||
|
||||
s == "UFNIRA" ||
|
||||
s == "NIA" ||
|
||||
s == "NRA" ||
|
||||
s == "UFNIA" ||
|
||||
s == "LIA" ||
|
||||
s == "LRA" ||
|
||||
s == "UFIDL" ||
|
||||
s == "QF_FP" ||
|
||||
s == "QF_FPBV" ||
|
||||
s == "QF_BVFP" ||
|
||||
s == "QF_S" ||
|
||||
s == "ALL" ||
|
||||
s == "QF_FD" ||
|
||||
s == "HORN";
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_arith() const {
|
||||
return !has_logic() || logic_has_arith_core(m_logic);
|
||||
return !has_logic() || smt_logics::logic_has_arith(m_logic);
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_bv_core(symbol const & s) const {
|
||||
return
|
||||
s == "UFBV" ||
|
||||
s == "AUFBV" ||
|
||||
s == "ABV" ||
|
||||
s == "BV" ||
|
||||
s == "QF_BV" ||
|
||||
s == "QF_UFBV" ||
|
||||
s == "QF_ABV" ||
|
||||
s == "QF_AUFBV" ||
|
||||
s == "QF_BVRE" ||
|
||||
s == "QF_FPBV" ||
|
||||
s == "QF_BVFP" ||
|
||||
s == "ALL" ||
|
||||
s == "QF_FD" ||
|
||||
s == "HORN";
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_horn(symbol const& s) const {
|
||||
return s == "HORN";
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_bv() const {
|
||||
return !has_logic() || logic_has_bv_core(m_logic);
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_seq_core(symbol const& s) const {
|
||||
return s == "QF_BVRE" || s == "QF_S" || s == "ALL";
|
||||
return !has_logic() || smt_logics::logic_has_bv(m_logic);
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_seq() const {
|
||||
return !has_logic() || logic_has_seq_core(m_logic);
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_fpa_core(symbol const& s) const {
|
||||
return s == "QF_FP" || s == "QF_FPBV" || s == "QF_BVFP" || s == "ALL";
|
||||
return !has_logic() || smt_logics::logic_has_seq(m_logic);
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_fpa() const {
|
||||
return !has_logic() || logic_has_fpa_core(m_logic);
|
||||
return !has_logic() || smt_logics::logic_has_fpa(m_logic);
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_array_core(symbol const & s) const {
|
||||
return
|
||||
s == "QF_AX" ||
|
||||
s == "QF_AUFLIA" ||
|
||||
s == "QF_ANIA" ||
|
||||
s == "QF_ALIA" ||
|
||||
s == "QF_AUFLIRA" ||
|
||||
s == "QF_AUFNIA" ||
|
||||
s == "QF_AUFNIRA" ||
|
||||
s == "ALIA" ||
|
||||
s == "AUFLIA" ||
|
||||
s == "AUFLIRA" ||
|
||||
s == "AUFNIA" ||
|
||||
s == "AUFNIRA" ||
|
||||
s == "AUFBV" ||
|
||||
s == "ABV" ||
|
||||
s == "ALL" ||
|
||||
s == "QF_ABV" ||
|
||||
s == "QF_AUFBV" ||
|
||||
s == "HORN";
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_array() const {
|
||||
return !has_logic() || logic_has_array_core(m_logic);
|
||||
return !has_logic() || smt_logics::logic_has_array(m_logic);
|
||||
}
|
||||
|
||||
bool cmd_context::logic_has_datatype() const {
|
||||
return !has_logic() || m_logic == "QF_FD";
|
||||
return !has_logic() || smt_logics::logic_has_datatype(m_logic);
|
||||
}
|
||||
|
||||
void cmd_context::init_manager_core(bool new_manager) {
|
||||
|
@ -706,31 +611,19 @@ void cmd_context::init_external_manager() {
|
|||
init_manager_core(false);
|
||||
}
|
||||
|
||||
bool cmd_context::supported_logic(symbol const & s) const {
|
||||
return s == "QF_UF" || s == "UF" || s == "ALL" || s == "QF_FD" ||
|
||||
logic_has_arith_core(s) || logic_has_bv_core(s) ||
|
||||
logic_has_array_core(s) || logic_has_seq_core(s) ||
|
||||
logic_has_horn(s) || logic_has_fpa_core(s);
|
||||
}
|
||||
|
||||
bool cmd_context::set_logic(symbol const & s) {
|
||||
if (has_logic())
|
||||
throw cmd_exception("the logic has already been set");
|
||||
if (has_manager() && m_main_ctx)
|
||||
throw cmd_exception("logic must be set before initialization");
|
||||
if (!supported_logic(s)) {
|
||||
if (!smt_logics::supported_logic(s)) {
|
||||
return false;
|
||||
}
|
||||
m_logic = s;
|
||||
if (is_logic("QF_RDL") ||
|
||||
is_logic("QF_LRA") ||
|
||||
is_logic("UFLRA") ||
|
||||
is_logic("LRA") ||
|
||||
is_logic("RDL") ||
|
||||
is_logic("QF_NRA") ||
|
||||
is_logic("QF_UFNRA") ||
|
||||
is_logic("QF_UFLRA"))
|
||||
if (smt_logics::logic_has_reals_only(s)) {
|
||||
m_numeral_as_real = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue