mirror of
https://github.com/Z3Prover/z3
synced 2025-04-13 12:28:44 +00:00
add pre-processing simplificaiton of power to the legacy simplifier Fixes #1237
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
5db349f6fa
commit
8542e4ae3d
|
@ -402,7 +402,7 @@ bool arith_simplifier_plugin::reduce(func_decl * f, unsigned num_args, expr * co
|
|||
case OP_TO_REAL: SASSERT(num_args == 1); mk_to_real(args[0], result); break;
|
||||
case OP_TO_INT: SASSERT(num_args == 1); mk_to_int(args[0], result); break;
|
||||
case OP_IS_INT: SASSERT(num_args == 1); mk_is_int(args[0], result); break;
|
||||
case OP_POWER: return false;
|
||||
case OP_POWER: SASSERT(num_args == 2); mk_power(args[0], args[1], result); break;
|
||||
case OP_ABS: SASSERT(num_args == 1); mk_abs(args[0], result); break;
|
||||
case OP_IRRATIONAL_ALGEBRAIC_NUM: return false;
|
||||
default:
|
||||
|
@ -412,6 +412,25 @@ bool arith_simplifier_plugin::reduce(func_decl * f, unsigned num_args, expr * co
|
|||
return true;
|
||||
}
|
||||
|
||||
void arith_simplifier_plugin::mk_power(expr* x, expr* y, expr_ref& result) {
|
||||
rational a, b;
|
||||
if (is_numeral(y, b) && b.is_one()) {
|
||||
result = x;
|
||||
return;
|
||||
}
|
||||
if (is_numeral(x, a) && is_numeral(y, b) && b.is_unsigned()) {
|
||||
if (b.is_zero() && !a.is_zero()) {
|
||||
result = m_util.mk_numeral(rational(1), m_manager.get_sort(x));
|
||||
return;
|
||||
}
|
||||
if (!b.is_zero()) {
|
||||
result = m_util.mk_numeral(power(a, b.get_unsigned()), m_manager.get_sort(x));
|
||||
return;
|
||||
}
|
||||
}
|
||||
result = m_util.mk_power(x, y);
|
||||
}
|
||||
|
||||
void arith_simplifier_plugin::mk_abs(expr * arg, expr_ref & result) {
|
||||
expr_ref c(m_manager);
|
||||
expr_ref m_arg(m_manager);
|
||||
|
|
|
@ -82,6 +82,7 @@ public:
|
|||
void mk_to_real(expr * arg, expr_ref & result);
|
||||
void mk_to_int(expr * arg, expr_ref & result);
|
||||
void mk_is_int(expr * arg, expr_ref & result);
|
||||
void mk_power(expr* x, expr* y, expr_ref& result);
|
||||
void mk_abs(expr * arg, expr_ref & result);
|
||||
|
||||
virtual bool reduce(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result);
|
||||
|
|
Loading…
Reference in a new issue