mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 09:35:32 +00:00
implementing model updates
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
92b5301b7f
commit
3de8c193ea
63 changed files with 482 additions and 294 deletions
|
@ -53,7 +53,7 @@ void simple_check_sat_result::get_unsat_core(ptr_vector<expr> & r) {
|
|||
r.append(m_core.size(), m_core.c_ptr());
|
||||
}
|
||||
|
||||
void simple_check_sat_result::get_model(model_ref & m) {
|
||||
void simple_check_sat_result::get_model_core(model_ref & m) {
|
||||
if (m_status != l_false)
|
||||
m = m_model;
|
||||
else
|
||||
|
|
|
@ -23,6 +23,7 @@ Notes:
|
|||
#include "util/lbool.h"
|
||||
#include "util/statistics.h"
|
||||
#include "util/event_handler.h"
|
||||
#include "tactic/model_converter.h"
|
||||
|
||||
/**
|
||||
\brief Abstract interface for the result of a (check-sat) like command.
|
||||
|
@ -40,6 +41,7 @@ class check_sat_result {
|
|||
protected:
|
||||
unsigned m_ref_count;
|
||||
lbool m_status;
|
||||
model_converter_ref m_mc0;
|
||||
public:
|
||||
check_sat_result():m_ref_count(0), m_status(l_undef) {}
|
||||
virtual ~check_sat_result() {}
|
||||
|
@ -54,7 +56,13 @@ public:
|
|||
get_unsat_core(core);
|
||||
r.append(core.size(), core.c_ptr());
|
||||
}
|
||||
virtual void get_model(model_ref & m) = 0;
|
||||
void set_model_converter(model_converter* mc) { m_mc0 = mc; }
|
||||
model_converter* mc0() { return m_mc0.get(); }
|
||||
virtual void get_model_core(model_ref & m) = 0;
|
||||
void get_model(model_ref & m) {
|
||||
get_model_core(m);
|
||||
if (m && mc0()) (*mc0())(m);
|
||||
}
|
||||
virtual proof * get_proof() = 0;
|
||||
virtual std::string reason_unknown() const = 0;
|
||||
virtual void set_reason_unknown(char const* msg) = 0;
|
||||
|
@ -80,7 +88,7 @@ struct simple_check_sat_result : public check_sat_result {
|
|||
virtual ast_manager& get_manager() const { return m_proof.get_manager(); }
|
||||
virtual void collect_statistics(statistics & st) const;
|
||||
virtual void get_unsat_core(ptr_vector<expr> & r);
|
||||
virtual void get_model(model_ref & m);
|
||||
virtual void get_model_core(model_ref & m);
|
||||
virtual proof * get_proof();
|
||||
virtual std::string reason_unknown() const;
|
||||
virtual void get_labels(svector<symbol> & r);
|
||||
|
|
|
@ -307,7 +307,7 @@ public:
|
|||
m_solver2->get_unsat_core(r);
|
||||
}
|
||||
|
||||
virtual void get_model(model_ref & m) {
|
||||
virtual void get_model_core(model_ref & m) {
|
||||
if (m_use_solver1_results)
|
||||
m_solver1->get_model(m);
|
||||
else
|
||||
|
|
|
@ -22,6 +22,7 @@ Notes:
|
|||
#include "ast/ast_pp.h"
|
||||
#include "ast/ast_pp_util.h"
|
||||
#include "util/common_msgs.h"
|
||||
#include "tactic/model_converter.h"
|
||||
|
||||
|
||||
unsigned solver::get_num_assertions() const {
|
||||
|
@ -41,6 +42,11 @@ std::ostream& solver::display(std::ostream & out) const {
|
|||
visitor.collect(fmls);
|
||||
visitor.display_decls(out);
|
||||
visitor.display_asserts(out, fmls, true);
|
||||
model_converter_ref mc = get_model_converter();
|
||||
if (mc.get()) {
|
||||
mc->set_pp_env(&visitor.env());
|
||||
mc->display(out);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ Notes:
|
|||
#include "util/params.h"
|
||||
|
||||
class solver;
|
||||
class model_converter;
|
||||
|
||||
class solver_factory {
|
||||
public:
|
||||
|
@ -184,25 +185,17 @@ public:
|
|||
|
||||
virtual expr_ref cube() = 0;
|
||||
|
||||
#if 0
|
||||
/**
|
||||
\brief extract a lookahead candidates for branching.
|
||||
*/
|
||||
|
||||
virtual expr_ref lookahead(expr_ref_vector const& assumptions, expr_ref_vector const& candidates) = 0;
|
||||
|
||||
|
||||
/**
|
||||
\brief extract learned lemmas.
|
||||
*/
|
||||
virtual void get_lemmas(expr_ref_vector& lemmas) {}
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief Display the content of this solver.
|
||||
*/
|
||||
virtual std::ostream& display(std::ostream & out) const;
|
||||
|
||||
/**
|
||||
\brief expose model converter when solver produces partially reduced set of assertions.
|
||||
*/
|
||||
|
||||
virtual model_converter_ref get_model_converter() const { return m_mc0; }
|
||||
|
||||
class scoped_push {
|
||||
solver& s;
|
||||
bool m_nopop;
|
||||
|
|
|
@ -122,6 +122,7 @@ public:
|
|||
local_solver->get_model(mdl);
|
||||
mc = model2model_converter(mdl.get());
|
||||
mc = concat(fmc.get(), mc.get());
|
||||
mc = concat(local_solver->mc0(), mc.get());
|
||||
}
|
||||
in->reset();
|
||||
result.push_back(in.get());
|
||||
|
@ -150,14 +151,8 @@ public:
|
|||
if (m.canceled()) {
|
||||
throw tactic_exception(Z3_CANCELED_MSG);
|
||||
}
|
||||
if (in->models_enabled()) {
|
||||
model_ref mdl;
|
||||
local_solver->get_model(mdl);
|
||||
if (mdl) {
|
||||
mc = model2model_converter(mdl.get());
|
||||
mc = concat(fmc.get(), mc.get());
|
||||
}
|
||||
}
|
||||
mc = local_solver->get_model_converter();
|
||||
mc = concat(fmc.get(), mc.get());
|
||||
in->reset();
|
||||
unsigned sz = local_solver->get_num_assertions();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
|
|
|
@ -36,6 +36,7 @@ class tactic2solver : public solver_na2as {
|
|||
unsigned_vector m_scopes;
|
||||
ref<simple_check_sat_result> m_result;
|
||||
tactic_ref m_tactic;
|
||||
ref<model_converter> m_mc;
|
||||
symbol m_logic;
|
||||
params_ref m_params;
|
||||
bool m_produce_models;
|
||||
|
@ -64,7 +65,7 @@ public:
|
|||
|
||||
virtual void collect_statistics(statistics & st) const;
|
||||
virtual void get_unsat_core(ptr_vector<expr> & r);
|
||||
virtual void get_model(model_ref & m);
|
||||
virtual void get_model_core(model_ref & m);
|
||||
virtual proof * get_proof();
|
||||
virtual std::string reason_unknown() const;
|
||||
virtual void set_reason_unknown(char const* msg);
|
||||
|
@ -82,6 +83,8 @@ public:
|
|||
return expr_ref(m.mk_true(), m);
|
||||
}
|
||||
|
||||
virtual model_converter* get_model_converter() { return m_mc.get(); }
|
||||
|
||||
};
|
||||
|
||||
ast_manager& tactic2solver::get_manager() const { return m_assertions.get_manager(); }
|
||||
|
@ -153,12 +156,12 @@ lbool tactic2solver::check_sat_core(unsigned num_assumptions, expr * const * ass
|
|||
}
|
||||
|
||||
model_ref md;
|
||||
proof_ref pr(m);
|
||||
proof_ref pr(m);
|
||||
expr_dependency_ref core(m);
|
||||
std::string reason_unknown = "unknown";
|
||||
labels_vec labels;
|
||||
try {
|
||||
switch (::check_sat(*m_tactic, g, md, labels, pr, core, reason_unknown)) {
|
||||
switch (::check_sat(*m_tactic, g, md, m_mc, labels, pr, core, reason_unknown)) {
|
||||
case l_true:
|
||||
m_result->set_status(l_true);
|
||||
break;
|
||||
|
@ -226,9 +229,9 @@ void tactic2solver::get_unsat_core(ptr_vector<expr> & r) {
|
|||
}
|
||||
}
|
||||
|
||||
void tactic2solver::get_model(model_ref & m) {
|
||||
void tactic2solver::get_model_core(model_ref & m) {
|
||||
if (m_result.get())
|
||||
m_result->get_model(m);
|
||||
m_result->get_model_core(m);
|
||||
}
|
||||
|
||||
proof * tactic2solver::get_proof() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue