Skip to content

Commit 79bbbf7

Browse files
fix #7006
1 parent 8179f8b commit 79bbbf7

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

src/ast/rewriter/rewriter_types.h

+12
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ enum br_status {
3333
BR_FAILED // no builtin rewrite is available
3434
};
3535

36+
inline std::ostream& operator<<(std::ostream& out, br_status st) {
37+
switch (st) {
38+
case BR_REWRITE1: return out << "rewrite1";
39+
case BR_REWRITE2: return out << "rewrite2";
40+
case BR_REWRITE3: return out << "rewrite3";
41+
case BR_REWRITE_FULL: return out << "rewrite_full";
42+
case BR_DONE: return out << "done";
43+
case BR_FAILED: return out << "failed";
44+
default: return out << "unknown";
45+
}
46+
}
47+
3648
#define RW_UNBOUNDED_DEPTH 3
3749
inline br_status unsigned2br_status(unsigned u) {
3850
br_status r = u >= RW_UNBOUNDED_DEPTH ? BR_REWRITE_FULL : static_cast<br_status>(u);

src/model/model_evaluator.cpp

+26-12
Original file line numberDiff line numberDiff line change
@@ -161,30 +161,32 @@ struct evaluator_cfg : public default_rewriter_cfg {
161161
return st;
162162
}
163163

164-
bool contains_as_array(expr* e) {
164+
bool contains_redex(expr* e) {
165165
if (m_ar.is_as_array(e))
166166
return true;
167167
if (is_var(e))
168168
return false;
169169
if (is_app(e) && to_app(e)->get_num_args() == 0)
170170
return false;
171171

172-
struct has_as_array {};
173-
struct has_as_array_finder {
172+
struct has_redex {};
173+
struct has_redex_finder {
174174
array_util& au;
175-
has_as_array_finder(array_util& au): au(au) {}
175+
has_redex_finder(array_util& au): au(au) {}
176176
void operator()(var* v) {}
177177
void operator()(quantifier* q) {}
178178
void operator()(app* a) {
179179
if (au.is_as_array(a->get_decl()))
180-
throw has_as_array();
180+
throw has_redex();
181+
if (au.get_manager().is_eq(a))
182+
throw has_redex();
181183
}
182184
};
183-
has_as_array_finder ha(m_ar);
185+
has_redex_finder ha(m_ar);
184186
try {
185187
for_each_expr(ha, e);
186188
}
187-
catch (has_as_array) {
189+
catch (has_redex) {
188190
return true;
189191
}
190192
return false;
@@ -216,8 +218,8 @@ struct evaluator_cfg : public default_rewriter_cfg {
216218
expr* val = m_model.get_const_interp(f);
217219
if (val != nullptr) {
218220
result = val;
219-
st = contains_as_array(val) ? BR_REWRITE_FULL : BR_DONE;
220-
TRACE("model_evaluator", tout << result << "\n";);
221+
st = contains_redex(val) ? BR_REWRITE_FULL : BR_DONE;
222+
TRACE("model_evaluator", tout << st << " " << result << "\n";);
221223
return st;
222224
}
223225
if (!m_model_completion)
@@ -443,10 +445,22 @@ struct evaluator_cfg : public default_rewriter_cfg {
443445
result = m.get_some_value(f->get_range());
444446
return BR_DONE;
445447
}
446-
else if (m_dt.is_accessor(f) && !is_ground(args[0])) {
447-
result = m.mk_app(f, num, args);
448-
return BR_DONE;
448+
else if (m_dt.is_accessor(f)) {
449+
expr* arg = args[0];
450+
if (is_ground(arg) && !fi) {
451+
fi = alloc(func_interp, m, f->get_arity());
452+
expr* val = m_model.get_some_value(f->get_range());
453+
fi->set_else(val);
454+
m_model.register_decl(f, fi);
455+
result = val;
456+
return BR_DONE;
457+
}
458+
if (!is_ground(arg)) {
459+
result = m.mk_app(f, num, args);
460+
return BR_DONE;
461+
}
449462
}
463+
450464
if (fi) {
451465
if (fi->is_partial())
452466
fi->set_else(m.get_some_value(f->get_range()));

0 commit comments

Comments
 (0)