mirror of
https://github.com/Z3Prover/z3
synced 2025-06-19 20:33:38 +00:00
integrate intblast solver
This commit is contained in:
parent
81411a5fcb
commit
d72938ba9a
4 changed files with 56 additions and 6 deletions
|
@ -233,6 +233,7 @@ namespace intblast {
|
||||||
literals.push_back(a);
|
literals.push_back(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_core.reset();
|
||||||
m_solver = mk_smt2_solver(m, s.params(), symbol::null);
|
m_solver = mk_smt2_solver(m, s.params(), symbol::null);
|
||||||
|
|
||||||
expr_ref_vector es(m);
|
expr_ref_vector es(m);
|
||||||
|
@ -241,11 +242,23 @@ namespace intblast {
|
||||||
|
|
||||||
translate(es);
|
translate(es);
|
||||||
|
|
||||||
for (auto e : es)
|
for (auto const& [src, vi] : m_vars) {
|
||||||
m_solver->assert_expr(e);
|
auto const& [v, b] = vi;
|
||||||
|
m_solver->assert_expr(a.mk_le(a.mk_int(0), v));
|
||||||
|
m_solver->assert_expr(a.mk_lt(v, a.mk_int(b)));
|
||||||
|
}
|
||||||
|
|
||||||
|
lbool r = m_solver->check_sat(es);
|
||||||
|
|
||||||
lbool r = m_solver->check_sat(0, nullptr);
|
if (r == l_false) {
|
||||||
|
expr_ref_vector core(m);
|
||||||
|
m_solver->get_unsat_core(core);
|
||||||
|
obj_map<expr, unsigned> e2index;
|
||||||
|
for (unsigned i = 0; i < es.size(); ++i)
|
||||||
|
e2index.insert(es.get(i), i);
|
||||||
|
for (auto e : core)
|
||||||
|
m_core.push_back(literals[e2index[e]]);
|
||||||
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
};
|
};
|
||||||
|
@ -573,6 +586,7 @@ namespace intblast {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
<<<<<<< HEAD
|
||||||
case OP_EXTRACT: {
|
case OP_EXTRACT: {
|
||||||
unsigned lo, hi;
|
unsigned lo, hi;
|
||||||
expr* old_arg;
|
expr* old_arg;
|
||||||
|
@ -846,6 +860,10 @@ namespace intblast {
|
||||||
set_translated(e, e);
|
set_translated(e, e);
|
||||||
else
|
else
|
||||||
set_translated(e, m.mk_app(e->get_decl(), m_args));
|
set_translated(e, m.mk_app(e->get_decl(), m_args));
|
||||||
|
=======
|
||||||
|
for (unsigned i = 0; i < es.size(); ++i)
|
||||||
|
es[i] = translated[es.get(i)];
|
||||||
|
>>>>>>> 09c2e0dd6 (integrate intblast solver)
|
||||||
}
|
}
|
||||||
|
|
||||||
rational solver::get_value(expr* e) const {
|
rational solver::get_value(expr* e) const {
|
||||||
|
|
|
@ -135,6 +135,8 @@ namespace intblast {
|
||||||
|
|
||||||
void eq_internalized(euf::enode* n) override;
|
void eq_internalized(euf::enode* n) override;
|
||||||
|
|
||||||
|
sat::literal_vector const& unsat_core();
|
||||||
|
|
||||||
rational get_value(expr* e) const;
|
rational get_value(expr* e) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -31,6 +31,8 @@ The result of polysat::core::check is one of:
|
||||||
#include "sat/smt/polysat/polysat_umul_ovfl.h"
|
#include "sat/smt/polysat/polysat_umul_ovfl.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace polysat {
|
namespace polysat {
|
||||||
|
|
||||||
solver::solver(euf::solver& ctx, theory_id id):
|
solver::solver(euf::solver& ctx, theory_id id):
|
||||||
|
@ -38,6 +40,7 @@ namespace polysat {
|
||||||
bv(ctx.get_manager()),
|
bv(ctx.get_manager()),
|
||||||
m_autil(ctx.get_manager()),
|
m_autil(ctx.get_manager()),
|
||||||
m_core(*this),
|
m_core(*this),
|
||||||
|
m_intblast(ctx),
|
||||||
m_lemma(ctx.get_manager())
|
m_lemma(ctx.get_manager())
|
||||||
{
|
{
|
||||||
ctx.get_egraph().add_plugin(alloc(euf::bv_plugin, ctx.get_egraph()));
|
ctx.get_egraph().add_plugin(alloc(euf::bv_plugin, ctx.get_egraph()));
|
||||||
|
@ -56,7 +59,31 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
sat::check_result solver::check() {
|
sat::check_result solver::check() {
|
||||||
return m_core.check();
|
switch (m_core.check()) {
|
||||||
|
case sat::check_result::CR_DONE:
|
||||||
|
return sat::check_result::CR_DONE;
|
||||||
|
case sat::check_result::CR_CONTINUE:
|
||||||
|
return sat::check_result::CR_CONTINUE;
|
||||||
|
case sat::check_result::CR_GIVEUP: {
|
||||||
|
if (!m.inc())
|
||||||
|
return sat::check_result::CR_GIVEUP;
|
||||||
|
switch (m_intblast.check()) {
|
||||||
|
case l_true:
|
||||||
|
trail().push(value_trail(m_use_intblast_model));
|
||||||
|
m_use_intblast_model = true;
|
||||||
|
return sat::check_result::CR_DONE;
|
||||||
|
case l_false: {
|
||||||
|
auto core = m_intblast.unsat_core();
|
||||||
|
for (auto& lit : core)
|
||||||
|
lit.neg();
|
||||||
|
s().add_clause(core.size(), core.data(), sat::status::th(true, get_id(), nullptr));
|
||||||
|
return sat::check_result::CR_CONTINUE;
|
||||||
|
}
|
||||||
|
case l_undef:
|
||||||
|
return sat::check_result::CR_GIVEUP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void solver::asserted(literal l) {
|
void solver::asserted(literal l) {
|
||||||
|
@ -136,6 +163,7 @@ namespace polysat {
|
||||||
|
|
||||||
unsigned num_scopes = s().scope_lvl() - m_lemma_level;
|
unsigned num_scopes = s().scope_lvl() - m_lemma_level;
|
||||||
|
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
// s().pop_reinit(num_scopes);
|
// s().pop_reinit(num_scopes);
|
||||||
|
|
||||||
sat::literal_vector lits;
|
sat::literal_vector lits;
|
||||||
|
|
|
@ -19,6 +19,7 @@ Author:
|
||||||
#include "sat/smt/sat_th.h"
|
#include "sat/smt/sat_th.h"
|
||||||
#include "math/dd/dd_pdd.h"
|
#include "math/dd/dd_pdd.h"
|
||||||
#include "sat/smt/polysat/polysat_core.h"
|
#include "sat/smt/polysat/polysat_core.h"
|
||||||
|
#include "sat/smt/intblast_solver.h"
|
||||||
|
|
||||||
namespace euf {
|
namespace euf {
|
||||||
class solver;
|
class solver;
|
||||||
|
@ -57,7 +58,8 @@ namespace polysat {
|
||||||
arith_util m_autil;
|
arith_util m_autil;
|
||||||
stats m_stats;
|
stats m_stats;
|
||||||
core m_core;
|
core m_core;
|
||||||
polysat_proof m_proof;
|
intblast::solver m_intblast;
|
||||||
|
bool m_use_intblast_model = false;
|
||||||
|
|
||||||
vector<pdd> m_var2pdd; // theory_var 2 pdd
|
vector<pdd> m_var2pdd; // theory_var 2 pdd
|
||||||
bool_vector m_var2pdd_valid; // valid flag
|
bool_vector m_var2pdd_valid; // valid flag
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue