3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-29 20:05:51 +00:00

redoing arrays

This commit is contained in:
Nikolaj Bjorner 2021-12-31 15:51:52 -08:00
parent aa901c4e88
commit 0ef0ed3b94
7 changed files with 61 additions and 52 deletions

View file

@ -49,7 +49,7 @@ namespace array {
if (v == euf::null_theory_var) {
mk_var(n);
if (is_lambda(n->get_expr()))
internalize_eh_lambda(n);
internalize_lambda_eh(n);
}
}
@ -91,18 +91,13 @@ namespace array {
return true;
}
void solver::internalize_eh_lambda(euf::enode* n) {
SASSERT(is_lambda(n->get_expr()) || a.is_const(n->get_expr()) || a.is_map(n->get_expr()) || a.is_as_array(n->get_expr()));
theory_var v = n->get_th_var(get_id());
void solver::internalize_lambda_eh(euf::enode* n) {
push_axiom(default_axiom(n));
add_lambda(v, n);
auto& d = get_var_data(find(n));
ctx.push_vec(d.m_lambdas, n);
}
void solver::internalize_eh(euf::enode* n) {
if (is_lambda(n->get_expr())) {
internalize_eh_lambda(n);
return;
}
switch (n->get_decl()->get_decl_kind()) {
case OP_STORE:
push_axiom(store_axiom(n));
@ -111,20 +106,19 @@ namespace array {
break;
case OP_AS_ARRAY:
case OP_CONST_ARRAY:
internalize_eh_lambda(n);
// SASSERT(!get_var_data(n->get_th_var(get_id())).m_prop_upward);
internalize_lambda_eh(n);
break;
case OP_ARRAY_EXT:
SASSERT(is_array(n->get_arg(0)));
push_axiom(extensionality_axiom(n->get_arg(0), n->get_arg(1)));
break;
case OP_ARRAY_DEFAULT:
add_parent_default(n->get_arg(0)->get_th_var(get_id()), n);
add_parent_default(find(n->get_arg(0)), n);
break;
case OP_ARRAY_MAP:
for (auto* arg : euf::enode_args(n))
add_parent_lambda(arg->get_th_var(get_id()), n);
internalize_eh_lambda(n);
add_parent_lambda(find(arg), n);
internalize_lambda_eh(n);
break;
case OP_SET_UNION:
case OP_SET_INTERSECT:
@ -143,7 +137,7 @@ namespace array {
void solver::relevant_eh(euf::enode* n) {
if (is_lambda(n->get_expr())) {
set_prop_upward(n->get_th_var(get_id()));
set_prop_upward(find(n));
return;
}
if (!is_app(n->get_expr()))
@ -152,23 +146,25 @@ namespace array {
return;
switch (n->get_decl()->get_decl_kind()) {
case OP_STORE:
add_parent_lambda(n->get_arg(0)->get_th_var(get_id()), n);
add_parent_lambda(find(n->get_arg(0)), n);
break;
case OP_SELECT:
add_parent_select(n->get_arg(0)->get_th_var(get_id()), n);
add_parent_select(find(n->get_arg(0)), n);
break;
case OP_AS_ARRAY:
case OP_CONST_ARRAY:
set_prop_upward(n->get_th_var(get_id()));
case OP_AS_ARRAY:
set_prop_upward(find(n));
add_parent_default(find(n), n);
break;
case OP_ARRAY_EXT:
break;
case OP_ARRAY_DEFAULT:
set_prop_upward(n->get_arg(0)->get_th_var(get_id()));
set_prop_upward(find(n->get_arg(0)));
break;
case OP_ARRAY_MAP:
for (auto* arg : euf::enode_args(n))
set_prop_upward_store(arg);
set_prop_upward(find(n));
break;
case OP_SET_UNION:
case OP_SET_INTERSECT: