File tree 2 files changed +19
-1
lines changed
2 files changed +19
-1
lines changed Original file line number Diff line number Diff line change @@ -8160,6 +8160,16 @@ namespace smt {
8160
8160
sort * rhs_sort = m.get_sort(rhs);
8161
8161
sort * str_sort = u.str.mk_string_sort();
8162
8162
8163
+ // Pick up new terms added during the search (e.g. recursive function expansion).
8164
+ if (!existing_toplevel_exprs.contains(lhs)) {
8165
+ existing_toplevel_exprs.insert(lhs);
8166
+ set_up_axioms(lhs);
8167
+ }
8168
+ if (!existing_toplevel_exprs.contains(rhs)) {
8169
+ existing_toplevel_exprs.insert(rhs);
8170
+ set_up_axioms(rhs);
8171
+ }
8172
+
8163
8173
if (lhs_sort != str_sort || rhs_sort != str_sort) {
8164
8174
TRACE("str", tout << "skip equality: not String sort" << std::endl;);
8165
8175
return;
@@ -8615,7 +8625,12 @@ namespace smt {
8615
8625
}
8616
8626
8617
8627
void theory_str::assign_eh(bool_var v, bool is_true) {
8618
- TRACE("str", tout << "assert: v" << v << " #" << get_context().bool_var2expr(v)->get_id() << " is_true: " << is_true << std::endl;);
8628
+ expr * e = get_context().bool_var2expr(v);
8629
+ TRACE("str", tout << "assert: v" << v << " " << mk_pp(e, get_manager()) << " is_true: " << is_true << std::endl;);
8630
+ if (!existing_toplevel_exprs.contains(e)) {
8631
+ existing_toplevel_exprs.insert(e);
8632
+ set_up_axioms(e);
8633
+ }
8619
8634
}
8620
8635
8621
8636
void theory_str::push_scope_eh() {
Original file line number Diff line number Diff line change @@ -346,6 +346,9 @@ class theory_str : public theory {
346
346
// include an occurrence of the term for which axioms are being generated
347
347
obj_hashtable<expr> axiomatized_terms;
348
348
349
+ // hashtable of all top-level exprs for which set_up_axioms() has been called
350
+ obj_hashtable<expr> existing_toplevel_exprs;
351
+
349
352
int tmpStringVarCount;
350
353
int tmpXorVarCount;
351
354
int tmpLenTestVarCount;
You can’t perform that action at this time.
0 commit comments