mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 11:42:28 +00:00 
			
		
		
		
	remove dependency on ast from params
This commit is contained in:
		
							parent
							
								
									f00db08221
								
							
						
					
					
						commit
						4b3fecc35e
					
				
					 13 changed files with 49 additions and 48 deletions
				
			
		|  | @ -23,12 +23,12 @@ def init_project_def(): | ||||||
|     add_lib('realclosure', ['interval'], 'math/realclosure') |     add_lib('realclosure', ['interval'], 'math/realclosure') | ||||||
|     add_lib('subpaving', ['interval'], 'math/subpaving') |     add_lib('subpaving', ['interval'], 'math/subpaving') | ||||||
|     add_lib('ast', ['util', 'polynomial']) |     add_lib('ast', ['util', 'polynomial']) | ||||||
|     add_lib('params', ['ast', 'util']) |     add_lib('params', ['util']) | ||||||
|     add_lib('euf', ['ast', 'util'], 'ast/euf') |     add_lib('euf', ['ast', 'util'], 'ast/euf') | ||||||
|     add_lib('grobner', ['ast', 'dd', 'simplex'], 'math/grobner')     |     add_lib('grobner', ['ast', 'dd', 'simplex'], 'math/grobner')     | ||||||
|     add_lib('sat', ['util', 'dd', 'grobner'])     |     add_lib('sat', ['util', 'dd', 'grobner'])     | ||||||
|     add_lib('nlsat', ['polynomial', 'sat']) |     add_lib('nlsat', ['polynomial', 'sat']) | ||||||
|     add_lib('smt_params', ['ast', 'params'], 'smt/params') |     add_lib('smt_params', ['params'], 'smt/params') | ||||||
|     add_lib('lp', ['util', 'nlsat', 'grobner', 'interval', 'smt_params'], 'math/lp') |     add_lib('lp', ['util', 'nlsat', 'grobner', 'interval', 'smt_params'], 'math/lp') | ||||||
|     add_lib('rewriter', ['ast', 'polynomial', 'automata', 'params'], 'ast/rewriter') |     add_lib('rewriter', ['ast', 'polynomial', 'automata', 'params'], 'ast/rewriter') | ||||||
|     add_lib('macros', ['rewriter'], 'ast/macros') |     add_lib('macros', ['rewriter'], 'ast/macros') | ||||||
|  |  | ||||||
|  | @ -24,7 +24,6 @@ Revision History: | ||||||
| #include "util/symbol.h" | #include "util/symbol.h" | ||||||
| #include "util/gparams.h" | #include "util/gparams.h" | ||||||
| #include "util/env_params.h" | #include "util/env_params.h" | ||||||
| #include "params/context_params.h" |  | ||||||
| 
 | 
 | ||||||
