mirror of
https://github.com/Z3Prover/z3
synced 2025-04-28 03:15:50 +00:00
add power axioms to arith_solver
This commit is contained in:
parent
d73d104ded
commit
579ba8bd70
3 changed files with 32 additions and 0 deletions
|
@ -65,6 +65,31 @@ namespace arith {
|
||||||
add_clause(eq, eq_internalize(t, a.mk_numeral(rational(1), a.is_int(t))));
|
add_clause(eq, eq_internalize(t, a.mk_numeral(rational(1), a.is_int(t))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// t = n^p
|
||||||
|
void solver::mk_power_axiom(expr* p, expr* x, expr* y) {
|
||||||
|
if (a.is_zero(y)) {
|
||||||
|
mk_power0_axioms(to_app(p), to_app(x));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rational r;
|
||||||
|
// r > 0 => r^y > 0
|
||||||
|
if (a.is_extended_numeral(x, r) && r > 0) {
|
||||||
|
expr_ref zero(a.mk_real(0), m);
|
||||||
|
add_clause(~mk_literal(a.mk_le(p, zero)));
|
||||||
|
}
|
||||||
|
if (a.is_extended_numeral(y, r) && r > 0) {
|
||||||
|
// r is m/n then x >= 0 => x^m = p^n
|
||||||
|
if (denominator(r) > 1) {
|
||||||
|
expr_ref x_ge_0(a.mk_ge(x, a.mk_real(0)), m);
|
||||||
|
expr_ref x(m);
|
||||||
|
if (numerator(r) > 1)
|
||||||
|
x = a.mk_power(x, a.mk_real(numerator(r)));
|
||||||
|
expr_ref x_eq_pn(a.mk_eq(x, a.mk_power(p, a.mk_real(denominator(r)))), m);
|
||||||
|
add_clause(~mk_literal(x_ge_0), mk_literal(x_eq_pn));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// is_int(x) <=> to_real(to_int(x)) = x
|
// is_int(x) <=> to_real(to_int(x)) = x
|
||||||
void solver::mk_is_int_axiom(expr* n) {
|
void solver::mk_is_int_axiom(expr* n) {
|
||||||
expr* x = nullptr;
|
expr* x = nullptr;
|
||||||
|
|
|
@ -262,6 +262,12 @@ namespace arith {
|
||||||
st.to_ensure_var().push_back(n1);
|
st.to_ensure_var().push_back(n1);
|
||||||
st.to_ensure_var().push_back(n2);
|
st.to_ensure_var().push_back(n2);
|
||||||
}
|
}
|
||||||
|
else if (a.is_power(n, n1, n2)) {
|
||||||
|
found_unsupported(n);
|
||||||
|
mk_power_axiom(n, n1, n2);
|
||||||
|
st.to_ensure_var().push_back(n1);
|
||||||
|
st.to_ensure_var().push_back(n2);
|
||||||
|
}
|
||||||
else if (a.is_band(n) || a.is_shl(n) || a.is_ashr(n) || a.is_lshr(n)) {
|
else if (a.is_band(n) || a.is_shl(n) || a.is_ashr(n) || a.is_lshr(n)) {
|
||||||
m_bv_terms.push_back(to_app(n));
|
m_bv_terms.push_back(to_app(n));
|
||||||
ctx.push(push_back_vector(m_bv_terms));
|
ctx.push(push_back_vector(m_bv_terms));
|
||||||
|
|
|
@ -312,6 +312,7 @@ namespace arith {
|
||||||
void mk_is_int_axiom(expr* n);
|
void mk_is_int_axiom(expr* n);
|
||||||
void mk_idiv_mod_axioms(expr* p, expr* q);
|
void mk_idiv_mod_axioms(expr* p, expr* q);
|
||||||
void mk_rem_axiom(expr* dividend, expr* divisor);
|
void mk_rem_axiom(expr* dividend, expr* divisor);
|
||||||
|
void mk_power_axiom(expr* t, expr* n, expr* p);
|
||||||
void mk_bound_axioms(api_bound& b);
|
void mk_bound_axioms(api_bound& b);
|
||||||
void mk_bound_axiom(api_bound& b1, api_bound& b2);
|
void mk_bound_axiom(api_bound& b1, api_bound& b2);
|
||||||
void mk_power0_axioms(app* t, app* n);
|
void mk_power0_axioms(app* t, app* n);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue