mirror of
https://github.com/Z3Prover/z3
synced 2026-06-19 23:26:30 +00:00
First step towards not-reusing variables
This commit is contained in:
parent
9bb0f7e337
commit
dd00dd7362
6 changed files with 90 additions and 10 deletions
|
|
@ -26,6 +26,7 @@ skolem::skolem(ast_manager& m, th_rewriter& rw):
|
|||
m_suffix = "seq.s.prefix";
|
||||
m_accept = "aut.accept";
|
||||
m_tail = "seq.tail";
|
||||
m_slice = "seq.slice";
|
||||
m_left = "seq.left";
|
||||
m_right = "seq.right";
|
||||
m_seq_first = "seq.first";
|
||||
|
|
@ -159,6 +160,16 @@ bool skolem::is_tail(expr* e, expr*& s, expr*& idx) const {
|
|||
return is_tail(e) && (s = to_app(e)->get_arg(0), idx = to_app(e)->get_arg(1), true);
|
||||
}
|
||||
|
||||
bool skolem::is_slice(expr* e, expr*& s) const {
|
||||
expr* l = nullptr;
|
||||
expr* r = nullptr;
|
||||
return is_slice(e, s, l, r);
|
||||
}
|
||||
|
||||
bool skolem::is_slice(expr* e, expr*& s, expr*& l, expr*& r) const {
|
||||
return is_slice(e) && (s = to_app(e)->get_arg(0), l = to_app(e)->get_arg(1), r = to_app(e)->get_arg(2), true);
|
||||
}
|
||||
|
||||
bool skolem::is_left_or_right(expr* e, expr*& x, expr*& y, expr*& z) {
|
||||
if (!is_skolem(m_left, e) && !is_skolem(m_right, e))
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ namespace seq {
|
|||
|
||||
symbol m_prefix, m_suffix;
|
||||
symbol m_tail;
|
||||
symbol m_slice;
|
||||
symbol m_left, m_right;
|
||||
symbol m_seq_first, m_seq_last;
|
||||
symbol m_indexof_left, m_indexof_right; // inverse of indexof: (indexof_left s t) + s + (indexof_right s t) = t, for s in t.
|
||||
|
|
@ -87,6 +88,7 @@ namespace seq {
|
|||
expr_ref mk_last_indexof_right(expr* t, expr* s, expr* offset = nullptr) { return mk(m_lindexof_right, t, s, offset); }
|
||||
|
||||
expr_ref mk_tail(expr* s, expr* i) { return mk(m_tail, s, i); }
|
||||
expr_ref mk_slice(expr* s, expr* l, expr* r) { return mk(m_slice, s, l, r); }
|
||||
expr_ref mk_post(expr* s, expr* i) { return mk(m_post, s, i); }
|
||||
expr_ref mk_postp(expr* s, expr* i) { return mk(m_postp, s, i); }
|
||||
expr_ref mk_ite(expr* c, expr* t, expr* e) { return mk(symbol("seq.if"), c, t, e, nullptr, t->get_sort()); }
|
||||
|
|
@ -116,6 +118,7 @@ namespace seq {
|
|||
bool is_unit_inv(expr* e) const { return is_skolem(symbol("seq.unit-inv"), e); }
|
||||
bool is_unit_inv(expr* e, expr*& u) const { return is_unit_inv(e) && (u = to_app(e)->get_arg(0), true); }
|
||||
bool is_tail(expr* e) const { return is_skolem(m_tail, e); }
|
||||
bool is_slice(expr* e) const { return is_skolem(m_slice, e); }
|
||||
bool is_seq_first(expr* e) const { return is_skolem(m_seq_first, e); }
|
||||
bool is_indexof_left(expr* e) const { return is_skolem(m_indexof_left, e); }
|
||||
bool is_indexof_right(expr* e) const { return is_skolem(m_indexof_right, e); }
|
||||
|
|
@ -154,6 +157,8 @@ namespace seq {
|
|||
bool is_tail(expr* e, expr*& s, expr*& idx) const;
|
||||
bool is_tail_u(expr* e, expr*& s, unsigned& idx) const;
|
||||
bool is_tail(expr* e, expr*& s) const;
|
||||
bool is_slice(expr* e, expr*& s, expr*& l, expr*& r) const;
|
||||
bool is_slice(expr* e, expr*& s) const;
|
||||
bool is_digit(expr* e) const { return is_skolem(symbol("seq.is_digit"), e); }
|
||||
bool is_max_unfolding(expr* e) const { return is_skolem(m_max_unfolding, e); }
|
||||
bool is_length_limit(expr* e) const { return is_skolem(m_length_limit, e); }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue