3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-09-05 09:37:44 +00:00

Add bitblasting fallback to viable::query

(integration between conflict/viable is still messy)
This commit is contained in:
Jakob Rath 2022-12-16 13:02:54 +01:00
parent 44cb528300
commit afde0e993c
8 changed files with 336 additions and 121 deletions

View file

@ -26,6 +26,12 @@ Author:
namespace polysat {
univariate_solver::dep_vector univariate_solver::unsat_core() {
dep_vector deps;
unsat_core(deps);
return deps;
}
class univariate_bitblast_solver : public univariate_solver {
// TODO: does it make sense to share m and bv between different solver instances?
// TODO: consider pooling solvers to save setup overhead, see if solver/solver_pool.h can be used
@ -33,6 +39,7 @@ namespace polysat {
scoped_ptr<bv_util> bv;
scoped_ptr<solver> s;
unsigned bit_width;
unsigned m_scope_level = 0;
func_decl_ref x_decl;
expr_ref x;
vector<rational> model_cache;
@ -67,15 +74,22 @@ namespace polysat {
}
void push() override {
m_scope_level++;
push_cache();
s->push();
}
void pop(unsigned n) override {
SASSERT(scope_level() >= n);
m_scope_level -= n;
pop_cache();
s->pop(n);
}
unsigned scope_level() override {
return m_scope_level;
}
expr* mk_numeral(rational const& r) const {
return bv->mk_numeral(r, bit_width);
}
@ -198,8 +212,8 @@ namespace polysat {
return s->check_sat();
}
dep_vector unsat_core() override {
dep_vector deps;
void unsat_core(dep_vector& deps) override {
deps.reset();
expr_ref_vector core(m);
s->get_unsat_core(core);
for (expr* a : core) {
@ -207,7 +221,6 @@ namespace polysat {
deps.push_back(dep);
}
SASSERT(deps.size() > 0);
return deps;
}
rational model() override {

View file

@ -39,13 +39,15 @@ namespace polysat {
virtual void push() = 0;
virtual void pop(unsigned n) = 0;
virtual unsigned scope_level() = 0;
virtual lbool check() = 0;
/**
* Precondition: check() returned l_false
*/
virtual dep_vector unsat_core() = 0;
dep_vector unsat_core();
virtual void unsat_core(dep_vector& out_deps) = 0;
/**
* Precondition: check() returned l_true