mirror of
https://github.com/Z3Prover/z3
synced 2025-08-15 23:35:26 +00:00
model-add/del
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
3de8c193ea
commit
caaf0ba33c
28 changed files with 271 additions and 251 deletions
|
@ -34,11 +34,9 @@ struct bit_blaster_model_converter : public model_converter {
|
|||
ast_manager & m() const { return m_vars.get_manager(); }
|
||||
|
||||
bit_blaster_model_converter(ast_manager & m, obj_map<func_decl, expr*> const & const2bits):m_vars(m), m_bits(m) {
|
||||
obj_map<func_decl, expr*>::iterator it = const2bits.begin();
|
||||
obj_map<func_decl, expr*>::iterator end = const2bits.end();
|
||||
for (; it != end; ++it) {
|
||||
func_decl * v = it->m_key;
|
||||
expr * bits = it->m_value;
|
||||
for (auto const& kv : const2bits) {
|
||||
func_decl * v = kv.m_key;
|
||||
expr * bits = kv.m_value;
|
||||
SASSERT(!TO_BOOL || is_app_of(bits, m.get_family_id("bv"), OP_MKBV));
|
||||
SASSERT(TO_BOOL || is_app_of(bits, m.get_family_id("bv"), OP_CONCAT));
|
||||
m_vars.push_back(v);
|
||||
|
@ -155,17 +153,11 @@ struct bit_blaster_model_converter : public model_converter {
|
|||
unsigned bv_sz = to_app(bs)->get_num_args();
|
||||
expr_ref_vector args(m());
|
||||
app_ref result(m());
|
||||
for (unsigned j = 0; j < bv_sz; ++j) {
|
||||
expr * bit = to_app(bs)->get_arg(j);
|
||||
for (expr * bit : *to_app(bs)) {
|
||||
SASSERT(is_uninterp_const(bit));
|
||||
func_decl * bit_decl = to_app(bit)->get_decl();
|
||||
expr * bit_val = old_model.get_const_interp(bit_decl);
|
||||
if (bit_val != 0) {
|
||||
args.push_back(bit_val);
|
||||
}
|
||||
else {
|
||||
args.push_back(bit);
|
||||
}
|
||||
args.push_back(bit_val ? bit_val : bit);
|
||||
}
|
||||
|
||||
if (TO_BOOL) {
|
||||
|
@ -194,14 +186,10 @@ struct bit_blaster_model_converter : public model_converter {
|
|||
}
|
||||
|
||||
virtual void display(std::ostream & out) {
|
||||
out << "(bit-blaster-model-converter";
|
||||
unsigned sz = m_vars.size();
|
||||
for (unsigned i = 0; i < sz; i++) {
|
||||
out << "\n (" << m_vars.get(i)->get_name() << " ";
|
||||
unsigned indent = m_vars.get(i)->get_name().size() + 4;
|
||||
out << mk_ismt2_pp(m_bits.get(i), m(), indent) << ")";
|
||||
}
|
||||
out << ")" << std::endl;
|
||||
display_add(out, m(), m_vars.get(i), m_bits.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
|
@ -210,10 +198,10 @@ public:
|
|||
|
||||
virtual model_converter * translate(ast_translation & translator) {
|
||||
bit_blaster_model_converter * res = alloc(bit_blaster_model_converter, translator.to());
|
||||
for (unsigned i = 0; i < m_vars.size(); i++)
|
||||
res->m_vars.push_back(translator(m_vars[i].get()));
|
||||
for (unsigned i = 0; i < m_bits.size(); i++)
|
||||
res->m_bits.push_back(translator(m_bits[i].get()));
|
||||
for (func_decl * v : m_vars)
|
||||
res->m_vars.push_back(translator(v));
|
||||
for (expr* b : m_bits)
|
||||
res->m_bits.push_back(translator(b));
|
||||
return res;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -81,7 +81,7 @@ class bit_blaster_tactic : public tactic {
|
|||
new_pr = m().mk_modus_ponens(pr, new_pr);
|
||||
}
|
||||
if (curr != new_curr) {
|
||||
change = true;
|
||||
change = true;
|
||||
TRACE("bit_blaster", tout << mk_pp(curr, m()) << " -> " << mk_pp(new_curr, m()) << "\n";);
|
||||
g->update(idx, new_curr, new_pr, g->dep(idx));
|
||||
}
|
||||
|
|
|
@ -29,11 +29,13 @@ public:
|
|||
converter():m_ref_count(0) {}
|
||||
virtual ~converter() {}
|
||||
|
||||
void inc_ref() { ++m_ref_count; }
|
||||
void inc_ref() { ++m_ref_count; std::cout << "inc_ref " << m_ref_count << " " << this << "\n"; }
|
||||
void dec_ref() {
|
||||
--m_ref_count;
|
||||
if (m_ref_count == 0)
|
||||
dealloc(this);
|
||||
if (m_ref_count == 0) {
|
||||
std::cout << "dec_ref " << this << "\n";
|
||||
dealloc(this);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void cancel() {}
|
||||
|
|
|
@ -62,7 +62,14 @@ void filter_model_converter::display(std::ostream & out) {
|
|||
|
||||
model_converter * filter_model_converter::translate(ast_translation & translator) {
|
||||
filter_model_converter * res = alloc(filter_model_converter, translator.to());
|
||||
for (unsigned i = 0; i < m_decls.size(); i++)
|
||||
res->m_decls.push_back(translator(m_decls[i].get()));
|
||||
for (func_decl* f : m_decls)
|
||||
res->m_decls.push_back(translator(f));
|
||||
return res;
|
||||
}
|
||||
|
||||
void filter_model_converter::collect(ast_pp_util& visitor) {
|
||||
m_env = &visitor.env();
|
||||
std::cout << "collect filter: " << m_decls.size() << "\n";
|
||||
for (func_decl* f : m_decls) visitor.coll.visit_func(f);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ Notes:
|
|||
#define FILTER_MODEL_CONVERTER_H_
|
||||
|
||||
#include "tactic/model_converter.h"
|
||||
#include "ast/ast_pp_util.h"
|
||||
|
||||
class filter_model_converter : public model_converter {
|
||||
func_decl_ref_vector m_decls;
|
||||
|
@ -37,7 +38,7 @@ public:
|
|||
virtual void operator()(model_ref & md) { operator()(md, 0); } // TODO: delete
|
||||
|
||||
virtual void cancel() {}
|
||||
|
||||
|
||||
virtual void display(std::ostream & out);
|
||||
|
||||
void insert(func_decl * d) {
|
||||
|
@ -45,6 +46,9 @@ public:
|
|||
}
|
||||
|
||||
virtual model_converter * translate(ast_translation & translator);
|
||||
|
||||
virtual void collect(ast_pp_util& visitor);
|
||||
|
||||
};
|
||||
|
||||
typedef ref<filter_model_converter> filter_model_converter_ref;
|
||||
|
|
|
@ -24,26 +24,16 @@ Notes:
|
|||
* Add or overwrite value in model.
|
||||
*/
|
||||
void model_converter::display_add(std::ostream& out, ast_manager& m, func_decl* f, expr* e) const {
|
||||
// TBD: for arity > 0, requires signature of arguments.
|
||||
if (m_env) {
|
||||
ast_smt2_pp(out, f, e, *m_env, params_ref(), 0, "model-add");
|
||||
}
|
||||
else {
|
||||
unsigned indent = f->get_name().size() + 4;
|
||||
out << "(model-add " << f->get_name() << " " << mk_ismt2_pp(e, m, indent) << ")\n";
|
||||
}
|
||||
VERIFY(m_env);
|
||||
ast_smt2_pp(out, f, e, *m_env, params_ref(), 0, "model-add") << "\n";
|
||||
}
|
||||
|
||||
/*
|
||||
* A value is removed from the model.
|
||||
*/
|
||||
void model_converter::display_del(std::ostream& out, func_decl* f) const {
|
||||
if (m_env) {
|
||||
ast_smt2_pp(out, f, *m_env, params_ref(), 0, "model-del");
|
||||
}
|
||||
else {
|
||||
out << "(model-del " << f->get_name() << ")\n";
|
||||
}
|
||||
VERIFY(m_env);
|
||||
ast_smt2_pp(out << "(model-del ", f->get_name(), f->is_skolem(), *m_env) << ")\n";
|
||||
}
|
||||
|
||||
void model_converter::display_add(std::ostream& out, ast_manager& m) {
|
||||
|
@ -64,7 +54,9 @@ void model_converter::display_add(std::ostream& out, ast_manager& m) {
|
|||
|
||||
class concat_model_converter : public concat_converter<model_converter> {
|
||||
public:
|
||||
concat_model_converter(model_converter * mc1, model_converter * mc2): concat_converter<model_converter>(mc1, mc2) {}
|
||||
concat_model_converter(model_converter * mc1, model_converter * mc2): concat_converter<model_converter>(mc1, mc2) {
|
||||
VERIFY(m_c1 && m_c2);
|
||||
}
|
||||
|
||||
virtual void operator()(model_ref & m) {
|
||||
this->m_c2->operator()(m);
|
||||
|
@ -86,6 +78,11 @@ public:
|
|||
virtual model_converter * translate(ast_translation & translator) {
|
||||
return this->translate_core<concat_model_converter>(translator);
|
||||
}
|
||||
|
||||
virtual void collect(ast_pp_util& visitor) {
|
||||
this->m_c1->collect(visitor);
|
||||
this->m_c2->collect(visitor);
|
||||
}
|
||||
};
|
||||
|
||||
model_converter * concat(model_converter * mc1, model_converter * mc2) {
|
||||
|
|
|
@ -19,6 +19,7 @@ Notes:
|
|||
#ifndef MODEL_CONVERTER_H_
|
||||
#define MODEL_CONVERTER_H_
|
||||
|
||||
#include "ast/ast_pp_util.h"
|
||||
#include "model/model.h"
|
||||
#include "tactic/converter.h"
|
||||
#include "util/ref.h"
|
||||
|
@ -48,8 +49,8 @@ public:
|
|||
|
||||
|
||||
virtual model_converter * translate(ast_translation & translator) = 0;
|
||||
|
||||
void set_pp_env(smt2_pp_environment* env) { m_env = env; }
|
||||
|
||||
virtual void collect(ast_pp_util& visitor) { m_env = &visitor.env(); }
|
||||
};
|
||||
|
||||
typedef ref<model_converter> model_converter_ref;
|
||||
|
|
|
@ -157,6 +157,7 @@ public:
|
|||
filter_model(mdl);
|
||||
}
|
||||
}
|
||||
virtual model_converter_ref get_model_converter() const { return m_solver->get_model_converter(); }
|
||||
virtual proof * get_proof() { return m_solver->get_proof(); }
|
||||
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
||||
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
||||
|
|
|
@ -102,6 +102,7 @@ public:
|
|||
filter_model(mdl);
|
||||
}
|
||||
}
|
||||
virtual model_converter_ref get_model_converter() const { return m_solver->get_model_converter(); }
|
||||
virtual proof * get_proof() { return m_solver->get_proof(); }
|
||||
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
||||
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
||||
|
|
|
@ -93,6 +93,7 @@ public:
|
|||
filter_model(mdl);
|
||||
}
|
||||
}
|
||||
virtual model_converter_ref get_model_converter() const { return m_solver->get_model_converter(); }
|
||||
virtual proof * get_proof() { return m_solver->get_proof(); }
|
||||
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
||||
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue