mirror of
https://github.com/Z3Prover/z3
synced 2026-04-02 18:08:57 +00:00
str.at wants a special treatment...
This commit is contained in:
parent
a8db876765
commit
34cb0a17fc
4 changed files with 10 additions and 6 deletions
|
|
@ -105,10 +105,10 @@ namespace euf {
|
|||
return snode_kind::s_in_re;
|
||||
|
||||
// uninterpreted constants of string sort are variables
|
||||
if (m_seq.is_seq(e->get_sort()) && (is_uninterp(e) || m_seq.is_skolem(e)))
|
||||
if (m_seq.is_seq(e->get_sort()) && (is_uninterp(e) || m_seq.is_skolem(e) || m_seq.str.is_at(e)))
|
||||
return snode_kind::s_var;
|
||||
|
||||
return snode_kind::s_var;
|
||||
return snode_kind::s_unknown; // it is an element of the seq
|
||||
}
|
||||
|
||||
void sgraph::compute_metadata(snode* n) {
|
||||
|
|
@ -465,6 +465,8 @@ namespace euf {
|
|||
snode* sgraph::mk_concat(snode* a, snode* b) {
|
||||
if (a->is_empty()) return b;
|
||||
if (b->is_empty()) return a;
|
||||
SASSERT(a->kind() != snode_kind::s_unknown);
|
||||
SASSERT(b->kind() != snode_kind::s_unknown);
|
||||
if (m_seq.is_re(a->get_expr()))
|
||||
return mk(expr_ref(m_seq.re.mk_concat(a->get_expr(), b->get_expr()), m));
|
||||
return mk(expr_ref(m_seq.str.mk_concat(a->get_expr(), b->get_expr()), m));
|
||||
|
|
@ -520,9 +522,6 @@ namespace euf {
|
|||
return mk_concat(s1, s2);
|
||||
return n;
|
||||
}
|
||||
// substitution can also work for expressions under unit.
|
||||
if (n->is_unit() && n->arg(0) == var)
|
||||
return mk(m_seq.str.mk_unit(replacement->get_expr()));
|
||||
// for non-concat compound nodes (power, star, etc.), no substitution into children
|
||||
return n;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ namespace euf {
|
|||
s_range, // character range [lo,hi] (OP_RE_RANGE)
|
||||
s_to_re, // string to regex (OP_SEQ_TO_RE)
|
||||
s_in_re, // regex membership (OP_SEQ_IN_RE)
|
||||
s_unknown, // something else
|
||||
};
|
||||
|
||||
class snode {
|
||||
|
|
|
|||
|
|
@ -1474,6 +1474,10 @@ namespace seq {
|
|||
bool ext = generate_extensions(node);
|
||||
IF_VERBOSE(1, display(verbose_stream(), node));
|
||||
CTRACE(seq, !ext, display(tout, node) << to_dot() << "\n");
|
||||
if (!ext) {
|
||||
node->to_html(std::cout, m);
|
||||
std::cout << std::endl;
|
||||
}
|
||||
VERIFY(ext);
|
||||
node->set_extended(true);
|
||||
++m_stats.m_num_extensions;
|
||||
|
|
@ -1833,7 +1837,6 @@ namespace seq {
|
|||
def = l->arg(0);
|
||||
}
|
||||
|
||||
|
||||
if (var) {
|
||||
nielsen_node* child = mk_child(node);
|
||||
nielsen_edge* e = mk_edge(node, child, true);
|
||||
|
|
|
|||
|
|
@ -432,6 +432,7 @@ namespace seq {
|
|||
SASSERT(repl != nullptr);
|
||||
// var may be s_var or s_power; sgraph::subst uses pointer identity matching
|
||||
SASSERT(var->is_var() || var->is_power() || var->is_unit());
|
||||
SASSERT(!var->is_unit() || repl->is_char_or_unit());
|
||||
}
|
||||
|
||||
// an eliminating substitution does not contain the variable in the replacement
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue