Skip to content

Commit 6eae3f0

Browse files
add cases for unconstrained sequences and strings
1 parent 62db764 commit 6eae3f0

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/ast/converters/expr_inverter.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -780,13 +780,37 @@ class seq_expr_inverter : public iexpr_inverter {
780780
}
781781
return true;
782782
}
783+
case OP_SEQ_CONTAINS:
784+
if (uncnstr(args[0])) {
785+
// x contains y -> r or y is empty
786+
mk_fresh_uncnstr_var_for(f, r);
787+
expr_ref emp(seq.str.mk_is_empty(args[0]), m);
788+
if (m_mc)
789+
add_def(args[0], m.mk_ite(r, args[1], seq.str.mk_empty(args[0]->get_sort())));
790+
r = m.mk_or(r, emp);
791+
return true;
792+
}
793+
if (uncnstr(args[1])) {
794+
// x contains y -> r
795+
// y -> if r then x else x + x
796+
mk_fresh_uncnstr_var_for(f, r);
797+
if (m_mc)
798+
add_def(args[1], m.mk_ite(r, args[0], seq.str.mk_concat(args[0], args[0])));
799+
return true;
800+
}
801+
return false;
783802
default:
803+
verbose_stream() << f->get_name() << "\n";
784804
return false;
785805

786806
}
787807
}
788808

789809
bool mk_diff(expr* t, expr_ref& r) override {
810+
if (seq.is_string(t->get_sort())) {
811+
r = seq.str.mk_concat(t, seq.str.mk_string(zstring("a")));
812+
return true;
813+
}
790814
return false;
791815
}
792816

src/ast/simplifiers/elim_unconstrained.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -286,8 +286,7 @@ void elim_unconstrained::init_nodes() {
286286
m_heap.reserve(max_id + 1);
287287

288288
for (expr* e : subterms_postorder::all(terms)) {
289-
node& n = get_node(e);
290-
SASSERT(n.is_root());
289+
SASSERT(get_node(e).is_root());
291290
if (is_uninterp_const(e))
292291
m_heap.insert(e->get_id());
293292
}

0 commit comments

Comments
 (0)