3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

add cases for unconstrained sequences and strings

This commit is contained in:
Nikolaj Bjorner 2024-11-14 21:40:00 -08:00
parent 62db7642ec
commit 6eae3f0863
2 changed files with 25 additions and 2 deletions

View file

@ -780,13 +780,37 @@ public:
}
return true;
}
case OP_SEQ_CONTAINS:
if (uncnstr(args[0])) {
// x contains y -> r or y is empty
mk_fresh_uncnstr_var_for(f, r);
expr_ref emp(seq.str.mk_is_empty(args[0]), m);
if (m_mc)
add_def(args[0], m.mk_ite(r, args[1], seq.str.mk_empty(args[0]->get_sort())));
r = m.mk_or(r, emp);
return true;
}
if (uncnstr(args[1])) {
// x contains y -> r
// y -> if r then x else x + x
mk_fresh_uncnstr_var_for(f, r);
if (m_mc)
add_def(args[1], m.mk_ite(r, args[0], seq.str.mk_concat(args[0], args[0])));
return true;
}
return false;
default:
verbose_stream() << f->get_name() << "\n";
return false;
}
}
bool mk_diff(expr* t, expr_ref& r) override {
if (seq.is_string(t->get_sort())) {
r = seq.str.mk_concat(t, seq.str.mk_string(zstring("a")));
return true;
}
return false;
}

View file

@ -286,8 +286,7 @@ void elim_unconstrained::init_nodes() {
m_heap.reserve(max_id + 1);
for (expr* e : subterms_postorder::all(terms)) {
node& n = get_node(e);
SASSERT(n.is_root());
SASSERT(get_node(e).is_root());
if (is_uninterp_const(e))
m_heap.insert(e->get_id());
}