diff --git a/lib/symmetry_reduce_tactic.cpp b/lib/symmetry_reduce_tactic.cpp index 5ca1dbcbf..0ee606da9 100644 --- a/lib/symmetry_reduce_tactic.cpp +++ b/lib/symmetry_reduce_tactic.cpp @@ -7,7 +7,7 @@ Module Name: Abstract: - Add symmetry breaking predicates to assertion sets. + Add symmetry breaking predicates to goals. Author: @@ -20,7 +20,6 @@ Notes: --*/ #include"tactical.h" -#include"assertion_set.h" #include"for_each_expr.h" #include"map.h" #include"expr_replacer.h" diff --git a/mk_make.py b/mk_make.py index f66dcd75f..3500fac03 100644 --- a/mk_make.py +++ b/mk_make.py @@ -33,4 +33,10 @@ add_lib('simplifier', ['util', 'ast', 'rewriter', 'old_params']) # We must replace all occurrences of simplifier with rewriter. add_lib('model', ['util', 'ast', 'rewriter', 'simplifier', 'old_params']) add_lib('framework', ['util', 'ast', 'model', 'old_params', 'simplifier', 'rewriter']) - +# Assertion set is the old tactic framework used in Z3 3.x. It will be deleted as soon as we finish the porting old +# code to the new tactic framework. +add_lib('assertion_set', ['util', 'ast', 'framework', 'model', 'rewriter', 'old_params']) +add_lib('normal_forms', ['util', 'ast', 'old_params', 'simplifier', 'rewriter', 'assertion_set', 'framework', 'model']) +add_lib('smt', ['util', 'ast', 'assertion_set']) +add_lib('pattern', ['util', 'ast']) +add_lib('spc', ['util', 'ast', 'simplifier', 'pattern', 'model', 'old_params', 'normal_forms', 'rewriter']) diff --git a/src/assertion_set/README b/src/assertion_set/README new file mode 100644 index 000000000..ed699ed82 --- /dev/null +++ b/src/assertion_set/README @@ -0,0 +1 @@ +This module is obsolete. It is subsumed by the tactic module. \ No newline at end of file diff --git a/lib/assertion_set.cpp b/src/assertion_set/assertion_set.cpp similarity index 100% rename from lib/assertion_set.cpp rename to src/assertion_set/assertion_set.cpp diff --git a/lib/assertion_set.h b/src/assertion_set/assertion_set.h similarity index 100% rename from lib/assertion_set.h rename to src/assertion_set/assertion_set.h diff --git a/lib/assertion_set_rewriter.cpp b/src/assertion_set/assertion_set_rewriter.cpp similarity index 100% rename from lib/assertion_set_rewriter.cpp rename to src/assertion_set/assertion_set_rewriter.cpp diff --git a/lib/assertion_set_rewriter.h b/src/assertion_set/assertion_set_rewriter.h similarity index 100% rename from lib/assertion_set_rewriter.h rename to src/assertion_set/assertion_set_rewriter.h diff --git a/lib/assertion_set_strategy.cpp b/src/assertion_set/assertion_set_strategy.cpp similarity index 87% rename from lib/assertion_set_strategy.cpp rename to src/assertion_set/assertion_set_strategy.cpp index 3ba1fd9c9..209f20351 100644 --- a/lib/assertion_set_strategy.cpp +++ b/src/assertion_set/assertion_set_strategy.cpp @@ -21,7 +21,6 @@ Notes: #include"cooperate.h" #include"scoped_timer.h" #include"cancel_eh.h" -#include"smt_solver.h" #include"front_end_params.h" #include"progress_callback.h" #include"params2front_end_params.h" @@ -1201,164 +1200,6 @@ struct check_decided_test : public as_test { as_test * check_decided() { return alloc(check_decided_test); } -class as_st_solver : public assertion_set_strategy { - scoped_ptr m_params; - params_ref m_params_ref; - statistics m_stats; - std::string m_failure; - smt::solver * m_ctx; - bool m_candidate_models; - symbol m_logic; - progress_callback * m_callback; -public: - as_st_solver(bool candidate_models):m_ctx(0), m_candidate_models(candidate_models), m_callback(0) {} - - front_end_params & fparams() { - if (!m_params) - m_params = alloc(front_end_params); - return *m_params; - } - - struct scoped_init_ctx { - as_st_solver & m_owner; - - scoped_init_ctx(as_st_solver & o, ast_manager & m):m_owner(o) { - smt::solver * new_ctx = alloc(smt::solver, m, o.fparams()); - TRACE("as_solver", tout << "logic: " << o.m_logic << "\n";); - new_ctx->set_logic(o.m_logic); - if (o.m_callback) { - new_ctx->set_progress_callback(o.m_callback); - } - #pragma omp critical (as_st_solver) - { - o.m_ctx = new_ctx; - } - } - - ~scoped_init_ctx() { - smt::solver * d = m_owner.m_ctx; - #pragma omp critical (as_st_cancel) - { - m_owner.m_ctx = 0; - } - if (d) - dealloc(d); - } - }; - - virtual ~as_st_solver() { - SASSERT(m_ctx == 0); - } - - virtual void updt_params(params_ref const & p) { - TRACE("as_solver", tout << "updt_params: " << p << "\n";); - m_params_ref = p; - params2front_end_params(m_params_ref, fparams()); - } - - virtual void collect_param_descrs(param_descrs & r) { - } - - virtual void set_cancel(bool f) { - if (m_ctx) - m_ctx->set_cancel(f); - } - - virtual void operator()(assertion_set & s, model_converter_ref & mc) { - SASSERT(is_well_sorted(s)); - IF_VERBOSE(ST_VERBOSITY_LVL, verbose_stream() << "(smt-solver)" << std::endl;); - TRACE("as_solver", tout << "AUTO_CONFIG: " << fparams().m_auto_config << " HIDIV0: " << fparams().m_hi_div0 << " " - << " PREPROCESS: " << fparams().m_preprocess << ", SOLVER:" << fparams().m_solver << "\n";); - TRACE("as_solver_detail", s.display(tout);); - ast_manager & m = s.m(); - TRACE("as_solver_memory", tout << "wasted_size: " << m.get_allocator().get_wasted_size() << "\n";); - // verbose_stream() << "wasted_size: " << m.get_allocator().get_wasted_size() << ", free_objs: " << m.get_allocator().get_num_free_objs() << "\n"; - // m.get_allocator().consolidate(); - scoped_init_ctx init(*this, m); - SASSERT(m_ctx != 0); - unsigned sz = s.size(); - for (unsigned i = 0; i < sz; i++) { - expr * f = s.form(i); - m_ctx->assert_expr(f); - } - lbool r = m_ctx->setup_and_check(); - m_ctx->collect_statistics(m_stats); - switch (r) { - case l_true: { - // the empty assertion set is trivially satifiable. - s.reset(); - // store the model in a do nothin model converter. - model_ref md; - m_ctx->get_model(md); - mc = model2model_converter(md.get()); - return; - } - case l_false: - // formula is unsat, reset the assertion set, and store false there. - s.reset(); - s.assert_expr(m.mk_false(), m_ctx->get_proof()); - return; - case l_undef: - if (m_candidate_models) { - switch (m_ctx->last_failure()) { - case smt::NUM_CONFLICTS: - case smt::THEORY: - case smt::QUANTIFIERS: { - model_ref md; - m_ctx->get_model(md); - mc = model2model_converter(md.get()); - return; - } - default: - break; - } - } - m_failure = m_ctx->last_failure_as_string(); - throw strategy_exception(m_failure.c_str()); - } - } - - virtual void collect_statistics(statistics & st) const { - if (m_ctx) - m_ctx->collect_statistics(st); // ctx is still running... - else - st.copy(m_stats); - } - - virtual void cleanup() { - } - - virtual void reset_statistics() { - m_stats.reset(); - } - - // for backward compatibility - virtual void set_front_end_params(front_end_params & p) { - m_params = alloc(front_end_params, p); - // must propagate the params_ref to fparams - params2front_end_params(m_params_ref, fparams()); - } - - virtual void set_logic(symbol const & l) { - m_logic = l; - } - - virtual void set_progress_callback(progress_callback * callback) { - m_callback = callback; - } -}; - -as_st * mk_smt_solver_core(bool candidate_models) { - return alloc(as_st_solver, candidate_models); -} - -as_st * mk_smt_solver(bool auto_config, bool candidate_models) { - as_st * solver = mk_smt_solver_core(candidate_models); - params_ref solver_p; - solver_p.set_bool(":auto-config", auto_config); - return using_params(solver, solver_p); -}; - /** \brief Execute strategy st on the given assertion set. */ diff --git a/lib/assertion_set_strategy.h b/src/assertion_set/assertion_set_strategy.h similarity index 97% rename from lib/assertion_set_strategy.h rename to src/assertion_set/assertion_set_strategy.h index c1209f6ae..0b02fad49 100644 --- a/lib/assertion_set_strategy.h +++ b/src/assertion_set/assertion_set_strategy.h @@ -167,9 +167,6 @@ as_test * check_as_size(unsigned l); as_test * check_decided(); as_st * cond(as_test * c, as_st * t, as_st * e); -as_st * mk_smt_solver_core(bool candidate_models = false); -as_st * mk_smt_solver(bool auto_config = true, bool candidate_models = false); - void exec(as_st * st, assertion_set & s, model_converter_ref & mc); lbool check_sat(as_st * st, assertion_set & s, model_ref & md, proof_ref & pr, std::string & reason_unknown); @@ -207,8 +204,6 @@ public: #define MK_SIMPLE_ST_FACTORY(NAME, ST) MK_ST_FACTORY(NAME, return ST;) -MK_SIMPLE_ST_FACTORY(smt_solver_stf, mk_smt_solver()); - struct is_qfbv_test : public as_test { virtual bool operator()(assertion_set const & s) const { return is_qfbv(s); } }; diff --git a/lib/assertion_set_util.cpp b/src/assertion_set/assertion_set_util.cpp similarity index 100% rename from lib/assertion_set_util.cpp rename to src/assertion_set/assertion_set_util.cpp diff --git a/lib/assertion_set_util.h b/src/assertion_set/assertion_set_util.h similarity index 100% rename from lib/assertion_set_util.h rename to src/assertion_set/assertion_set_util.h diff --git a/src/assertion_set/der_strategy.cpp b/src/assertion_set/der_strategy.cpp new file mode 100644 index 000000000..ba294f2ee --- /dev/null +++ b/src/assertion_set/der_strategy.cpp @@ -0,0 +1,94 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + der_strategy.cpp + +Abstract: + + DER strategy + +Author: + + Leonardo de Moura (leonardo) 2012-10-20 + +--*/ +#include"der_strategy.h" + +struct der_strategy::imp { + ast_manager & m_manager; + der_rewriter m_r; + + imp(ast_manager & m): + m_manager(m), + m_r(m) { + } + + ast_manager & m() const { return m_manager; } + + void set_cancel(bool f) { + m_r.set_cancel(f); + } + + void reset() { + m_r.reset(); + } + + void operator()(assertion_set & s) { + SASSERT(is_well_sorted(s)); + as_st_report report("der", s); + TRACE("before_der", s.display(tout);); + if (s.inconsistent()) + return; + expr_ref new_curr(m()); + proof_ref new_pr(m()); + unsigned size = s.size(); + for (unsigned idx = 0; idx < size; idx++) { + if (s.inconsistent()) + break; + expr * curr = s.form(idx); + m_r(curr, new_curr, new_pr); + if (m().proofs_enabled()) { + proof * pr = s.pr(idx); + new_pr = m().mk_modus_ponens(pr, new_pr); + } + s.update(idx, new_curr, new_pr); + } + s.elim_redundancies(); + TRACE("after_der", s.display(tout);); + SASSERT(is_well_sorted(s)); + } +}; + +der_strategy::der_strategy(ast_manager & m) { + m_imp = alloc(imp, m); +} + +der_strategy::~der_strategy() { + dealloc(m_imp); +} + +void der_strategy::operator()(assertion_set & s) { + m_imp->operator()(s); +} + +void der_strategy::set_cancel(bool f) { + if (m_imp) + m_imp->set_cancel(f); +} + +void der_strategy::cleanup() { + ast_manager & m = m_imp->m(); + imp * d = m_imp; + #pragma omp critical (as_st_cancel) + { + m_imp = 0; + } + dealloc(d); + d = alloc(imp, m); + #pragma omp critical (as_st_cancel) + { + m_imp = d; + } +} diff --git a/src/assertion_set/der_strategy.h b/src/assertion_set/der_strategy.h new file mode 100644 index 000000000..ace90eb3c --- /dev/null +++ b/src/assertion_set/der_strategy.h @@ -0,0 +1,47 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + der_strategy.h + +Abstract: + + DER strategy + +Author: + + Leonardo de Moura (leonardo) 2012-10-20 + +--*/ +#ifndef _DER_STRATEGY_H_ +#define _DER_STRATEGY_H_ + +#include"der.h" +#include"assertion_set_strategy.h" + +// TODO: delete obsolete class +class der_strategy : public assertion_set_strategy { + struct imp; + imp * m_imp; +public: + der_strategy(ast_manager & m); + virtual ~der_strategy(); + + void operator()(assertion_set & s); + + virtual void operator()(assertion_set & s, model_converter_ref & mc) { + operator()(s); + mc = 0; + } + + virtual void cleanup(); + virtual void set_cancel(bool f); +}; + +inline as_st * mk_der(ast_manager & m) { + return alloc(der_strategy, m); +} + + +#endif diff --git a/lib/elim_var_model_converter.cpp b/src/assertion_set/elim_var_model_converter.cpp similarity index 100% rename from lib/elim_var_model_converter.cpp rename to src/assertion_set/elim_var_model_converter.cpp diff --git a/lib/elim_var_model_converter.h b/src/assertion_set/elim_var_model_converter.h similarity index 100% rename from lib/elim_var_model_converter.h rename to src/assertion_set/elim_var_model_converter.h diff --git a/lib/gaussian_elim.cpp b/src/assertion_set/gaussian_elim.cpp similarity index 100% rename from lib/gaussian_elim.cpp rename to src/assertion_set/gaussian_elim.cpp diff --git a/lib/gaussian_elim.h b/src/assertion_set/gaussian_elim.h similarity index 100% rename from lib/gaussian_elim.h rename to src/assertion_set/gaussian_elim.h diff --git a/src/assertion_set/num_occurs_assertion_set.cpp b/src/assertion_set/num_occurs_assertion_set.cpp new file mode 100644 index 000000000..2f35d4b5c --- /dev/null +++ b/src/assertion_set/num_occurs_assertion_set.cpp @@ -0,0 +1,29 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + num_occurs_assertion_set.cpp + +Abstract: + + TODO: delete + +Author: + + Leonardo de Moura (leonardo) 2012-10-20. + +Revision History: + +--*/ +#include"num_occurs_assertion_set.h" +#include"assertion_set.h" + +// TODO delete +void num_occurs_as::operator()(assertion_set const & s) { + expr_fast_mark1 visited; + unsigned sz = s.size(); + for (unsigned i = 0; i < sz; i++) { + process(s.form(i), visited); + } +} diff --git a/src/assertion_set/num_occurs_assertion_set.h b/src/assertion_set/num_occurs_assertion_set.h new file mode 100644 index 000000000..50e8ac4e8 --- /dev/null +++ b/src/assertion_set/num_occurs_assertion_set.h @@ -0,0 +1,38 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + num_occurs_assertion_set.h + +Abstract: + + TODO: delete + +Author: + + Leonardo de Moura (leonardo) 2012-10-20. + +Revision History: + +--*/ +#ifndef _NUM_OCCURS_AS_H_ +#define _NUM_OCCURS_AS_H_ + +#include"num_occurs.h" + +class assertion_set; + +/** + \brief Functor for computing the number of occurrences of each sub-expression in a expression F. +*/ +class num_occurs_as : public num_occurs { +public: + num_occurs_as(bool ignore_ref_count1 = false, bool ignore_quantifiers = false): + num_occurs(ignore_ref_count1, ignore_quantifiers) { + } + + void operator()(assertion_set const & s); // TODO delete +}; + +#endif diff --git a/lib/strategy_exception.cpp b/src/assertion_set/strategy_exception.cpp similarity index 100% rename from lib/strategy_exception.cpp rename to src/assertion_set/strategy_exception.cpp diff --git a/lib/strategy_exception.h b/src/assertion_set/strategy_exception.h similarity index 100% rename from lib/strategy_exception.h rename to src/assertion_set/strategy_exception.h diff --git a/lib/num_occurs.cpp b/src/ast/num_occurs.cpp similarity index 82% rename from lib/num_occurs.cpp rename to src/ast/num_occurs.cpp index ee4b76258..c5d50475e 100644 --- a/lib/num_occurs.cpp +++ b/src/ast/num_occurs.cpp @@ -18,8 +18,6 @@ Revision History: --*/ #include"num_occurs.h" -#include"assertion_set.h" -#include"goal.h" void num_occurs::process(expr * t, expr_fast_mark1 & visited) { ptr_buffer stack; @@ -74,19 +72,3 @@ void num_occurs::operator()(unsigned num, expr * const * ts) { } } -// TODO delete -void num_occurs::operator()(assertion_set const & s) { - expr_fast_mark1 visited; - unsigned sz = s.size(); - for (unsigned i = 0; i < sz; i++) { - process(s.form(i), visited); - } -} - -void num_occurs::operator()(goal const & g) { - expr_fast_mark1 visited; - unsigned sz = g.size(); - for (unsigned i = 0; i < sz; i++) { - process(g.form(i), visited); - } -} diff --git a/lib/num_occurs.h b/src/ast/num_occurs.h similarity index 88% rename from lib/num_occurs.h rename to src/ast/num_occurs.h index 01d160ac5..ecd77e356 100644 --- a/lib/num_occurs.h +++ b/src/ast/num_occurs.h @@ -22,13 +22,11 @@ Revision History: #include"ast.h" #include"obj_hashtable.h" -class assertion_set; // TODO delete -class goal; - /** \brief Functor for computing the number of occurrences of each sub-expression in a expression F. */ class num_occurs { +protected: bool m_ignore_ref_count1; bool m_ignore_quantifiers; obj_map m_num_occurs; @@ -44,8 +42,6 @@ public: void operator()(expr * t); void operator()(unsigned num, expr * const * ts); - void operator()(assertion_set const & s); // TODO delete - void operator()(goal const & s); unsigned get_num_occs(expr * n) const { unsigned val; diff --git a/lib/occurs.cpp b/src/ast/occurs.cpp similarity index 100% rename from lib/occurs.cpp rename to src/ast/occurs.cpp diff --git a/lib/occurs.h b/src/ast/occurs.h similarity index 100% rename from lib/occurs.h rename to src/ast/occurs.h diff --git a/src/framework/der_tactic.cpp b/src/framework/der_tactic.cpp new file mode 100644 index 000000000..c2245b409 --- /dev/null +++ b/src/framework/der_tactic.cpp @@ -0,0 +1,114 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + der_tactic.cpp + +Abstract: + + DER tactic + +Author: + + Leonardo de Moura (leonardo) 2012-10-20 + +--*/ +#include"der.h" +#include"tactical.h" + +class der_tactic : public tactic { + struct imp { + ast_manager & m_manager; + der_rewriter m_r; + + imp(ast_manager & m): + m_manager(m), + m_r(m) { + } + + ast_manager & m() const { return m_manager; } + + void set_cancel(bool f) { + m_r.set_cancel(f); + } + + void reset() { + m_r.reset(); + } + + void operator()(goal & g) { + SASSERT(g.is_well_sorted()); + bool proofs_enabled = g.proofs_enabled(); + tactic_report report("der", g); + TRACE("before_der", g.display(tout);); + expr_ref new_curr(m()); + proof_ref new_pr(m()); + unsigned size = g.size(); + for (unsigned idx = 0; idx < size; idx++) { + if (g.inconsistent()) + break; + expr * curr = g.form(idx); + m_r(curr, new_curr, new_pr); + if (proofs_enabled) { + proof * pr = g.pr(idx); + new_pr = m().mk_modus_ponens(pr, new_pr); + } + g.update(idx, new_curr, new_pr, g.dep(idx)); + } + g.elim_redundancies(); + TRACE("after_der", g.display(tout);); + SASSERT(g.is_well_sorted()); + } + }; + + imp * m_imp; + +public: + der_tactic(ast_manager & m) { + m_imp = alloc(imp, m); + } + + virtual tactic * translate(ast_manager & m) { + return alloc(der_tactic, m); + } + + virtual ~der_tactic() { + dealloc(m_imp); + } + + virtual void operator()(goal_ref const & in, + goal_ref_buffer & result, + model_converter_ref & mc, + proof_converter_ref & pc, + expr_dependency_ref & core) { + mc = 0; pc = 0; core = 0; + (*m_imp)(*(in.get())); + in->inc_depth(); + result.push_back(in.get()); + } + + virtual void cleanup() { + ast_manager & m = m_imp->m(); + imp * d = m_imp; + #pragma omp critical (tactic_cancel) + { + m_imp = 0; + } + dealloc(d); + d = alloc(imp, m); + #pragma omp critical (tactic_cancel) + { + m_imp = d; + } + } + + virtual void set_cancel(bool f) { + if (m_imp) + m_imp->set_cancel(f); + } +}; + +tactic * mk_der_tactic(ast_manager & m) { + return alloc(der_tactic, m); +} diff --git a/src/framework/der_tactic.h b/src/framework/der_tactic.h new file mode 100644 index 000000000..8e7d1453f --- /dev/null +++ b/src/framework/der_tactic.h @@ -0,0 +1,25 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + der_tactic.h + +Abstract: + + DER tactic + +Author: + + Leonardo de Moura (leonardo) 2012-10-20 + +--*/ +#ifndef _DER_TACTIC_H_ +#define _DER_TACTIC_H_ + +class ast_manager; +class tactic; + +tactic * mk_der_tactic(ast_manager & m); + +#endif /* _DER_TACTIC_H_ */ diff --git a/src/framework/num_occurs_goal.cpp b/src/framework/num_occurs_goal.cpp new file mode 100644 index 000000000..adc412434 --- /dev/null +++ b/src/framework/num_occurs_goal.cpp @@ -0,0 +1,27 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + num_occurs_goal.cpp + +Abstract: + + +Author: + + Leonardo de Moura (leonardo) 2012-10-20. + +Revision History: + +--*/ +#include"num_occurs_goal.h" +#include"goal.h" + +void num_occurs_goal::operator()(goal const & g) { + expr_fast_mark1 visited; + unsigned sz = g.size(); + for (unsigned i = 0; i < sz; i++) { + process(g.form(i), visited); + } +} diff --git a/src/framework/num_occurs_goal.h b/src/framework/num_occurs_goal.h new file mode 100644 index 000000000..5e6e0cc94 --- /dev/null +++ b/src/framework/num_occurs_goal.h @@ -0,0 +1,35 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + num_occurs_goal.h + +Abstract: + + +Author: + + Leonardo de Moura (leonardo) 2012-10-20. + +Revision History: + +--*/ +#ifndef _NUM_OCCURS_GOAL_H_ +#define _NUM_OCCURS_GOAL_H_ + +#include"num_occurs.h" + +class goal; + +class num_occurs_goal : public num_occurs { +public: + num_occurs_goal(bool ignore_ref_count1 = false, bool ignore_quantifiers = false): + num_occurs(ignore_ref_count1, ignore_quantifiers) { + } + + void operator()(goal const & s); +}; + + +#endif diff --git a/lib/cnf.cpp b/src/normal_forms/cnf.cpp similarity index 100% rename from lib/cnf.cpp rename to src/normal_forms/cnf.cpp diff --git a/lib/cnf.h b/src/normal_forms/cnf.h similarity index 100% rename from lib/cnf.h rename to src/normal_forms/cnf.h diff --git a/lib/defined_names.cpp b/src/normal_forms/defined_names.cpp similarity index 100% rename from lib/defined_names.cpp rename to src/normal_forms/defined_names.cpp diff --git a/lib/defined_names.h b/src/normal_forms/defined_names.h similarity index 100% rename from lib/defined_names.h rename to src/normal_forms/defined_names.h diff --git a/lib/name_exprs.cpp b/src/normal_forms/name_exprs.cpp similarity index 100% rename from lib/name_exprs.cpp rename to src/normal_forms/name_exprs.cpp diff --git a/lib/name_exprs.h b/src/normal_forms/name_exprs.h similarity index 100% rename from lib/name_exprs.h rename to src/normal_forms/name_exprs.h diff --git a/lib/nnf.cpp b/src/normal_forms/nnf.cpp similarity index 100% rename from lib/nnf.cpp rename to src/normal_forms/nnf.cpp diff --git a/lib/nnf.h b/src/normal_forms/nnf.h similarity index 100% rename from lib/nnf.h rename to src/normal_forms/nnf.h diff --git a/lib/pull_quant.cpp b/src/normal_forms/pull_quant.cpp similarity index 100% rename from lib/pull_quant.cpp rename to src/normal_forms/pull_quant.cpp diff --git a/lib/pull_quant.h b/src/normal_forms/pull_quant.h similarity index 100% rename from lib/pull_quant.h rename to src/normal_forms/pull_quant.h diff --git a/lib/database.h b/src/pattern/database.h similarity index 100% rename from lib/database.h rename to src/pattern/database.h diff --git a/lib/database.smt b/src/pattern/database.smt similarity index 100% rename from lib/database.smt rename to src/pattern/database.smt diff --git a/lib/expr_pattern_match.cpp b/src/pattern/expr_pattern_match.cpp similarity index 100% rename from lib/expr_pattern_match.cpp rename to src/pattern/expr_pattern_match.cpp diff --git a/lib/expr_pattern_match.h b/src/pattern/expr_pattern_match.h similarity index 100% rename from lib/expr_pattern_match.h rename to src/pattern/expr_pattern_match.h diff --git a/lib/pattern_inference.cpp b/src/pattern/pattern_inference.cpp similarity index 100% rename from lib/pattern_inference.cpp rename to src/pattern/pattern_inference.cpp diff --git a/lib/pattern_inference.h b/src/pattern/pattern_inference.h similarity index 100% rename from lib/pattern_inference.h rename to src/pattern/pattern_inference.h diff --git a/lib/pattern_validation.cpp b/src/pattern/pattern_validation.cpp similarity index 100% rename from lib/pattern_validation.cpp rename to src/pattern/pattern_validation.cpp diff --git a/lib/pattern_validation.h b/src/pattern/pattern_validation.h similarity index 100% rename from lib/pattern_validation.h rename to src/pattern/pattern_validation.h diff --git a/lib/der.cpp b/src/rewriter/der.cpp similarity index 77% rename from lib/der.cpp rename to src/rewriter/der.cpp index 6df1a0105..4a4f438a7 100644 --- a/lib/der.cpp +++ b/src/rewriter/der.cpp @@ -25,7 +25,6 @@ Revision History: #include"ast_pp.h" #include"ast_ll_pp.h" #include"ast_smt2_pp.h" -#include"tactical.h" static bool is_var(expr * e, unsigned num_decls) { return is_var(e) && to_var(e)->get_idx() < num_decls; @@ -465,175 +464,4 @@ void der_rewriter::reset() { m_imp->reset(); } -struct der_strategy::imp { - ast_manager & m_manager; - der_rewriter m_r; - imp(ast_manager & m): - m_manager(m), - m_r(m) { - } - - ast_manager & m() const { return m_manager; } - - void set_cancel(bool f) { - m_r.set_cancel(f); - } - - void reset() { - m_r.reset(); - } - - void operator()(assertion_set & s) { - SASSERT(is_well_sorted(s)); - as_st_report report("der", s); - TRACE("before_der", s.display(tout);); - if (s.inconsistent()) - return; - expr_ref new_curr(m()); - proof_ref new_pr(m()); - unsigned size = s.size(); - for (unsigned idx = 0; idx < size; idx++) { - if (s.inconsistent()) - break; - expr * curr = s.form(idx); - m_r(curr, new_curr, new_pr); - if (m().proofs_enabled()) { - proof * pr = s.pr(idx); - new_pr = m().mk_modus_ponens(pr, new_pr); - } - s.update(idx, new_curr, new_pr); - } - s.elim_redundancies(); - TRACE("after_der", s.display(tout);); - SASSERT(is_well_sorted(s)); - } -}; - -der_strategy::der_strategy(ast_manager & m) { - m_imp = alloc(imp, m); -} - -der_strategy::~der_strategy() { - dealloc(m_imp); -} - -void der_strategy::operator()(assertion_set & s) { - m_imp->operator()(s); -} - -void der_strategy::set_cancel(bool f) { - if (m_imp) - m_imp->set_cancel(f); -} - -void der_strategy::cleanup() { - ast_manager & m = m_imp->m(); - imp * d = m_imp; - #pragma omp critical (as_st_cancel) - { - m_imp = 0; - } - dealloc(d); - d = alloc(imp, m); - #pragma omp critical (as_st_cancel) - { - m_imp = d; - } -} - -class der_tactic : public tactic { - struct imp { - ast_manager & m_manager; - der_rewriter m_r; - - imp(ast_manager & m): - m_manager(m), - m_r(m) { - } - - ast_manager & m() const { return m_manager; } - - void set_cancel(bool f) { - m_r.set_cancel(f); - } - - void reset() { - m_r.reset(); - } - - void operator()(goal & g) { - SASSERT(g.is_well_sorted()); - bool proofs_enabled = g.proofs_enabled(); - tactic_report report("der", g); - TRACE("before_der", g.display(tout);); - expr_ref new_curr(m()); - proof_ref new_pr(m()); - unsigned size = g.size(); - for (unsigned idx = 0; idx < size; idx++) { - if (g.inconsistent()) - break; - expr * curr = g.form(idx); - m_r(curr, new_curr, new_pr); - if (proofs_enabled) { - proof * pr = g.pr(idx); - new_pr = m().mk_modus_ponens(pr, new_pr); - } - g.update(idx, new_curr, new_pr, g.dep(idx)); - } - g.elim_redundancies(); - TRACE("after_der", g.display(tout);); - SASSERT(g.is_well_sorted()); - } - }; - - imp * m_imp; - -public: - der_tactic(ast_manager & m) { - m_imp = alloc(imp, m); - } - - virtual tactic * translate(ast_manager & m) { - return alloc(der_tactic, m); - } - - virtual ~der_tactic() { - dealloc(m_imp); - } - - virtual void operator()(goal_ref const & in, - goal_ref_buffer & result, - model_converter_ref & mc, - proof_converter_ref & pc, - expr_dependency_ref & core) { - mc = 0; pc = 0; core = 0; - (*m_imp)(*(in.get())); - in->inc_depth(); - result.push_back(in.get()); - } - - virtual void cleanup() { - ast_manager & m = m_imp->m(); - imp * d = m_imp; - #pragma omp critical (tactic_cancel) - { - m_imp = 0; - } - dealloc(d); - d = alloc(imp, m); - #pragma omp critical (tactic_cancel) - { - m_imp = d; - } - } - - virtual void set_cancel(bool f) { - if (m_imp) - m_imp->set_cancel(f); - } -}; - -tactic * mk_der_tactic(ast_manager & m) { - return alloc(der_tactic, m); -} diff --git a/lib/der.h b/src/rewriter/der.h similarity index 91% rename from lib/der.h rename to src/rewriter/der.h index 69f294fd4..a0be33c5c 100644 --- a/lib/der.h +++ b/src/rewriter/der.h @@ -23,7 +23,6 @@ Revision History: #include"ast.h" #include"var_subst.h" -#include"assertion_set_strategy.h" /* New DER: the class DER (above) eliminates variables one by one. @@ -184,32 +183,5 @@ public: typedef der_rewriter der_star; -// TODO: delete obsolete class -class der_strategy : public assertion_set_strategy { - struct imp; - imp * m_imp; -public: - der_strategy(ast_manager & m); - virtual ~der_strategy(); - - void operator()(assertion_set & s); - - virtual void operator()(assertion_set & s, model_converter_ref & mc) { - operator()(s); - mc = 0; - } - - virtual void cleanup(); - virtual void set_cancel(bool f); -}; - -inline as_st * mk_der(ast_manager & m) { - return alloc(der_strategy, m); -} - -class tactic; - -tactic * mk_der_tactic(ast_manager & m); - #endif /* _DER_H_ */ diff --git a/lib/expr_replacer.cpp b/src/rewriter/expr_replacer.cpp similarity index 100% rename from lib/expr_replacer.cpp rename to src/rewriter/expr_replacer.cpp diff --git a/lib/expr_replacer.h b/src/rewriter/expr_replacer.h similarity index 100% rename from lib/expr_replacer.h rename to src/rewriter/expr_replacer.h diff --git a/lib/push_app_ite.cpp b/src/simplifier/push_app_ite.cpp similarity index 100% rename from lib/push_app_ite.cpp rename to src/simplifier/push_app_ite.cpp diff --git a/lib/push_app_ite.h b/src/simplifier/push_app_ite.h similarity index 100% rename from lib/push_app_ite.h rename to src/simplifier/push_app_ite.h diff --git a/src/smt/smt_solver_strategy.cpp b/src/smt/smt_solver_strategy.cpp new file mode 100644 index 000000000..65dde6361 --- /dev/null +++ b/src/smt/smt_solver_strategy.cpp @@ -0,0 +1,180 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + smt_solver_strategy.cpp + +Abstract: + + Wraps a solver as an assertion_set strategy. + **Temporary code** + It should be deleted when we finish porting the assertion_set code to the tactic framework. + +Author: + + Leonardo (leonardo) 2012-10-20 + +Notes: + +--*/ +#include"smt_solver_strategy.h" +#include"smt_solver.h" + +class as_st_solver : public assertion_set_strategy { + scoped_ptr m_params; + params_ref m_params_ref; + statistics m_stats; + std::string m_failure; + smt::solver * m_ctx; + bool m_candidate_models; + symbol m_logic; + progress_callback * m_callback; +public: + as_st_solver(bool candidate_models):m_ctx(0), m_candidate_models(candidate_models), m_callback(0) {} + + front_end_params & fparams() { + if (!m_params) + m_params = alloc(front_end_params); + return *m_params; + } + + struct scoped_init_ctx { + as_st_solver & m_owner; + + scoped_init_ctx(as_st_solver & o, ast_manager & m):m_owner(o) { + smt::solver * new_ctx = alloc(smt::solver, m, o.fparams()); + TRACE("as_solver", tout << "logic: " << o.m_logic << "\n";); + new_ctx->set_logic(o.m_logic); + if (o.m_callback) { + new_ctx->set_progress_callback(o.m_callback); + } + #pragma omp critical (as_st_solver) + { + o.m_ctx = new_ctx; + } + } + + ~scoped_init_ctx() { + smt::solver * d = m_owner.m_ctx; + #pragma omp critical (as_st_cancel) + { + m_owner.m_ctx = 0; + } + if (d) + dealloc(d); + } + }; + + virtual ~as_st_solver() { + SASSERT(m_ctx == 0); + } + + virtual void updt_params(params_ref const & p) { + TRACE("as_solver", tout << "updt_params: " << p << "\n";); + m_params_ref = p; + params2front_end_params(m_params_ref, fparams()); + } + + virtual void collect_param_descrs(param_descrs & r) { + } + + virtual void set_cancel(bool f) { + if (m_ctx) + m_ctx->set_cancel(f); + } + + virtual void operator()(assertion_set & s, model_converter_ref & mc) { + SASSERT(is_well_sorted(s)); + IF_VERBOSE(ST_VERBOSITY_LVL, verbose_stream() << "(smt-solver)" << std::endl;); + TRACE("as_solver", tout << "AUTO_CONFIG: " << fparams().m_auto_config << " HIDIV0: " << fparams().m_hi_div0 << " " + << " PREPROCESS: " << fparams().m_preprocess << ", SOLVER:" << fparams().m_solver << "\n";); + TRACE("as_solver_detail", s.display(tout);); + ast_manager & m = s.m(); + TRACE("as_solver_memory", tout << "wasted_size: " << m.get_allocator().get_wasted_size() << "\n";); + // verbose_stream() << "wasted_size: " << m.get_allocator().get_wasted_size() << ", free_objs: " << m.get_allocator().get_num_free_objs() << "\n"; + // m.get_allocator().consolidate(); + scoped_init_ctx init(*this, m); + SASSERT(m_ctx != 0); + unsigned sz = s.size(); + for (unsigned i = 0; i < sz; i++) { + expr * f = s.form(i); + m_ctx->assert_expr(f); + } + lbool r = m_ctx->setup_and_check(); + m_ctx->collect_statistics(m_stats); + switch (r) { + case l_true: { + // the empty assertion set is trivially satifiable. + s.reset(); + // store the model in a do nothin model converter. + model_ref md; + m_ctx->get_model(md); + mc = model2model_converter(md.get()); + return; + } + case l_false: + // formula is unsat, reset the assertion set, and store false there. + s.reset(); + s.assert_expr(m.mk_false(), m_ctx->get_proof()); + return; + case l_undef: + if (m_candidate_models) { + switch (m_ctx->last_failure()) { + case smt::NUM_CONFLICTS: + case smt::THEORY: + case smt::QUANTIFIERS: { + model_ref md; + m_ctx->get_model(md); + mc = model2model_converter(md.get()); + return; + } + default: + break; + } + } + m_failure = m_ctx->last_failure_as_string(); + throw strategy_exception(m_failure.c_str()); + } + } + + virtual void collect_statistics(statistics & st) const { + if (m_ctx) + m_ctx->collect_statistics(st); // ctx is still running... + else + st.copy(m_stats); + } + + virtual void cleanup() { + } + + virtual void reset_statistics() { + m_stats.reset(); + } + + // for backward compatibility + virtual void set_front_end_params(front_end_params & p) { + m_params = alloc(front_end_params, p); + // must propagate the params_ref to fparams + params2front_end_params(m_params_ref, fparams()); + } + + virtual void set_logic(symbol const & l) { + m_logic = l; + } + + virtual void set_progress_callback(progress_callback * callback) { + m_callback = callback; + } +}; + +as_st * mk_smt_solver_core(bool candidate_models) { + return alloc(as_st_solver, candidate_models); +} + +as_st * mk_smt_solver(bool auto_config, bool candidate_models) { + as_st * solver = mk_smt_solver_core(candidate_models); + params_ref solver_p; + solver_p.set_bool(":auto-config", auto_config); + return using_params(solver, solver_p); +}; diff --git a/src/smt/smt_solver_strategy.h b/src/smt/smt_solver_strategy.h new file mode 100644 index 000000000..eb74dc530 --- /dev/null +++ b/src/smt/smt_solver_strategy.h @@ -0,0 +1,31 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + smt_solver_strategy.h + +Abstract: + + Wraps a solver as an assertion_set strategy. + **Temporary code** + It should be deleted when we finish porting the assertion_set code to the tactic framework. + +Author: + + Leonardo (leonardo) 2012-10-20 + +Notes: + +--*/ +#ifndef _SMT_SOLVER_STRATEGY_H_ +#define _SMT_SOLVER_STRATEGY_H_ + +#include"assertion_set_strategy.h" + +as_st * mk_smt_solver_core(bool candidate_models = false); +as_st * mk_smt_solver(bool auto_config = true, bool candidate_models = false); + +MK_SIMPLE_ST_FACTORY(smt_solver_stf, mk_smt_solver()); + +#endif diff --git a/src/spc/README b/src/spc/README new file mode 100644 index 000000000..67ccf0e3c --- /dev/null +++ b/src/spc/README @@ -0,0 +1,2 @@ +Superposition Calculus. +This module is currently disabled. \ No newline at end of file diff --git a/lib/expr_offset.h b/src/spc/expr_offset.h similarity index 100% rename from lib/expr_offset.h rename to src/spc/expr_offset.h diff --git a/lib/expr_offset_map.h b/src/spc/expr_offset_map.h similarity index 100% rename from lib/expr_offset_map.h rename to src/spc/expr_offset_map.h diff --git a/lib/expr_stat.cpp b/src/spc/expr_stat.cpp similarity index 100% rename from lib/expr_stat.cpp rename to src/spc/expr_stat.cpp diff --git a/lib/expr_stat.h b/src/spc/expr_stat.h similarity index 100% rename from lib/expr_stat.h rename to src/spc/expr_stat.h diff --git a/lib/kbo.cpp b/src/spc/kbo.cpp similarity index 100% rename from lib/kbo.cpp rename to src/spc/kbo.cpp diff --git a/lib/kbo.h b/src/spc/kbo.h similarity index 100% rename from lib/kbo.h rename to src/spc/kbo.h diff --git a/lib/lpo.cpp b/src/spc/lpo.cpp similarity index 100% rename from lib/lpo.cpp rename to src/spc/lpo.cpp diff --git a/lib/lpo.h b/src/spc/lpo.h similarity index 100% rename from lib/lpo.h rename to src/spc/lpo.h diff --git a/lib/marker.h b/src/spc/marker.h similarity index 100% rename from lib/marker.h rename to src/spc/marker.h diff --git a/lib/matcher.cpp b/src/spc/matcher.cpp similarity index 100% rename from lib/matcher.cpp rename to src/spc/matcher.cpp diff --git a/lib/matcher.h b/src/spc/matcher.h similarity index 100% rename from lib/matcher.h rename to src/spc/matcher.h diff --git a/lib/normalize_vars.cpp b/src/spc/normalize_vars.cpp similarity index 100% rename from lib/normalize_vars.cpp rename to src/spc/normalize_vars.cpp diff --git a/lib/normalize_vars.h b/src/spc/normalize_vars.h similarity index 100% rename from lib/normalize_vars.h rename to src/spc/normalize_vars.h diff --git a/lib/order.cpp b/src/spc/order.cpp similarity index 100% rename from lib/order.cpp rename to src/spc/order.cpp diff --git a/lib/order.h b/src/spc/order.h similarity index 100% rename from lib/order.h rename to src/spc/order.h diff --git a/lib/precedence.cpp b/src/spc/precedence.cpp similarity index 100% rename from lib/precedence.cpp rename to src/spc/precedence.cpp diff --git a/lib/precedence.h b/src/spc/precedence.h similarity index 100% rename from lib/precedence.h rename to src/spc/precedence.h diff --git a/lib/preprocessor.cpp b/src/spc/preprocessor.cpp similarity index 100% rename from lib/preprocessor.cpp rename to src/spc/preprocessor.cpp diff --git a/lib/preprocessor.h b/src/spc/preprocessor.h similarity index 100% rename from lib/preprocessor.h rename to src/spc/preprocessor.h diff --git a/lib/sparse_use_list.h b/src/spc/sparse_use_list.h similarity index 100% rename from lib/sparse_use_list.h rename to src/spc/sparse_use_list.h diff --git a/lib/spc_asserted_literals.cpp b/src/spc/spc_asserted_literals.cpp similarity index 100% rename from lib/spc_asserted_literals.cpp rename to src/spc/spc_asserted_literals.cpp diff --git a/lib/spc_asserted_literals.h b/src/spc/spc_asserted_literals.h similarity index 100% rename from lib/spc_asserted_literals.h rename to src/spc/spc_asserted_literals.h diff --git a/lib/spc_clause.cpp b/src/spc/spc_clause.cpp similarity index 100% rename from lib/spc_clause.cpp rename to src/spc/spc_clause.cpp diff --git a/lib/spc_clause.h b/src/spc/spc_clause.h similarity index 100% rename from lib/spc_clause.h rename to src/spc/spc_clause.h diff --git a/lib/spc_clause_pos_set.h b/src/spc/spc_clause_pos_set.h similarity index 100% rename from lib/spc_clause_pos_set.h rename to src/spc/spc_clause_pos_set.h diff --git a/lib/spc_clause_selection.cpp b/src/spc/spc_clause_selection.cpp similarity index 100% rename from lib/spc_clause_selection.cpp rename to src/spc/spc_clause_selection.cpp diff --git a/lib/spc_clause_selection.h b/src/spc/spc_clause_selection.h similarity index 100% rename from lib/spc_clause_selection.h rename to src/spc/spc_clause_selection.h diff --git a/lib/spc_context.cpp b/src/spc/spc_context.cpp similarity index 100% rename from lib/spc_context.cpp rename to src/spc/spc_context.cpp diff --git a/lib/spc_context.h b/src/spc/spc_context.h similarity index 100% rename from lib/spc_context.h rename to src/spc/spc_context.h diff --git a/lib/spc_decl_plugin.cpp b/src/spc/spc_decl_plugin.cpp similarity index 100% rename from lib/spc_decl_plugin.cpp rename to src/spc/spc_decl_plugin.cpp diff --git a/lib/spc_decl_plugin.h b/src/spc/spc_decl_plugin.h similarity index 100% rename from lib/spc_decl_plugin.h rename to src/spc/spc_decl_plugin.h diff --git a/lib/spc_der.cpp b/src/spc/spc_der.cpp similarity index 100% rename from lib/spc_der.cpp rename to src/spc/spc_der.cpp diff --git a/lib/spc_der.h b/src/spc/spc_der.h similarity index 100% rename from lib/spc_der.h rename to src/spc/spc_der.h diff --git a/lib/spc_eq_resolution.cpp b/src/spc/spc_eq_resolution.cpp similarity index 100% rename from lib/spc_eq_resolution.cpp rename to src/spc/spc_eq_resolution.cpp diff --git a/lib/spc_eq_resolution.h b/src/spc/spc_eq_resolution.h similarity index 100% rename from lib/spc_eq_resolution.h rename to src/spc/spc_eq_resolution.h diff --git a/lib/spc_factoring.cpp b/src/spc/spc_factoring.cpp similarity index 100% rename from lib/spc_factoring.cpp rename to src/spc/spc_factoring.cpp diff --git a/lib/spc_factoring.h b/src/spc/spc_factoring.h similarity index 100% rename from lib/spc_factoring.h rename to src/spc/spc_factoring.h diff --git a/lib/spc_justification.cpp b/src/spc/spc_justification.cpp similarity index 100% rename from lib/spc_justification.cpp rename to src/spc/spc_justification.cpp diff --git a/lib/spc_justification.h b/src/spc/spc_justification.h similarity index 100% rename from lib/spc_justification.h rename to src/spc/spc_justification.h diff --git a/lib/spc_literal.cpp b/src/spc/spc_literal.cpp similarity index 100% rename from lib/spc_literal.cpp rename to src/spc/spc_literal.cpp diff --git a/lib/spc_literal.h b/src/spc/spc_literal.h similarity index 100% rename from lib/spc_literal.h rename to src/spc/spc_literal.h diff --git a/lib/spc_literal_selection.cpp b/src/spc/spc_literal_selection.cpp similarity index 100% rename from lib/spc_literal_selection.cpp rename to src/spc/spc_literal_selection.cpp diff --git a/lib/spc_literal_selection.h b/src/spc/spc_literal_selection.h similarity index 100% rename from lib/spc_literal_selection.h rename to src/spc/spc_literal_selection.h diff --git a/lib/spc_prover.cpp b/src/spc/spc_prover.cpp similarity index 100% rename from lib/spc_prover.cpp rename to src/spc/spc_prover.cpp diff --git a/lib/spc_prover.h b/src/spc/spc_prover.h similarity index 100% rename from lib/spc_prover.h rename to src/spc/spc_prover.h diff --git a/lib/spc_rewriter.cpp b/src/spc/spc_rewriter.cpp similarity index 100% rename from lib/spc_rewriter.cpp rename to src/spc/spc_rewriter.cpp diff --git a/lib/spc_rewriter.h b/src/spc/spc_rewriter.h similarity index 100% rename from lib/spc_rewriter.h rename to src/spc/spc_rewriter.h diff --git a/lib/spc_semantic_tautology.cpp b/src/spc/spc_semantic_tautology.cpp similarity index 100% rename from lib/spc_semantic_tautology.cpp rename to src/spc/spc_semantic_tautology.cpp diff --git a/lib/spc_semantic_tautology.h b/src/spc/spc_semantic_tautology.h similarity index 100% rename from lib/spc_semantic_tautology.h rename to src/spc/spc_semantic_tautology.h diff --git a/lib/spc_statistics.cpp b/src/spc/spc_statistics.cpp similarity index 100% rename from lib/spc_statistics.cpp rename to src/spc/spc_statistics.cpp diff --git a/lib/spc_statistics.h b/src/spc/spc_statistics.h similarity index 100% rename from lib/spc_statistics.h rename to src/spc/spc_statistics.h diff --git a/lib/spc_subsumption.cpp b/src/spc/spc_subsumption.cpp similarity index 100% rename from lib/spc_subsumption.cpp rename to src/spc/spc_subsumption.cpp diff --git a/lib/spc_subsumption.h b/src/spc/spc_subsumption.h similarity index 100% rename from lib/spc_subsumption.h rename to src/spc/spc_subsumption.h diff --git a/lib/spc_superposition.cpp b/src/spc/spc_superposition.cpp similarity index 100% rename from lib/spc_superposition.cpp rename to src/spc/spc_superposition.cpp diff --git a/lib/spc_superposition.h b/src/spc/spc_superposition.h similarity index 100% rename from lib/spc_superposition.h rename to src/spc/spc_superposition.h diff --git a/lib/spc_unary_inference.cpp b/src/spc/spc_unary_inference.cpp similarity index 100% rename from lib/spc_unary_inference.cpp rename to src/spc/spc_unary_inference.cpp diff --git a/lib/spc_unary_inference.h b/src/spc/spc_unary_inference.h similarity index 100% rename from lib/spc_unary_inference.h rename to src/spc/spc_unary_inference.h diff --git a/lib/splay_tree.h b/src/spc/splay_tree.h similarity index 100% rename from lib/splay_tree.h rename to src/spc/splay_tree.h diff --git a/lib/splay_tree_def.h b/src/spc/splay_tree_def.h similarity index 100% rename from lib/splay_tree_def.h rename to src/spc/splay_tree_def.h diff --git a/lib/splay_tree_map.h b/src/spc/splay_tree_map.h similarity index 100% rename from lib/splay_tree_map.h rename to src/spc/splay_tree_map.h diff --git a/lib/substitution.cpp b/src/spc/substitution.cpp similarity index 100% rename from lib/substitution.cpp rename to src/spc/substitution.cpp diff --git a/lib/substitution.h b/src/spc/substitution.h similarity index 100% rename from lib/substitution.h rename to src/spc/substitution.h diff --git a/lib/substitution_tree.cpp b/src/spc/substitution_tree.cpp similarity index 100% rename from lib/substitution_tree.cpp rename to src/spc/substitution_tree.cpp diff --git a/lib/substitution_tree.h b/src/spc/substitution_tree.h similarity index 100% rename from lib/substitution_tree.h rename to src/spc/substitution_tree.h diff --git a/lib/unifier.cpp b/src/spc/unifier.cpp similarity index 100% rename from lib/unifier.cpp rename to src/spc/unifier.cpp diff --git a/lib/unifier.h b/src/spc/unifier.h similarity index 100% rename from lib/unifier.h rename to src/spc/unifier.h diff --git a/lib/use_list.cpp b/src/spc/use_list.cpp similarity index 100% rename from lib/use_list.cpp rename to src/spc/use_list.cpp diff --git a/lib/use_list.h b/src/spc/use_list.h similarity index 100% rename from lib/use_list.h rename to src/spc/use_list.h diff --git a/lib/var_offset_map.h b/src/spc/var_offset_map.h similarity index 100% rename from lib/var_offset_map.h rename to src/spc/var_offset_map.h