mirror of
https://github.com/Z3Prover/z3
synced 2025-06-07 06:33:23 +00:00
updates to mbqi
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
e281f85586
commit
d95e167d61
2 changed files with 34 additions and 2 deletions
|
@ -369,7 +369,7 @@ public:
|
||||||
void set_next_arg(cmd_context & ctx, unsigned num, expr * const * ts) override {
|
void set_next_arg(cmd_context & ctx, unsigned num, expr * const * ts) override {
|
||||||
m_vars.append(num, ts);
|
m_vars.append(num, ts);
|
||||||
}
|
}
|
||||||
void prepare(cmd_context & ctx) override { m_fml = nullptr; }
|
void prepare(cmd_context & ctx) override { m_fml = nullptr; m_vars.reset(); }
|
||||||
void execute(cmd_context & ctx) override {
|
void execute(cmd_context & ctx) override {
|
||||||
ast_manager& m = ctx.m();
|
ast_manager& m = ctx.m();
|
||||||
app_ref_vector vars(m);
|
app_ref_vector vars(m);
|
||||||
|
|
|
@ -1216,6 +1216,38 @@ namespace qe {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool solve_eq(model& model, app_ref_vector& vars, expr_ref_vector& lits) {
|
||||||
|
// find an equality to solve for.
|
||||||
|
expr* s, *t;
|
||||||
|
for (unsigned i = 0; i < lits.size(); ++i) {
|
||||||
|
if (m.is_eq(lits[i].get(), s, t)) {
|
||||||
|
vector<indices> idxs;
|
||||||
|
expr_ref save(m), back(m);
|
||||||
|
save = lits[i].get();
|
||||||
|
back = lits.back();
|
||||||
|
lits[i] = back;
|
||||||
|
lits.pop_back();
|
||||||
|
unsigned sz = lits.size();
|
||||||
|
if (contains_x(s) && !contains_x(t) && is_app(s)) {
|
||||||
|
if (solve(model, to_app(s), t, idxs, vars, lits)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (contains_x(t) && !contains_x(s) && is_app(t)) {
|
||||||
|
if (solve(model, to_app(t), s, idxs, vars, lits)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// put back the equality literal.
|
||||||
|
lits.resize(sz);
|
||||||
|
lits.push_back(back);
|
||||||
|
lits[i] = save;
|
||||||
|
}
|
||||||
|
// TBD: not distinct?
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool solve(model& model, app* s, expr* t, vector<indices>& idxs, app_ref_vector& vars, expr_ref_vector& lits) {
|
bool solve(model& model, app* s, expr* t, vector<indices>& idxs, app_ref_vector& vars, expr_ref_vector& lits) {
|
||||||
SASSERT(contains_x(s));
|
SASSERT(contains_x(s));
|
||||||
SASSERT(!contains_x(t));
|
SASSERT(!contains_x(t));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue