Skip to content

Commit 8125fb1

Browse files
na
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 3fcd9e6 commit 8125fb1

File tree

1 file changed

+30
-15
lines changed

1 file changed

+30
-15
lines changed

src/tactic/fd_solver/smtfd_solver.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -893,10 +893,8 @@ namespace smtfd {
893893

894894
void check_select(app* t) {
895895
expr* a = t->get_arg(0);
896-
if (!m_autil.is_store(a)) {
897-
expr_ref vA = eval_abs(a);
898-
enforce_congruence(vA, t);
899-
}
896+
expr_ref vA = eval_abs(a);
897+
enforce_congruence(vA, t);
900898
}
901899

902900
// check that (select(t, t.args) = t.value)
@@ -927,24 +925,34 @@ namespace smtfd {
927925
return;
928926
}
929927
app* store = to_app(t->get_arg(0));
928+
expr* val = store->get_arg(store->get_num_args()-1);
930929
expr* a = store->get_arg(0);
931930
expr_ref_vector eqs(m);
932931
m_args.reset();
933932
m_args.push_back(a);
934933
bool all_eq = true;
935934
for (unsigned i = 1; i < t->get_num_args(); ++i) {
936-
expr_ref v1 = eval_abs(t->get_arg(i));
937-
expr_ref v2 = eval_abs(store->get_arg(i));
935+
expr* arg1 = t->get_arg(i);
936+
expr* arg2 = store->get_arg(i);
937+
if (arg1 == arg2) continue;
938+
expr_ref v1 = eval_abs(arg1);
939+
expr_ref v2 = eval_abs(arg2);
938940
if (v1 != v2) all_eq = false;
939-
m_args.push_back(t->get_arg(i));
940-
eqs.push_back(m.mk_eq(t->get_arg(i), store->get_arg(i)));
941+
m_args.push_back(arg1);
942+
eqs.push_back(m.mk_eq(arg1, arg2));
943+
}
944+
if (eqs.empty()) return;
945+
expr_ref eq = mk_and(eqs);
946+
expr_ref eqV = eval_abs(eq);
947+
expr_ref val1 = eval_abs(t);
948+
expr_ref val2 = eval_abs(val);
949+
if (val1 != val2 && !m.is_false(eqV)) {
950+
add_lemma(m.mk_implies(mk_and(eqs), m.mk_eq(t, val)));
941951
}
942-
if (all_eq) return;
943952

944953
app_ref sel(m_autil.mk_select(m_args), m);
945-
expr_ref val1 = eval_abs(sel);
946-
expr_ref val2 = eval_abs(t);
947-
if (val1 != val2) {
954+
val2 = eval_abs(sel);
955+
if (val1 != val2 && !m.is_true(eqV)) {
948956
TRACE("smtfd", tout << "select/store: " << mk_bounded_pp(t, m, 2) << "\n";);
949957
add_lemma(m.mk_or(m.mk_eq(sel, t), mk_and(eqs)));
950958
m_pinned.push_back(sel);
@@ -993,7 +1001,7 @@ namespace smtfd {
9931001
//
9941002
void reconcile_stores(app* t, expr* vT, table& tT, expr* vA, table& tA) {
9951003
unsigned r = 0;
996-
if (get_lambda(vA) <= 1) {
1004+
if (false && get_lambda(vA) <= 1) {
9971005
return;
9981006
}
9991007
inc_lambda(vT);
@@ -1008,7 +1016,7 @@ namespace smtfd {
10081016
++r;
10091017
}
10101018
}
1011-
#if 0
1019+
#if 1
10121020
// only up-propagation really needed.
10131021
for (auto& fT : tT) {
10141022
f_app fA;
@@ -1196,6 +1204,9 @@ namespace smtfd {
11961204
if (m_autil.is_store(t)) {
11971205
check_store2(to_app(t));
11981206
}
1207+
else if (m_autil.is_select(t)) {
1208+
check_select_store(to_app(t));
1209+
}
11991210
break;
12001211
default:
12011212
break;
@@ -1532,7 +1543,11 @@ namespace smtfd {
15321543
lbool check_abs(unsigned num_assumptions, expr * const * assumptions) {
15331544
expr_ref_vector asms(m);
15341545
init_assumptions(num_assumptions, assumptions, asms);
1535-
TRACE("smtfd", display(tout << asms << "\n"););
1546+
TRACE("smtfd",
1547+
for (unsigned i = 0; i < num_assumptions; ++i) {
1548+
tout << mk_bounded_pp(assumptions[i], m, 3) << "\n";
1549+
}
1550+
display(tout << asms << "\n"););
15361551
SASSERT(asms.contains(m_toggle));
15371552
m_fd_sat_solver->assert_expr(m_toggle);
15381553
lbool r = m_fd_sat_solver->check_sat(asms);

0 commit comments

Comments
 (0)