mirror of
https://github.com/Z3Prover/z3
synced 2025-08-09 20:50:50 +00:00
Refactor array_plugin in sls to improve handling of select expressions with multiple arguments
This commit is contained in:
parent
2f2559d670
commit
25c19b61dd
2 changed files with 32 additions and 8 deletions
|
@ -193,7 +193,7 @@ namespace sls {
|
||||||
g.merge(n1, n2, nullptr);
|
g.merge(n1, n2, nullptr);
|
||||||
}
|
}
|
||||||
for (auto lit : ctx.root_literals()) {
|
for (auto lit : ctx.root_literals()) {
|
||||||
if (!ctx.is_true(lit))
|
if (!ctx.is_true(lit) || lit.sign())
|
||||||
continue;
|
continue;
|
||||||
auto e = ctx.atom(lit.var());
|
auto e = ctx.atom(lit.var());
|
||||||
expr* x, * y;
|
expr* x, * y;
|
||||||
|
@ -209,16 +209,14 @@ namespace sls {
|
||||||
for (auto n : g.nodes()) {
|
for (auto n : g.nodes()) {
|
||||||
if (!n->is_root() || !a.is_array(n->get_expr()))
|
if (!n->is_root() || !a.is_array(n->get_expr()))
|
||||||
continue;
|
continue;
|
||||||
kv.insert(n, obj_map<euf::enode, euf::enode*>());
|
kv.insert(n, select2value());
|
||||||
for (auto p : euf::enode_parents(n)) {
|
for (auto p : euf::enode_parents(n)) {
|
||||||
if (!a.is_select(p->get_expr()))
|
if (!a.is_select(p->get_expr()))
|
||||||
continue;
|
continue;
|
||||||
SASSERT(p->num_args() == 2);
|
|
||||||
if (p->get_arg(0)->get_root() != n->get_root())
|
if (p->get_arg(0)->get_root() != n->get_root())
|
||||||
continue;
|
continue;
|
||||||
auto idx = p->get_arg(1)->get_root();
|
|
||||||
auto val = p->get_root();
|
auto val = p->get_root();
|
||||||
kv[n].insert(idx, val);
|
kv[n].insert(select_args(p), val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
display(verbose_stream());
|
display(verbose_stream());
|
||||||
|
@ -242,7 +240,7 @@ namespace sls {
|
||||||
for (auto [k, v] : kv[n]) {
|
for (auto [k, v] : kv[n]) {
|
||||||
ptr_vector<expr> args;
|
ptr_vector<expr> args;
|
||||||
args.push_back(r);
|
args.push_back(r);
|
||||||
args.push_back(k->get_expr());
|
args.push_back(k.sel->get_arg(1)->get_expr());
|
||||||
args.push_back(v->get_expr());
|
args.push_back(v->get_expr());
|
||||||
r = a.mk_store(args);
|
r = a.mk_store(args);
|
||||||
}
|
}
|
||||||
|
@ -257,7 +255,10 @@ namespace sls {
|
||||||
out << m_g->pp(n) << " -> {";
|
out << m_g->pp(n) << " -> {";
|
||||||
char const* sp = "";
|
char const* sp = "";
|
||||||
for (auto& [k, v] : kvs) {
|
for (auto& [k, v] : kvs) {
|
||||||
out << sp << m_g->pp(k) << " -> " << m_g->pp(v);
|
out << sp;
|
||||||
|
for (unsigned i = 1; i < k.sel->num_args(); ++i)
|
||||||
|
out << m_g->pp(k.sel->get_arg(i)->get_root()) << " ";
|
||||||
|
out << "-> " << m_g->pp(v);
|
||||||
sp = " ";
|
sp = " ";
|
||||||
}
|
}
|
||||||
out << "}\n";
|
out << "}\n";
|
||||||
|
|
|
@ -23,7 +23,30 @@ Author:
|
||||||
namespace sls {
|
namespace sls {
|
||||||
|
|
||||||
class array_plugin : public plugin {
|
class array_plugin : public plugin {
|
||||||
typedef obj_map<euf::enode, obj_map<euf::enode, euf::enode*>> kv;
|
struct select_args {
|
||||||
|
euf::enode* sel = nullptr;
|
||||||
|
select_args(euf::enode* s) : sel(s) {}
|
||||||
|
select_args() {}
|
||||||
|
};
|
||||||
|
struct select_args_hash {
|
||||||
|
unsigned operator()(select_args const& a) const {
|
||||||
|
unsigned h = 0;
|
||||||
|
for (unsigned i = 1; i < a.sel->num_args(); ++i)
|
||||||
|
h ^= a.sel->get_arg(i)->get_root()->hash();
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
struct select_args_eq {
|
||||||
|
bool operator()(select_args const& a, select_args const& b) const {
|
||||||
|
SASSERT(a.sel->num_args() == b.sel->num_args());
|
||||||
|
for (unsigned i = 1; i < a.sel->num_args(); ++i)
|
||||||
|
if (a.sel->get_arg(i)->get_root() != b.sel->get_arg(i)->get_root())
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
typedef map<select_args, euf::enode*, select_args_hash, select_args_eq> select2value;
|
||||||
|
typedef obj_map<euf::enode, select2value> kv;
|
||||||
|
|
||||||
array_util a;
|
array_util a;
|
||||||
scoped_ptr<euf::egraph> m_g;
|
scoped_ptr<euf::egraph> m_g;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue