mirror of
https://github.com/Z3Prover/z3
synced 2025-04-29 20:05:51 +00:00
arrays (#4684)
* arrays Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * arrays Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * arrays Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fill Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * update drat and fix euf bugs Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * const qualifiers Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * reorg ba Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * reorg Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * build warnings Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
d56dd1db7b
commit
796e2fd9eb
79 changed files with 2571 additions and 1850 deletions
|
@ -20,13 +20,15 @@ Author:
|
|||
|
||||
namespace array {
|
||||
|
||||
sat::literal solver::internalize(expr* e, bool sign, bool root, bool learned) {
|
||||
// TODO
|
||||
return sat::null_literal;
|
||||
sat::literal solver::internalize(expr* e, bool sign, bool root, bool redundant) {
|
||||
SASSERT(m.is_bool(e));
|
||||
if (!visit_rec(m, e, sign, root, redundant))
|
||||
return sat::null_literal;
|
||||
return expr2literal(e);
|
||||
}
|
||||
|
||||
void solver::internalize(expr* e, bool redundant) {
|
||||
// TODO
|
||||
visit_rec(m, e, false, false, redundant);
|
||||
}
|
||||
|
||||
euf::theory_var solver::mk_var(euf::enode* n) {
|
||||
|
@ -39,8 +41,11 @@ namespace array {
|
|||
|
||||
void solver::ensure_var(euf::enode* n) {
|
||||
theory_var v = n->get_th_var(get_id());
|
||||
if (v == euf::null_theory_var)
|
||||
if (v == euf::null_theory_var) {
|
||||
mk_var(n);
|
||||
if (is_lambda(n->get_expr()))
|
||||
internalize_lambda(n);
|
||||
}
|
||||
}
|
||||
|
||||
void solver::apply_sort_cnstr(euf::enode * n, sort * s) {
|
||||
|
@ -48,19 +53,30 @@ namespace array {
|
|||
}
|
||||
|
||||
void solver::internalize_store(euf::enode* n) {
|
||||
if (get_config().m_array_laziness == 0)
|
||||
add_parent(n->get_arg(0), n);
|
||||
add_parent_lambda(n->get_arg(0)->get_th_var(get_id()), n);
|
||||
push_axiom(store_axiom(n));
|
||||
add_lambda(n->get_th_var(get_id()), n);
|
||||
SASSERT(!get_var_data(n->get_th_var(get_id())).m_prop_upward);
|
||||
}
|
||||
|
||||
void solver::internalize_map(euf::enode* n) {
|
||||
for (auto* arg : euf::enode_args(n)) {
|
||||
add_parent_lambda(arg->get_th_var(get_id()), n);
|
||||
set_prop_upward(arg);
|
||||
}
|
||||
push_axiom(default_axiom(n));
|
||||
add_lambda(n->get_th_var(get_id()), n);
|
||||
SASSERT(!get_var_data(n->get_th_var(get_id())).m_prop_upward);
|
||||
}
|
||||
|
||||
void solver::internalize_lambda(euf::enode* n) {
|
||||
set_prop_upward(n);
|
||||
push_axiom(default_axiom(n));
|
||||
add_lambda(n->get_th_var(get_id()), n);
|
||||
}
|
||||
|
||||
void solver::internalize_select(euf::enode* n) {
|
||||
if (get_config().m_array_laziness == 0)
|
||||
add_parent(n->get_arg(0), n);
|
||||
}
|
||||
|
||||
void solver::internalize_const(euf::enode* n) {
|
||||
push_axiom(default_axiom(n));
|
||||
set_prop_upward(n);
|
||||
add_parent_select(n->get_arg(0)->get_th_var(get_id()), n);
|
||||
}
|
||||
|
||||
void solver::internalize_ext(euf::enode* n) {
|
||||
|
@ -68,24 +84,10 @@ namespace array {
|
|||
}
|
||||
|
||||
void solver::internalize_default(euf::enode* n) {
|
||||
add_parent(n->get_arg(0), n);
|
||||
add_parent_default(n->get_arg(0)->get_th_var(get_id()), n);
|
||||
set_prop_upward(n);
|
||||
}
|
||||
|
||||
void solver::internalize_map(euf::enode* n) {
|
||||
for (auto* arg : euf::enode_args(n)) {
|
||||
add_parent(arg, n);
|
||||
set_prop_upward(arg);
|
||||
}
|
||||
push_axiom(default_axiom(n));
|
||||
}
|
||||
|
||||
void solver::internalize_as_array(euf::enode* n) {
|
||||
// TBD: delay verdict whether model is undetermined
|
||||
ctx.unhandled_function(n->get_decl());
|
||||
push_axiom(default_axiom(n));
|
||||
}
|
||||
|
||||
bool solver::visited(expr* e) {
|
||||
euf::enode* n = expr2enode(e);
|
||||
return n && n->is_attached_to(get_id());
|
||||
|
@ -94,7 +96,8 @@ namespace array {
|
|||
bool solver::visit(expr* e) {
|
||||
if (!is_app(e) || to_app(e)->get_family_id() != get_id()) {
|
||||
ctx.internalize(e, m_is_redundant);
|
||||
ensure_var(expr2enode(e));
|
||||
euf::enode* n = expr2enode(e);
|
||||
ensure_var(n);
|
||||
return true;
|
||||
}
|
||||
m_stack.push_back(sat::eframe(e));
|
||||
|
@ -108,7 +111,7 @@ namespace array {
|
|||
if (!n)
|
||||
n = mk_enode(e, false);
|
||||
SASSERT(!n->is_attached_to(get_id()));
|
||||
theory_var v = mk_var(n);
|
||||
mk_var(n);
|
||||
for (auto* arg : euf::enode_args(n))
|
||||
ensure_var(arg);
|
||||
switch (a->get_decl_kind()) {
|
||||
|
@ -118,8 +121,9 @@ namespace array {
|
|||
case OP_SELECT:
|
||||
internalize_select(n);
|
||||
break;
|
||||
case OP_AS_ARRAY:
|
||||
case OP_CONST_ARRAY:
|
||||
internalize_const(n);
|
||||
internalize_lambda(n);
|
||||
break;
|
||||
case OP_ARRAY_EXT:
|
||||
internalize_ext(n);
|
||||
|
@ -130,9 +134,6 @@ namespace array {
|
|||
case OP_ARRAY_MAP:
|
||||
internalize_map(n);
|
||||
break;
|
||||
case OP_AS_ARRAY:
|
||||
internalize_as_array(n);
|
||||
break;
|
||||
case OP_SET_UNION:
|
||||
case OP_SET_INTERSECT:
|
||||
case OP_SET_DIFFERENCE:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue