3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-22 16:45:31 +00:00

fix #3899 regression from transitioning to decompose_monomial

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-04-10 11:21:30 -07:00
parent 61fb134653
commit a7123062a0
2 changed files with 14 additions and 11 deletions

View file

@ -183,7 +183,7 @@ namespace smt {
}
};
num_threads = 1;
// num_threads = 1;
while (true) {
vector<std::thread> threads(num_threads);

View file

@ -1339,20 +1339,23 @@ expr * theory_arith<Ext>::factor(expr * m, expr * var, unsigned d) {
m_nl_new_exprs.push_back(result);
return result;
}
SASSERT(is_pure_monomial(m));
unsigned idx = 0;
ptr_buffer<expr> new_args;
for (expr * arg : *to_app(m)) {
if (arg == var) {
if (idx < d)
idx++;
else
new_args.push_back(arg);
}
else {
unsigned idx = 0;
auto insert = [&](expr* arg) {
if (idx < d && var == arg)
++idx;
else
new_args.push_back(arg);
};
while (m_util.is_mul(m) && idx < d) {
unsigned sz = to_app(m)->get_num_args();
for (unsigned i = 0; i + 1 < sz; ++i) {
insert(to_app(m)->get_arg(i));
}
m = to_app(m)->get_arg(sz - 1);
}
insert(m);
SASSERT(idx == d);
TRACE("factor_bug", tout << "new_args:\n"; for(unsigned i = 0; i < new_args.size(); i++) tout << mk_pp(new_args[i], get_manager()) << "\n";);
expr * result = mk_nary_mul(new_args.size(), new_args.c_ptr(), m_util.is_int(var));