Replace seq::derive's m_intervals + m_intervals_start append-only
char-range stack and the imperative intersect_intervals /
exclude_interval helpers with a single canonical range_predicate
m_path_pred that tracks the feasible character set under the
current path.
* Add range_predicate_translator: pure AST -> range_predicate
translator for the boolean-over-char_le fragment
(true/false, eq with const, char_le with const, not/and/or any
nesting). Returns false on the first sub-term outside the
fragment so the caller can fall back to other reasoning.
* push_intervals_impl: translate the candidate predicate to a
range_predicate and reduce path tracking to set arithmetic
(intersection + subset/empty checks). The legacy top-level
and/or descent is preserved for mixed char / non-char
conditions.
* eval_range_cond: implication becomes subset_of and contradiction
becomes !intersects, both linear in the number of ranges with no
AST allocation.
* range_predicate gains subset_of / intersects / disjoint_from to
support allocation-free path queries.
* path_save now stores the saved range_predicate by value; the
stack switches from svector (CallDestructors=false) to vector
because range_predicate owns an inner svector.
Tests: 91/91 pass with /a, including the new
range_predicate_translator unit test exercising true/false, eq,
char_le, and/or/not, and De Morgan agreement.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>