mirror of
https://github.com/Z3Prover/z3
synced 2025-07-20 03:12:03 +00:00
flatten products
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
87d556d37d
commit
29aca5b1d6
1 changed files with 15 additions and 2 deletions
|
@ -845,11 +845,22 @@ namespace sls {
|
||||||
else if (a.is_mul(e)) {
|
else if (a.is_mul(e)) {
|
||||||
unsigned_vector m;
|
unsigned_vector m;
|
||||||
num_t c(1);
|
num_t c(1);
|
||||||
for (expr* arg : *to_app(e))
|
ptr_buffer<expr> muls;
|
||||||
if (is_num(arg, i))
|
muls.append(to_app(e)->get_num_args(), to_app(e)->get_args());
|
||||||
|
for (unsigned j = 0; j < muls.size(); ++j) {
|
||||||
|
expr* arg = muls[j];
|
||||||
|
if (a.is_mul(arg)) {
|
||||||
|
muls.append(to_app(arg)->get_num_args(), to_app(arg)->get_args());
|
||||||
|
muls[j] = muls.back();
|
||||||
|
muls.pop_back();
|
||||||
|
--j;
|
||||||
|
}
|
||||||
|
else if (is_num(arg, i))
|
||||||
c *= i;
|
c *= i;
|
||||||
else
|
else
|
||||||
m.push_back(mk_term(arg));
|
m.push_back(mk_term(arg));
|
||||||
|
}
|
||||||
|
|
||||||
switch (m.size()) {
|
switch (m.size()) {
|
||||||
case 0:
|
case 0:
|
||||||
term.m_coeff += c*coeff;
|
term.m_coeff += c*coeff;
|
||||||
|
@ -970,6 +981,7 @@ namespace sls {
|
||||||
typename arith_base<num_t>::var_t arith_base<num_t>::mk_var(expr* e) {
|
typename arith_base<num_t>::var_t arith_base<num_t>::mk_var(expr* e) {
|
||||||
var_t v = m_expr2var.get(e->get_id(), UINT_MAX);
|
var_t v = m_expr2var.get(e->get_id(), UINT_MAX);
|
||||||
if (v == UINT_MAX) {
|
if (v == UINT_MAX) {
|
||||||
|
// verbose_stream() << "mk-var " << mk_bounded_pp(e, m) << "\n";
|
||||||
v = m_vars.size();
|
v = m_vars.size();
|
||||||
m_expr2var.setx(e->get_id(), v, UINT_MAX);
|
m_expr2var.setx(e->get_id(), v, UINT_MAX);
|
||||||
m_vars.push_back(var_info(e, a.is_int(e) ? var_sort::INT : var_sort::REAL));
|
m_vars.push_back(var_info(e, a.is_int(e) ? var_sort::INT : var_sort::REAL));
|
||||||
|
@ -1186,6 +1198,7 @@ namespace sls {
|
||||||
return false;
|
return false;
|
||||||
flet<bool> _tabu(m_use_tabu, false);
|
flet<bool> _tabu(m_use_tabu, false);
|
||||||
TRACE("sls", tout << "repair def " << mk_bounded_pp(vi.m_expr, m) << "\n");
|
TRACE("sls", tout << "repair def " << mk_bounded_pp(vi.m_expr, m) << "\n");
|
||||||
|
// verbose_stream() << "repair down " << mk_bounded_pp(e, m) << "\n";
|
||||||
switch (vi.m_op) {
|
switch (vi.m_op) {
|
||||||
case arith_op_kind::LAST_ARITH_OP:
|
case arith_op_kind::LAST_ARITH_OP:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue