Skip to content

Commit c2e0491

Browse files
fix #4113
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 0499b6b commit c2e0491

File tree

4 files changed

+22
-11
lines changed

4 files changed

+22
-11
lines changed

src/qe/qe_mbp.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ class mbp::impl {
191191
vars.shrink(j);
192192
}
193193

194+
// over-approximation
195+
bool contains_uninterpreted(expr* v) {
196+
return true;
197+
}
198+
194199
bool extract_bools(model_evaluator& eval, expr_ref_vector& fmls, expr* fml) {
195200
TRACE("qe", tout << "extract bools: " << mk_pp(fml, m) << "\n";);
196201
ptr_vector<expr> todo;
@@ -209,10 +214,14 @@ class mbp::impl {
209214
m_visited.mark(e);
210215
if (m.is_bool(e) && !m.is_true(e) && !m.is_false(e) && m.inc()) {
211216
expr_ref val = eval(e);
212-
TRACE("qe", tout << "found: " << mk_pp(e, m) << "\n";);
217+
TRACE("qe", tout << "found: " << mk_pp(e, m) << " " << val << "\n";);
213218
if (!m.inc())
214219
continue;
220+
if (!m.is_true(val) && !m.is_false(val) && contains_uninterpreted(val)) {
221+
throw default_exception("could not evaluate Boolean in model");
222+
}
215223
SASSERT(m.is_true(val) || m.is_false(val));
224+
216225
if (!m_bool_visited.is_marked(e)) {
217226
fmls.push_back(m.is_true(val) ? e : mk_not(m, e));
218227
}

src/qe/qsat.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ namespace qe {
331331
}
332332
if (sz == args.size()) {
333333
if (diff) {
334-
r = m.mk_app(a->get_decl(), sz, args.c_ptr());
334+
r = m.mk_app(a->get_decl(), args);
335335
trail.push_back(r);
336336
}
337337
else {
@@ -424,7 +424,7 @@ namespace qe {
424424
}
425425
if (args.size() == sz) {
426426
if (diff) {
427-
r = m.mk_app(a->get_decl(), sz, args.c_ptr());
427+
r = m.mk_app(a->get_decl(), args);
428428
}
429429
else {
430430
r = to_app(a);
@@ -456,9 +456,8 @@ namespace qe {
456456

457457
void pred_abs::display(std::ostream& out) const {
458458
out << "pred2lit:\n";
459-
obj_map<expr, expr*>::iterator it = m_pred2lit.begin(), end = m_pred2lit.end();
460-
for (; it != end; ++it) {
461-
out << mk_pp(it->m_key, m) << " |-> " << mk_pp(it->m_value, m) << "\n";
459+
for (auto const& kv : m_pred2lit) {
460+
out << mk_pp(kv.m_key, m) << " |-> " << mk_pp(kv.m_value, m) << "\n";
462461
}
463462
for (unsigned i = 0; i < m_preds.size(); ++i) {
464463
out << "level " << i << "\n";
@@ -477,10 +476,10 @@ namespace qe {
477476

478477
void pred_abs::display(std::ostream& out, expr_ref_vector const& asms) const {
479478
max_level lvl;
480-
for (unsigned i = 0; i < asms.size(); ++i) {
481-
expr* e = asms[i];
482-
bool is_not = m.is_not(asms[i], e);
483-
out << mk_pp(asms[i], m);
479+
for (expr* a : asms) {
480+
expr* e = a;
481+
bool is_not = m.is_not(a, e);
482+
out << mk_pp(a, m);
484483
if (m_elevel.find(e, lvl)) {
485484
lvl.display(out << " - ");
486485
}
@@ -1010,7 +1009,7 @@ namespace qe {
10101009
}
10111010
}
10121011
if (all_visited) {
1013-
r = m.mk_app(a->get_decl(), args.size(), args.c_ptr());
1012+
r = m.mk_app(a->get_decl(), args);
10141013
todo.pop_back();
10151014
trail.push_back(r);
10161015
visited.insert(e, r);

src/smt/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ z3_add_component(smt
1010
expr_context_simplifier.cpp
1111
fingerprints.cpp
1212
mam.cpp
13+
model_sweeper.cpp
1314
old_interval.cpp
1415
qi_queue.cpp
1516
seq_axioms.cpp

src/smt/theory_recfun.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Revision History:
2222
#include "ast/for_each_expr.h"
2323
#include "smt/theory_recfun.h"
2424
#include "smt/params/smt_params_helper.hpp"
25+
#include "smt/model_sweeper.h"
2526

2627

2728
#define TRACEFN(x) TRACE("recfun", tout << x << '\n';)
@@ -443,6 +444,7 @@ namespace smt {
443444
final_check_status theory_recfun::final_check_eh() {
444445
TRACEFN("final\n");
445446
if (can_propagate()) {
447+
generate_induction_lemmas(get_context());
446448
propagate();
447449
return FC_CONTINUE;
448450
}

0 commit comments

Comments
 (0)