3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-06-20 15:40:37 +00:00

Missing dependency bug. Still not fixed, but better now

This commit is contained in:
CEisenhofer 2026-05-12 14:00:50 +02:00
parent c9fb432191
commit 71d7d70080
5 changed files with 89 additions and 29 deletions

View file

@ -97,6 +97,9 @@ namespace euf {
if (m_seq.re.is_range(e))
return snode_kind::s_range;
if (m.is_ite(e))
return snode_kind::s_ite;
if (m_seq.re.is_to_re(e))
return snode_kind::s_to_re;
@ -251,6 +254,15 @@ namespace euf {
n->m_length = 1;
break;
case snode_kind::s_ite:
SASSERT(n->num_args() == 3);
n->m_ground = n->arg(0)->is_ground() && n->arg(1)->is_ground() && n->arg(2)->is_ground();
n->m_regex_free = n->arg(1)->is_regex_free() && n->arg(2)->is_regex_free();
n->m_is_classical = false;
n->m_level = 1;
n->m_length = 1;
break;
case snode_kind::s_to_re:
SASSERT(n->num_args() == 1);
n->m_ground = n->arg(0)->is_ground();
@ -508,7 +520,18 @@ namespace euf {
return mk_concat(s1, s2);
return n;
}
if (n->is_ite() && var->is_unit()) {
// We only need to replace in case we are replacing units;
// we would not generate any proper string replacements that propagates into the ite
auto s1 = subst(n->arg(0), var, replacement);
auto s2 = subst(n->arg(1), var, replacement);
auto s3 = subst(n->arg(2), var, replacement);
if (s1 != n->arg(0) || s2 != n->arg(1) || s3 != n->arg(2))
return mk(expr_ref(m.mk_ite(s1->get_expr(), s2->get_expr(), s3->get_expr()), m));
return n;
}
// for non-concat compound nodes (power, star, etc.), no substitution into children
// TODO: This might change in the future foe e.g., powers
return n;
}
@ -744,6 +767,7 @@ namespace euf {
case snode_kind::s_full_char: return "full_char";
case snode_kind::s_full_seq: return "full_seq";
case snode_kind::s_range: return "range";
case snode_kind::s_ite: return "ite";
case snode_kind::s_to_re: return "to_re";
case snode_kind::s_in_re: return "in_re";
}

View file

@ -53,6 +53,7 @@ namespace euf {
s_full_char, // full character set (OP_RE_FULL_CHAR_SET)
s_full_seq, // full sequence set r=.* (OP_RE_FULL_SEQ_SET)
s_range, // character range [lo,hi] (OP_RE_RANGE)
s_ite, // ite (OP_ITE)
s_to_re, // string to regex (OP_SEQ_TO_RE)
s_in_re // regex membership (OP_SEQ_IN_RE)
};
@ -188,6 +189,9 @@ namespace euf {
bool is_range() const {
return m_kind == snode_kind::s_range;
}
bool is_ite() const {
return m_kind == snode_kind::s_ite;
}
bool is_to_re() const {
return m_kind == snode_kind::s_to_re;
}