mirror of
https://github.com/Z3Prover/z3
synced 2025-04-08 18:31:49 +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
|
@ -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; }
|
||||
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);
|
||||
std::string to_string() const { return std::string(Z3_ast_to_string(ctx(), m_ast)); }
|
||||
|
||||
|
||||
/**
|
||||
\brief Return true if the ASTs are structurally identical.
|
||||
|
@ -757,7 +759,11 @@ namespace z3 {
|
|||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Z3_lbool bool_value() const {
|
||||
return Z3_get_bool_value(ctx(), m_ast);
|
||||
}
|
||||
|
||||
expr numerator() const {
|
||||
assert(is_numeral());
|
||||
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*(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, int 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, int 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) {
|
||||
check_context(a, b);
|
||||
assert(a.is_bool() && b.is_bool());
|
||||
Z3_ast r = Z3_mk_implies(a.ctx(), a, b);
|
||||
a.check_error();
|
||||
return expr(a.ctx(), r);
|
||||
assert(a.is_bool() && b.is_bool());
|
||||
_Z3_MK_BIN_(a, b, Z3_mk_implies);
|
||||
}
|
||||
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 pw(expr const & a, expr const & b) {
|
||||
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, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power); }
|
||||
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 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) {
|
||||
assert(a.is_bool());
|
||||
Z3_ast r = Z3_mk_not(a.ctx(), a);
|
||||
a.check_error();
|
||||
return expr(a.ctx(), r);
|
||||
}
|
||||
inline expr rem(expr const& a, expr const& b) { _Z3_MK_BIN_(a, b, Z3_mk_rem); }
|
||||
inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); }
|
||||
inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); }
|
||||
|
||||
#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) {
|
||||
check_context(a, b);
|
||||
|
|
Loading…
Reference in a new issue