mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
NB @nunoplopes - the code path regarding rewrite_uncstr could use some unit tests.
This commit is contained in:
parent
e27a71bbcb
commit
85da7407dc
|
@ -93,10 +93,11 @@ public:
|
||||||
g->update(idx, f_new, new_pr, g->dep(idx));
|
g->update(idx, f_new, new_pr, g->dep(idx));
|
||||||
}
|
}
|
||||||
if (mc) g->add(mc.get());
|
if (mc) g->add(mc.get());
|
||||||
g->inc_depth();
|
TRACE("invertible_tactic", g->display(tout););
|
||||||
|
g->inc_depth();
|
||||||
}
|
}
|
||||||
result.push_back(g.get());
|
result.push_back(g.get());
|
||||||
CTRACE("invertible_tactic", g->mc(), g->mc()->display(tout););
|
CTRACE("invertible_tactic", g->mc(), g->mc()->display(tout););
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup() override {}
|
void cleanup() override {}
|
||||||
|
@ -223,28 +224,46 @@ private:
|
||||||
rational r;
|
rational r;
|
||||||
app* a = to_app(v);
|
app* a = to_app(v);
|
||||||
expr* fst_arg = a->get_arg(0);
|
expr* fst_arg = a->get_arg(0);
|
||||||
bool fst_is_var = is_var(fst_arg);
|
|
||||||
|
|
||||||
for (unsigned i = 0, n = a->get_num_args(); i != n; ++i) {
|
for (expr* arg : *a)
|
||||||
auto arg = a->get_arg(i);
|
if (!m_parents[arg->get_id()].get())
|
||||||
if (!m_parents[arg->get_id()].get() || is_var(arg) != fst_is_var)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (fst_is_var && to_var(arg)->get_idx() >= max_var)
|
if (is_var(fst_arg)) {
|
||||||
return false;
|
for (expr* arg : *a) {
|
||||||
|
if (!is_var(arg))
|
||||||
if (m_bv.is_numeral(arg, r) && r != mdl)
|
return false;
|
||||||
return false;
|
if (to_var(arg)->get_idx() >= max_var)
|
||||||
|
return false;
|
||||||
if (i > 0 && !is_var(arg) && (!is_app(arg) || to_app(arg)->get_num_args() > 0))
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bool first = true;
|
||||||
|
for (expr* arg : *a) {
|
||||||
|
if (!is_app(arg))
|
||||||
|
return false;
|
||||||
|
if (is_uninterp_const(arg))
|
||||||
|
continue;
|
||||||
|
if (m_bv.is_numeral(arg, r) && r == mdl) {
|
||||||
|
if (first || mdl.is_zero()) {
|
||||||
|
first = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mc) {
|
if (mc) {
|
||||||
ensure_mc(mc);
|
ensure_mc(mc);
|
||||||
expr_ref num(m_bv.mk_numeral(mdl, fst_arg->get_sort()), m);
|
expr_ref num(m_bv.mk_numeral(mdl, fst_arg->get_sort()), m);
|
||||||
for (unsigned i = 1, n = a->get_num_args(); i != n; ++i) {
|
for (unsigned i = 1, n = a->get_num_args(); i != n; ++i) {
|
||||||
(*mc)->add(a->get_arg(i), num);
|
expr* arg = a->get_arg(i);
|
||||||
|
if (m_bv.is_numeral(arg))
|
||||||
|
continue;
|
||||||
|
(*mc)->add(arg, num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new_v = fst_arg;
|
new_v = fst_arg;
|
||||||
|
|
Loading…
Reference in a new issue