| extern "C" { | extern "C" { | ||||||
|     void Z3_API Z3_global_param_set(Z3_string param_id, Z3_string param_value) { |     void Z3_API Z3_global_param_set(Z3_string param_id, Z3_string param_value) { | ||||||
|  | @ -71,7 +70,7 @@ extern "C" { | ||||||
|         try { |         try { | ||||||
|             memory::initialize(UINT_MAX); |             memory::initialize(UINT_MAX); | ||||||
|             LOG_Z3_mk_config(); |             LOG_Z3_mk_config(); | ||||||
|             Z3_config r = reinterpret_cast<Z3_config>(alloc(context_params)); |             Z3_config r = reinterpret_cast<Z3_config>(alloc(ast_context)); | ||||||
|             RETURN_Z3(r); |             RETURN_Z3(r); | ||||||
|         } catch (z3_exception & ex) { |         } catch (z3_exception & ex) { | ||||||
|             // The error handler is only available for contexts
 |             // The error handler is only available for contexts
 | ||||||
|  | @ -83,13 +82,13 @@ extern "C" { | ||||||
|      |      | ||||||
|     void Z3_API Z3_del_config(Z3_config c) { |     void Z3_API Z3_del_config(Z3_config c) { | ||||||
|         LOG_Z3_del_config(c); |         LOG_Z3_del_config(c); | ||||||
|         dealloc((reinterpret_cast<context_params*>(c))); |         dealloc((reinterpret_cast<ast_context*>(c))); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     void Z3_API Z3_set_param_value(Z3_config c, char const * param_id, char const * param_value) { |     void Z3_API Z3_set_param_value(Z3_config c, char const * param_id, char const * param_value) { | ||||||
|         LOG_Z3_set_param_value(c, param_id, param_value); |         LOG_Z3_set_param_value(c, param_id, param_value); | ||||||
|         try { |         try { | ||||||
|             context_params * p = reinterpret_cast<context_params*>(c); |             ast_context * p = reinterpret_cast<ast_context*>(c); | ||||||
|             p->set(param_id, param_value); |             p->set(param_id, param_value); | ||||||
|         } |         } | ||||||
|         catch (z3_exception & ex) { |         catch (z3_exception & ex) { | ||||||
|  |  | ||||||
|  | @ -70,8 +70,8 @@ namespace api { | ||||||
|     //
 |     //
 | ||||||
|     // ------------------------
 |     // ------------------------
 | ||||||
| 
 | 
 | ||||||
|     context::context(context_params * p, bool user_ref_count): |     context::context(ast_context * p, bool user_ref_count): | ||||||
|         m_params(p != nullptr ? *p : context_params()), |         m_params(p != nullptr ? *p : ast_context()), | ||||||
|         m_user_ref_count(user_ref_count), |         m_user_ref_count(user_ref_count), | ||||||
|         m_manager(m_params.mk_ast_manager()), |         m_manager(m_params.mk_ast_manager()), | ||||||
|         m_plugins(m()), |         m_plugins(m()), | ||||||
|  | @ -343,7 +343,7 @@ extern "C" { | ||||||
|         Z3_TRY; |         Z3_TRY; | ||||||
|         LOG_Z3_mk_context(c); |         LOG_Z3_mk_context(c); | ||||||
|         memory::initialize(UINT_MAX); |         memory::initialize(UINT_MAX); | ||||||
|         Z3_context r = reinterpret_cast<Z3_context>(alloc(api::context, reinterpret_cast<context_params*>(c), false)); |         Z3_context r = reinterpret_cast<Z3_context>(alloc(api::context, reinterpret_cast<ast_context*>(c), false)); | ||||||
|         RETURN_Z3(r); |         RETURN_Z3(r); | ||||||
|         Z3_CATCH_RETURN_NO_HANDLE(nullptr); |         Z3_CATCH_RETURN_NO_HANDLE(nullptr); | ||||||
|     } |     } | ||||||
|  | @ -352,7 +352,7 @@ extern "C" { | ||||||
|         Z3_TRY; |         Z3_TRY; | ||||||
|         LOG_Z3_mk_context_rc(c); |         LOG_Z3_mk_context_rc(c); | ||||||
|         memory::initialize(UINT_MAX); |         memory::initialize(UINT_MAX); | ||||||
|         Z3_context r = reinterpret_cast<Z3_context>(alloc(api::context, reinterpret_cast<context_params*>(c), true)); |         Z3_context r = reinterpret_cast<Z3_context>(alloc(api::context, reinterpret_cast<ast_context*>(c), true)); | ||||||
|         RETURN_Z3(r); |         RETURN_Z3(r); | ||||||
|         Z3_CATCH_RETURN_NO_HANDLE(nullptr); |         Z3_CATCH_RETURN_NO_HANDLE(nullptr); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -36,7 +36,6 @@ Revision History: | ||||||
| #include "smt/smt_kernel.h" | #include "smt/smt_kernel.h" | ||||||
| #include "smt/smt_solver.h" | #include "smt/smt_solver.h" | ||||||
| #include "cmd_context/tactic_manager.h" | #include "cmd_context/tactic_manager.h" | ||||||
| #include "params/context_params.h" |  | ||||||
| #include "cmd_context/cmd_context.h" | #include "cmd_context/cmd_context.h" | ||||||
| #include "solver/solver.h" | #include "solver/solver.h" | ||||||
| #include "api/z3.h" | #include "api/z3.h" | ||||||
|  | @ -74,7 +73,7 @@ namespace api { | ||||||
| 
 | 
 | ||||||
|     class context : public tactic_manager { |     class context : public tactic_manager { | ||||||
|         struct add_plugins {  add_plugins(ast_manager & m); }; |         struct add_plugins {  add_plugins(ast_manager & m); }; | ||||||
|         context_params             m_params; |         ast_context                m_params; | ||||||
|         bool                       m_user_ref_count; //!< if true, the user is responsible for managing reference counters.
 |         bool                       m_user_ref_count; //!< if true, the user is responsible for managing reference counters.
 | ||||||
|         scoped_ptr<ast_manager>    m_manager; |         scoped_ptr<ast_manager>    m_manager; | ||||||
|         scoped_ptr<cmd_context>    m_cmd; |         scoped_ptr<cmd_context>    m_cmd; | ||||||
|  | @ -136,11 +135,11 @@ namespace api { | ||||||
|         //
 |         //
 | ||||||
|         // ------------------------
 |         // ------------------------
 | ||||||
|          |          | ||||||
|         context(context_params * p, bool user_ref_count = false); |         context(ast_context * p, bool user_ref_count = false); | ||||||
|         ~context(); |         ~context(); | ||||||
|         ast_manager & m() const { return *(m_manager.get()); } |         ast_manager & m() const { return *(m_manager.get()); } | ||||||
| 
 | 
 | ||||||
|         context_params & params() { m_params.updt_params(); return m_params; } |         ast_context & params() { m_params.updt_params(); return m_params; } | ||||||
|         scoped_ptr<cmd_context>& cmd() { return m_cmd; } |         scoped_ptr<cmd_context>& cmd() { return m_cmd; } | ||||||
|         bool produce_proofs() const { return m().proofs_enabled(); } |         bool produce_proofs() const { return m().proofs_enabled(); } | ||||||
|         bool produce_models() const { return m_params.m_model; } |         bool produce_models() const { return m_params.m_model; } | ||||||
|  |  | ||||||
|  | @ -876,7 +876,7 @@ extern "C" { | ||||||
|         solver::push_eh_t _push = push_eh; |         solver::push_eh_t _push = push_eh; | ||||||
|         solver::pop_eh_t _pop = pop_eh; |         solver::pop_eh_t _pop = pop_eh; | ||||||
|         solver::fresh_eh_t _fresh = [&](void * user_ctx, ast_manager& m, solver::context_obj*& _ctx) { |         solver::fresh_eh_t _fresh = [&](void * user_ctx, ast_manager& m, solver::context_obj*& _ctx) { | ||||||
|             context_params params; |             ast_context params; | ||||||
|             params.set_foreign_manager(&m); |             params.set_foreign_manager(&m); | ||||||
|             auto* ctx = alloc(api::context, ¶ms, false); |             auto* ctx = alloc(api::context, ¶ms, false); | ||||||
|             _ctx = alloc(api_context_obj, ctx); |             _ctx = alloc(api_context_obj, ctx); | ||||||
|  |  | ||||||
|  | @ -280,6 +280,20 @@ void macro_decls::erase_last(ast_manager& m) { | ||||||
|     m_decls->pop_back(); |     m_decls->pop_back(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | ast_manager * ast_context::mk_ast_manager() { | ||||||
|  |     if (m_manager) | ||||||
|  |         return m_manager; | ||||||
|  |     ast_manager * r = alloc(ast_manager, | ||||||
|  |                             m_proof ? PGM_ENABLED : PGM_DISABLED, | ||||||
|  |                             m_trace ? m_trace_file_name.c_str() : nullptr); | ||||||
|  |     if (m_smtlib2_compliant) | ||||||
|  |         r->enable_int_real_coercions(false); | ||||||
|  |     if (m_debug_ref_count) | ||||||
|  |         r->debug_ref_count(); | ||||||
|  |     return r; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| bool cmd_context::contains_func_decl(symbol const& s, unsigned n, sort* const* domain, sort* range) const { | bool cmd_context::contains_func_decl(symbol const& s, unsigned n, sort* const* domain, sort* range) const { | ||||||
|     func_decls fs; |     func_decls fs; | ||||||
|     return m_func_decls.find(s, fs) && fs.contains(n, domain, range); |     return m_func_decls.find(s, fs) && fs.contains(n, domain, range); | ||||||
|  | @ -1889,6 +1903,8 @@ void cmd_context::validate_model() { | ||||||
|                 if (m().is_true(r)) |                 if (m().is_true(r)) | ||||||
|                     continue; |                     continue; | ||||||
| 
 | 
 | ||||||
|  |                 TRACE("model_validate", tout << *md << "\n";); | ||||||
|  | 
 | ||||||
|                 // The evaluator for array expressions is not complete
 |                 // The evaluator for array expressions is not complete
 | ||||||
|                 // If r contains as_array/store/map/const expressions, then we do not generate the error.
 |                 // If r contains as_array/store/map/const expressions, then we do not generate the error.
 | ||||||
|                 // TODO: improve evaluator for model expressions.
 |                 // TODO: improve evaluator for model expressions.
 | ||||||
|  | @ -1897,7 +1913,8 @@ void cmd_context::validate_model() { | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|                 try { |                 try { | ||||||
|                     for_each_expr(contains_underspecified, a); |                     if (!m().is_false(r)) | ||||||
|  |                         for_each_expr(contains_underspecified, a); | ||||||
|                     for_each_expr(contains_underspecified, r); |                     for_each_expr(contains_underspecified, r); | ||||||
|                 } |                 } | ||||||
|                 catch (const contains_underspecified_op_proc::found &) { |                 catch (const contains_underspecified_op_proc::found &) { | ||||||
|  |  | ||||||
|  | @ -160,6 +160,18 @@ public: | ||||||
|     virtual void updt_params(params_ref const& p) = 0; |     virtual void updt_params(params_ref const& p) = 0; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | class ast_context : public context_params {  | ||||||
|  |     ast_manager* m_manager { nullptr }; | ||||||
|  | public: | ||||||
|  |     /**
 | ||||||
|  |        \brief Create an AST manager using this configuration. | ||||||
|  |     */ | ||||||
|  |     ast_manager * mk_ast_manager(); | ||||||
|  | 
 | ||||||
|  |     void set_foreign_manager(ast_manager* m) { m_manager = m; } | ||||||
|  |     bool owns_manager() const { return m_manager != nullptr; } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| class cmd_context : public progress_callback, public tactic_manager, public ast_printer_context { | class cmd_context : public progress_callback, public tactic_manager, public ast_printer_context { | ||||||
| public: | public: | ||||||
|     enum status { |     enum status { | ||||||
|  | @ -179,8 +191,10 @@ public: | ||||||
|         ~scoped_watch() { m_ctx.m_watch.stop(); } |         ~scoped_watch() { m_ctx.m_watch.stop(); } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |      | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
|     context_params               m_params; |     ast_context                  m_params; | ||||||
|     bool                         m_main_ctx; |     bool                         m_main_ctx; | ||||||
|     symbol                       m_logic; |     symbol                       m_logic; | ||||||
|     bool                         m_interactive_mode; |     bool                         m_interactive_mode; | ||||||
|  |  | ||||||
|  | @ -4,7 +4,6 @@ z3_add_component(params | ||||||
|     context_params.cpp |     context_params.cpp | ||||||
|   COMPONENT_DEPENDENCIES |   COMPONENT_DEPENDENCIES | ||||||
|     util |     util | ||||||
|     ast |  | ||||||
|   PYG_FILES |   PYG_FILES | ||||||
|     arith_rewriter_params.pyg |     arith_rewriter_params.pyg | ||||||
|     array_rewriter_params.pyg |     array_rewriter_params.pyg | ||||||
|  |  | ||||||
|  | @ -19,7 +19,6 @@ Notes: | ||||||
| --*/ | --*/ | ||||||
| #include "util/gparams.h" | #include "util/gparams.h" | ||||||
| #include "util/params.h" | #include "util/params.h" | ||||||
| #include "ast/ast.h" |  | ||||||
| #include "params/context_params.h" | #include "params/context_params.h" | ||||||
| 
 | 
 | ||||||
| context_params::context_params() { | context_params::context_params() { | ||||||
|  | @ -194,17 +193,5 @@ void context_params::get_solver_params(params_ref & p, bool & proofs_enabled, bo | ||||||
|     p = merge_default_params(p); |     p = merge_default_params(p); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ast_manager * context_params::mk_ast_manager() { |  | ||||||
|     if (m_manager) |  | ||||||
|         return m_manager; |  | ||||||
|     ast_manager * r = alloc(ast_manager, |  | ||||||
|                             m_proof ? PGM_ENABLED : PGM_DISABLED, |  | ||||||
|                             m_trace ? m_trace_file_name.c_str() : nullptr); |  | ||||||
|     if (m_smtlib2_compliant) |  | ||||||
|         r->enable_int_real_coercions(false); |  | ||||||
|     if (m_debug_ref_count) |  | ||||||
|         r->debug_ref_count(); |  | ||||||
|     return r; |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,14 +20,12 @@ Notes: | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "util/params.h" | #include "util/params.h" | ||||||
| class ast_manager; |  | ||||||
| 
 | 
 | ||||||
| class context_params { | class context_params { | ||||||
|     void set_bool(bool & opt, char const * param, char const * value); |     void set_bool(bool & opt, char const * param, char const * value); | ||||||
|     void set_uint(unsigned & opt, char const * param, char const * value); |     void set_uint(unsigned & opt, char const * param, char const * value); | ||||||
| 
 | 
 | ||||||
|     unsigned    m_rlimit { 0 }; |     unsigned    m_rlimit { 0 }; | ||||||
|     ast_manager* m_manager { nullptr }; |  | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     bool        m_auto_config { true }; |     bool        m_auto_config { true }; | ||||||
|  | @ -71,13 +69,7 @@ public: | ||||||
|     */ |     */ | ||||||
|     params_ref merge_default_params(params_ref const & p); |     params_ref merge_default_params(params_ref const & p); | ||||||
| 
 | 
 | ||||||
|     /**
 |  | ||||||
|        \brief Create an AST manager using this configuration. |  | ||||||
|     */ |  | ||||||
|     ast_manager * mk_ast_manager(); |  | ||||||
| 
 | 
 | ||||||
|     void set_foreign_manager(ast_manager* m) { m_manager = m; } |  | ||||||
|     bool owns_manager() const { return m_manager != nullptr; } |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -128,7 +128,6 @@ namespace array { | ||||||
|             r.set_delayed(); |             r.set_delayed(); | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|         r.set_applied(); |  | ||||||
|         if (a.is_const(child)) |         if (a.is_const(child)) | ||||||
|             return assert_select_const_axiom(select, to_app(child)); |             return assert_select_const_axiom(select, to_app(child)); | ||||||
|         else if (a.is_as_array(child)) |         else if (a.is_as_array(child)) | ||||||
|  | @ -205,12 +204,6 @@ namespace array { | ||||||
|         if (s().value(sel_eq) == l_true) |         if (s().value(sel_eq) == l_true) | ||||||
|             return false; |             return false; | ||||||
| 
 | 
 | ||||||
| #if 0 |  | ||||||
|         static unsigned count = 0; |  | ||||||
|         ++count; |  | ||||||
|         std::cout << count << " " << sel_eq << "\n"; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|         bool new_prop = false; |         bool new_prop = false; | ||||||
|         for (unsigned i = 1; i < num_args; i++) { |         for (unsigned i = 1; i < num_args; i++) { | ||||||
|             expr* idx1 = store->get_arg(i); |             expr* idx1 = store->get_arg(i); | ||||||
|  | @ -238,6 +231,7 @@ namespace array { | ||||||
|      *    select(const(v), i) = v |      *    select(const(v), i) = v | ||||||
|      */ |      */ | ||||||
|     bool solver::assert_select_const_axiom(app* select, app* cnst) { |     bool solver::assert_select_const_axiom(app* select, app* cnst) { | ||||||
|  |          | ||||||
|         ++m_stats.m_num_select_const_axiom; |         ++m_stats.m_num_select_const_axiom; | ||||||
|         expr* val = nullptr; |         expr* val = nullptr; | ||||||
|         VERIFY(a.is_const(cnst, val)); |         VERIFY(a.is_const(cnst, val)); | ||||||
|  |  | ||||||
|  | @ -73,7 +73,7 @@ namespace euf { | ||||||
|         values2model(deps, mdl); |         values2model(deps, mdl); | ||||||
|         for (auto* mb : m_solvers) |         for (auto* mb : m_solvers) | ||||||
|             mb->finalize_model(*mdl); |             mb->finalize_model(*mdl); | ||||||
|         // validate_model(*mdl);
 |         validate_model(*mdl); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     bool solver::include_func_interp(func_decl* f) { |     bool solver::include_func_interp(func_decl* f) { | ||||||
|  |  | ||||||
|  | @ -308,7 +308,7 @@ namespace euf { | ||||||
|             euf::enode* nb = n->get_arg(1); |             euf::enode* nb = n->get_arg(1); | ||||||
|             m_egraph.merge(na, nb, c); |             m_egraph.merge(na, nb, c); | ||||||
|         } |         } | ||||||
|         else if (n->merge_enabled() && n->num_parents() > 0) { |         else if (n->merge_enabled() && (n->num_parents() > 0 || n->num_args() > 0)) { | ||||||
|             euf::enode* nb = sign ? mk_false() : mk_true(); |             euf::enode* nb = sign ? mk_false() : mk_true(); | ||||||
|             m_egraph.merge(n, nb, c); |             m_egraph.merge(n, nb, c); | ||||||
|         } |         } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue