diff --git a/src/smt/theory_array_base.cpp b/src/smt/theory_array_base.cpp index 8d545d3b4..e71630fa4 100644 --- a/src/smt/theory_array_base.cpp +++ b/src/smt/theory_array_base.cpp @@ -54,6 +54,20 @@ namespace smt { return r; } + app * theory_array_base::mk_select_reduce(unsigned num_args, expr * * args) { + array_util util(m); + while (util.is_store(args[0])) { + bool are_distinct = false; + for (unsigned i = 1; i < num_args && !are_distinct; ++i) + are_distinct |= m.are_distinct(args[i], to_app(args[0])->get_arg(i)); + if (!are_distinct) + break; + args[0] = to_app(to_app(args[0])->get_arg(0)); + } + return mk_select(num_args, args); + } + + app * theory_array_base::mk_store(unsigned num_args, expr * const * args) { return m.mk_app(get_family_id(), OP_STORE, 0, nullptr, num_args, args); } diff --git a/src/smt/theory_array_base.h b/src/smt/theory_array_base.h index f0d698f26..58d143ff1 100644 --- a/src/smt/theory_array_base.h +++ b/src/smt/theory_array_base.h @@ -62,6 +62,7 @@ namespace smt { bool is_select_arg(enode* r); app * mk_select(unsigned num_args, expr * const * args); + app * mk_select_reduce(unsigned num_args, expr * * args); app * mk_select(expr_ref_vector const& args) { return mk_select(args.size(), args.data()); } app * mk_store(unsigned num_args, expr * const * args); app * mk_default(expr* a);