mirror of
https://github.com/Z3Prover/z3
synced 2025-04-29 11:55:51 +00:00
solver factories, cleanup solver API, simplified strategic solver, added combined solver
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
bfe6678ad2
commit
8198e62cbd
22 changed files with 720 additions and 492 deletions
|
@ -18,7 +18,8 @@ Notes:
|
|||
|
||||
--*/
|
||||
#include"cmd_context.h"
|
||||
#include"strategic_solver.h"
|
||||
#include"combined_solver.h"
|
||||
#include"tactic2solver.h"
|
||||
#include"qfbv_tactic.h"
|
||||
#include"qflia_tactic.h"
|
||||
#include"qfnia_tactic.h"
|
||||
|
@ -36,57 +37,76 @@ Notes:
|
|||
#include"horn_tactic.h"
|
||||
#include"smt_solver.h"
|
||||
|
||||
MK_SIMPLE_TACTIC_FACTORY(qfuf_fct, mk_qfuf_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qfidl_fct, mk_qfidl_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qfauflia_fct, mk_qfauflia_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(auflia_fct, mk_auflia_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(auflira_fct, mk_auflira_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(aufnira_fct, mk_aufnira_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(ufnia_fct, mk_ufnia_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(uflra_fct, mk_uflra_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(lra_fct, mk_lra_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qfbv_fct, mk_qfbv_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(default_fct, mk_default_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qfaufbv_fct, mk_qfaufbv_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qflra_fct, mk_qflra_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qflia_fct, mk_qflia_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qfufbv_fct, mk_qfufbv_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qfnia_fct, mk_qfnia_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qfnra_fct, mk_qfnra_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(qffpa_fct, mk_qffpa_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(ufbv_fct, mk_ufbv_tactic(m, p));
|
||||
MK_SIMPLE_TACTIC_FACTORY(horn_fct, mk_horn_tactic(m, p));
|
||||
|
||||
static void init(strategic_solver * s) {
|
||||
s->set_default_tactic(alloc(default_fct));
|
||||
s->set_tactic_for(symbol("QF_UF"), alloc(qfuf_fct));
|
||||
s->set_tactic_for(symbol("QF_BV"), alloc(qfbv_fct));
|
||||
s->set_tactic_for(symbol("QF_IDL"), alloc(qfidl_fct));
|
||||
s->set_tactic_for(symbol("QF_LIA"), alloc(qflia_fct));
|
||||
s->set_tactic_for(symbol("QF_LRA"), alloc(qflra_fct));
|
||||
s->set_tactic_for(symbol("QF_NIA"), alloc(qfnia_fct));
|
||||
s->set_tactic_for(symbol("QF_NRA"), alloc(qfnra_fct));
|
||||
s->set_tactic_for(symbol("QF_AUFLIA"), alloc(qfauflia_fct));
|
||||
s->set_tactic_for(symbol("QF_AUFBV"), alloc(qfaufbv_fct));
|
||||
s->set_tactic_for(symbol("QF_ABV"), alloc(qfaufbv_fct));
|
||||
s->set_tactic_for(symbol("QF_UFBV"), alloc(qfufbv_fct));
|
||||
s->set_tactic_for(symbol("AUFLIA"), alloc(auflia_fct));
|
||||
s->set_tactic_for(symbol("AUFLIRA"), alloc(auflira_fct));
|
||||
s->set_tactic_for(symbol("AUFNIRA"), alloc(aufnira_fct));
|
||||
s->set_tactic_for(symbol("UFNIA"), alloc(ufnia_fct));
|
||||
s->set_tactic_for(symbol("UFLRA"), alloc(uflra_fct));
|
||||
s->set_tactic_for(symbol("LRA"), alloc(lra_fct));
|
||||
s->set_tactic_for(symbol("UFBV"), alloc(ufbv_fct));
|
||||
s->set_tactic_for(symbol("BV"), alloc(ufbv_fct));
|
||||
s->set_tactic_for(symbol("QF_FPA"), alloc(qffpa_fct));
|
||||
s->set_tactic_for(symbol("QF_FPABV"), alloc(qffpa_fct));
|
||||
s->set_tactic_for(symbol("HORN"), alloc(horn_fct));
|
||||
tactic * mk_tactic_for_logic(ast_manager & m, params_ref const & p, symbol const & logic) {
|
||||
if (logic=="QF_UF")
|
||||
return mk_qfufbv_tactic(m, p);
|
||||
else if (logic=="QF_BV")
|
||||
return mk_qfbv_tactic(m, p);
|
||||
else if (logic=="QF_IDL")
|
||||
return mk_qfidl_tactic(m, p);
|
||||
else if (logic=="QF_LIA")
|
||||
return mk_qflia_tactic(m, p);
|
||||
else if (logic=="QF_LRA")
|
||||
return mk_qflra_tactic(m, p);
|
||||
else if (logic=="QF_NIA")
|
||||
return mk_qfnia_tactic(m, p);
|
||||
else if (logic=="QF_NRA")
|
||||
return mk_qfnra_tactic(m, p);
|
||||
else if (logic=="QF_AUFLIA")
|
||||
return mk_qfauflia_tactic(m, p);
|
||||
else if (logic=="QF_AUFBV")
|
||||
return mk_qfaufbv_tactic(m, p);
|
||||
else if (logic=="QF_ABV")
|
||||
return mk_qfaufbv_tactic(m, p);
|
||||
else if (logic=="QF_UFBV")
|
||||
return mk_qfufbv_tactic(m, p);
|
||||
else if (logic=="AUFLIA")
|
||||
return mk_auflia_tactic(m, p);
|
||||
else if (logic=="AUFLIRA")
|
||||
return mk_auflira_tactic(m, p);
|
||||
else if (logic=="AUFNIRA")
|
||||
return mk_aufnira_tactic(m, p);
|
||||
else if (logic=="UFNIA")
|
||||
return mk_ufnia_tactic(m, p);
|
||||
else if (logic=="UFLRA")
|
||||
return mk_uflra_tactic(m, p);
|
||||
else if (logic=="LRA")
|
||||
return mk_lra_tactic(m, p);
|
||||
else if (logic=="UFBV")
|
||||
return mk_ufbv_tactic(m, p);
|
||||
else if (logic=="BV")
|
||||
return mk_ufbv_tactic(m, p);
|
||||
else if (logic=="QF_FPA")
|
||||
return mk_qffpa_tactic(m, p);
|
||||
else if (logic=="QF_FPABV")
|
||||
return mk_qffpa_tactic(m, p);
|
||||
else if (logic=="HORN")
|
||||
return mk_horn_tactic(m, p);
|
||||
else
|
||||
return mk_default_tactic(m, p);
|
||||
}
|
||||
|
||||
solver * mk_smt_strategic_solver(bool force_tactic) {
|
||||
strategic_solver * s = alloc(strategic_solver);
|
||||
s->force_tactic(force_tactic);
|
||||
s->set_inc_solver(mk_smt_solver());
|
||||
init(s);
|
||||
return s;
|
||||
class smt_strategic_solver_factory : public solver_factory {
|
||||
symbol const & m_logic;
|
||||
public:
|
||||
smt_strategic_solver_factory(symbol const & logic):m_logic(logic) {}
|
||||
|
||||
virtual ~smt_strategic_solver_factory() {}
|
||||
|
||||
virtual solver * operator()(ast_manager & m, params_ref const & p, bool proofs_enabled, bool models_enabled, bool unsat_core_enabled, symbol const & logic) {
|
||||
symbol l;
|
||||
if (m_logic != symbol::null)
|
||||
l = m_logic;
|
||||
else
|
||||
l = logic;
|
||||
tactic * t = mk_tactic_for_logic(m, p, logic);
|
||||
return mk_combined_solver(mk_tactic2solver(m, t, p, proofs_enabled, models_enabled, unsat_core_enabled, l),
|
||||
mk_smt_solver(m, p, l),
|
||||
p);
|
||||
}
|
||||
};
|
||||
|
||||
solver_factory * mk_smt_strategic_solver_factory(symbol const & logic) {
|
||||
return alloc(smt_strategic_solver_factory, logic);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@ Notes:
|
|||
#ifndef _SMT_STRATEGIC_SOLVER_H_
|
||||
#define _SMT_STRATEGIC_SOLVER_H_
|
||||
|
||||
class solver;
|
||||
// Create a strategic solver for the Z3 API
|
||||
solver * mk_smt_strategic_solver(bool force_tactic=false);
|
||||
class solver_factory;
|
||||
|
||||
solver_factory * mk_smt_strategic_solver_factory(symbol const & logic = symbol::null);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue