3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 17:45:32 +00:00

enable incremental bit-vector solving

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2015-09-01 09:48:35 -07:00
parent 0ed38ed59b
commit cc5d719d9e
15 changed files with 208 additions and 55 deletions

View file

@ -98,6 +98,11 @@ struct bit_blaster_model_converter : public model_converter {
SASSERT(m_vars.size() == m_bits.size());
unsigned sz = m_vars.size();
for (unsigned i = 0; i < sz; i++) {
expr* new_val = old_model->get_const_interp(m_vars.get(i));
if (new_val) {
new_model->register_decl(m_vars.get(i), new_val);
continue;
}
expr * bs = m_bits.get(i);
val.reset();
unsigned bv_sz = to_app(bs)->get_num_args();
@ -132,7 +137,7 @@ struct bit_blaster_model_converter : public model_converter {
val++;
}
}
expr * new_val = util.mk_numeral(val, bv_sz);
new_val = util.mk_numeral(val, bv_sz);
new_model->register_decl(m_vars.get(i), new_val);
}
}

View file

@ -25,13 +25,16 @@ Notes:
class bit_blaster_tactic : public tactic {
struct imp {
bit_blaster_rewriter m_rewriter;
unsigned m_num_steps;
bool m_blast_quant;
imp(ast_manager & m, params_ref const & p):
m_rewriter(m, p) {
struct imp {
bit_blaster_rewriter m_base_rewriter;
bit_blaster_rewriter* m_rewriter;
unsigned m_num_steps;
bool m_blast_quant;
imp(ast_manager & m, bit_blaster_rewriter* rw, params_ref const & p):
m_base_rewriter(m, p),
m_rewriter(rw?rw:&m_base_rewriter) {
updt_params(p);
}
@ -40,14 +43,14 @@ class bit_blaster_tactic : public tactic {
}
void updt_params(params_ref const & p) {
m_rewriter.updt_params(p);
m_rewriter->updt_params(p);
updt_params_core(p);
}
ast_manager & m() const { return m_rewriter.m(); }
ast_manager & m() const { return m_rewriter->m(); }
void set_cancel(bool f) {
m_rewriter.set_cancel(f);
m_rewriter->set_cancel(f);
}
void operator()(goal_ref const & g,
@ -74,8 +77,8 @@ class bit_blaster_tactic : public tactic {
if (g->inconsistent())
break;
expr * curr = g->form(idx);
m_rewriter(curr, new_curr, new_pr);
m_num_steps += m_rewriter.get_num_steps();
(*m_rewriter)(curr, new_curr, new_pr);
m_num_steps += m_rewriter->get_num_steps();
if (proofs_enabled) {
proof * pr = g->pr(idx);
new_pr = m().mk_modus_ponens(pr, new_pr);
@ -88,29 +91,32 @@ class bit_blaster_tactic : public tactic {
}
if (change && g->models_enabled())
mc = mk_bit_blaster_model_converter(m(), m_rewriter.const2bits());
mc = mk_bit_blaster_model_converter(m(), m_rewriter->const2bits());
else
mc = 0;
g->inc_depth();
result.push_back(g.get());
TRACE("after_bit_blaster", g->display(tout); if (mc) mc->display(tout); tout << "\n";);
m_rewriter.cleanup();
m_rewriter->cleanup();
}
unsigned get_num_steps() const { return m_num_steps; }
};
imp * m_imp;
bit_blaster_rewriter* m_rewriter;
params_ref m_params;
public:
bit_blaster_tactic(ast_manager & m, params_ref const & p):
m_params(p){
m_imp = alloc(imp, m, p);
bit_blaster_tactic(ast_manager & m, bit_blaster_rewriter* rw, params_ref const & p):
m_rewriter(rw),
m_params(p) {
m_imp = alloc(imp, m, m_rewriter, p);
}
virtual tactic * translate(ast_manager & m) {
return alloc(bit_blaster_tactic, m, m_params);
SASSERT(!m_rewriter); // assume translation isn't used where rewriter is external.
return alloc(bit_blaster_tactic, m, 0, m_params);
}
virtual ~bit_blaster_tactic() {
@ -145,7 +151,7 @@ public:
}
virtual void cleanup() {
imp * d = alloc(imp, m_imp->m(), m_params);
imp * d = alloc(imp, m_imp->m(), m_rewriter, m_params);
#pragma omp critical (tactic_cancel)
{
std::swap(d, m_imp);
@ -166,5 +172,9 @@ protected:
tactic * mk_bit_blaster_tactic(ast_manager & m, params_ref const & p) {
return clean(alloc(bit_blaster_tactic, m, p));
return clean(alloc(bit_blaster_tactic, m, 0, p));
}
tactic * mk_bit_blaster_tactic(ast_manager & m, bit_blaster_rewriter* rw, params_ref const & p) {
return clean(alloc(bit_blaster_tactic, m, rw, p));
}

View file

@ -20,10 +20,12 @@ Notes:
#define BIT_BLASTER_TACTIC_H_
#include"params.h"
#include"bit_blaster_rewriter.h"
class ast_manager;
class tactic;
tactic * mk_bit_blaster_tactic(ast_manager & m, params_ref const & p = params_ref());
tactic * mk_bit_blaster_tactic(ast_manager & m, bit_blaster_rewriter* rw, params_ref const & p = params_ref());
/*
ADD_TACTIC("bit-blast", "reduce bit-vector expressions into SAT.", "mk_bit_blaster_tactic(m, p)")
*/

View file

@ -92,7 +92,7 @@ tactic * mk_tactic_for_logic(ast_manager & m, params_ref const & p, symbol const
return mk_default_tactic(m, p);
}
solver* mk_solver_for_logic(ast_manager & m, params_ref const & p, symbol const& logic) {
static solver* mk_solver_for_logic(ast_manager & m, params_ref const & p, symbol const& logic) {
if (logic == "QF_BV")
return mk_inc_sat_solver(m, p);
return mk_smt_solver(m, p, logic);
@ -112,8 +112,8 @@ public:
l = logic;
tactic * t = mk_tactic_for_logic(m, p, l);
return mk_combined_solver(mk_tactic2solver(m, t, p, proofs_enabled, models_enabled, unsat_core_enabled, l),
//mk_solver_for_logic(m, p, l),
mk_smt_solver(m, p, l),
mk_solver_for_logic(m, p, l),
//mk_smt_solver(m, p, l),
p);
}
};