3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-14 06:45:25 +00:00

a lot of seq churn

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-04-17 18:21:40 -07:00
parent b8bf6087ff
commit 3e9479d01a
10 changed files with 388 additions and 282 deletions

View file

@ -36,6 +36,7 @@ seq_skolem::seq_skolem(ast_manager& m, th_rewriter& rw):
m_eq = "seq.eq";
m_seq_align = "seq.align";
m_max_unfolding = "seq.max_unfolding";
m_length_limit = "seq.length_limit";
}
expr_ref seq_skolem::mk(symbol const& s, expr* e1, expr* e2, expr* e3, expr* e4, sort* range) {
@ -53,6 +54,21 @@ expr_ref seq_skolem::mk_max_unfolding_depth(unsigned depth) {
return expr_ref(m.mk_const(f), m);
}
expr_ref seq_skolem::mk_length_limit(expr* e, unsigned d) {
parameter ps[3] = { parameter(m_length_limit), parameter(d), parameter(e) };
func_decl* f = m.mk_func_decl(seq.get_family_id(), _OP_SEQ_SKOLEM, 3, ps, 0, (sort*const*) nullptr, m.mk_bool_sort());
return expr_ref(m.mk_const(f), m);
}
bool seq_skolem::is_length_limit(expr* p, unsigned& lim, expr*& s) const {
if (!is_length_limit(p))
return false;
lim = to_app(p)->get_parameter(1).get_int();
s = to_expr(to_app(p)->get_parameter(2).get_ast());
return true;
}
bool seq_skolem::is_skolem(symbol const& s, expr* e) const {
return seq.is_skolem(e) && to_app(e)->get_decl()->get_parameter(0).get_symbol() == s;
}
@ -64,7 +80,7 @@ void seq_skolem::decompose(expr* e, expr_ref& head, expr_ref& tail) {
decompose_main:
if (seq.str.is_empty(e)) {
head = seq.str.mk_unit(seq.str.mk_nth(e, a.mk_int(0)));
head = seq.str.mk_unit(seq.str.mk_nth_i(e, a.mk_int(0)));
tail = e;
}
else if (seq.str.is_string(e, s)) {
@ -93,12 +109,12 @@ decompose_main:
else if (is_skolem(m_tail, e) && a.is_numeral(to_app(e)->get_arg(1), r)) {
expr* s = to_app(e)->get_arg(0);
expr* idx = a.mk_int(r.get_unsigned() + 1);
head = seq.str.mk_unit(seq.str.mk_nth(s, idx));
head = seq.str.mk_unit(seq.str.mk_nth_i(s, idx));
tail = mk(m_tail, s, idx);
m_rewrite(head);
}
else {
head = seq.str.mk_unit(seq.str.mk_nth(e, a.mk_int(0)));
head = seq.str.mk_unit(seq.str.mk_nth_i(e, a.mk_int(0)));
tail = mk(m_tail, e, a.mk_int(0));
m_rewrite(head);
m_rewrite(tail);