mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 11:42:28 +00:00 
			
		
		
		
	add missing mod/rem/is_int functionality to C++ API
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									4c6efbbc8b
								
							
						
					
					
						commit
						b3dabc7ccf
					
				
					 1 changed files with 50 additions and 22 deletions
				
			
		|  | @ -435,6 +435,8 @@ namespace z3 { | ||||||
|         Z3_ast_kind kind() const { Z3_ast_kind r = Z3_get_ast_kind(ctx(), m_ast); check_error(); return r; } |         Z3_ast_kind kind() const { Z3_ast_kind r = Z3_get_ast_kind(ctx(), m_ast); check_error(); return r; } | ||||||
|         unsigned hash() const { unsigned r = Z3_get_ast_hash(ctx(), m_ast); check_error(); return r; } |         unsigned hash() const { unsigned r = Z3_get_ast_hash(ctx(), m_ast); check_error(); return r; } | ||||||
|         friend std::ostream & operator<<(std::ostream & out, ast const & n); |         friend std::ostream & operator<<(std::ostream & out, ast const & n); | ||||||
|  |         std::string to_string() const { return std::string(Z3_ast_to_string(ctx(), m_ast)); } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         /**
 |         /**
 | ||||||
|            \brief Return true if the ASTs are structurally identical. |            \brief Return true if the ASTs are structurally identical. | ||||||
|  | @ -757,7 +759,11 @@ namespace z3 { | ||||||
|             } |             } | ||||||
|             return result; |             return result; | ||||||
|         } |         } | ||||||
|             | 
 | ||||||
|  |         Z3_lbool bool_value() const { | ||||||
|  |             return Z3_get_bool_value(ctx(), m_ast); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         expr numerator() const {  |         expr numerator() const {  | ||||||
|             assert(is_numeral()); |             assert(is_numeral()); | ||||||
|             Z3_ast r = Z3_get_numerator(ctx(), m_ast); |             Z3_ast r = Z3_get_numerator(ctx(), m_ast); | ||||||
|  | @ -889,13 +895,23 @@ namespace z3 { | ||||||
|         friend expr operator*(expr const & a, int b); |         friend expr operator*(expr const & a, int b); | ||||||
|         friend expr operator*(int a, expr const & b); |         friend expr operator*(int a, expr const & b); | ||||||
| 
 | 
 | ||||||
|         /**
 |         /*  \brief Power operator  */ | ||||||
|            \brief Power operator |  | ||||||
|         */ |  | ||||||
|         friend expr pw(expr const & a, expr const & b); |         friend expr pw(expr const & a, expr const & b); | ||||||
|         friend expr pw(expr const & a, int b); |         friend expr pw(expr const & a, int b); | ||||||
|         friend expr pw(int a, expr const & b); |         friend expr pw(int a, expr const & b); | ||||||
| 
 | 
 | ||||||
|  |         /* \brief mod operator */ | ||||||
|  |         friend expr mod(expr const& a, expr const& b); | ||||||
|  |         friend expr mod(expr const& a, int b); | ||||||
|  |         friend expr mod(int a, expr const& b); | ||||||
|  | 
 | ||||||
|  |         /* \brief rem operator */ | ||||||
|  |         friend expr rem(expr const& a, expr const& b); | ||||||
|  |         friend expr rem(expr const& a, int b); | ||||||
|  |         friend expr rem(int a, expr const& b); | ||||||
|  | 
 | ||||||
|  |         friend expr is_int(expr const& e); | ||||||
|  | 
 | ||||||
|         friend expr operator/(expr const & a, expr const & b); |         friend expr operator/(expr const & a, expr const & b); | ||||||
|         friend expr operator/(expr const & a, int b); |         friend expr operator/(expr const & a, int b); | ||||||
|         friend expr operator/(int a, expr const & b); |         friend expr operator/(int a, expr const & b); | ||||||
|  | @ -1026,34 +1042,46 @@ namespace z3 { | ||||||
| 
 | 
 | ||||||
|    }; |    }; | ||||||
| 
 | 
 | ||||||
|  | #define _Z3_MK_BIN_(a, b, binop)                        \ | ||||||
|  |     check_context(a, b);                                \ | ||||||
|  |     Z3_ast r = binop(a.ctx(), a, b);                    \ | ||||||
|  |     a.check_error();                                    \ | ||||||
|  |     return expr(a.ctx(), r);                            \ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     inline expr implies(expr const & a, expr const & b) { |     inline expr implies(expr const & a, expr const & b) { | ||||||
|         check_context(a, b); |         assert(a.is_bool() && b.is_bool());      | ||||||
|         assert(a.is_bool() && b.is_bool()); |         _Z3_MK_BIN_(a, b, Z3_mk_implies); | ||||||
|         Z3_ast r = Z3_mk_implies(a.ctx(), a, b); |  | ||||||
|         a.check_error(); |  | ||||||
|         return expr(a.ctx(), r); |  | ||||||
|     } |     } | ||||||
|     inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); } |     inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); } | ||||||
|     inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); } |     inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     inline expr pw(expr const & a, expr const & b) { |     inline expr pw(expr const & a, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power);   } | ||||||
|         assert(a.is_arith() && b.is_arith()); |  | ||||||
|         check_context(a, b); |  | ||||||
|         Z3_ast r = Z3_mk_power(a.ctx(), a, b); |  | ||||||
|         a.check_error(); |  | ||||||
|         return expr(a.ctx(), r); |  | ||||||
|     } |  | ||||||
|     inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); } |     inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); } | ||||||
|     inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); } |     inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); } | ||||||
| 
 | 
 | ||||||
|  |     inline expr mod(expr const& a, expr const& b) { _Z3_MK_BIN_(a, b, Z3_mk_mod);   } | ||||||
|  |     inline expr mod(expr const & a, int b) { return mod(a, a.ctx().num_val(b, a.get_sort())); } | ||||||
|  |     inline expr mod(int a, expr const & b) { return mod(b.ctx().num_val(a, b.get_sort()), b); } | ||||||
| 
 | 
 | ||||||
|     inline expr operator!(expr const & a) { |     inline expr rem(expr const& a, expr const& b) { _Z3_MK_BIN_(a, b, Z3_mk_rem);   } | ||||||
|         assert(a.is_bool()); |     inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); } | ||||||
|         Z3_ast r = Z3_mk_not(a.ctx(), a); |     inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); } | ||||||
|         a.check_error(); | 
 | ||||||
|         return expr(a.ctx(), r); | #undef _Z3_MK_BIN_ | ||||||
|     } | 
 | ||||||
|  | #define _Z3_MK_UN_(a, mkun)                     \ | ||||||
|  |     Z3_ast r = mkun(a.ctx(), a);                \ | ||||||
|  |     a.check_error();                            \ | ||||||
|  |     return expr(a.ctx(), r);                    \ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     inline expr operator!(expr const & a) { assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); } | ||||||
|  | 
 | ||||||
|  |     inline expr is_int(expr const& e) { _Z3_MK_UN_(e, Z3_mk_is_int); } | ||||||
|  | 
 | ||||||
|  | #undef _Z3_MK_UN_ | ||||||
| 
 | 
 | ||||||
|     inline expr operator&&(expr const & a, expr const & b) { |     inline expr operator&&(expr const & a, expr const & b) { | ||||||
|         check_context(a, b); |         check_context(a, b); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue