mirror of
https://github.com/Z3Prover/z3
synced 2025-07-19 10:52:02 +00:00
add rule unfolding transformation
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
2c24f25050
commit
d16db63e56
13 changed files with 160 additions and 138 deletions
|
@ -683,123 +683,3 @@ namespace pdr {
|
|||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
|
||||
void model_farkas_generalizer::extract_eqs(expr_ref_vector const& lits, eqs& eqs) {
|
||||
expr* e;
|
||||
rational vl;
|
||||
bool is_int;
|
||||
for (unsigned i = 0; i < lits.size(); ++i) {
|
||||
if (is_eq(lits[i], e, vl, is_int)) {
|
||||
eqs.push_back(std::make_pair(e, vl));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void model_farkas_generalizer::solve_eqs(expr_ref& A, expr_ref_vector& other, eqs const& o_eqs) {
|
||||
if (o_eqs.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
expr_substitution sub(m);
|
||||
scoped_ptr<expr_replacer> rep = mk_default_expr_replacer(m);
|
||||
rep->set_substitution(&sub);
|
||||
|
||||
expr* e1;
|
||||
rational vl1;
|
||||
bool is_int;
|
||||
for (unsigned i = 0; i < other.size(); ++i) {
|
||||
if (is_eq(other[i].get(), e1, vl1, is_int)) {
|
||||
unsigned k = m_random(o_eqs.size());
|
||||
for (unsigned j = 0; j < o_eqs.size(); ++j) {
|
||||
unsigned l = (j+k)%o_eqs.size();
|
||||
expr* e2 = o_eqs[l].first;
|
||||
if (m.get_sort(e1) == m.get_sort(e2)) {
|
||||
sub.insert(e1, mk_offset(e2, vl1-o_eqs[l].second));
|
||||
other[i] = m.mk_true();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
(*rep)(A);
|
||||
other.push_back(A);
|
||||
A = m.mk_and(other.size(), other.c_ptr());
|
||||
}
|
||||
|
||||
expr* model_farkas_generalizer::mk_offset(expr* e, rational const& r) {
|
||||
if (r.is_zero()) {
|
||||
return e;
|
||||
}
|
||||
else {
|
||||
return a.mk_add(e, a.mk_numeral(r, a.is_int(e)));
|
||||
}
|
||||
}
|
||||
|
||||
void model_farkas_generalizer::connect_vars(ptr_vector<expr>& vars, vector<rational>& vals, expr_ref_vector& lits) {
|
||||
switch(vars.size()) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
lits.push_back(m.mk_eq(vars[0], a.mk_numeral(vals[0], a.is_int(vars[0]))));
|
||||
break;
|
||||
case 2:
|
||||
lits.push_back(m.mk_eq(vars[0], a.mk_numeral(vals[0], a.is_int(vars[0]))));
|
||||
lits.push_back(m.mk_eq(vars[0], mk_offset(vars[1], vals[0]-vals[1])));
|
||||
break;
|
||||
default: {
|
||||
ptr_vector<expr> new_vars;
|
||||
vector<rational> new_vals;
|
||||
unsigned j, i = m_random(vars.size());
|
||||
new_vars.push_back(vars[i]);
|
||||
new_vals.push_back(vals[i]);
|
||||
lits.push_back(m.mk_eq(vars[i], a.mk_numeral(vals[i], a.is_int(vars[i]))));
|
||||
vars.erase(vars.begin() + i);
|
||||
vals.erase(vals.begin() + i);
|
||||
while (!vars.empty()) {
|
||||
i = m_random(vars.size());
|
||||
j = m_random(new_vars.size());
|
||||
lits.push_back(m.mk_eq(vars[i], mk_offset(new_vars[j], vals[i]-new_vals[j])));
|
||||
new_vars.push_back(vars[i]);
|
||||
new_vals.push_back(vals[i]);
|
||||
vars.erase(vars.begin() + i);
|
||||
vals.erase(vals.begin() + i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool model_farkas_generalizer::is_eq(expr* e, expr*& r, rational& vl, bool& is_int) {
|
||||
expr* r2 = 0;
|
||||
return
|
||||
(m.is_eq(e, r, r2) && a.is_numeral(r2, vl, is_int)) ||
|
||||
(m.is_eq(e, r2, r) && a.is_numeral(r2, vl, is_int));
|
||||
}
|
||||
|
||||
void model_farkas_generalizer::relativize(expr_ref_vector& literals) {
|
||||
ast_manager& m = literals.get_manager();
|
||||
ptr_vector<expr> ints, reals;
|
||||
vector<rational> int_vals, real_vals;
|
||||
expr* e;
|
||||
rational vl;
|
||||
bool is_int;
|
||||
for (unsigned i = 0; i < literals.size(); ) {
|
||||
if (is_eq(literals[i].get(), e, vl, is_int)) {
|
||||
(is_int?ints:reals).push_back(e);
|
||||
(is_int?int_vals:real_vals).push_back(vl);
|
||||
literals[i] = literals.back();
|
||||
literals.pop_back();
|
||||
}
|
||||
else {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
connect_vars(ints, int_vals, literals);
|
||||
connect_vars(reals, real_vals, literals);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue