Skip to content

Commit 78a1f53

Browse files
fix #2544
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent b1cdb3e commit 78a1f53

File tree

4 files changed

+44
-20
lines changed

4 files changed

+44
-20
lines changed

src/smt/smt_model_checker.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,29 @@ namespace smt {
8080
}
8181

8282
expr * model_checker::get_type_compatible_term(expr * val) {
83-
for (expr* f : m_fresh_exprs) {
84-
if (m.get_sort(f) == m.get_sort(val)) {
85-
return f;
83+
app* fresh_term;
84+
if (is_app(val) && to_app(val)->get_num_args() > 0) {
85+
ptr_buffer<expr> args;
86+
for (expr* arg : *to_app(val)) {
87+
args.push_back(get_type_compatible_term(arg));
8688
}
89+
fresh_term = m.mk_app(to_app(val)->get_decl(), args.size(), args.c_ptr());
90+
}
91+
else {
92+
expr * sk_term = get_term_from_ctx(val);
93+
if (sk_term != nullptr) {
94+
return sk_term;
95+
}
96+
97+
for (expr* f : m_fresh_exprs) {
98+
if (m.get_sort(f) == m.get_sort(val)) {
99+
return f;
100+
}
101+
}
102+
fresh_term = m.mk_fresh_const("sk", m.get_sort(val));
87103
}
88-
app* fresh_term = m.mk_fresh_const("sk", m.get_sort(val));
89-
m_context->ensure_internalized(fresh_term);
90104
m_fresh_exprs.push_back(fresh_term);
105+
m_context->ensure_internalized(fresh_term);
91106
return fresh_term;
92107
}
93108

@@ -279,14 +294,14 @@ namespace smt {
279294
return false;
280295
}
281296

282-
283297
bool model_checker::add_blocking_clause(model * cex, expr_ref_vector & sks) {
284298
SASSERT(cex != nullptr);
285299
expr_ref_buffer diseqs(m);
286300
for (expr * sk : sks) {
287301
func_decl * sk_d = to_app(sk)->get_decl();
288302
expr_ref sk_value(cex->get_some_const_interp(sk_d), m);
289303
if (!sk_value) {
304+
TRACE("model_checker", tout << "no constant interpretation for " << mk_pp(sk, m) << "\n";);
290305
return false; // get_some_value failed... aborting add_blocking_clause
291306
}
292307
diseqs.push_back(m.mk_not(m.mk_eq(sk, sk_value)));

src/smt/theory_seq.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ final_check_status theory_seq::final_check_eh() {
390390
}
391391
if (branch_unit_variable()) {
392392
++m_stats.m_branch_variable;
393-
TRACEFIN("ranch_unit_variable");
393+
TRACEFIN("branch_unit_variable");
394394
return FC_CONTINUE;
395395
}
396396
if (branch_binary_variable()) {
@@ -3321,7 +3321,7 @@ bool theory_seq::solve_nc(unsigned idx) {
33213321
expr_ref c = canonize(n.contains(), deps);
33223322
expr* a = nullptr, *b = nullptr;
33233323

3324-
CTRACE("seq", c != n.contains(), tout << n.contains() << " =>\n" << c << "\n";);
3324+
CTRACE("seq", c != n.contains(), tout << n.contains() << " =>\n" << c << "\n";);
33253325

33263326

33273327
if (m.is_true(c)) {

src/tactic/fd_solver/smtfd_solver.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,17 @@ namespace smtfd {
10451045
expr* abs(expr* e) { return m_context.get_abs().abs(e); }
10461046
expr_ref eval_abs(expr* t) { return (*m_model)(abs(t)); }
10471047

1048+
1049+
void restrict_to_universe(expr * sk, ptr_vector<expr> const & universe) {
1050+
SASSERT(!universe.empty());
1051+
expr_ref_vector eqs(m);
1052+
for (expr * e : universe) {
1053+
eqs.push_back(m.mk_eq(sk, e));
1054+
}
1055+
expr_ref fml = mk_or(eqs);
1056+
m_solver->assert_expr(fml);
1057+
}
1058+
10481059
// !Ex P(x) => !P(t)
10491060
// Ax P(x) => P(t)
10501061
// l_true: new instance
@@ -1056,21 +1067,24 @@ namespace smtfd {
10561067
if (!m_model->eval_expr(q->get_expr(), tmp, true)) {
10571068
return l_undef;
10581069
}
1070+
1071+
m_solver->push();
10591072
expr_ref_vector vars(m), vals(m);
10601073
vars.resize(sz, nullptr);
10611074
vals.resize(sz, nullptr);
10621075
for (unsigned i = 0; i < sz; ++i) {
1063-
vars[sz - i - 1] = m.mk_fresh_const(q->get_decl_name(i), q->get_decl_sort(i));
1064-
1065-
// TBD: finite domain variables
1076+
sort* s = q->get_decl_sort(i);
1077+
vars[i] = m.mk_fresh_const(q->get_decl_name(i), s);
1078+
if (m_model->has_uninterpreted_sort(s)) {
1079+
restrict_to_universe(vars.get(i), m_model->get_universe(s));
1080+
}
10661081
}
10671082
var_subst subst(m);
10681083
expr_ref body = subst(tmp, vars.size(), vars.c_ptr());
10691084
if (is_forall(q)) {
10701085
body = m.mk_not(body);
10711086
}
10721087

1073-
m_solver->push();
10741088
m_solver->assert_expr(body);
10751089
lbool r = m_solver->check_sat(0, nullptr);
10761090
model_ref mdl;
@@ -1115,12 +1129,8 @@ namespace smtfd {
11151129
return r;
11161130
}
11171131

1118-
bool is_enforced(quantifier* q) {
1119-
return m_enforced.contains(q);
1120-
}
1121-
11221132
lbool check_exists(quantifier* q) {
1123-
if (is_enforced(q)) {
1133+
if (m_enforced.contains(q)) {
11241134
return l_true;
11251135
}
11261136
expr_ref tmp(m);
@@ -1504,7 +1514,7 @@ namespace smtfd {
15041514
lbool r;
15051515
expr_ref_vector core(m);
15061516
while (true) {
1507-
IF_VERBOSE(1, verbose_stream() << "(smtfd-check-sat " << m_stats.m_num_rounds << " " << m_stats.m_num_lemmas << ")\n");
1517+
IF_VERBOSE(1, verbose_stream() << "(smtfd-check-sat " << m_stats.m_num_rounds << " " << m_stats.m_num_lemmas << " " << m_stats.m_num_mbqi << ")\n");
15081518
m_stats.m_num_rounds++;
15091519
checkpoint();
15101520

@@ -1542,7 +1552,7 @@ namespace smtfd {
15421552
case l_undef:
15431553
break;
15441554
case l_false:
1545-
m_max_conflicts = UINT_MAX;
1555+
// m_max_conflicts = UINT_MAX;
15461556
break;
15471557
}
15481558
}

src/util/ref_vector.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ class ref_vector : public ref_vector_core<T, ref_manager_wrapper<T, TManager> >
249249
}
250250

251251
element_ref & operator=(T * n) {
252-
SASSERT(n);
253252
m_manager.inc_ref(n);
254253
m_manager.dec_ref(m_ref);
255254
m_ref = n;

0 commit comments

Comments
 (0)