mirror of
https://github.com/Z3Prover/z3
synced 2025-06-12 09:03:26 +00:00
add stubs for converting assertions, consolidate filter_model_converter
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
53e36c9cf9
commit
0d15b6abb7
76 changed files with 244 additions and 356 deletions
|
@ -1883,7 +1883,7 @@ namespace z3 {
|
||||||
bool is_uint(unsigned i) const { Z3_bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r != 0; }
|
bool is_uint(unsigned i) const { Z3_bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r != 0; }
|
||||||
bool is_double(unsigned i) const { Z3_bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r != 0; }
|
bool is_double(unsigned i) const { Z3_bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r != 0; }
|
||||||
unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
|
unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
|
||||||
double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
|
double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
|
||||||
friend std::ostream & operator<<(std::ostream & out, stats const & s);
|
friend std::ostream & operator<<(std::ostream & out, stats const & s);
|
||||||
};
|
};
|
||||||
inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
|
inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
|
||||||
|
|
|
@ -41,7 +41,7 @@ Revision History:
|
||||||
#include "ast/rewriter/expr_replacer.h"
|
#include "ast/rewriter/expr_replacer.h"
|
||||||
#include "ast/rewriter/bool_rewriter.h"
|
#include "ast/rewriter/bool_rewriter.h"
|
||||||
#include "ast/rewriter/expr_safe_replace.h"
|
#include "ast/rewriter/expr_safe_replace.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/scoped_proof.h"
|
#include "ast/scoped_proof.h"
|
||||||
#include "ast/datatype_decl_plugin.h"
|
#include "ast/datatype_decl_plugin.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
|
@ -326,8 +326,8 @@ namespace datalog {
|
||||||
rules.set_output_predicate(qpred);
|
rules.set_output_predicate(qpred);
|
||||||
|
|
||||||
if (m_ctx.get_model_converter()) {
|
if (m_ctx.get_model_converter()) {
|
||||||
filter_model_converter* mc = alloc(filter_model_converter, m);
|
generic_model_converter* mc = alloc(generic_model_converter, m);
|
||||||
mc->insert(qpred);
|
mc->hide(qpred);
|
||||||
m_ctx.add_model_converter(mc);
|
m_ctx.add_model_converter(mc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ Revision History:
|
||||||
#include "ast/rewriter/expr_replacer.h"
|
#include "ast/rewriter/expr_replacer.h"
|
||||||
#include "muz/base/dl_rule_transformer.h"
|
#include "muz/base/dl_rule_transformer.h"
|
||||||
#include "muz/transforms/dl_mk_slice.h"
|
#include "muz/transforms/dl_mk_slice.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "muz/transforms/dl_transforms.h"
|
#include "muz/transforms/dl_transforms.h"
|
||||||
#include "muz/base/fixedpoint_params.hpp"
|
#include "muz/base/fixedpoint_params.hpp"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
|
@ -229,8 +229,8 @@ class horn_tactic : public tactic {
|
||||||
}
|
}
|
||||||
queries.reset();
|
queries.reset();
|
||||||
queries.push_back(q);
|
queries.push_back(q);
|
||||||
filter_model_converter* mc1 = alloc(filter_model_converter, m);
|
generic_model_converter* mc1 = alloc(generic_model_converter, m);
|
||||||
mc1->insert(to_app(q)->get_decl());
|
mc1->hide(q);
|
||||||
mc = mc1;
|
mc = mc1;
|
||||||
}
|
}
|
||||||
SASSERT(queries.size() == 1);
|
SASSERT(queries.size() == 1);
|
||||||
|
|
|
@ -112,10 +112,10 @@ public:
|
||||||
{m_solver.collect_param_descrs(r);}
|
{m_solver.collect_param_descrs(r);}
|
||||||
virtual void set_produce_models(bool f)
|
virtual void set_produce_models(bool f)
|
||||||
{m_solver.set_produce_models(f);}
|
{m_solver.set_produce_models(f);}
|
||||||
virtual void assert_expr(expr *t)
|
virtual void assert_expr_core(expr *t)
|
||||||
{m_solver.assert_expr(t);}
|
{m_solver.assert_expr(t);}
|
||||||
|
|
||||||
virtual void assert_expr(expr *t, expr *a)
|
virtual void assert_expr_core(expr *t, expr *a)
|
||||||
{NOT_IMPLEMENTED_YET();}
|
{NOT_IMPLEMENTED_YET();}
|
||||||
virtual void assert_lemma(expr* e) { NOT_IMPLEMENTED_YET(); }
|
virtual void assert_lemma(expr* e) { NOT_IMPLEMENTED_YET(); }
|
||||||
virtual expr_ref lookahead(const expr_ref_vector &,const expr_ref_vector &) { return expr_ref(m.mk_true(), m); }
|
virtual expr_ref lookahead(const expr_ref_vector &,const expr_ref_vector &) { return expr_ref(m.mk_true(), m); }
|
||||||
|
|
|
@ -50,7 +50,7 @@ virtual_solver::virtual_solver(virtual_solver_factory &factory,
|
||||||
// -- change m_context, but will add m_pred to
|
// -- change m_context, but will add m_pred to
|
||||||
// -- the private field solver_na2as::m_assumptions
|
// -- the private field solver_na2as::m_assumptions
|
||||||
if (m_virtual)
|
if (m_virtual)
|
||||||
{ solver_na2as::assert_expr(m.mk_true(), m_pred); }
|
{ solver_na2as::assert_expr_core(m.mk_true(), m_pred); }
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual_solver::~virtual_solver()
|
virtual_solver::~virtual_solver()
|
||||||
|
@ -210,7 +210,7 @@ void virtual_solver::get_unsat_core(ptr_vector<expr> &r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void virtual_solver::assert_expr(expr *e)
|
void virtual_solver::assert_expr_core(expr *e)
|
||||||
{
|
{
|
||||||
SASSERT(!m_pushed || get_scope_level() > 0);
|
SASSERT(!m_pushed || get_scope_level() > 0);
|
||||||
if (m.is_true(e)) { return; }
|
if (m.is_true(e)) { return; }
|
||||||
|
|
|
@ -78,7 +78,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void get_unsat_core(ptr_vector<expr> &r);
|
virtual void get_unsat_core(ptr_vector<expr> &r);
|
||||||
virtual void assert_expr(expr *e);
|
virtual void assert_expr_core(expr *e);
|
||||||
virtual void collect_statistics(statistics &st) const {}
|
virtual void collect_statistics(statistics &st) const {}
|
||||||
virtual void get_model_core(model_ref &m) {m_context.get_model(m);}
|
virtual void get_model_core(model_ref &m) {m_context.get_model(m);}
|
||||||
virtual proof* get_proof();
|
virtual proof* get_proof();
|
||||||
|
|
|
@ -22,7 +22,7 @@ Revision History:
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
#include "ast/rewriter/expr_safe_replace.h"
|
#include "ast/rewriter/expr_safe_replace.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "muz/transforms/dl_mk_interp_tail_simplifier.h"
|
#include "muz/transforms/dl_mk_interp_tail_simplifier.h"
|
||||||
#include "muz/base/fixedpoint_params.hpp"
|
#include "muz/base/fixedpoint_params.hpp"
|
||||||
#include "ast/scoped_proof.h"
|
#include "ast/scoped_proof.h"
|
||||||
|
@ -299,12 +299,12 @@ namespace datalog {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_context.get_model_converter()) {
|
if (m_context.get_model_converter()) {
|
||||||
filter_model_converter* fmc = alloc(filter_model_converter, m);
|
generic_model_converter* fmc = alloc(generic_model_converter, m);
|
||||||
bit_blast_model_converter* bvmc = alloc(bit_blast_model_converter, m);
|
bit_blast_model_converter* bvmc = alloc(bit_blast_model_converter, m);
|
||||||
func_decl_ref_vector const& old_funcs = m_rewriter.m_cfg.old_funcs();
|
func_decl_ref_vector const& old_funcs = m_rewriter.m_cfg.old_funcs();
|
||||||
func_decl_ref_vector const& new_funcs = m_rewriter.m_cfg.new_funcs();
|
func_decl_ref_vector const& new_funcs = m_rewriter.m_cfg.new_funcs();
|
||||||
for (unsigned i = 0; i < old_funcs.size(); ++i) {
|
for (unsigned i = 0; i < old_funcs.size(); ++i) {
|
||||||
fmc->insert(new_funcs[i]);
|
fmc->hide(new_funcs[i]);
|
||||||
bvmc->insert(old_funcs[i], new_funcs[i]);
|
bvmc->insert(old_funcs[i], new_funcs[i]);
|
||||||
}
|
}
|
||||||
m_context.add_model_converter(concat(bvmc, fmc));
|
m_context.add_model_converter(concat(bvmc, fmc));
|
||||||
|
|
|
@ -105,7 +105,7 @@ namespace opt {
|
||||||
|
|
||||||
app* maxsmt_solver_base::mk_fresh_bool(char const* name) {
|
app* maxsmt_solver_base::mk_fresh_bool(char const* name) {
|
||||||
app* result = m.mk_fresh_const(name, m.mk_bool_sort());
|
app* result = m.mk_fresh_const(name, m.mk_bool_sort());
|
||||||
m_c.fm().insert(result->get_decl());
|
m_c.fm().hide(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@ Notes:
|
||||||
#include "ast/ast.h"
|
#include "ast/ast.h"
|
||||||
#include "util/params.h"
|
#include "util/params.h"
|
||||||
#include "solver/solver.h"
|
#include "solver/solver.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "util/statistics.h"
|
#include "util/statistics.h"
|
||||||
#include "smt/smt_context.h"
|
#include "smt/smt_context.h"
|
||||||
#include "smt/smt_theory.h"
|
#include "smt/smt_theory.h"
|
||||||
|
|
|
@ -40,7 +40,7 @@ Notes:
|
||||||
#include "ast/bv_decl_plugin.h"
|
#include "ast/bv_decl_plugin.h"
|
||||||
#include "ast/pb_decl_plugin.h"
|
#include "ast/pb_decl_plugin.h"
|
||||||
#include "ast/ast_smt_pp.h"
|
#include "ast/ast_smt_pp.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/ast_pp_util.h"
|
#include "ast/ast_pp_util.h"
|
||||||
#include "qe/qsat.h"
|
#include "qe/qsat.h"
|
||||||
|
|
||||||
|
@ -1021,7 +1021,7 @@ namespace opt {
|
||||||
}
|
}
|
||||||
|
|
||||||
void context::purify(app_ref& term) {
|
void context::purify(app_ref& term) {
|
||||||
filter_model_converter_ref fm;
|
generic_model_converter_ref fm;
|
||||||
if (m_arith.is_add(term)) {
|
if (m_arith.is_add(term)) {
|
||||||
expr_ref_vector args(m);
|
expr_ref_vector args(m);
|
||||||
unsigned sz = term->get_num_args();
|
unsigned sz = term->get_num_args();
|
||||||
|
@ -1058,13 +1058,13 @@ namespace opt {
|
||||||
(m_arith.is_mul(e, e2, e1) && m_arith.is_numeral(e1) && is_uninterp_const(e2));
|
(m_arith.is_mul(e, e2, e1) && m_arith.is_numeral(e1) && is_uninterp_const(e2));
|
||||||
}
|
}
|
||||||
|
|
||||||
app* context::purify(filter_model_converter_ref& fm, expr* term) {
|
app* context::purify(generic_model_converter_ref& fm, expr* term) {
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << mk_pp(term, m);
|
out << mk_pp(term, m);
|
||||||
app* q = m.mk_fresh_const(out.str().c_str(), m.get_sort(term));
|
app* q = m.mk_fresh_const(out.str().c_str(), m.get_sort(term));
|
||||||
if (!fm) fm = alloc(filter_model_converter, m);
|
if (!fm) fm = alloc(generic_model_converter, m);
|
||||||
m_hard_constraints.push_back(m.mk_eq(q, term));
|
m_hard_constraints.push_back(m.mk_eq(q, term));
|
||||||
fm->insert(q->get_decl());
|
fm->hide(q);
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1075,7 +1075,7 @@ namespace opt {
|
||||||
- filter "obj" from generated model.
|
- filter "obj" from generated model.
|
||||||
*/
|
*/
|
||||||
void context::mk_atomic(expr_ref_vector& terms) {
|
void context::mk_atomic(expr_ref_vector& terms) {
|
||||||
filter_model_converter_ref fm;
|
generic_model_converter_ref fm;
|
||||||
for (unsigned i = 0; i < terms.size(); ++i) {
|
for (unsigned i = 0; i < terms.size(); ++i) {
|
||||||
expr_ref p(terms[i].get(), m);
|
expr_ref p(terms[i].get(), m);
|
||||||
app_ref q(m);
|
app_ref q(m);
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace opt {
|
||||||
|
|
||||||
class maxsat_context {
|
class maxsat_context {
|
||||||
public:
|
public:
|
||||||
virtual filter_model_converter& fm() = 0; // converter that removes fresh names introduced by simplification.
|
virtual generic_model_converter& fm() = 0; // converter that removes fresh names introduced by simplification.
|
||||||
virtual bool sat_enabled() const = 0; // is using th SAT solver core enabled?
|
virtual bool sat_enabled() const = 0; // is using th SAT solver core enabled?
|
||||||
virtual solver& get_solver() = 0; // retrieve solver object (SAT or SMT solver)
|
virtual solver& get_solver() = 0; // retrieve solver object (SAT or SMT solver)
|
||||||
virtual ast_manager& get_manager() const = 0;
|
virtual ast_manager& get_manager() const = 0;
|
||||||
|
@ -155,7 +155,7 @@ namespace opt {
|
||||||
vector<objective> m_objectives;
|
vector<objective> m_objectives;
|
||||||
model_ref m_model;
|
model_ref m_model;
|
||||||
model_converter_ref m_model_converter;
|
model_converter_ref m_model_converter;
|
||||||
filter_model_converter m_fm;
|
generic_model_converter m_fm;
|
||||||
obj_map<func_decl, unsigned> m_objective_fns;
|
obj_map<func_decl, unsigned> m_objective_fns;
|
||||||
obj_map<func_decl, expr*> m_objective_orig;
|
obj_map<func_decl, expr*> m_objective_orig;
|
||||||
func_decl_ref_vector m_objective_refs;
|
func_decl_ref_vector m_objective_refs;
|
||||||
|
@ -219,7 +219,7 @@ namespace opt {
|
||||||
virtual expr_ref mk_le(unsigned i, model_ref& model);
|
virtual expr_ref mk_le(unsigned i, model_ref& model);
|
||||||
|
|
||||||
virtual smt::context& smt_context() { return m_opt_solver->get_context(); }
|
virtual smt::context& smt_context() { return m_opt_solver->get_context(); }
|
||||||
virtual filter_model_converter& fm() { return m_fm; }
|
virtual generic_model_converter& fm() { return m_fm; }
|
||||||
virtual bool sat_enabled() const { return 0 != m_sat_solver.get(); }
|
virtual bool sat_enabled() const { return 0 != m_sat_solver.get(); }
|
||||||
virtual solver& get_solver();
|
virtual solver& get_solver();
|
||||||
virtual ast_manager& get_manager() const { return this->m; }
|
virtual ast_manager& get_manager() const { return this->m; }
|
||||||
|
@ -253,7 +253,7 @@ namespace opt {
|
||||||
vector<rational>& weights, rational& offset, bool& neg,
|
vector<rational>& weights, rational& offset, bool& neg,
|
||||||
symbol& id, expr_ref& orig_term, unsigned& index);
|
symbol& id, expr_ref& orig_term, unsigned& index);
|
||||||
void purify(app_ref& term);
|
void purify(app_ref& term);
|
||||||
app* purify(filter_model_converter_ref& fm, expr* e);
|
app* purify(generic_model_converter_ref& fm, expr* e);
|
||||||
bool is_mul_const(expr* e);
|
bool is_mul_const(expr* e);
|
||||||
expr* mk_maximize(unsigned index, app* t);
|
expr* mk_maximize(unsigned index, app* t);
|
||||||
expr* mk_minimize(unsigned index, app* t);
|
expr* mk_minimize(unsigned index, app* t);
|
||||||
|
|
|
@ -37,7 +37,7 @@ Notes:
|
||||||
namespace opt {
|
namespace opt {
|
||||||
|
|
||||||
opt_solver::opt_solver(ast_manager & mgr, params_ref const & p,
|
opt_solver::opt_solver(ast_manager & mgr, params_ref const & p,
|
||||||
filter_model_converter& fm):
|
generic_model_converter& fm):
|
||||||
solver_na2as(mgr),
|
solver_na2as(mgr),
|
||||||
m_params(p),
|
m_params(p),
|
||||||
m_context(mgr, m_params),
|
m_context(mgr, m_params),
|
||||||
|
@ -80,7 +80,7 @@ namespace opt {
|
||||||
m_context.collect_statistics(st);
|
m_context.collect_statistics(st);
|
||||||
}
|
}
|
||||||
|
|
||||||
void opt_solver::assert_expr(expr * t) {
|
void opt_solver::assert_expr_core(expr * t) {
|
||||||
if (has_quantifiers(t)) {
|
if (has_quantifiers(t)) {
|
||||||
m_params.m_relevancy_lvl = 2;
|
m_params.m_relevancy_lvl = 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ Notes:
|
||||||
#include "smt/params/smt_params.h"
|
#include "smt/params/smt_params.h"
|
||||||
#include "smt/smt_types.h"
|
#include "smt/smt_types.h"
|
||||||
#include "smt/theory_opt.h"
|
#include "smt/theory_opt.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
namespace opt {
|
namespace opt {
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ namespace opt {
|
||||||
smt_params m_params;
|
smt_params m_params;
|
||||||
smt::kernel m_context;
|
smt::kernel m_context;
|
||||||
ast_manager& m;
|
ast_manager& m;
|
||||||
filter_model_converter& m_fm;
|
generic_model_converter& m_fm;
|
||||||
progress_callback * m_callback;
|
progress_callback * m_callback;
|
||||||
symbol m_logic;
|
symbol m_logic;
|
||||||
svector<smt::theory_var> m_objective_vars;
|
svector<smt::theory_var> m_objective_vars;
|
||||||
|
@ -84,14 +84,14 @@ namespace opt {
|
||||||
bool m_first;
|
bool m_first;
|
||||||
bool m_was_unknown;
|
bool m_was_unknown;
|
||||||
public:
|
public:
|
||||||
opt_solver(ast_manager & m, params_ref const & p, filter_model_converter& fm);
|
opt_solver(ast_manager & m, params_ref const & p, generic_model_converter& fm);
|
||||||
virtual ~opt_solver();
|
virtual ~opt_solver();
|
||||||
|
|
||||||
virtual solver* translate(ast_manager& m, params_ref const& p);
|
virtual solver* translate(ast_manager& m, params_ref const& p);
|
||||||
virtual void updt_params(params_ref const& p);
|
virtual void updt_params(params_ref const& p);
|
||||||
virtual void collect_param_descrs(param_descrs & r);
|
virtual void collect_param_descrs(param_descrs & r);
|
||||||
virtual void collect_statistics(statistics & st) const;
|
virtual void collect_statistics(statistics & st) const;
|
||||||
virtual void assert_expr(expr * t);
|
virtual void assert_expr_core(expr * t);
|
||||||
virtual void assert_lemma(expr* t) {}
|
virtual void assert_lemma(expr* t) {}
|
||||||
virtual void push_core();
|
virtual void push_core();
|
||||||
virtual void pop_core(unsigned n);
|
virtual void pop_core(unsigned n);
|
||||||
|
|
|
@ -24,7 +24,7 @@ Notes:
|
||||||
#include "smt/smt_context.h"
|
#include "smt/smt_context.h"
|
||||||
#include "opt/opt_context.h"
|
#include "opt/opt_context.h"
|
||||||
#include "util/sorting_network.h"
|
#include "util/sorting_network.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
namespace opt {
|
namespace opt {
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ namespace opt {
|
||||||
psort_nw<sortmax> m_sort;
|
psort_nw<sortmax> m_sort;
|
||||||
expr_ref_vector m_trail;
|
expr_ref_vector m_trail;
|
||||||
func_decl_ref_vector m_fresh;
|
func_decl_ref_vector m_fresh;
|
||||||
ref<filter_model_converter> m_filter;
|
ref<generic_model_converter> m_filter;
|
||||||
sortmax(maxsat_context& c, weights_t& ws, expr_ref_vector const& soft):
|
sortmax(maxsat_context& c, weights_t& ws, expr_ref_vector const& soft):
|
||||||
maxsmt_solver_base(c, ws, soft), m_sort(*this), m_trail(m), m_fresh(m) {}
|
maxsmt_solver_base(c, ws, soft), m_sort(*this), m_trail(m), m_fresh(m) {}
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ namespace opt {
|
||||||
if (is_sat != l_true) {
|
if (is_sat != l_true) {
|
||||||
return is_sat;
|
return is_sat;
|
||||||
}
|
}
|
||||||
m_filter = alloc(filter_model_converter, m);
|
m_filter = alloc(generic_model_converter, m);
|
||||||
rational offset = m_lower;
|
rational offset = m_lower;
|
||||||
m_upper = offset;
|
m_upper = offset;
|
||||||
expr_ref_vector in(m);
|
expr_ref_vector in(m);
|
||||||
|
@ -142,7 +142,7 @@ namespace opt {
|
||||||
expr_ref fr(m.mk_fresh_const(n, m.mk_bool_sort()), m);
|
expr_ref fr(m.mk_fresh_const(n, m.mk_bool_sort()), m);
|
||||||
func_decl* f = to_app(fr)->get_decl();
|
func_decl* f = to_app(fr)->get_decl();
|
||||||
m_fresh.push_back(f);
|
m_fresh.push_back(f);
|
||||||
m_filter->insert(f);
|
m_filter->hide(f);
|
||||||
return trail(fr);
|
return trail(fr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ Revision History:
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "util/cooperate.h"
|
#include "util/cooperate.h"
|
||||||
#include "qe/qe.h"
|
#include "qe/qe.h"
|
||||||
|
|
||||||
|
|
|
@ -44,11 +44,11 @@ namespace qe {
|
||||||
m(m),
|
m(m),
|
||||||
m_asms(m),
|
m_asms(m),
|
||||||
m_trail(m),
|
m_trail(m),
|
||||||
m_fmc(alloc(filter_model_converter, m))
|
m_fmc(alloc(generic_model_converter, m))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
filter_model_converter* pred_abs::fmc() {
|
generic_model_converter* pred_abs::fmc() {
|
||||||
return m_fmc.get();
|
return m_fmc.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,7 +282,7 @@ namespace qe {
|
||||||
|
|
||||||
app_ref pred_abs::fresh_bool(char const* name) {
|
app_ref pred_abs::fresh_bool(char const* name) {
|
||||||
app_ref r(m.mk_fresh_const(name, m.mk_bool_sort()), m);
|
app_ref r(m.mk_fresh_const(name, m.mk_bool_sort()), m);
|
||||||
m_fmc->insert(r->get_decl());
|
m_fmc->hide(r);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -747,9 +747,7 @@ namespace qe {
|
||||||
}
|
}
|
||||||
|
|
||||||
void filter_vars(app_ref_vector const& vars) {
|
void filter_vars(app_ref_vector const& vars) {
|
||||||
for (unsigned i = 0; i < vars.size(); ++i) {
|
for (app* v : vars) m_pred_abs.fmc()->hide(v);
|
||||||
m_pred_abs.fmc()->insert(vars[i]->get_decl());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialize_levels() {
|
void initialize_levels() {
|
||||||
|
|
|
@ -22,7 +22,7 @@ Revision History:
|
||||||
#define QE_QSAT_H__
|
#define QE_QSAT_H__
|
||||||
|
|
||||||
#include "tactic/tactic.h"
|
#include "tactic/tactic.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "qe/qe_mbp.h"
|
#include "qe/qe_mbp.h"
|
||||||
|
|
||||||
namespace qe {
|
namespace qe {
|
||||||
|
@ -72,7 +72,7 @@ namespace qe {
|
||||||
obj_map<expr, app*> m_asm2pred; // maintain map from assumptions to predicates
|
obj_map<expr, app*> m_asm2pred; // maintain map from assumptions to predicates
|
||||||
obj_map<expr, expr*> m_pred2asm; // predicates |-> assumptions
|
obj_map<expr, expr*> m_pred2asm; // predicates |-> assumptions
|
||||||
expr_ref_vector m_trail;
|
expr_ref_vector m_trail;
|
||||||
filter_model_converter_ref m_fmc;
|
generic_model_converter_ref m_fmc;
|
||||||
ptr_vector<expr> todo;
|
ptr_vector<expr> todo;
|
||||||
obj_map<expr, max_level> m_elevel;
|
obj_map<expr, max_level> m_elevel;
|
||||||
obj_map<func_decl, max_level> m_flevel;
|
obj_map<func_decl, max_level> m_flevel;
|
||||||
|
@ -91,7 +91,7 @@ namespace qe {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
pred_abs(ast_manager& m);
|
pred_abs(ast_manager& m);
|
||||||
filter_model_converter* fmc();
|
generic_model_converter* fmc();
|
||||||
void reset();
|
void reset();
|
||||||
max_level compute_level(app* e);
|
max_level compute_level(app* e);
|
||||||
void push();
|
void push();
|
||||||
|
|
|
@ -31,7 +31,6 @@ Notes:
|
||||||
#include "sat/tactic/goal2sat.h"
|
#include "sat/tactic/goal2sat.h"
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
#include "model/model_smt2_pp.h"
|
#include "model/model_smt2_pp.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "tactic/bv/bit_blaster_model_converter.h"
|
#include "tactic/bv/bit_blaster_model_converter.h"
|
||||||
#include "ast/ast_translation.h"
|
#include "ast/ast_translation.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
|
@ -241,13 +240,13 @@ public:
|
||||||
virtual unsigned get_scope_level() const {
|
virtual unsigned get_scope_level() const {
|
||||||
return m_num_scopes;
|
return m_num_scopes;
|
||||||
}
|
}
|
||||||
virtual void assert_expr(expr * t, expr * a) {
|
virtual void assert_expr_core(expr * t, expr * a) {
|
||||||
if (a) {
|
if (a) {
|
||||||
m_asmsf.push_back(a);
|
m_asmsf.push_back(a);
|
||||||
assert_expr(m.mk_implies(a, t));
|
assert_expr_core(m.mk_implies(a, t));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert_expr(t);
|
assert_expr_core(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,7 +260,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ast_manager& get_manager() const { return m; }
|
virtual ast_manager& get_manager() const { return m; }
|
||||||
virtual void assert_expr(expr * t) {
|
virtual void assert_expr_core(expr * t) {
|
||||||
m_internalized = false;
|
m_internalized = false;
|
||||||
TRACE("goal2sat", tout << mk_pp(t, m) << "\n";);
|
TRACE("goal2sat", tout << mk_pp(t, m) << "\n";);
|
||||||
m_fmls.push_back(t);
|
m_fmls.push_back(t);
|
||||||
|
|
|
@ -38,7 +38,7 @@ Notes:
|
||||||
#include "model/model_evaluator.h"
|
#include "model/model_evaluator.h"
|
||||||
#include "model/model_v2_pp.h"
|
#include "model/model_v2_pp.h"
|
||||||
#include "tactic/tactic.h"
|
#include "tactic/tactic.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include<sstream>
|
#include<sstream>
|
||||||
|
|
||||||
struct goal2sat::imp {
|
struct goal2sat::imp {
|
||||||
|
@ -883,7 +883,7 @@ struct sat2goal::imp {
|
||||||
class sat_model_converter : public model_converter {
|
class sat_model_converter : public model_converter {
|
||||||
sat::model_converter m_mc;
|
sat::model_converter m_mc;
|
||||||
expr_ref_vector m_var2expr;
|
expr_ref_vector m_var2expr;
|
||||||
filter_model_converter_ref m_fmc; // filter for eliminating fresh variables introduced in the assertion-set --> sat conversion
|
generic_model_converter_ref m_fmc; // filter for eliminating fresh variables introduced in the assertion-set --> sat conversion
|
||||||
|
|
||||||
sat_model_converter(ast_manager & m):
|
sat_model_converter(ast_manager & m):
|
||||||
m_var2expr(m) {
|
m_var2expr(m) {
|
||||||
|
@ -892,7 +892,7 @@ struct sat2goal::imp {
|
||||||
public:
|
public:
|
||||||
sat_model_converter(ast_manager & m, sat::solver const & s):m_var2expr(m) {
|
sat_model_converter(ast_manager & m, sat::solver const & s):m_var2expr(m) {
|
||||||
m_mc.copy(s.get_model_converter());
|
m_mc.copy(s.get_model_converter());
|
||||||
m_fmc = alloc(filter_model_converter, m);
|
m_fmc = alloc(generic_model_converter, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_manager & m() { return m_var2expr.get_manager(); }
|
ast_manager & m() { return m_var2expr.get_manager(); }
|
||||||
|
@ -907,7 +907,7 @@ struct sat2goal::imp {
|
||||||
if (aux) {
|
if (aux) {
|
||||||
SASSERT(is_uninterp_const(atom));
|
SASSERT(is_uninterp_const(atom));
|
||||||
SASSERT(m().is_bool(atom));
|
SASSERT(m().is_bool(atom));
|
||||||
m_fmc->insert(to_app(atom)->get_decl());
|
m_fmc->hide(to_app(atom)->get_decl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -976,7 +976,7 @@ struct sat2goal::imp {
|
||||||
|
|
||||||
virtual model_converter * translate(ast_translation & translator) {
|
virtual model_converter * translate(ast_translation & translator) {
|
||||||
sat_model_converter * res = alloc(sat_model_converter, translator.to());
|
sat_model_converter * res = alloc(sat_model_converter, translator.to());
|
||||||
res->m_fmc = static_cast<filter_model_converter*>(m_fmc->translate(translator));
|
res->m_fmc = static_cast<generic_model_converter*>(m_fmc->translate(translator));
|
||||||
for (expr* e : m_var2expr)
|
for (expr* e : m_var2expr)
|
||||||
res->m_var2expr.push_back(e ? translator(e) : nullptr);
|
res->m_var2expr.push_back(e ? translator(e) : nullptr);
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -18,7 +18,6 @@ Notes:
|
||||||
--*/
|
--*/
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "sat/tactic/goal2sat.h"
|
#include "sat/tactic/goal2sat.h"
|
||||||
#include "sat/sat_solver.h"
|
#include "sat/sat_solver.h"
|
||||||
#include "model/model_v2_pp.h"
|
#include "model/model_v2_pp.h"
|
||||||
|
|
|
@ -101,11 +101,11 @@ namespace smt {
|
||||||
return m_context.find_mutexes(vars, mutexes);
|
return m_context.find_mutexes(vars, mutexes);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void assert_expr(expr * t) {
|
virtual void assert_expr_core(expr * t) {
|
||||||
m_context.assert_expr(t);
|
m_context.assert_expr(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void assert_expr(expr * t, expr * a) {
|
virtual void assert_expr_core(expr * t, expr * a) {
|
||||||
if (m_name2assertion.contains(a)) {
|
if (m_name2assertion.contains(a)) {
|
||||||
throw default_exception("named assertion defined twice");
|
throw default_exception("named assertion defined twice");
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ Notes:
|
||||||
#include "smt/params/smt_params_helper.hpp"
|
#include "smt/params/smt_params_helper.hpp"
|
||||||
#include "util/lp/lp_params.hpp"
|
#include "util/lp/lp_params.hpp"
|
||||||
#include "ast/rewriter/rewriter_types.h"
|
#include "ast/rewriter/rewriter_types.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
#include "solver/solver2tactic.h"
|
#include "solver/solver2tactic.h"
|
||||||
#include "smt/smt_solver.h"
|
#include "smt/smt_solver.h"
|
||||||
|
@ -169,7 +169,7 @@ public:
|
||||||
expr_ref_vector clauses(m);
|
expr_ref_vector clauses(m);
|
||||||
expr2expr_map bool2dep;
|
expr2expr_map bool2dep;
|
||||||
ptr_vector<expr> assumptions;
|
ptr_vector<expr> assumptions;
|
||||||
ref<filter_model_converter> fmc;
|
ref<generic_model_converter> fmc;
|
||||||
if (in->unsat_core_enabled()) {
|
if (in->unsat_core_enabled()) {
|
||||||
extract_clauses_and_dependencies(in, clauses, assumptions, bool2dep, fmc);
|
extract_clauses_and_dependencies(in, clauses, assumptions, bool2dep, fmc);
|
||||||
TRACE("mus", in->display_with_dependencies(tout);
|
TRACE("mus", in->display_with_dependencies(tout);
|
||||||
|
|
|
@ -1081,7 +1081,7 @@ namespace smt {
|
||||||
virtual inf_eps_rational<inf_rational> maximize(theory_var v, expr_ref& blocker, bool& has_shared);
|
virtual inf_eps_rational<inf_rational> maximize(theory_var v, expr_ref& blocker, bool& has_shared);
|
||||||
virtual inf_eps_rational<inf_rational> value(theory_var v);
|
virtual inf_eps_rational<inf_rational> value(theory_var v);
|
||||||
virtual theory_var add_objective(app* term);
|
virtual theory_var add_objective(app* term);
|
||||||
expr_ref mk_ge(filter_model_converter& fm, theory_var v, inf_numeral const& val);
|
expr_ref mk_ge(generic_model_converter& fm, theory_var v, inf_numeral const& val);
|
||||||
void enable_record_conflict(expr* bound);
|
void enable_record_conflict(expr* bound);
|
||||||
void record_conflict(unsigned num_lits, literal const * lits,
|
void record_conflict(unsigned num_lits, literal const * lits,
|
||||||
unsigned num_eqs, enode_pair const * eqs,
|
unsigned num_eqs, enode_pair const * eqs,
|
||||||
|
|
|
@ -23,7 +23,7 @@ Revision History:
|
||||||
#include "smt/theory_arith.h"
|
#include "smt/theory_arith.h"
|
||||||
#include "smt/smt_farkas_util.h"
|
#include "smt/smt_farkas_util.h"
|
||||||
#include "ast/rewriter/th_rewriter.h"
|
#include "ast/rewriter/th_rewriter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
namespace smt {
|
namespace smt {
|
||||||
|
|
||||||
|
@ -1117,14 +1117,14 @@ namespace smt {
|
||||||
This allows to handle inequalities with non-standard numbers.
|
This allows to handle inequalities with non-standard numbers.
|
||||||
*/
|
*/
|
||||||
template<typename Ext>
|
template<typename Ext>
|
||||||
expr_ref theory_arith<Ext>::mk_ge(filter_model_converter& fm, theory_var v, inf_numeral const& val) {
|
expr_ref theory_arith<Ext>::mk_ge(generic_model_converter& fm, theory_var v, inf_numeral const& val) {
|
||||||
ast_manager& m = get_manager();
|
ast_manager& m = get_manager();
|
||||||
context& ctx = get_context();
|
context& ctx = get_context();
|
||||||
std::ostringstream strm;
|
std::ostringstream strm;
|
||||||
strm << val << " <= " << mk_pp(get_enode(v)->get_owner(), get_manager());
|
strm << val << " <= " << mk_pp(get_enode(v)->get_owner(), get_manager());
|
||||||
app* b = m.mk_const(symbol(strm.str().c_str()), m.mk_bool_sort());
|
app* b = m.mk_const(symbol(strm.str().c_str()), m.mk_bool_sort());
|
||||||
if (!ctx.b_internalized(b)) {
|
if (!ctx.b_internalized(b)) {
|
||||||
fm.insert(b->get_decl());
|
fm.hide(b->get_decl());
|
||||||
bool_var bv = ctx.mk_bool_var(b);
|
bool_var bv = ctx.mk_bool_var(b);
|
||||||
ctx.set_var_theory(bv, get_id());
|
ctx.set_var_theory(bv, get_id());
|
||||||
// ctx.set_enode_flag(bv, true);
|
// ctx.set_enode_flag(bv, true);
|
||||||
|
|
|
@ -271,7 +271,7 @@ namespace smt {
|
||||||
virtual inf_eps_rational<inf_rational> value(theory_var v);
|
virtual inf_eps_rational<inf_rational> value(theory_var v);
|
||||||
virtual theory_var add_objective(app* term);
|
virtual theory_var add_objective(app* term);
|
||||||
virtual expr_ref mk_gt(theory_var v, inf_eps const& val);
|
virtual expr_ref mk_gt(theory_var v, inf_eps const& val);
|
||||||
expr_ref mk_ge(filter_model_converter& fm, theory_var v, inf_eps const& val);
|
expr_ref mk_ge(generic_model_converter& fm, theory_var v, inf_eps const& val);
|
||||||
|
|
||||||
// -----------------------------------
|
// -----------------------------------
|
||||||
//
|
//
|
||||||
|
|
|
@ -1055,7 +1055,7 @@ namespace smt {
|
||||||
|
|
||||||
template<typename Ext>
|
template<typename Ext>
|
||||||
expr_ref theory_dense_diff_logic<Ext>::mk_ge(
|
expr_ref theory_dense_diff_logic<Ext>::mk_ge(
|
||||||
filter_model_converter& fm, theory_var v, inf_eps const& val) {
|
generic_model_converter& fm, theory_var v, inf_eps const& val) {
|
||||||
return mk_ineq(v, val, false);
|
return mk_ineq(v, val, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -324,7 +324,7 @@ namespace smt {
|
||||||
virtual inf_eps maximize(theory_var v, expr_ref& blocker, bool& has_shared);
|
virtual inf_eps maximize(theory_var v, expr_ref& blocker, bool& has_shared);
|
||||||
virtual inf_eps value(theory_var v);
|
virtual inf_eps value(theory_var v);
|
||||||
virtual theory_var add_objective(app* term);
|
virtual theory_var add_objective(app* term);
|
||||||
expr_ref mk_ge(filter_model_converter& fm, theory_var v, inf_eps const& val);
|
expr_ref mk_ge(generic_model_converter& fm, theory_var v, inf_eps const& val);
|
||||||
|
|
||||||
bool internalize_objective(expr * n, rational const& m, rational& r, objective_term & objective);
|
bool internalize_objective(expr * n, rational const& m, rational& r, objective_term & objective);
|
||||||
|
|
||||||
|
|
|
@ -1336,7 +1336,7 @@ expr_ref theory_diff_logic<Ext>::mk_gt(theory_var v, inf_eps const& val) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Ext>
|
template<typename Ext>
|
||||||
expr_ref theory_diff_logic<Ext>::mk_ge(filter_model_converter& fm, theory_var v, inf_eps const& val) {
|
expr_ref theory_diff_logic<Ext>::mk_ge(generic_model_converter& fm, theory_var v, inf_eps const& val) {
|
||||||
return mk_ineq(v, val, false);
|
return mk_ineq(v, val, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ Revision History:
|
||||||
#include "smt/smt_model_generator.h"
|
#include "smt/smt_model_generator.h"
|
||||||
#include "smt/arith_eq_adapter.h"
|
#include "smt/arith_eq_adapter.h"
|
||||||
#include "util/nat_set.h"
|
#include "util/nat_set.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
namespace lra_lp {
|
namespace lra_lp {
|
||||||
enum bound_kind { lower_t, upper_t };
|
enum bound_kind { lower_t, upper_t };
|
||||||
|
@ -2417,7 +2417,7 @@ namespace smt {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expr_ref mk_ge(filter_model_converter& fm, theory_var v, inf_rational const& val) {
|
expr_ref mk_ge(generic_model_converter& fm, theory_var v, inf_rational const& val) {
|
||||||
rational r = val.get_rational();
|
rational r = val.get_rational();
|
||||||
bool is_strict = val.get_infinitesimal().is_pos();
|
bool is_strict = val.get_infinitesimal().is_pos();
|
||||||
app_ref b(m);
|
app_ref b(m);
|
||||||
|
@ -2429,7 +2429,7 @@ namespace smt {
|
||||||
b = a.mk_ge(mk_obj(v), a.mk_numeral(r, is_int));
|
b = a.mk_ge(mk_obj(v), a.mk_numeral(r, is_int));
|
||||||
}
|
}
|
||||||
if (!ctx().b_internalized(b)) {
|
if (!ctx().b_internalized(b)) {
|
||||||
fm.insert(b->get_decl());
|
fm.hide(b);
|
||||||
bool_var bv = ctx().mk_bool_var(b);
|
bool_var bv = ctx().mk_bool_var(b);
|
||||||
ctx().set_var_theory(bv, get_id());
|
ctx().set_var_theory(bv, get_id());
|
||||||
// ctx().set_enode_flag(bv, true);
|
// ctx().set_enode_flag(bv, true);
|
||||||
|
@ -2620,7 +2620,7 @@ namespace smt {
|
||||||
theory_var theory_lra::add_objective(app* term) {
|
theory_var theory_lra::add_objective(app* term) {
|
||||||
return m_imp->add_objective(term);
|
return m_imp->add_objective(term);
|
||||||
}
|
}
|
||||||
expr_ref theory_lra::mk_ge(filter_model_converter& fm, theory_var v, inf_rational const& val) {
|
expr_ref theory_lra::mk_ge(generic_model_converter& fm, theory_var v, inf_rational const& val) {
|
||||||
return m_imp->mk_ge(fm, v, val);
|
return m_imp->mk_ge(fm, v, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,7 @@ namespace smt {
|
||||||
virtual inf_eps value(theory_var);
|
virtual inf_eps value(theory_var);
|
||||||
virtual inf_eps maximize(theory_var v, expr_ref& blocker, bool& has_shared);
|
virtual inf_eps maximize(theory_var v, expr_ref& blocker, bool& has_shared);
|
||||||
virtual theory_var add_objective(app* term);
|
virtual theory_var add_objective(app* term);
|
||||||
virtual expr_ref mk_ge(filter_model_converter& fm, theory_var v, inf_rational const& val);
|
virtual expr_ref mk_ge(generic_model_converter& fm, theory_var v, inf_rational const& val);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -25,7 +25,7 @@ Notes:
|
||||||
#ifndef THEORY_OPT_H_
|
#ifndef THEORY_OPT_H_
|
||||||
#define THEORY_OPT_H_
|
#define THEORY_OPT_H_
|
||||||
|
|
||||||
class filter_model_converter;
|
class generic_model_converter;
|
||||||
namespace smt {
|
namespace smt {
|
||||||
class theory_opt {
|
class theory_opt {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -25,7 +25,7 @@ Notes:
|
||||||
|
|
||||||
namespace smt {
|
namespace smt {
|
||||||
|
|
||||||
theory_wmaxsat::theory_wmaxsat(ast_manager& m, filter_model_converter& mc):
|
theory_wmaxsat::theory_wmaxsat(ast_manager& m, generic_model_converter& mc):
|
||||||
theory(m.mk_family_id("weighted_maxsat")),
|
theory(m.mk_family_id("weighted_maxsat")),
|
||||||
m_mc(mc),
|
m_mc(mc),
|
||||||
m_vars(m),
|
m_vars(m),
|
||||||
|
@ -92,7 +92,7 @@ namespace smt {
|
||||||
ast_manager& m = get_manager();
|
ast_manager& m = get_manager();
|
||||||
app_ref var(m), wfml(m);
|
app_ref var(m), wfml(m);
|
||||||
var = m.mk_fresh_const("w", m.mk_bool_sort());
|
var = m.mk_fresh_const("w", m.mk_bool_sort());
|
||||||
m_mc.insert(var->get_decl());
|
m_mc.hide(var);
|
||||||
wfml = m.mk_or(var, fml);
|
wfml = m.mk_or(var, fml);
|
||||||
ctx.assert_expr(wfml);
|
ctx.assert_expr(wfml);
|
||||||
m_rweights.push_back(w);
|
m_rweights.push_back(w);
|
||||||
|
|
|
@ -22,7 +22,7 @@ Notes:
|
||||||
|
|
||||||
#include "smt/smt_theory.h"
|
#include "smt/smt_theory.h"
|
||||||
#include "smt/smt_clause.h"
|
#include "smt/smt_clause.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
namespace smt {
|
namespace smt {
|
||||||
class theory_wmaxsat : public theory {
|
class theory_wmaxsat : public theory {
|
||||||
|
@ -32,7 +32,7 @@ namespace smt {
|
||||||
void reset() { memset(this, 0, sizeof(*this)); }
|
void reset() { memset(this, 0, sizeof(*this)); }
|
||||||
stats() { reset(); }
|
stats() { reset(); }
|
||||||
};
|
};
|
||||||
filter_model_converter& m_mc;
|
generic_model_converter& m_mc;
|
||||||
mutable unsynch_mpz_manager m_mpz;
|
mutable unsynch_mpz_manager m_mpz;
|
||||||
app_ref_vector m_vars; // Auxiliary variables per soft clause
|
app_ref_vector m_vars; // Auxiliary variables per soft clause
|
||||||
expr_ref_vector m_fmls; // Formulas per soft clause
|
expr_ref_vector m_fmls; // Formulas per soft clause
|
||||||
|
@ -56,7 +56,7 @@ namespace smt {
|
||||||
svector<bool> m_assigned, m_enabled;
|
svector<bool> m_assigned, m_enabled;
|
||||||
stats m_stats;
|
stats m_stats;
|
||||||
public:
|
public:
|
||||||
theory_wmaxsat(ast_manager& m, filter_model_converter& mc);
|
theory_wmaxsat(ast_manager& m, generic_model_converter& mc);
|
||||||
virtual ~theory_wmaxsat();
|
virtual ~theory_wmaxsat();
|
||||||
void get_assignment(svector<bool>& result);
|
void get_assignment(svector<bool>& result);
|
||||||
expr* assert_weighted(expr* fml, rational const& w);
|
expr* assert_weighted(expr* fml, rational const& w);
|
||||||
|
|
|
@ -164,7 +164,7 @@ public:
|
||||||
m_solver2->set_produce_models(f);
|
m_solver2->set_produce_models(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void assert_expr(expr * t) {
|
virtual void assert_expr_core(expr * t) {
|
||||||
if (m_check_sat_executed)
|
if (m_check_sat_executed)
|
||||||
switch_inc_mode();
|
switch_inc_mode();
|
||||||
m_solver1->assert_expr(t);
|
m_solver1->assert_expr(t);
|
||||||
|
@ -172,7 +172,7 @@ public:
|
||||||
m_solver2->assert_expr(t);
|
m_solver2->assert_expr(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void assert_expr(expr * t, expr * a) {
|
virtual void assert_expr_core(expr * t, expr * a) {
|
||||||
if (m_check_sat_executed)
|
if (m_check_sat_executed)
|
||||||
switch_inc_mode();
|
switch_inc_mode();
|
||||||
m_solver1->assert_expr(t, a);
|
m_solver1->assert_expr(t, a);
|
||||||
|
|
|
@ -182,13 +182,26 @@ bool solver::is_literal(ast_manager& m, expr* e) {
|
||||||
return is_uninterp_const(e) || (m.is_not(e, e) && is_uninterp_const(e));
|
return is_uninterp_const(e) || (m.is_not(e, e) && is_uninterp_const(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
expr_ref solver::lookahead(expr_ref_vector const& candidates) {
|
void solver::assert_expr(expr* f) {
|
||||||
std::cout << "lookahead: " << candidates.size() << "\n";
|
expr_ref fml(f, get_manager());
|
||||||
INVOKE_DEBUGGER();
|
if (mc0()) {
|
||||||
ast_manager& m = candidates.get_manager();
|
(*mc0())(fml);
|
||||||
return expr_ref(m.mk_true(), m);
|
}
|
||||||
|
assert_expr_core(fml);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
void solver::assert_expr(expr* f, expr* t) {
|
||||||
|
// let mc0 be the model converter associated with the solver
|
||||||
|
// that converts models to their "real state".
|
||||||
|
ast_manager& m = get_manager();
|
||||||
|
expr_ref fml(f, m);
|
||||||
|
expr_ref a(t, m);
|
||||||
|
|
||||||
|
if (mc0()) {
|
||||||
|
(*mc0())(fml);
|
||||||
|
// (*mc0())(a);
|
||||||
|
}
|
||||||
|
assert_expr_core(fml, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,14 +80,16 @@ public:
|
||||||
/**
|
/**
|
||||||
\brief Add a new formula to the assertion stack.
|
\brief Add a new formula to the assertion stack.
|
||||||
*/
|
*/
|
||||||
virtual void assert_expr(expr * t) = 0;
|
void assert_expr(expr* f);
|
||||||
|
|
||||||
|
virtual void assert_expr_core(expr * t) = 0;
|
||||||
|
|
||||||
void assert_expr(expr_ref_vector const& ts) {
|
void assert_expr(expr_ref_vector const& ts) {
|
||||||
for (unsigned i = 0; i < ts.size(); ++i) assert_expr(ts[i]);
|
for (expr* e : ts) assert_expr(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void assert_expr(ptr_vector<expr> const& ts) {
|
void assert_expr(ptr_vector<expr> const& ts) {
|
||||||
for (unsigned i = 0; i < ts.size(); ++i) assert_expr(ts[i]);
|
for (expr* e : ts) assert_expr(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -95,7 +97,10 @@ public:
|
||||||
The propositional variable \c a is used to track the use of \c t in a proof
|
The propositional variable \c a is used to track the use of \c t in a proof
|
||||||
of unsatisfiability.
|
of unsatisfiability.
|
||||||
*/
|
*/
|
||||||
virtual void assert_expr(expr * t, expr * a) = 0;
|
|
||||||
|
void assert_expr(expr * t, expr* a);
|
||||||
|
|
||||||
|
virtual void assert_expr_core(expr * t, expr * a) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Add a lemma to the assertion stack. A lemma is assumed to be a consequence of already
|
\brief Add a lemma to the assertion stack. A lemma is assumed to be a consequence of already
|
||||||
|
@ -210,11 +215,13 @@ public:
|
||||||
~scoped_push() { if (!m_nopop) s.pop(1); }
|
~scoped_push() { if (!m_nopop) s.pop(1); }
|
||||||
void disable_pop() { m_nopop = true; }
|
void disable_pop() { m_nopop = true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences);
|
virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences);
|
||||||
|
|
||||||
|
|
||||||
bool is_literal(ast_manager& m, expr* e);
|
bool is_literal(ast_manager& m, expr* e);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,13 +19,13 @@ Notes:
|
||||||
|
|
||||||
#include "solver/solver.h"
|
#include "solver/solver.h"
|
||||||
#include "tactic/tactic.h"
|
#include "tactic/tactic.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "solver/solver2tactic.h"
|
#include "solver/solver2tactic.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
|
|
||||||
typedef obj_map<expr, expr *> expr2expr_map;
|
typedef obj_map<expr, expr *> expr2expr_map;
|
||||||
|
|
||||||
void extract_clauses_and_dependencies(goal_ref const& g, expr_ref_vector& clauses, ptr_vector<expr>& assumptions, expr2expr_map& bool2dep, ref<filter_model_converter>& fmc) {
|
void extract_clauses_and_dependencies(goal_ref const& g, expr_ref_vector& clauses, ptr_vector<expr>& assumptions, expr2expr_map& bool2dep, ref<generic_model_converter>& fmc) {
|
||||||
expr2expr_map dep2bool;
|
expr2expr_map dep2bool;
|
||||||
ptr_vector<expr> deps;
|
ptr_vector<expr> deps;
|
||||||
ast_manager& m = g->m();
|
ast_manager& m = g->m();
|
||||||
|
@ -65,9 +65,9 @@ void extract_clauses_and_dependencies(goal_ref const& g, expr_ref_vector& clause
|
||||||
bool2dep.insert(b, d);
|
bool2dep.insert(b, d);
|
||||||
assumptions.push_back(b);
|
assumptions.push_back(b);
|
||||||
if (!fmc) {
|
if (!fmc) {
|
||||||
fmc = alloc(filter_model_converter, m);
|
fmc = alloc(generic_model_converter, m);
|
||||||
}
|
}
|
||||||
fmc->insert(to_app(b)->get_decl());
|
fmc->hide(to_app(b)->get_decl());
|
||||||
}
|
}
|
||||||
clause.push_back(m.mk_not(b));
|
clause.push_back(m.mk_not(b));
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ public:
|
||||||
expr_ref_vector clauses(m);
|
expr_ref_vector clauses(m);
|
||||||
expr2expr_map bool2dep;
|
expr2expr_map bool2dep;
|
||||||
ptr_vector<expr> assumptions;
|
ptr_vector<expr> assumptions;
|
||||||
ref<filter_model_converter> fmc;
|
ref<generic_model_converter> fmc;
|
||||||
extract_clauses_and_dependencies(in, clauses, assumptions, bool2dep, fmc);
|
extract_clauses_and_dependencies(in, clauses, assumptions, bool2dep, fmc);
|
||||||
ref<solver> local_solver = m_solver->translate(m, m_params);
|
ref<solver> local_solver = m_solver->translate(m, m_params);
|
||||||
local_solver->assert_expr(clauses);
|
local_solver->assert_expr(clauses);
|
||||||
|
|
|
@ -20,11 +20,11 @@ Notes:
|
||||||
#define SOLVER2TACTIC_H_
|
#define SOLVER2TACTIC_H_
|
||||||
|
|
||||||
#include "tactic/tactic.h"
|
#include "tactic/tactic.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
class solver;
|
class solver;
|
||||||
|
|
||||||
tactic * mk_solver2tactic(solver* s);
|
tactic * mk_solver2tactic(solver* s);
|
||||||
|
|
||||||
void extract_clauses_and_dependencies(goal_ref const& g, expr_ref_vector& clauses, ptr_vector<expr>& assumptions, obj_map<expr, expr*>& bool2dep, ref<filter_model_converter>& fmc);
|
void extract_clauses_and_dependencies(goal_ref const& g, expr_ref_vector& clauses, ptr_vector<expr>& assumptions, obj_map<expr, expr*>& bool2dep, ref<generic_model_converter>& fmc);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,9 +30,9 @@ solver_na2as::solver_na2as(ast_manager & m):
|
||||||
|
|
||||||
solver_na2as::~solver_na2as() {}
|
solver_na2as::~solver_na2as() {}
|
||||||
|
|
||||||
void solver_na2as::assert_expr(expr * t, expr * a) {
|
void solver_na2as::assert_expr_core(expr * t, expr * a) {
|
||||||
if (a == 0) {
|
if (a == 0) {
|
||||||
assert_expr(t);
|
assert_expr_core(t);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SASSERT(is_uninterp_const(a));
|
SASSERT(is_uninterp_const(a));
|
||||||
|
@ -41,7 +41,7 @@ void solver_na2as::assert_expr(expr * t, expr * a) {
|
||||||
m_assumptions.push_back(a);
|
m_assumptions.push_back(a);
|
||||||
expr_ref new_t(m);
|
expr_ref new_t(m);
|
||||||
new_t = m.mk_implies(a, t);
|
new_t = m.mk_implies(a, t);
|
||||||
assert_expr(new_t);
|
assert_expr_core(new_t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,8 @@ public:
|
||||||
solver_na2as(ast_manager & m);
|
solver_na2as(ast_manager & m);
|
||||||
virtual ~solver_na2as();
|
virtual ~solver_na2as();
|
||||||
|
|
||||||
virtual void assert_expr(expr * t, expr * a);
|
void assert_expr_core(expr * t, expr * a) override;
|
||||||
virtual void assert_expr(expr * t) = 0;
|
virtual void assert_expr_core(expr * t) = 0;
|
||||||
|
|
||||||
// Subclasses of solver_na2as should redefine the following *_core methods instead of these ones.
|
// Subclasses of solver_na2as should redefine the following *_core methods instead of these ones.
|
||||||
virtual lbool check_sat(unsigned num_assumptions, expr * const * assumptions);
|
virtual lbool check_sat(unsigned num_assumptions, expr * const * assumptions);
|
||||||
|
|
|
@ -49,7 +49,7 @@ public:
|
||||||
m_in_delayed_scope(false),
|
m_in_delayed_scope(false),
|
||||||
m_dump_counter(0) {
|
m_dump_counter(0) {
|
||||||
if (is_virtual()) {
|
if (is_virtual()) {
|
||||||
solver_na2as::assert_expr(m.mk_true(), pred);
|
solver_na2as::assert_expr_core(m.mk_true(), pred);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void assert_expr(expr * e) {
|
virtual void assert_expr_core(expr * e) {
|
||||||
SASSERT(!m_pushed || get_scope_level() > 0);
|
SASSERT(!m_pushed || get_scope_level() > 0);
|
||||||
if (m.is_true(e)) return;
|
if (m.is_true(e)) return;
|
||||||
if (m_in_delayed_scope) {
|
if (m_in_delayed_scope) {
|
||||||
|
|
|
@ -54,7 +54,7 @@ public:
|
||||||
|
|
||||||
virtual void set_produce_models(bool f) { m_produce_models = f; }
|
virtual void set_produce_models(bool f) { m_produce_models = f; }
|
||||||
|
|
||||||
virtual void assert_expr(expr * t);
|
virtual void assert_expr_core(expr * t);
|
||||||
virtual void assert_lemma(expr * t);
|
virtual void assert_lemma(expr * t);
|
||||||
|
|
||||||
virtual void push_core();
|
virtual void push_core();
|
||||||
|
@ -112,7 +112,7 @@ void tactic2solver::collect_param_descrs(param_descrs & r) {
|
||||||
m_tactic->collect_param_descrs(r);
|
m_tactic->collect_param_descrs(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tactic2solver::assert_expr(expr * t) {
|
void tactic2solver::assert_expr_core(expr * t) {
|
||||||
m_assertions.push_back(t);
|
m_assertions.push_back(t);
|
||||||
m_result = 0;
|
m_result = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ z3_add_component(tactic
|
||||||
SOURCES
|
SOURCES
|
||||||
equiv_proof_converter.cpp
|
equiv_proof_converter.cpp
|
||||||
extension_model_converter.cpp
|
extension_model_converter.cpp
|
||||||
filter_model_converter.cpp
|
|
||||||
generic_model_converter.cpp
|
generic_model_converter.cpp
|
||||||
goal.cpp
|
goal.cpp
|
||||||
goal_num_occurs.cpp
|
goal_num_occurs.cpp
|
||||||
|
|
|
@ -23,7 +23,7 @@ Notes:
|
||||||
#include "ast/rewriter/pb2bv_rewriter.h"
|
#include "ast/rewriter/pb2bv_rewriter.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
class card2bv_tactic : public tactic {
|
class card2bv_tactic : public tactic {
|
||||||
ast_manager & m;
|
ast_manager & m;
|
||||||
|
@ -89,9 +89,9 @@ public:
|
||||||
|
|
||||||
func_decl_ref_vector const& fns = rw2.fresh_constants();
|
func_decl_ref_vector const& fns = rw2.fresh_constants();
|
||||||
if (!fns.empty()) {
|
if (!fns.empty()) {
|
||||||
filter_model_converter* filter = alloc(filter_model_converter, m);
|
generic_model_converter* filter = alloc(generic_model_converter, m);
|
||||||
for (unsigned i = 0; i < fns.size(); ++i) {
|
for (unsigned i = 0; i < fns.size(); ++i) {
|
||||||
filter->insert(fns[i]);
|
filter->hide(fns[i]);
|
||||||
}
|
}
|
||||||
mc = filter;
|
mc = filter;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ Revision History:
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "tactic/generic_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "util/cooperate.h"
|
#include "util/cooperate.h"
|
||||||
#include "ast/arith_decl_plugin.h"
|
#include "ast/arith_decl_plugin.h"
|
||||||
|
@ -197,12 +196,10 @@ class degree_shift_tactic : public tactic {
|
||||||
|
|
||||||
void prepare_substitution(model_converter_ref & mc) {
|
void prepare_substitution(model_converter_ref & mc) {
|
||||||
SASSERT(!m_var2degree.empty());
|
SASSERT(!m_var2degree.empty());
|
||||||
filter_model_converter * fmc = 0;
|
|
||||||
generic_model_converter * xmc = 0;
|
generic_model_converter * xmc = 0;
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
fmc = alloc(filter_model_converter, m);
|
|
||||||
xmc = alloc(generic_model_converter, m);
|
xmc = alloc(generic_model_converter, m);
|
||||||
mc = concat(fmc, xmc);
|
mc = xmc;
|
||||||
}
|
}
|
||||||
for (auto const& kv : m_var2degree) {
|
for (auto const& kv : m_var2degree) {
|
||||||
SASSERT(kv.m_value.is_int());
|
SASSERT(kv.m_value.is_int());
|
||||||
|
@ -211,7 +208,7 @@ class degree_shift_tactic : public tactic {
|
||||||
m_pinned.push_back(fresh);
|
m_pinned.push_back(fresh);
|
||||||
m_var2var.insert(kv.m_key, fresh);
|
m_var2var.insert(kv.m_key, fresh);
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
fmc->insert(fresh->get_decl());
|
xmc->hide(fresh->get_decl());
|
||||||
xmc->add(kv.m_key->get_decl(), mk_power(fresh, rational(1)/kv.m_value));
|
xmc->add(kv.m_key->get_decl(), mk_power(fresh, rational(1)/kv.m_value));
|
||||||
}
|
}
|
||||||
if (m_produce_proofs) {
|
if (m_produce_proofs) {
|
||||||
|
|
|
@ -21,7 +21,7 @@ Revision History:
|
||||||
#include "ast/rewriter/th_rewriter.h"
|
#include "ast/rewriter/th_rewriter.h"
|
||||||
#include "ast/for_each_expr.h"
|
#include "ast/for_each_expr.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/arith_decl_plugin.h"
|
#include "ast/arith_decl_plugin.h"
|
||||||
#include "ast/expr_substitution.h"
|
#include "ast/expr_substitution.h"
|
||||||
#include "ast/ast_smt2_pp.h"
|
#include "ast/ast_smt2_pp.h"
|
||||||
|
@ -225,10 +225,10 @@ class lia2pb_tactic : public tactic {
|
||||||
throw tactic_exception("lia2pb failed, number of necessary bits exceeds specified threshold (use option :lia2pb-total-bits to increase threshold)");
|
throw tactic_exception("lia2pb failed, number of necessary bits exceeds specified threshold (use option :lia2pb-total-bits to increase threshold)");
|
||||||
|
|
||||||
extension_model_converter * mc1 = 0;
|
extension_model_converter * mc1 = 0;
|
||||||
filter_model_converter * mc2 = 0;
|
generic_model_converter * mc2 = 0;
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
mc1 = alloc(extension_model_converter, m);
|
mc1 = alloc(extension_model_converter, m);
|
||||||
mc2 = alloc(filter_model_converter, m);
|
mc2 = alloc(generic_model_converter, m);
|
||||||
mc = concat(mc2, mc1);
|
mc = concat(mc2, mc1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ class lia2pb_tactic : public tactic {
|
||||||
else
|
else
|
||||||
def_args.push_back(m_util.mk_mul(m_util.mk_numeral(a, true), x_prime));
|
def_args.push_back(m_util.mk_mul(m_util.mk_numeral(a, true), x_prime));
|
||||||
if (m_produce_models)
|
if (m_produce_models)
|
||||||
mc2->insert(x_prime->get_decl());
|
mc2->hide(x_prime->get_decl());
|
||||||
a *= rational(2);
|
a *= rational(2);
|
||||||
}
|
}
|
||||||
SASSERT(def_args.size() > 1);
|
SASSERT(def_args.size() > 1);
|
||||||
|
|
|
@ -27,7 +27,7 @@ Notes:
|
||||||
#include "tactic/arith/bv2int_rewriter.h"
|
#include "tactic/arith/bv2int_rewriter.h"
|
||||||
#include "tactic/arith/bv2real_rewriter.h"
|
#include "tactic/arith/bv2real_rewriter.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "tactic/arith/bound_manager.h"
|
#include "tactic/arith/bound_manager.h"
|
||||||
#include "util/obj_pair_hashtable.h"
|
#include "util/obj_pair_hashtable.h"
|
||||||
#include "ast/ast_smt2_pp.h"
|
#include "ast/ast_smt2_pp.h"
|
||||||
|
@ -60,7 +60,7 @@ class nla2bv_tactic : public tactic {
|
||||||
expr_ref_vector m_trail;
|
expr_ref_vector m_trail;
|
||||||
unsigned m_num_bits;
|
unsigned m_num_bits;
|
||||||
unsigned m_default_bv_size;
|
unsigned m_default_bv_size;
|
||||||
filter_model_converter_ref m_fmc;
|
generic_model_converter_ref m_fmc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
imp(ast_manager & m, params_ref const& p):
|
imp(ast_manager & m, params_ref const& p):
|
||||||
|
@ -86,7 +86,7 @@ class nla2bv_tactic : public tactic {
|
||||||
TRACE("nla2bv", g.display(tout);
|
TRACE("nla2bv", g.display(tout);
|
||||||
tout << "Muls: " << count_mul(g) << "\n";
|
tout << "Muls: " << count_mul(g) << "\n";
|
||||||
);
|
);
|
||||||
m_fmc = alloc(filter_model_converter, m_manager);
|
m_fmc = alloc(generic_model_converter, m_manager);
|
||||||
m_bounds(g);
|
m_bounds(g);
|
||||||
collect_power2(g);
|
collect_power2(g);
|
||||||
if(!collect_vars(g)) {
|
if(!collect_vars(g)) {
|
||||||
|
@ -104,7 +104,7 @@ class nla2bv_tactic : public tactic {
|
||||||
evc->insert(m_vars[i].get(), m_defs[i].get());
|
evc->insert(m_vars[i].get(), m_defs[i].get());
|
||||||
}
|
}
|
||||||
for (unsigned i = 0; i < m_bv2real.num_aux_decls(); ++i) {
|
for (unsigned i = 0; i < m_bv2real.num_aux_decls(); ++i) {
|
||||||
m_fmc->insert(m_bv2real.get_aux_decl(i));
|
m_fmc->hide(m_bv2real.get_aux_decl(i));
|
||||||
}
|
}
|
||||||
IF_VERBOSE(TACTIC_VERBOSITY_LVL, verbose_stream() << "(nla->bv :sat-preserving " << m_is_sat_preserving << ")\n";);
|
IF_VERBOSE(TACTIC_VERBOSITY_LVL, verbose_stream() << "(nla->bv :sat-preserving " << m_is_sat_preserving << ")\n";);
|
||||||
TRACE("nla2bv_verbose", g.display(tout););
|
TRACE("nla2bv_verbose", g.display(tout););
|
||||||
|
@ -233,7 +233,7 @@ class nla2bv_tactic : public tactic {
|
||||||
bv_sort = m_bv.mk_sort(num_bits);
|
bv_sort = m_bv.mk_sort(num_bits);
|
||||||
std::string name = n->get_decl()->get_name().str();
|
std::string name = n->get_decl()->get_name().str();
|
||||||
s_bv = m_manager.mk_fresh_const(name.c_str(), bv_sort);
|
s_bv = m_manager.mk_fresh_const(name.c_str(), bv_sort);
|
||||||
m_fmc->insert(to_app(s_bv)->get_decl());
|
m_fmc->hide(s_bv);
|
||||||
s_bv = m_bv.mk_bv2int(s_bv);
|
s_bv = m_bv.mk_bv2int(s_bv);
|
||||||
if (low) {
|
if (low) {
|
||||||
if (!(*low).is_zero()) {
|
if (!(*low).is_zero()) {
|
||||||
|
@ -271,8 +271,8 @@ class nla2bv_tactic : public tactic {
|
||||||
s = m_manager.mk_fresh_const(name.c_str(), bv_sort);
|
s = m_manager.mk_fresh_const(name.c_str(), bv_sort);
|
||||||
name += "_r";
|
name += "_r";
|
||||||
t = m_manager.mk_fresh_const(name.c_str(), bv_sort);
|
t = m_manager.mk_fresh_const(name.c_str(), bv_sort);
|
||||||
m_fmc->insert(to_app(s)->get_decl());
|
m_fmc->hide(s);
|
||||||
m_fmc->insert(to_app(t)->get_decl());
|
m_fmc->hide(t);
|
||||||
s_bv = m_bv2real.mk_bv2real(s, t);
|
s_bv = m_bv2real.mk_bv2real(s, t);
|
||||||
m_trail.push_back(s_bv);
|
m_trail.push_back(s_bv);
|
||||||
m_subst.insert(n, s_bv);
|
m_subst.insert(n, s_bv);
|
||||||
|
|
|
@ -22,7 +22,7 @@ Revision History:
|
||||||
#include "tactic/arith/bound_manager.h"
|
#include "tactic/arith/bound_manager.h"
|
||||||
#include "ast/rewriter/th_rewriter.h"
|
#include "ast/rewriter/th_rewriter.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/arith_decl_plugin.h"
|
#include "ast/arith_decl_plugin.h"
|
||||||
#include "ast/expr_substitution.h"
|
#include "ast/expr_substitution.h"
|
||||||
#include "ast/ast_smt2_pp.h"
|
#include "ast/ast_smt2_pp.h"
|
||||||
|
@ -99,10 +99,10 @@ class normalize_bounds_tactic : public tactic {
|
||||||
}
|
}
|
||||||
|
|
||||||
extension_model_converter * mc1 = 0;
|
extension_model_converter * mc1 = 0;
|
||||||
filter_model_converter * mc2 = 0;
|
generic_model_converter * mc2 = 0;
|
||||||
if (produce_models) {
|
if (produce_models) {
|
||||||
mc1 = alloc(extension_model_converter, m);
|
mc1 = alloc(extension_model_converter, m);
|
||||||
mc2 = alloc(filter_model_converter, m);
|
mc2 = alloc(generic_model_converter, m);
|
||||||
mc = concat(mc2, mc1);
|
mc = concat(mc2, mc1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ class normalize_bounds_tactic : public tactic {
|
||||||
subst.insert(x, def);
|
subst.insert(x, def);
|
||||||
if (produce_models) {
|
if (produce_models) {
|
||||||
mc1->insert(to_app(x)->get_decl(), def);
|
mc1->insert(to_app(x)->get_decl(), def);
|
||||||
mc2->insert(x_prime->get_decl());
|
mc2->hide(x_prime->get_decl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ Notes:
|
||||||
#include "util/trace.h"
|
#include "util/trace.h"
|
||||||
#include "ast/ast_smt2_pp.h"
|
#include "ast/ast_smt2_pp.h"
|
||||||
#include "ast/expr_substitution.h"
|
#include "ast/expr_substitution.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "tactic/arith/pb2bv_model_converter.h"
|
#include "tactic/arith/pb2bv_model_converter.h"
|
||||||
#include "tactic/arith/pb2bv_tactic.h"
|
#include "tactic/arith/pb2bv_tactic.h"
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
|
@ -949,15 +949,13 @@ private:
|
||||||
g->update(idx, new_exprs[idx].get(), 0, (m_produce_unsat_cores) ? new_deps[idx].get() : g->dep(idx));
|
g->update(idx, new_exprs[idx].get(), 0, (m_produce_unsat_cores) ? new_deps[idx].get() : g->dep(idx));
|
||||||
|
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
filter_model_converter * mc1 = alloc(filter_model_converter, m);
|
generic_model_converter * mc1 = alloc(generic_model_converter, m);
|
||||||
obj_map<func_decl, expr*>::iterator it = m_const2bit.begin();
|
for (auto const& kv : m_const2bit)
|
||||||
obj_map<func_decl, expr*>::iterator end = m_const2bit.end();
|
mc1->hide(kv.m_value);
|
||||||
for (; it != end; ++it)
|
|
||||||
mc1->insert(to_app(it->m_value)->get_decl());
|
|
||||||
// store temp int constants in the filter
|
// store temp int constants in the filter
|
||||||
unsigned num_temps = m_temporary_ints.size();
|
unsigned num_temps = m_temporary_ints.size();
|
||||||
for (unsigned i = 0; i < num_temps; i++)
|
for (unsigned i = 0; i < num_temps; i++)
|
||||||
mc1->insert(to_app(m_temporary_ints.get(i))->get_decl());
|
mc1->hide(m_temporary_ints.get(i));
|
||||||
pb2bv_model_converter * mc2 = alloc(pb2bv_model_converter, m, m_const2bit, m_bm);
|
pb2bv_model_converter * mc2 = alloc(pb2bv_model_converter, m, m_const2bit, m_bm);
|
||||||
mc = concat(mc1, mc2);
|
mc = concat(mc1, mc2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ Revision History:
|
||||||
#include "tactic/core/nnf_tactic.h"
|
#include "tactic/core/nnf_tactic.h"
|
||||||
#include "tactic/core/simplify_tactic.h"
|
#include "tactic/core/simplify_tactic.h"
|
||||||
#include "ast/rewriter/th_rewriter.h"
|
#include "ast/rewriter/th_rewriter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "ast/ast_smt2_pp.h"
|
#include "ast/ast_smt2_pp.h"
|
||||||
#include "ast/rewriter/expr_replacer.h"
|
#include "ast/rewriter/expr_replacer.h"
|
||||||
|
@ -764,17 +764,15 @@ struct purify_arith_proc {
|
||||||
m_goal.assert_expr(r.cfg().m_new_cnstrs.get(i), m_produce_proofs ? r.cfg().m_new_cnstr_prs.get(i) : 0, 0);
|
m_goal.assert_expr(r.cfg().m_new_cnstrs.get(i), m_produce_proofs ? r.cfg().m_new_cnstr_prs.get(i) : 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add filter_model_converter to eliminate auxiliary variables from model
|
// add generic_model_converter to eliminate auxiliary variables from model
|
||||||
if (produce_models) {
|
if (produce_models) {
|
||||||
filter_model_converter * fmc = alloc(filter_model_converter, m());
|
generic_model_converter * fmc = alloc(generic_model_converter, m());
|
||||||
mc = fmc;
|
mc = fmc;
|
||||||
obj_map<app, expr*> & f2v = r.cfg().m_app2fresh;
|
obj_map<app, expr*> & f2v = r.cfg().m_app2fresh;
|
||||||
obj_map<app, expr*>::iterator it = f2v.begin();
|
for (auto const& kv : f2v) {
|
||||||
obj_map<app, expr*>::iterator end = f2v.end();
|
app * v = to_app(kv.m_value);
|
||||||
for (; it != end; ++it) {
|
|
||||||
app * v = to_app(it->m_value);
|
|
||||||
SASSERT(is_uninterp_const(v));
|
SASSERT(is_uninterp_const(v));
|
||||||
fmc->insert(v->get_decl());
|
fmc->hide(v->get_decl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (produce_models && !m_sin_cos.empty()) {
|
if (produce_models && !m_sin_cos.empty()) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ Revision History:
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "ast/rewriter/th_rewriter.h"
|
#include "ast/rewriter/th_rewriter.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/arith_decl_plugin.h"
|
#include "ast/arith_decl_plugin.h"
|
||||||
#include "ast/expr_substitution.h"
|
#include "ast/expr_substitution.h"
|
||||||
#include "util/dec_ref_util.h"
|
#include "util/dec_ref_util.h"
|
||||||
|
@ -113,7 +113,7 @@ class recover_01_tactic : public tactic {
|
||||||
|
|
||||||
// temporary fields used by operator() and process
|
// temporary fields used by operator() and process
|
||||||
extension_model_converter * mc1;
|
extension_model_converter * mc1;
|
||||||
filter_model_converter * mc2;
|
generic_model_converter * mc2;
|
||||||
expr_substitution * subst;
|
expr_substitution * subst;
|
||||||
goal_ref new_goal;
|
goal_ref new_goal;
|
||||||
obj_map<expr, expr *> bool2int;
|
obj_map<expr, expr *> bool2int;
|
||||||
|
@ -205,7 +205,7 @@ class recover_01_tactic : public tactic {
|
||||||
expr * bool_def = m.mk_eq(var, m_util.mk_numeral(rational(1), true));
|
expr * bool_def = m.mk_eq(var, m_util.mk_numeral(rational(1), true));
|
||||||
subst->insert(atom, bool_def);
|
subst->insert(atom, bool_def);
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
mc2->insert(to_app(var)->get_decl());
|
mc2->hide(to_app(var)->get_decl());
|
||||||
mc1->insert(to_app(atom)->get_decl(), bool_def);
|
mc1->insert(to_app(atom)->get_decl(), bool_def);
|
||||||
}
|
}
|
||||||
m.inc_ref(atom);
|
m.inc_ref(atom);
|
||||||
|
@ -329,7 +329,7 @@ class recover_01_tactic : public tactic {
|
||||||
|
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
mc1 = alloc(extension_model_converter, m);
|
mc1 = alloc(extension_model_converter, m);
|
||||||
mc2 = alloc(filter_model_converter, m);
|
mc2 = alloc(generic_model_converter, m);
|
||||||
mc = concat(mc2, mc1);
|
mc = concat(mc2, mc1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ Notes:
|
||||||
#include "ast/bv_decl_plugin.h"
|
#include "ast/bv_decl_plugin.h"
|
||||||
#include "ast/rewriter/expr_replacer.h"
|
#include "ast/rewriter/expr_replacer.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/ast_smt2_pp.h"
|
#include "ast/ast_smt2_pp.h"
|
||||||
|
|
||||||
class bv_size_reduction_tactic : public tactic {
|
class bv_size_reduction_tactic : public tactic {
|
||||||
|
@ -60,7 +60,7 @@ struct bv_size_reduction_tactic::imp {
|
||||||
obj_map<app, numeral> m_unsigned_lowers;
|
obj_map<app, numeral> m_unsigned_lowers;
|
||||||
obj_map<app, numeral> m_unsigned_uppers;
|
obj_map<app, numeral> m_unsigned_uppers;
|
||||||
ref<bv_size_reduction_mc> m_mc;
|
ref<bv_size_reduction_mc> m_mc;
|
||||||
filter_model_converter_ref m_fmc;
|
generic_model_converter_ref m_fmc;
|
||||||
scoped_ptr<expr_replacer> m_replacer;
|
scoped_ptr<expr_replacer> m_replacer;
|
||||||
bool m_produce_models;
|
bool m_produce_models;
|
||||||
|
|
||||||
|
@ -269,9 +269,9 @@ struct bv_size_reduction_tactic::imp {
|
||||||
m_mc = alloc(bv_size_reduction_mc, m);
|
m_mc = alloc(bv_size_reduction_mc, m);
|
||||||
m_mc->insert(v->get_decl(), new_def);
|
m_mc->insert(v->get_decl(), new_def);
|
||||||
if (!m_fmc && new_const)
|
if (!m_fmc && new_const)
|
||||||
m_fmc = alloc(filter_model_converter, m);
|
m_fmc = alloc(generic_model_converter, m);
|
||||||
if (new_const)
|
if (new_const)
|
||||||
m_fmc->insert(new_const->get_decl());
|
m_fmc->hide(new_const);
|
||||||
}
|
}
|
||||||
num_reduced++;
|
num_reduced++;
|
||||||
}
|
}
|
||||||
|
@ -335,9 +335,9 @@ struct bv_size_reduction_tactic::imp {
|
||||||
m_mc = alloc(bv_size_reduction_mc, m);
|
m_mc = alloc(bv_size_reduction_mc, m);
|
||||||
m_mc->insert(v->get_decl(), new_def);
|
m_mc->insert(v->get_decl(), new_def);
|
||||||
if (!m_fmc && new_const)
|
if (!m_fmc && new_const)
|
||||||
m_fmc = alloc(filter_model_converter, m);
|
m_fmc = alloc(generic_model_converter, m);
|
||||||
if (new_const)
|
if (new_const)
|
||||||
m_fmc->insert(new_const->get_decl());
|
m_fmc->hide(new_const);
|
||||||
}
|
}
|
||||||
num_reduced++;
|
num_reduced++;
|
||||||
TRACE("bv_size_reduction", tout << "New definition = " << mk_ismt2_pp(new_def, m) << "\n";);
|
TRACE("bv_size_reduction", tout << "New definition = " << mk_ismt2_pp(new_def, m) << "\n";);
|
||||||
|
|
|
@ -120,7 +120,7 @@ func_decl_ref bvarray2uf_rewriter_cfg::mk_uf_for_array(expr * e) {
|
||||||
m_array_util.mk_as_array(bv_f));
|
m_array_util.mk_as_array(bv_f));
|
||||||
}
|
}
|
||||||
else if (m_fmc)
|
else if (m_fmc)
|
||||||
m_fmc->insert(bv_f);
|
m_fmc->hide(bv_f);
|
||||||
m_arrays_fs.insert(e, bv_f);
|
m_arrays_fs.insert(e, bv_f);
|
||||||
m_manager.inc_ref(e);
|
m_manager.inc_ref(e);
|
||||||
m_manager.inc_ref(bv_f);
|
m_manager.inc_ref(bv_f);
|
||||||
|
@ -193,10 +193,10 @@ br_status bvarray2uf_rewriter_cfg::reduce_app(func_decl * f, unsigned num, expr
|
||||||
if (is_uninterp_const(e)) {
|
if (is_uninterp_const(e)) {
|
||||||
if (m_emc)
|
if (m_emc)
|
||||||
m_emc->insert(e->get_decl(),
|
m_emc->insert(e->get_decl(),
|
||||||
m_array_util.mk_as_array(bv_f));
|
m_array_util.mk_as_array(bv_f));
|
||||||
}
|
}
|
||||||
else if (m_fmc)
|
else if (m_fmc)
|
||||||
m_fmc->insert(bv_f);
|
m_fmc->hide(bv_f);
|
||||||
m_arrays_fs.insert(e, bv_f);
|
m_arrays_fs.insert(e, bv_f);
|
||||||
m_manager.inc_ref(e);
|
m_manager.inc_ref(e);
|
||||||
m_manager.inc_ref(bv_f);
|
m_manager.inc_ref(bv_f);
|
||||||
|
|
|
@ -22,7 +22,7 @@ Notes:
|
||||||
|
|
||||||
#include "ast/rewriter/rewriter.h"
|
#include "ast/rewriter/rewriter.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
class bvarray2uf_rewriter_cfg : public default_rewriter_cfg {
|
class bvarray2uf_rewriter_cfg : public default_rewriter_cfg {
|
||||||
ast_manager & m_manager;
|
ast_manager & m_manager;
|
||||||
|
@ -31,7 +31,7 @@ class bvarray2uf_rewriter_cfg : public default_rewriter_cfg {
|
||||||
bv_util m_bv_util;
|
bv_util m_bv_util;
|
||||||
array_util m_array_util;
|
array_util m_array_util;
|
||||||
extension_model_converter * m_emc;
|
extension_model_converter * m_emc;
|
||||||
filter_model_converter * m_fmc;
|
generic_model_converter * m_fmc;
|
||||||
|
|
||||||
obj_map<expr, func_decl*> m_arrays_fs;
|
obj_map<expr, func_decl*> m_arrays_fs;
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ public:
|
||||||
|
|
||||||
expr_ref_vector extra_assertions;
|
expr_ref_vector extra_assertions;
|
||||||
|
|
||||||
void set_mcs(extension_model_converter * emc, filter_model_converter * fmc) { m_emc = emc; m_fmc = fmc; }
|
void set_mcs(extension_model_converter * emc, generic_model_converter * fmc) { m_emc = emc; m_fmc = fmc; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
sort * get_index_sort(expr * e);
|
sort * get_index_sort(expr * e);
|
||||||
|
@ -79,7 +79,7 @@ struct bvarray2uf_rewriter : public rewriter_tpl<bvarray2uf_rewriter_cfg> {
|
||||||
m_cfg(m, p) {
|
m_cfg(m, p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_mcs(extension_model_converter * emc, filter_model_converter * fmc) { m_cfg.set_mcs(emc, fmc); }
|
void set_mcs(extension_model_converter * emc, generic_model_converter * fmc) { m_cfg.set_mcs(emc, fmc); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,7 +21,7 @@ Notes:
|
||||||
#include "ast/bv_decl_plugin.h"
|
#include "ast/bv_decl_plugin.h"
|
||||||
#include "ast/rewriter/expr_replacer.h"
|
#include "ast/rewriter/expr_replacer.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/ast_smt2_pp.h"
|
#include "ast/ast_smt2_pp.h"
|
||||||
|
|
||||||
#include "tactic/bv/bvarray2uf_tactic.h"
|
#include "tactic/bv/bvarray2uf_tactic.h"
|
||||||
|
@ -69,7 +69,7 @@ class bvarray2uf_tactic : public tactic {
|
||||||
|
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
extension_model_converter * emc = alloc(extension_model_converter, m_manager);
|
extension_model_converter * emc = alloc(extension_model_converter, m_manager);
|
||||||
filter_model_converter * fmc = alloc(filter_model_converter, m_manager);
|
generic_model_converter * fmc = alloc(generic_model_converter, m_manager);
|
||||||
mc = concat(emc, fmc);
|
mc = concat(emc, fmc);
|
||||||
m_rw.set_mcs(emc, fmc);
|
m_rw.set_mcs(emc, fmc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,11 +21,11 @@ Revision History:
|
||||||
|
|
||||||
#include "tactic/bv/dt2bv_tactic.h"
|
#include "tactic/bv/dt2bv_tactic.h"
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/datatype_decl_plugin.h"
|
#include "ast/datatype_decl_plugin.h"
|
||||||
#include "ast/bv_decl_plugin.h"
|
#include "ast/bv_decl_plugin.h"
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "ast/rewriter/var_subst.h"
|
#include "ast/rewriter/var_subst.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
|
@ -135,7 +135,7 @@ public:
|
||||||
m_fd_sorts.remove(s);
|
m_fd_sorts.remove(s);
|
||||||
if (!m_fd_sorts.empty()) {
|
if (!m_fd_sorts.empty()) {
|
||||||
ref<extension_model_converter> ext = alloc(extension_model_converter, m);
|
ref<extension_model_converter> ext = alloc(extension_model_converter, m);
|
||||||
ref<filter_model_converter> filter = alloc(filter_model_converter, m);
|
ref<generic_model_converter> filter = alloc(generic_model_converter, m);
|
||||||
enum2bv_rewriter rw(m, m_params);
|
enum2bv_rewriter rw(m, m_params);
|
||||||
rw.set_is_fd(&m_is_fd);
|
rw.set_is_fd(&m_is_fd);
|
||||||
expr_ref new_curr(m);
|
expr_ref new_curr(m);
|
||||||
|
@ -153,7 +153,7 @@ public:
|
||||||
for (expr* b : bounds)
|
for (expr* b : bounds)
|
||||||
g->assert_expr(b);
|
g->assert_expr(b);
|
||||||
for (auto const& kv : rw.enum2bv())
|
for (auto const& kv : rw.enum2bv())
|
||||||
filter->insert(kv.m_value);
|
filter->hide(kv.m_value);
|
||||||
for (auto const& kv : rw.enum2def())
|
for (auto const& kv : rw.enum2def())
|
||||||
ext->insert(kv.m_key, kv.m_value);
|
ext->insert(kv.m_key, kv.m_value);
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ Revision History:
|
||||||
--*/
|
--*/
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "util/cooperate.h"
|
#include "util/cooperate.h"
|
||||||
#include "ast/bv_decl_plugin.h"
|
#include "ast/bv_decl_plugin.h"
|
||||||
#include "ast/used_vars.h"
|
#include "ast/used_vars.h"
|
||||||
|
@ -35,7 +35,7 @@ class elim_small_bv_tactic : public tactic {
|
||||||
params_ref m_params;
|
params_ref m_params;
|
||||||
bv_util m_util;
|
bv_util m_util;
|
||||||
th_rewriter m_simp;
|
th_rewriter m_simp;
|
||||||
ref<filter_model_converter> m_mc;
|
ref<generic_model_converter> m_mc;
|
||||||
goal * m_goal;
|
goal * m_goal;
|
||||||
unsigned m_max_bits;
|
unsigned m_max_bits;
|
||||||
unsigned long long m_max_steps;
|
unsigned long long m_max_steps;
|
||||||
|
|
|
@ -19,7 +19,6 @@ Notes:
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "ast/normal_forms/defined_names.h"
|
#include "ast/normal_forms/defined_names.h"
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "util/cooperate.h"
|
#include "util/cooperate.h"
|
||||||
#include "ast/scoped_proof.h"
|
#include "ast/scoped_proof.h"
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ Notes:
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "ast/normal_forms/defined_names.h"
|
#include "ast/normal_forms/defined_names.h"
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "util/cooperate.h"
|
#include "util/cooperate.h"
|
||||||
|
|
||||||
class elim_term_ite_tactic : public tactic {
|
class elim_term_ite_tactic : public tactic {
|
||||||
|
@ -28,7 +28,7 @@ class elim_term_ite_tactic : public tactic {
|
||||||
struct rw_cfg : public default_rewriter_cfg {
|
struct rw_cfg : public default_rewriter_cfg {
|
||||||
ast_manager & m;
|
ast_manager & m;
|
||||||
defined_names m_defined_names;
|
defined_names m_defined_names;
|
||||||
ref<filter_model_converter> m_mc;
|
ref<generic_model_converter> m_mc;
|
||||||
goal * m_goal;
|
goal * m_goal;
|
||||||
unsigned long long m_max_memory; // in bytes
|
unsigned long long m_max_memory; // in bytes
|
||||||
bool m_produce_models;
|
bool m_produce_models;
|
||||||
|
@ -55,8 +55,8 @@ class elim_term_ite_tactic : public tactic {
|
||||||
m_num_fresh++;
|
m_num_fresh++;
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
if (!m_mc)
|
if (!m_mc)
|
||||||
m_mc = alloc(filter_model_converter, m);
|
m_mc = alloc(generic_model_converter, m);
|
||||||
m_mc->insert(_result->get_decl());
|
m_mc->hide(_result->get_decl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = _result.get();
|
result = _result.get();
|
||||||
|
|
|
@ -18,7 +18,6 @@ Notes:
|
||||||
--*/
|
--*/
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/generic_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "ast/arith_decl_plugin.h"
|
#include "ast/arith_decl_plugin.h"
|
||||||
#include "ast/bv_decl_plugin.h"
|
#include "ast/bv_decl_plugin.h"
|
||||||
|
@ -873,9 +872,9 @@ class elim_uncnstr_tactic : public tactic {
|
||||||
app_ref_vector & fresh_vars = m_rw->cfg().m_fresh_vars;
|
app_ref_vector & fresh_vars = m_rw->cfg().m_fresh_vars;
|
||||||
m_num_elim_apps = fresh_vars.size();
|
m_num_elim_apps = fresh_vars.size();
|
||||||
if (produce_models && !fresh_vars.empty()) {
|
if (produce_models && !fresh_vars.empty()) {
|
||||||
filter_model_converter * fmc = alloc(filter_model_converter, m());
|
generic_model_converter * fmc = alloc(generic_model_converter, m());
|
||||||
for (unsigned i = 0; i < fresh_vars.size(); i++)
|
for (app * f : fresh_vars)
|
||||||
fmc->insert(fresh_vars.get(i)->get_decl());
|
fmc->hide(f);
|
||||||
mc = concat(fmc, m_mc.get());
|
mc = concat(fmc, m_mc.get());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -910,7 +909,7 @@ class elim_uncnstr_tactic : public tactic {
|
||||||
imp * m_imp;
|
imp * m_imp;
|
||||||
params_ref m_params;
|
params_ref m_params;
|
||||||
public:
|
public:
|
||||||
elim_uncnstr_tactic(ast_manager & m, params_ref const & p):
|
elim_uncnstr_tactic(ast_manager & m, params_ref const & p):
|
||||||
m_params(p) {
|
m_params(p) {
|
||||||
m_imp = alloc(imp, m, p);
|
m_imp = alloc(imp, m, p);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ Revision History:
|
||||||
--*/
|
--*/
|
||||||
#include "ast/normal_forms/nnf.h"
|
#include "ast/normal_forms/nnf.h"
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
class nnf_tactic : public tactic {
|
class nnf_tactic : public tactic {
|
||||||
params_ref m_params;
|
params_ref m_params;
|
||||||
|
@ -97,10 +97,10 @@ public:
|
||||||
result.push_back(g.get());
|
result.push_back(g.get());
|
||||||
unsigned num_extra_names = dnames.get_num_names();
|
unsigned num_extra_names = dnames.get_num_names();
|
||||||
if (num_extra_names > 0) {
|
if (num_extra_names > 0) {
|
||||||
filter_model_converter * fmc = alloc(filter_model_converter, m);
|
generic_model_converter * fmc = alloc(generic_model_converter, m);
|
||||||
mc = fmc;
|
mc = fmc;
|
||||||
for (unsigned i = 0; i < num_extra_names; i++)
|
for (unsigned i = 0; i < num_extra_names; i++)
|
||||||
fmc->insert(dnames.get_name_decl(i));
|
fmc->hide(dnames.get_name_decl(i));
|
||||||
}
|
}
|
||||||
TRACE("nnf", g->display(tout););
|
TRACE("nnf", g->display(tout););
|
||||||
SASSERT(g->is_well_sorted());
|
SASSERT(g->is_well_sorted());
|
||||||
|
|
|
@ -23,13 +23,13 @@ Revision History:
|
||||||
--*/
|
--*/
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/core/occf_tactic.h"
|
#include "tactic/core/occf_tactic.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "util/cooperate.h"
|
#include "util/cooperate.h"
|
||||||
|
|
||||||
class occf_tactic : public tactic {
|
class occf_tactic : public tactic {
|
||||||
struct imp {
|
struct imp {
|
||||||
ast_manager & m;
|
ast_manager & m;
|
||||||
filter_model_converter * m_mc;
|
generic_model_converter * m_mc;
|
||||||
|
|
||||||
imp(ast_manager & _m):
|
imp(ast_manager & _m):
|
||||||
m(_m) {
|
m(_m) {
|
||||||
|
@ -115,7 +115,7 @@ class occf_tactic : public tactic {
|
||||||
SASSERT(!c2b.contains(cnstr));
|
SASSERT(!c2b.contains(cnstr));
|
||||||
expr * bvar = m.mk_fresh_const(0, m.mk_bool_sort());
|
expr * bvar = m.mk_fresh_const(0, m.mk_bool_sort());
|
||||||
if (produce_models)
|
if (produce_models)
|
||||||
m_mc->insert(to_app(bvar)->get_decl());
|
m_mc->hide(to_app(bvar)->get_decl());
|
||||||
c2b.insert(cnstr, bvar_info(bvar, sign));
|
c2b.insert(cnstr, bvar_info(bvar, sign));
|
||||||
if (sign) {
|
if (sign) {
|
||||||
g->assert_expr(m.mk_or(bvar, m.mk_not(cnstr)), 0, 0);
|
g->assert_expr(m.mk_or(bvar, m.mk_not(cnstr)), 0, 0);
|
||||||
|
@ -157,7 +157,7 @@ class occf_tactic : public tactic {
|
||||||
if (!is_target(cls))
|
if (!is_target(cls))
|
||||||
continue;
|
continue;
|
||||||
if (produce_models && !m_mc) {
|
if (produce_models && !m_mc) {
|
||||||
m_mc = alloc(filter_model_converter, m);
|
m_mc = alloc(generic_model_converter, m);
|
||||||
mc = m_mc;
|
mc = m_mc;
|
||||||
}
|
}
|
||||||
expr * keep = 0;
|
expr * keep = 0;
|
||||||
|
|
|
@ -23,7 +23,7 @@ Notes:
|
||||||
#include "util/map.h"
|
#include "util/map.h"
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Reduce the number of arguments in function applications.
|
\brief Reduce the number of arguments in function applications.
|
||||||
|
@ -395,7 +395,7 @@ struct reduce_args_tactic::imp {
|
||||||
var_ref_vector new_vars(m_manager);
|
var_ref_vector new_vars(m_manager);
|
||||||
ptr_buffer<expr> new_eqs;
|
ptr_buffer<expr> new_eqs;
|
||||||
extension_model_converter * e_mc = alloc(extension_model_converter, m_manager);
|
extension_model_converter * e_mc = alloc(extension_model_converter, m_manager);
|
||||||
filter_model_converter * f_mc = alloc(filter_model_converter, m_manager);
|
generic_model_converter * f_mc = alloc(generic_model_converter, m_manager);
|
||||||
decl2arg2func_map::iterator it = decl2arg2funcs.begin();
|
decl2arg2func_map::iterator it = decl2arg2funcs.begin();
|
||||||
decl2arg2func_map::iterator end = decl2arg2funcs.end();
|
decl2arg2func_map::iterator end = decl2arg2funcs.end();
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
|
@ -416,7 +416,7 @@ struct reduce_args_tactic::imp {
|
||||||
for (; it2 != end2; ++it2) {
|
for (; it2 != end2; ++it2) {
|
||||||
app * t = it2->m_key;
|
app * t = it2->m_key;
|
||||||
func_decl * new_def = it2->m_value;
|
func_decl * new_def = it2->m_value;
|
||||||
f_mc->insert(new_def);
|
f_mc->hide(new_def);
|
||||||
SASSERT(new_def->get_arity() == new_args.size());
|
SASSERT(new_def->get_arity() == new_args.size());
|
||||||
app * new_t = m_manager.mk_app(new_def, new_args.size(), new_args.c_ptr());
|
app * new_t = m_manager.mk_app(new_def, new_args.size(), new_args.c_ptr());
|
||||||
if (def == 0) {
|
if (def == 0) {
|
||||||
|
|
|
@ -51,7 +51,7 @@ Notes:
|
||||||
--*/
|
--*/
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/goal_shared_occs.h"
|
#include "tactic/goal_shared_occs.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/rewriter/bool_rewriter.h"
|
#include "ast/rewriter/bool_rewriter.h"
|
||||||
#include "tactic/core/simplify_tactic.h"
|
#include "tactic/core/simplify_tactic.h"
|
||||||
#include "util/cooperate.h"
|
#include "util/cooperate.h"
|
||||||
|
@ -80,7 +80,7 @@ class tseitin_cnf_tactic : public tactic {
|
||||||
frame(app * n):m_t(n), m_first(true) {}
|
frame(app * n):m_t(n), m_first(true) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef filter_model_converter mc;
|
typedef generic_model_converter mc;
|
||||||
|
|
||||||
ast_manager & m;
|
ast_manager & m;
|
||||||
svector<frame> m_frame_stack;
|
svector<frame> m_frame_stack;
|
||||||
|
@ -344,7 +344,7 @@ class tseitin_cnf_tactic : public tactic {
|
||||||
app * v = m.mk_fresh_const(0, m.mk_bool_sort());
|
app * v = m.mk_fresh_const(0, m.mk_bool_sort());
|
||||||
m_fresh_vars.push_back(v);
|
m_fresh_vars.push_back(v);
|
||||||
if (m_mc)
|
if (m_mc)
|
||||||
m_mc->insert(v->get_decl());
|
m_mc->hide(v->get_decl());
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -817,7 +817,7 @@ class tseitin_cnf_tactic : public tactic {
|
||||||
m_frame_stack.reset();
|
m_frame_stack.reset();
|
||||||
m_clauses.reset();
|
m_clauses.reset();
|
||||||
if (m_produce_models)
|
if (m_produce_models)
|
||||||
m_mc = alloc(filter_model_converter, m);
|
m_mc = alloc(generic_model_converter, m);
|
||||||
else
|
else
|
||||||
m_mc = 0;
|
m_mc = 0;
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ Abstract:
|
||||||
Model converter that introduces new interpretations into a model.
|
Model converter that introduces new interpretations into a model.
|
||||||
It used to be called elim_var_model_converter
|
It used to be called elim_var_model_converter
|
||||||
|
|
||||||
|
TBD: special case of generic_model_converter
|
||||||
|
|
||||||
Author:
|
Author:
|
||||||
|
|
||||||
Leonardo (leonardo) 2011-10-21
|
Leonardo (leonardo) 2011-10-21
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
/*++
|
|
||||||
Copyright (c) 2011 Microsoft Corporation
|
|
||||||
|
|
||||||
Module Name:
|
|
||||||
|
|
||||||
filter_model_converter.cpp
|
|
||||||
|
|
||||||
Abstract:
|
|
||||||
|
|
||||||
Filter decls from a model
|
|
||||||
|
|
||||||
Author:
|
|
||||||
|
|
||||||
Leonardo (leonardo) 2011-05-06
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
--*/
|
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "model/model_v2_pp.h"
|
|
||||||
|
|
||||||
filter_model_converter::~filter_model_converter() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void filter_model_converter::operator()(model_ref & old_model, unsigned goal_idx) {
|
|
||||||
TRACE("filter_mc", tout << "before filter_model_converter\n"; model_v2_pp(tout, *old_model); display(tout););
|
|
||||||
ast_fast_mark1 fs;
|
|
||||||
unsigned num = m_decls.size();
|
|
||||||
for (unsigned i = 0; i < num; i++)
|
|
||||||
fs.mark(m_decls.get(i));
|
|
||||||
model * new_model = alloc(model, m());
|
|
||||||
num = old_model->get_num_constants();
|
|
||||||
for (unsigned i = 0; i < num; i++) {
|
|
||||||
func_decl * f = old_model->get_constant(i);
|
|
||||||
if (fs.is_marked(f))
|
|
||||||
continue;
|
|
||||||
expr * fi = old_model->get_const_interp(f);
|
|
||||||
new_model->register_decl(f, fi);
|
|
||||||
}
|
|
||||||
num = old_model->get_num_functions();
|
|
||||||
for (unsigned i = 0; i < num; i++) {
|
|
||||||
func_decl * f = old_model->get_function(i);
|
|
||||||
if (fs.is_marked(f))
|
|
||||||
continue;
|
|
||||||
func_interp * fi = old_model->get_func_interp(f);
|
|
||||||
SASSERT(fi);
|
|
||||||
new_model->register_decl(f, fi->copy());
|
|
||||||
}
|
|
||||||
new_model->copy_usort_interps(*old_model);
|
|
||||||
old_model = new_model;
|
|
||||||
TRACE("filter_mc", tout << "after filter_model_converter\n"; model_v2_pp(tout, *old_model););
|
|
||||||
}
|
|
||||||
|
|
||||||
void filter_model_converter::operator()(svector<symbol> & labels, unsigned goal_idx) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void filter_model_converter::display(std::ostream & out) {
|
|
||||||
for (func_decl* f : m_decls) {
|
|
||||||
display_del(out, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
model_converter * filter_model_converter::translate(ast_translation & translator) {
|
|
||||||
filter_model_converter * res = alloc(filter_model_converter, translator.to());
|
|
||||||
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();
|
|
||||||
for (func_decl* f : m_decls) visitor.coll.visit_func(f);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*++
|
|
||||||
Copyright (c) 2011 Microsoft Corporation
|
|
||||||
|
|
||||||
Module Name:
|
|
||||||
|
|
||||||
filter_model_converter.h
|
|
||||||
|
|
||||||
Abstract:
|
|
||||||
|
|
||||||
Filter decls from a model
|
|
||||||
|
|
||||||
Author:
|
|
||||||
|
|
||||||
Leonardo (leonardo) 2011-05-06
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
--*/
|
|
||||||
#ifndef FILTER_MODEL_CONVERTER_H_
|
|
||||||
#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;
|
|
||||||
public:
|
|
||||||
filter_model_converter(ast_manager & m): m_decls(m) {}
|
|
||||||
|
|
||||||
virtual ~filter_model_converter();
|
|
||||||
|
|
||||||
ast_manager & m() const { return m_decls.get_manager(); }
|
|
||||||
|
|
||||||
virtual void operator()(model_ref & md, unsigned goal_idx);
|
|
||||||
|
|
||||||
virtual void operator()(svector<symbol> & labels, unsigned goal_idx);
|
|
||||||
|
|
||||||
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) {
|
|
||||||
m_decls.push_back(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual model_converter * translate(ast_translation & translator);
|
|
||||||
|
|
||||||
virtual void collect(ast_pp_util& visitor);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef ref<filter_model_converter> filter_model_converter_ref;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -85,3 +85,7 @@ void generic_model_converter::collect(ast_pp_util& visitor) {
|
||||||
if (e.m_def) visitor.coll.visit(e.m_def);
|
if (e.m_def) visitor.coll.visit(e.m_def);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void generic_model_converter::operator()(expr_ref& fml) {
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
}
|
||||||
|
|
|
@ -38,6 +38,8 @@ public:
|
||||||
|
|
||||||
virtual ~generic_model_converter() { }
|
virtual ~generic_model_converter() { }
|
||||||
|
|
||||||
|
void hide(expr* e) { SASSERT(is_app(e) && to_app(e)->get_num_args() == 0); hide(to_app(e)->get_decl()); }
|
||||||
|
|
||||||
void hide(func_decl * f) { m_entries.push_back(entry(f, 0, m, HIDE)); }
|
void hide(func_decl * f) { m_entries.push_back(entry(f, 0, m, HIDE)); }
|
||||||
|
|
||||||
void add(func_decl * d, expr* e) { m_entries.push_back(entry(d, e, m, ADD)); }
|
void add(func_decl * d, expr* e) { m_entries.push_back(entry(d, e, m, ADD)); }
|
||||||
|
@ -55,6 +57,8 @@ public:
|
||||||
virtual model_converter * translate(ast_translation & translator);
|
virtual model_converter * translate(ast_translation & translator);
|
||||||
|
|
||||||
virtual void collect(ast_pp_util& visitor);
|
virtual void collect(ast_pp_util& visitor);
|
||||||
|
|
||||||
|
void operator()(expr_ref& fml) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef ref<generic_model_converter> generic_model_converter_ref;
|
typedef ref<generic_model_converter> generic_model_converter_ref;
|
||||||
|
|
|
@ -45,12 +45,19 @@ public:
|
||||||
SASSERT(goal_idx == 0);
|
SASSERT(goal_idx == 0);
|
||||||
operator()(m);
|
operator()(m);
|
||||||
}
|
}
|
||||||
virtual void operator()(labels_vec & r, unsigned goal_idx) {}
|
|
||||||
|
|
||||||
|
virtual void operator()(labels_vec & r, unsigned goal_idx) {}
|
||||||
|
|
||||||
virtual model_converter * translate(ast_translation & translator) = 0;
|
virtual model_converter * translate(ast_translation & translator) = 0;
|
||||||
|
|
||||||
virtual void collect(ast_pp_util& visitor) { m_env = &visitor.env(); }
|
virtual void collect(ast_pp_util& visitor) { m_env = &visitor.env(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief we are adding a formula to the context of the model converter.
|
||||||
|
The operator has as side effect of adding definitions as assertions to the
|
||||||
|
formula and removing these definitions from the model converter.
|
||||||
|
*/
|
||||||
|
virtual void operator()(expr_ref& formula) { UNREACHABLE(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef ref<model_converter> model_converter_ref;
|
typedef ref<model_converter> model_converter_ref;
|
||||||
|
|
|
@ -49,7 +49,7 @@ Revision History:
|
||||||
#include "smt/tactic/smt_tactic.h"
|
#include "smt/tactic/smt_tactic.h"
|
||||||
#include "ast/rewriter/rewriter.h"
|
#include "ast/rewriter/rewriter.h"
|
||||||
#include "nlsat/tactic/nlsat_tactic.h"
|
#include "nlsat/tactic/nlsat_tactic.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "util/obj_pair_hashtable.h"
|
#include "util/obj_pair_hashtable.h"
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
|
@ -73,7 +73,7 @@ class nl_purify_tactic : public tactic {
|
||||||
arith_util m_util;
|
arith_util m_util;
|
||||||
params_ref m_params;
|
params_ref m_params;
|
||||||
bool m_produce_proofs;
|
bool m_produce_proofs;
|
||||||
ref<filter_model_converter> m_fmc;
|
ref<generic_model_converter> m_fmc;
|
||||||
tactic_ref m_nl_tac; // nlsat tactic
|
tactic_ref m_nl_tac; // nlsat tactic
|
||||||
goal_ref m_nl_g; // nlsat goal
|
goal_ref m_nl_g; // nlsat goal
|
||||||
ref<solver> m_solver; // SMT solver
|
ref<solver> m_solver; // SMT solver
|
||||||
|
@ -133,7 +133,7 @@ public:
|
||||||
}
|
}
|
||||||
r = m.mk_fresh_const(0, u().mk_real());
|
r = m.mk_fresh_const(0, u().mk_real());
|
||||||
m_new_reals.push_back(to_app(r));
|
m_new_reals.push_back(to_app(r));
|
||||||
m_owner.m_fmc->insert(to_app(r)->get_decl());
|
m_owner.m_fmc->hide(r);
|
||||||
m_interface_cache.insert(arg, r);
|
m_interface_cache.insert(arg, r);
|
||||||
expr_ref eq(m);
|
expr_ref eq(m);
|
||||||
eq = m.mk_eq(r, arg);
|
eq = m.mk_eq(r, arg);
|
||||||
|
@ -159,7 +159,7 @@ public:
|
||||||
result = m.mk_fresh_const(0, m.mk_bool_sort());
|
result = m.mk_fresh_const(0, m.mk_bool_sort());
|
||||||
m_polarities.insert(result, pol);
|
m_polarities.insert(result, pol);
|
||||||
m_new_preds.push_back(to_app(result));
|
m_new_preds.push_back(to_app(result));
|
||||||
m_owner.m_fmc->insert(to_app(result)->get_decl());
|
m_owner.m_fmc->hide(result);
|
||||||
if (pol != pol_neg) {
|
if (pol != pol_neg) {
|
||||||
m_owner.m_nl_g->assert_expr(m.mk_or(m.mk_not(result), old_pred));
|
m_owner.m_nl_g->assert_expr(m.mk_or(m.mk_not(result), old_pred));
|
||||||
}
|
}
|
||||||
|
@ -491,7 +491,7 @@ private:
|
||||||
pred = m.mk_fresh_const(0, m.mk_bool_sort());
|
pred = m.mk_fresh_const(0, m.mk_bool_sort());
|
||||||
m_eq_preds.push_back(pred);
|
m_eq_preds.push_back(pred);
|
||||||
m_eq_values.push_back(l_true);
|
m_eq_values.push_back(l_true);
|
||||||
m_fmc->insert(to_app(pred)->get_decl());
|
m_fmc->hide(pred);
|
||||||
nl_g->assert_expr(m.mk_or(m.mk_not(pred), m.mk_eq(w, v)));
|
nl_g->assert_expr(m.mk_or(m.mk_not(pred), m.mk_eq(w, v)));
|
||||||
nl_g->assert_expr(m.mk_or(pred, m.mk_not(m.mk_eq(w, v))));
|
nl_g->assert_expr(m.mk_or(pred, m.mk_not(m.mk_eq(w, v))));
|
||||||
m_solver->assert_expr(m.mk_iff(pred, m.mk_eq(w, v)));
|
m_solver->assert_expr(m.mk_iff(pred, m.mk_eq(w, v)));
|
||||||
|
@ -761,7 +761,7 @@ public:
|
||||||
rw r(*this);
|
rw r(*this);
|
||||||
expr_ref_vector clauses(m);
|
expr_ref_vector clauses(m);
|
||||||
m_nl_g = alloc(goal, m, true, false);
|
m_nl_g = alloc(goal, m, true, false);
|
||||||
m_fmc = alloc(filter_model_converter, m);
|
m_fmc = alloc(generic_model_converter, m);
|
||||||
|
|
||||||
// first hoist interface variables,
|
// first hoist interface variables,
|
||||||
// then annotate subformulas by polarities,
|
// then annotate subformulas by polarities,
|
||||||
|
|
|
@ -21,7 +21,7 @@ Notes:
|
||||||
#include "solver/solver_na2as.h"
|
#include "solver/solver_na2as.h"
|
||||||
#include "tactic/tactic.h"
|
#include "tactic/tactic.h"
|
||||||
#include "ast/rewriter/pb2bv_rewriter.h"
|
#include "ast/rewriter/pb2bv_rewriter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
#include "model/model_smt2_pp.h"
|
#include "model/model_smt2_pp.h"
|
||||||
|
@ -86,7 +86,7 @@ public:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void assert_expr(expr * t) {
|
virtual void assert_expr_core(expr * t) {
|
||||||
unsigned i = m_assertions.size();
|
unsigned i = m_assertions.size();
|
||||||
m_assertions.push_back(t);
|
m_assertions.push_back(t);
|
||||||
while (i < m_assertions.size()) {
|
while (i < m_assertions.size()) {
|
||||||
|
@ -209,10 +209,8 @@ private:
|
||||||
if (m_bv_fns.empty()) {
|
if (m_bv_fns.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
filter_model_converter filter(m);
|
generic_model_converter filter(m);
|
||||||
for (unsigned i = 0; i < m_bv_fns.size(); ++i) {
|
for (func_decl* f : m_bv_fns) filter.hide(f);
|
||||||
filter.insert(m_bv_fns[i].get());
|
|
||||||
}
|
|
||||||
filter(mdl, 0);
|
filter(mdl, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ Notes:
|
||||||
#include "model/model_smt2_pp.h"
|
#include "model/model_smt2_pp.h"
|
||||||
#include "tactic/tactic.h"
|
#include "tactic/tactic.h"
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "tactic/portfolio/enum2bv_solver.h"
|
#include "tactic/portfolio/enum2bv_solver.h"
|
||||||
#include "solver/solver_na2as.h"
|
#include "solver/solver_na2as.h"
|
||||||
#include "ast/rewriter/enum2bv_rewriter.h"
|
#include "ast/rewriter/enum2bv_rewriter.h"
|
||||||
|
@ -58,7 +58,7 @@ public:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void assert_expr(expr * t) {
|
virtual void assert_expr_core(expr * t) {
|
||||||
expr_ref tmp(t, m);
|
expr_ref tmp(t, m);
|
||||||
expr_ref_vector bounds(m);
|
expr_ref_vector bounds(m);
|
||||||
proof_ref tmp_proof(m);
|
proof_ref tmp_proof(m);
|
||||||
|
@ -164,9 +164,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void filter_model(model_ref& mdl) {
|
void filter_model(model_ref& mdl) {
|
||||||
filter_model_converter filter(m);
|
generic_model_converter filter(m);
|
||||||
for (auto const& kv : m_rewriter.enum2bv()) {
|
for (auto const& kv : m_rewriter.enum2bv()) {
|
||||||
filter.insert(kv.m_value);
|
filter.hide(kv.m_value);
|
||||||
}
|
}
|
||||||
filter(mdl, 0);
|
filter(mdl, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -549,7 +549,7 @@ public:
|
||||||
expr_ref_vector clauses(m);
|
expr_ref_vector clauses(m);
|
||||||
ptr_vector<expr> assumptions;
|
ptr_vector<expr> assumptions;
|
||||||
obj_map<expr, expr*> bool2dep;
|
obj_map<expr, expr*> bool2dep;
|
||||||
ref<filter_model_converter> fmc;
|
ref<generic_model_converter> fmc;
|
||||||
extract_clauses_and_dependencies(g, clauses, assumptions, bool2dep, fmc);
|
extract_clauses_and_dependencies(g, clauses, assumptions, bool2dep, fmc);
|
||||||
for (expr * clause : clauses) {
|
for (expr * clause : clauses) {
|
||||||
s->assert_expr(clause);
|
s->assert_expr(clause);
|
||||||
|
|
|
@ -21,7 +21,7 @@ Notes:
|
||||||
#include "tactic/tactic.h"
|
#include "tactic/tactic.h"
|
||||||
#include "ast/rewriter/pb2bv_rewriter.h"
|
#include "ast/rewriter/pb2bv_rewriter.h"
|
||||||
#include "ast/rewriter/th_rewriter.h"
|
#include "ast/rewriter/th_rewriter.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
#include "model/model_smt2_pp.h"
|
#include "model/model_smt2_pp.h"
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ public:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void assert_expr(expr * t) {
|
virtual void assert_expr_core(expr * t) {
|
||||||
m_assertions.push_back(t);
|
m_assertions.push_back(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,10 +113,10 @@ public:
|
||||||
if (m_rewriter.fresh_constants().empty()) {
|
if (m_rewriter.fresh_constants().empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
filter_model_converter filter(m);
|
generic_model_converter filter(m);
|
||||||
func_decl_ref_vector const& fns = m_rewriter.fresh_constants();
|
func_decl_ref_vector const& fns = m_rewriter.fresh_constants();
|
||||||
for (unsigned i = 0; i < fns.size(); ++i) {
|
for (func_decl* f : fns) {
|
||||||
filter.insert(fns[i]);
|
filter.hide(f);
|
||||||
}
|
}
|
||||||
filter(mdl, 0);
|
filter(mdl, 0);
|
||||||
}
|
}
|
||||||
|
@ -138,8 +138,8 @@ private:
|
||||||
proof_ref proof(m);
|
proof_ref proof(m);
|
||||||
expr_ref fml1(m), fml(m);
|
expr_ref fml1(m), fml(m);
|
||||||
expr_ref_vector fmls(m);
|
expr_ref_vector fmls(m);
|
||||||
for (unsigned i = 0; i < m_assertions.size(); ++i) {
|
for (expr* a : m_assertions) {
|
||||||
m_th_rewriter(m_assertions[i].get(), fml1, proof);
|
m_th_rewriter(a, fml1, proof);
|
||||||
m_rewriter(fml1, fml, proof);
|
m_rewriter(fml1, fml, proof);
|
||||||
m_solver->assert_expr(fml);
|
m_solver->assert_expr(fml);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,10 +18,9 @@ Revision History:
|
||||||
|
|
||||||
#include "tactic/sine_filter.h"
|
#include "tactic/sine_filter.h"
|
||||||
#include "tactic/tactical.h"
|
#include "tactic/tactical.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
#include "tactic/generic_model_converter.h"
|
||||||
#include "ast/datatype_decl_plugin.h"
|
#include "ast/datatype_decl_plugin.h"
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "tactic/filter_model_converter.h"
|
|
||||||
#include "tactic/extension_model_converter.h"
|
#include "tactic/extension_model_converter.h"
|
||||||
#include "ast/rewriter/var_subst.h"
|
#include "ast/rewriter/var_subst.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
|
@ -69,7 +68,7 @@ public:
|
||||||
result.push_back(g.get());
|
result.push_back(g.get());
|
||||||
TRACE("sine", result[0]->display(tout););
|
TRACE("sine", result[0]->display(tout););
|
||||||
SASSERT(g->is_well_sorted());
|
SASSERT(g->is_well_sorted());
|
||||||
filter_model_converter * fmc = alloc(filter_model_converter, m);
|
generic_model_converter * fmc = alloc(generic_model_converter, m);
|
||||||
mc = fmc;
|
mc = fmc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue