3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-08 18:31:49 +00:00

Remove unused function

This commit is contained in:
Arie Gurfinkel 2018-06-13 13:34:31 -07:00
parent 535b8893ae
commit 81575fae7c

View file

@ -54,10 +54,10 @@ namespace {
app_ref m_peq; // partial equality application
app_ref m_eq; // equivalent std equality using def. of partial eq
array_util m_arr_u;
public:
static const char* PARTIAL_EQ;
peq (app* p, ast_manager& m):
m (m),
m_lhs (p->get_arg (0), m),
@ -79,7 +79,7 @@ namespace {
m_diff_indices.push_back (vec);
}
}
peq (expr* lhs, expr* rhs, vector<expr_ref_vector> const& diff_indices, ast_manager& m):
m (m),
m_lhs (lhs, m),
@ -102,13 +102,13 @@ namespace {
}
m_decl = m.mk_func_decl (symbol (PARTIAL_EQ), sorts.size (), sorts.c_ptr (), m.mk_bool_sort ());
}
expr_ref lhs () { return m_lhs; }
expr_ref rhs () { return m_rhs; }
void get_diff_indices (vector<expr_ref_vector>& result) { result.append(m_diff_indices); }
app_ref mk_peq () {
if (!m_peq) {
ptr_vector<expr> args;
@ -121,18 +121,18 @@ namespace {
}
return m_peq;
}
app_ref mk_eq (app_ref_vector& aux_consts, bool stores_on_rhs = true) {
if (!m_eq) {
expr_ref lhs (m_lhs, m), rhs (m_rhs, m);
if (!stores_on_rhs) {
std::swap (lhs, rhs);
}
}
// lhs = (...(store (store rhs i0 v0) i1 v1)...)
sort* val_sort = get_array_range (m.get_sort (lhs));
for (expr_ref_vector const& diff : m_diff_indices) {
ptr_vector<expr> store_args;
store_args.push_back (rhs);
store_args.push_back (rhs);
store_args.append (diff.size(), diff.c_ptr());
app_ref val(m.mk_fresh_const ("diff", val_sort), m);
store_args.push_back (val);
@ -145,8 +145,8 @@ namespace {
}
};
const char* peq::PARTIAL_EQ = "!partial_eq";
const char* peq::PARTIAL_EQ = "!partial_eq";
bool is_partial_eq (app* a) {
return a->get_decl ()->get_name () == peq::PARTIAL_EQ;
}
@ -160,11 +160,6 @@ namespace qe {
return true;
}
static bool is_eq(vector<rational> const& xs, vector<rational> const& ys) {
for (unsigned i = 0; i < xs.size(); ++i) if (xs[i] != ys[i]) return false;
return true;
}
static expr_ref mk_eq(expr_ref_vector const& xs, expr_ref_vector const& ys) {
ast_manager& m = xs.get_manager();
expr_ref_vector eqs(m);
@ -177,9 +172,9 @@ namespace qe {
* where x appears and the equalities do not evaluate to false in the current model.
* 2. Track them as partial equivalence relations.
* 3. Sort them according to nesting depth.
* 4. Solve for x by potentially introducing fresh variables.
* Thus, (store x i v) = y, then
* x = (store y i w), (select y i) = v, where w is fresh and evaluates to (select x i).
* 4. Solve for x by potentially introducing fresh variables.
* Thus, (store x i v) = y, then
* x = (store y i w), (select y i) = v, where w is fresh and evaluates to (select x i).
* Generally, equalities are tracked as x =_idxs y, where x, y are equal up to idxs.
*/
@ -524,9 +519,9 @@ namespace qe {
bool lhs_has_v = (lhs == m_v || m_has_stores_v.is_marked (lhs));
bool rhs_has_v = (rhs == m_v || m_has_stores_v.is_marked (rhs));
app* store = nullptr;
SASSERT (lhs_has_v || rhs_has_v);
if (!lhs_has_v && is_app(rhs)) {
store = to_app (rhs);
}
@ -538,7 +533,7 @@ namespace qe {
// put it in the beginning to simplify it away
return 0;
}
unsigned nd = 0; // nesting depth
for (nd = 1; m_arr_u.is_store (store); nd++, store = to_app (store->get_arg (0)))
/* empty */ ;
@ -635,7 +630,7 @@ namespace qe {
M = &mdl;
m_mev = &mev;
unsigned j = 0;
unsigned j = 0;
for (unsigned i = 0; i < arr_vars.size (); i++) {
reset_v ();
m_v = arr_vars.get (i);
@ -798,14 +793,14 @@ namespace qe {
/**
* \brief reduce (select (store (store x i1 v1) i2 v2) idx) under model M
* such that the result is v2 if idx = i2 under M, it is v1 if idx = i1, idx != i2 under M,
* such that the result is v2 if idx = i2 under M, it is v1 if idx = i1, idx != i2 under M,
* and it is (select x idx) if idx != i1, idx !+ i2 under M.
*/
expr* reduce_core (app *a) {
if (!m_arr_u.is_store (a->get_arg (0))) return a;
expr* array = a->get_arg(0);
expr* array = a->get_arg(0);
unsigned arity = get_array_arity(m.get_sort(array));
expr* const* js = a->get_args() + 1;
while (m_arr_u.is_store (array)) {
@ -888,7 +883,7 @@ namespace qe {
* and generally distinct(i1, i2, i3) for arbitrary index sorts.
* - for equal indices accumulate constraint i1 = i2, i3 = i5, ..
* - introduce variables v1, v2, .., for each equivalence class.
* - replace occurrences of select by v1, v2, ...
* - replace occurrences of select by v1, v2, ...
* - update M to evaluate v1, v2, the same as (select a i1) (select a i2)
*/
@ -900,10 +895,10 @@ namespace qe {
expr_ref_vector val;
vector<rational> rval;
idx_val(expr_ref_vector & idx, expr_ref_vector & val, vector<rational> const& rval): idx(idx), val(val), rval(rval) {}
idx_val& operator=(idx_val const& o) {
idx_val& operator=(idx_val const& o) {
idx.reset(); val.reset(); rval.reset();
idx.append(o.idx); val.append(o.val); rval.append(o.rval);
return *this;
return *this;
}
};
ast_manager& m;
@ -981,7 +976,7 @@ namespace qe {
compare_idx(array_project_selects_util& u):u(u) {}
bool operator()(idx_val const& x, idx_val const& y) {
SASSERT(x.rval.size() == y.rval.size());
for (unsigned j = 0; j < x.rval.size(); ++j) {
for (unsigned j = 0; j < x.rval.size(); ++j) {
rational const& xv = x.rval[j];
rational const& yv = y.rval[j];
if (xv < yv) return true;
@ -1004,7 +999,7 @@ namespace qe {
SASSERT(xs.size() == ys.size() && !xs.empty());
expr_ref result(mk_lt(xs.back(), ys.back()), m);
for (unsigned i = xs.size()-1; i-- > 0; ) {
result = m.mk_or(mk_lt(xs[i], ys[i]),
result = m.mk_or(mk_lt(xs[i], ys[i]),
m.mk_and(m.mk_eq(xs[i], ys[i]), result));
}
return result;
@ -1028,9 +1023,9 @@ namespace qe {
if (!m_ari_u.is_real(srt) && !m_ari_u.is_int(srt) && !m_bv_u.is_bv_sort(srt)) {
TRACE("qe", tout << "non-numeric index sort for Ackerman" << mk_pp(srt, m) << "\n";);
is_numeric = false;
}
}
}
unsigned start = m_idxs.size (); // append at the end
for (app * a : sel_terms) {
expr_ref_vector idxs(m, arity, a->get_args() + 1);
@ -1045,7 +1040,7 @@ namespace qe {
// add equality (idx == repr)
m_idx_lits.push_back (mk_eq (idxs, m_idxs[j].idx));
is_new = false;
break;
break;
}
if (is_new) {
// new repr, val, and sel const
@ -1067,7 +1062,7 @@ namespace qe {
else if (is_numeric) {
// sort reprs by their value and add a chain of strict inequalities
compare_idx cmp(*this);
std::sort(m_idxs.begin() + start, m_idxs.end(), cmp);
std::sort(m_idxs.begin() + start, m_idxs.end(), cmp);
for (unsigned i = start; i + 1 < m_idxs.size(); ++i) {
m_idx_lits.push_back (mk_lex_lt(m_idxs[i].idx, m_idxs[i+1].idx));
}
@ -1183,7 +1178,7 @@ namespace qe {
expr_ref_vector m_values;
expr* const* m_vars;
indices(ast_manager& m, model& model, unsigned n, expr* const* vars):
indices(ast_manager& m, model& model, unsigned n, expr* const* vars):
m_values(m), m_vars(vars) {
expr_ref val(m);
for (unsigned i = 0; i < n; ++i) {
@ -1192,11 +1187,11 @@ namespace qe {
}
}
};
ast_manager& m;
array_util a;
scoped_ptr<contains_app> m_var;
imp(ast_manager& m): m(m), a(m) {}
~imp() {}
@ -1209,7 +1204,7 @@ namespace qe {
if (m.is_true(lits[i].get())) {
project_plugin::erase(lits, i);
}
}
}
}
bool contains_x(expr* e) {
@ -1223,7 +1218,7 @@ namespace qe {
lits.push_back(m.mk_eq(x.m_vars[j], y.m_vars[j]));
}
}
bool solve_eq(model& model, app_ref_vector& vars, expr_ref_vector& lits) {
// find an equality to solve for.
expr* s, *t;
@ -1270,13 +1265,13 @@ namespace qe {
var = m.mk_fresh_const("value", range);
vars.push_back(var);
args.reset();
args.push_back (s);
args.append(idxs[i].m_values.size(), idxs[i].m_vars);
sel = a.mk_select (args.size (), args.c_ptr ());
VERIFY (model.eval (sel, val));
model.register_decl (var->get_decl (), val);
args[0] = result;
args.push_back(var);
result = a.mk_store(args.size(), args.c_ptr());
@ -1297,7 +1292,7 @@ namespace qe {
if (contains_x(s->get_arg(i))) {
return false;
}
}
}
unsigned i;
expr_ref_vector args(m);
switch (contains(idx, idxs, i)) {
@ -1317,7 +1312,7 @@ namespace qe {
return solve(model, to_app(s->get_arg(0)), t, idxs, vars, lits);
case l_undef:
return false;
}
}
}
return false;
}
@ -1325,13 +1320,13 @@ namespace qe {
lbool contains(indices const& idx, vector<indices> const& idxs, unsigned& j) {
for (unsigned i = 0; i < idxs.size(); ++i) {
switch (compare(idx, idxs[i])) {
case l_true:
case l_true:
j = i;
return l_true;
case l_false:
break;
case l_undef:
return l_undef;
return l_undef;
}
}
return l_false;
@ -1355,25 +1350,25 @@ namespace qe {
lbool compare(expr* val1, expr* val2) {
if (m.are_equal (val1, val2)) return l_true;
if (m.are_distinct (val1, val2)) return l_false;
if (is_uninterp(val1) ||
is_uninterp(val2)) {
// TBD chase definition of nested array.
return l_undef;
}
return l_undef;
}
}
};
array_project_plugin::array_project_plugin(ast_manager& m) {
m_imp = alloc(imp, m);
}
array_project_plugin::~array_project_plugin() {
dealloc(m_imp);
}
bool array_project_plugin::operator()(model& model, app* var, app_ref_vector& vars, expr_ref_vector& lits) {
ast_manager& m = vars.get_manager();
app_ref_vector vvars(m, 1, &var);
@ -1387,7 +1382,7 @@ namespace qe {
bool array_project_plugin::solve(model& model, app_ref_vector& vars, expr_ref_vector& lits) {
return m_imp->solve(model, vars, lits);
}
family_id array_project_plugin::get_family_id() {
return m_imp->a.get_family_id();
}
@ -1406,9 +1401,9 @@ namespace qe {
// 2. reduce selects
array_select_reducer rs (m);
rs (mdl, arr_vars, fml, reduce_all_selects);
TRACE ("qe", tout << "Reduced selects:\n" << fml << "\n"; );
// 3. project selects using model based ackermannization
array_project_selects_util ps (m);
ps (mdl, arr_vars, fml, aux_vars);
@ -1424,4 +1419,3 @@ namespace qe {
}
};