mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 03:32:28 +00:00 
			
		
		
		
	add parameter access to C++ API
This commit is contained in:
		
							parent
							
								
									9ca0faa091
								
							
						
					
					
						commit
						cd2ea6b703
					
				
					 1 changed files with 41 additions and 0 deletions
				
			
		|  | @ -151,6 +151,7 @@ namespace z3 { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|     /**
 |     /**
 | ||||||
|        \brief A Context manages all other Z3 objects, global configuration options, etc. |        \brief A Context manages all other Z3 objects, global configuration options, etc. | ||||||
|     */ |     */ | ||||||
|  | @ -750,6 +751,7 @@ namespace z3 { | ||||||
|         func_decl_vector recognizers(); |         func_decl_vector recognizers(); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|     /**
 |     /**
 | ||||||
|        \brief Function declaration (aka function definition). It is the signature of interpreted and uninterpreted functions in Z3. |        \brief Function declaration (aka function definition). It is the signature of interpreted and uninterpreted functions in Z3. | ||||||
|        The basic building block in Z3 is the function application. |        The basic building block in Z3 is the function application. | ||||||
|  | @ -770,6 +772,8 @@ namespace z3 { | ||||||
|         sort range() const { Z3_sort r = Z3_get_range(ctx(), *this); check_error(); return sort(ctx(), r); } |         sort range() const { Z3_sort r = Z3_get_range(ctx(), *this); check_error(); return sort(ctx(), r); } | ||||||
|         symbol name() const { Z3_symbol s = Z3_get_decl_name(ctx(), *this); check_error(); return symbol(ctx(), s); } |         symbol name() const { Z3_symbol s = Z3_get_decl_name(ctx(), *this); check_error(); return symbol(ctx(), s); } | ||||||
|         Z3_decl_kind decl_kind() const { return Z3_get_decl_kind(ctx(), *this); } |         Z3_decl_kind decl_kind() const { return Z3_get_decl_kind(ctx(), *this); } | ||||||
|  |         unsigned num_parameters() const { return Z3_get_decl_num_parameters(ctx(), *this); } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         func_decl transitive_closure(func_decl const&) { |         func_decl transitive_closure(func_decl const&) { | ||||||
|             Z3_func_decl tc = Z3_mk_transitive_closure(ctx(), *this); check_error(); return func_decl(ctx(), tc);  |             Z3_func_decl tc = Z3_mk_transitive_closure(ctx(), *this); check_error(); return func_decl(ctx(), tc);  | ||||||
|  | @ -2687,6 +2691,43 @@ namespace z3 { | ||||||
|         return out; |         return out; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /**
 | ||||||
|  |         \brief class for auxiliary parameters associated with func_decl  | ||||||
|  |         The class is initialized with a func_decl or application expression and an index | ||||||
|  |         The accessor get_expr, get_sort, ... is available depending on the value of kind(). | ||||||
|  |         The caller is responsible to check that the kind of the parameter aligns with the call (get_expr etc). | ||||||
|  | 
 | ||||||
|  |         Parameters are available on some declarations to contain additional information that is not passed as | ||||||
|  |         arguments when a function is applied to arguments. For example, bit-vector extraction has two  | ||||||
|  |         integer parameters. Array map has a function parameter. | ||||||
|  |     */ | ||||||
|  |     class parameter { | ||||||
|  |         Z3_parameter_kind m_kind; | ||||||
|  |         func_decl         m_decl; | ||||||
|  |         unsigned          m_index; | ||||||
|  |         context& ctx() const { return m_decl.ctx(); } | ||||||
|  |         void check_error() const { ctx().check_error(); } | ||||||
|  |     public: | ||||||
|  |         parameter(func_decl const& d, unsigned idx) : m_decl(d), m_index(idx) {  | ||||||
|  |             if (ctx().enable_exceptions() && idx >= d.num_parameters()) | ||||||
|  |                 Z3_THROW(exception("parameter index is out of bounds")); | ||||||
|  |             m_kind = Z3_get_decl_parameter_kind(ctx(), d, idx);  | ||||||
|  |         } | ||||||
|  |         parameter(expr const& e, unsigned idx) : m_decl(e.decl()), m_index(idx) { | ||||||
|  |             if (ctx().enable_exceptions() && idx >= m_decl.num_parameters()) | ||||||
|  |                 Z3_THROW(exception("parameter index is out of bounds")); | ||||||
|  |             m_kind = Z3_get_decl_parameter_kind(ctx(), m_decl, idx); | ||||||
|  |         } | ||||||
|  |         Z3_parameter_kind kind() const { return m_kind; } | ||||||
|  |         expr get_expr() const { Z3_ast a = Z3_get_decl_ast_parameter(ctx(), m_decl, m_index); check_error(); return expr(ctx(), a); } | ||||||
|  |         sort get_sort() const { Z3_sort s = Z3_get_decl_sort_parameter(ctx(), m_decl, m_index); check_error(); return sort(ctx(), s); } | ||||||
|  |         func_decl get_decl() const { Z3_func_decl f = Z3_get_decl_func_decl_parameter(ctx(), m_decl, m_index); check_error(); return func_decl(ctx(), f); } | ||||||
|  |         symbol get_symbol() const { Z3_symbol s = Z3_get_decl_symbol_parameter(ctx(), m_decl, m_index); check_error(); return symbol(ctx(), s); } | ||||||
|  |         std::string get_rational() const { Z3_string s = Z3_get_decl_rational_parameter(ctx(), m_decl, m_index); check_error(); return s; } | ||||||
|  |         double get_double() const { double d = Z3_get_decl_double_parameter(ctx(), m_decl, m_index); check_error(); return d; } | ||||||
|  |         int get_int() const { int i = Z3_get_decl_int_parameter(ctx(), m_decl, m_index); check_error(); return i; } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|     class solver : public object { |     class solver : public object { | ||||||
|         Z3_solver m_solver; |         Z3_solver m_solver; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue