mirror of
https://github.com/Z3Prover/z3
synced 2026-06-21 16:10:26 +00:00
Fix regression timeouts via range condition simplification
- Simplify trivial range bounds in derive_range: when lo=0, omit the lo<=x condition; when hi=max_char, omit the x<=hi condition. Full charset ranges return epsilon directly. - Add char_le(0,x)=true and char_le(x,max)=true to eval_cond for always-valid bounds. - Add range implication logic to simplify_ite_rec: when path has negated/positive char_le constraints, detect implied or contradicted char_le conditions (e.g., ¬(x<=127) implies 128<=x). - Add is_subset(a, .+) check: non-nullable regexes are subsets of .+ - In update_state_graph, skip recursive exploration of nullable targets to avoid state explosion. These fixes resolve timeouts on 5724 (all problems), 5721 P1, and 5693. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
parent
88a177f6c5
commit
d54d62a07a
3 changed files with 170 additions and 6 deletions
|
|
@ -891,6 +891,16 @@ namespace smt {
|
|||
m_state_graph.add_edge(r_id, dr_id, maybecycle);
|
||||
}
|
||||
m_state_graph.mark_done(r_id);
|
||||
// Recursively explore unexplored targets for dead state detection
|
||||
// Skip targets that are nullable to avoid state explosion
|
||||
for (auto const& dr: derivatives) {
|
||||
unsigned dr_id = get_state_id(dr);
|
||||
if (m_state_graph.is_done(dr_id) || m_state_graph.is_live(dr_id))
|
||||
continue;
|
||||
if (re().get_info(dr).nullable == l_true)
|
||||
continue;
|
||||
update_state_graph(dr);
|
||||
}
|
||||
}
|
||||
|
||||
STRACE(seq_regex, m_state_graph.display(tout););
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue