mirror of
https://github.com/Z3Prover/z3
synced 2026-06-19 07:06:28 +00:00
Regex range expressions (`re.range`) and Boolean operations over them were left in unsimplified form, defeating downstream optimisations (bisimulation classical fast-path, derivative engine) and producing semantically-empty terms not syntactically equal to `re.none`. ## Changes ### `seq_decl_plugin.h` / `seq_decl_plugin.cpp` - **`seq_util::rex::mk_range(sort*, unsigned lo, unsigned hi)`** — new smart constructor that normalises at call time: - `lo > hi` → `re.empty` - `lo == hi` → `str.to_re` (singleton string) - `lo < hi` → `re.range` - **`mk_info_rec` `OP_RE_RANGE`** — concrete non-empty ranges (both bounds are single-char literals with `lo ≤ hi`) now return `classical = true`, enabling the XOR-bisimulation `classical_distinguishing` fast-path on character-predicate leaves. Symbolic/unknown ranges retain `classical = false`. ### `seq_rewriter.cpp` - **`mk_re_range`** — singleton collapse: `(re.range "a" "a")` → `(str.to_re "a")` - **`mk_regex_inter_normalize`** — range × range intersection: `[a,b] ∩ [c,d]` → `[max(a,c), min(b,d)]`, or `re.none` (disjoint), or `str.to_re` (boundary singleton); now delegates to `re().mk_range(sort*, lo, hi)` - **`mk_regex_union_normalize`** — range × range union for overlapping/adjacent ranges: `[a,b] ∪ [c,d]` → `[min(a,c), max(b,d)]`; disjoint ranges fall through to existing `merge_regex_sets`; now delegates to `re().mk_range(sort*, lo, hi)` - **`mk_re_complement`** — range complement expands to one or two concrete ranges instead of an opaque `re.comp` node; now delegates to `re().mk_range(sort*, lo, hi)`: - `comp([0, b])` → `[b+1, max]` - `comp([a, max])` → `[0, a-1]` - `comp([a, b])` → `[0, a-1] ∪ [b+1, max]` ``` (simplify (re.range "z" "a")) ; → re.none (simplify (re.range "a" "a")) ; → (str.to_re "a") (simplify (re.inter (re.range "a" "z") (re.range "f" "k"))); → (re.range "f" "k") (simplify (re.union (re.range "a" "f") (re.range "g" "k"))); → (re.range "a" "k") (simplify (re.comp (re.range "b" "y"))) ; → (re.union [0,a] [z,max]) ``` ### Tests New `src/test/seq_rewriter.cpp` with 14 cases covering all the above reductions plus downstream propagation (star/concat/union/inter absorbing empty ranges). --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Nikolaj Bjorner <nbjorner@microsoft.com>
177 lines
3.8 KiB
CMake
177 lines
3.8 KiB
CMake
add_subdirectory(fuzzing)
|
|
add_subdirectory(lp)
|
|
################################################################################
|
|
# z3-test executable
|
|
################################################################################
|
|
set(z3_test_deps api fuzzing simplex)
|
|
z3_expand_dependencies(z3_test_expanded_deps ${z3_test_deps})
|
|
set (z3_test_extra_object_files "")
|
|
foreach (component ${z3_test_expanded_deps})
|
|
list(APPEND z3_test_extra_object_files $<TARGET_OBJECTS:${component}>)
|
|
endforeach()
|
|
add_executable(test-z3
|
|
EXCLUDE_FROM_ALL
|
|
ackermannize.cpp
|
|
algebraic.cpp
|
|
algebraic_numbers.cpp
|
|
api_ast_map.cpp
|
|
api_bug.cpp
|
|
api_special_relations.cpp
|
|
api.cpp
|
|
api_algebraic.cpp
|
|
api_polynomial.cpp
|
|
api_pb.cpp
|
|
api_datalog.cpp
|
|
parametric_datatype.cpp
|
|
arith_rewriter.cpp
|
|
seq_rewriter.cpp
|
|
arith_simplifier_plugin.cpp
|
|
ast.cpp
|
|
bdd.cpp
|
|
bit_blaster.cpp
|
|
bits.cpp
|
|
bit_vector.cpp
|
|
buffer.cpp
|
|
chashtable.cpp
|
|
check_assumptions.cpp
|
|
cnf_backbones.cpp
|
|
cube_clause.cpp
|
|
datalog_parser.cpp
|
|
ddnf.cpp
|
|
deep_api_bugs.cpp
|
|
diff_logic.cpp
|
|
distribution.cpp
|
|
dl_context.cpp
|
|
dl_product_relation.cpp
|
|
dl_query.cpp
|
|
dl_relation.cpp
|
|
dl_table.cpp
|
|
dl_util.cpp
|
|
doc.cpp
|
|
dlist.cpp
|
|
egraph.cpp
|
|
escaped.cpp
|
|
euf_bv_plugin.cpp
|
|
euf_arith_plugin.cpp
|
|
ex.cpp
|
|
expr_rand.cpp
|
|
expr_substitution.cpp
|
|
ext_numeral.cpp
|
|
f2n.cpp
|
|
finite_set.cpp
|
|
finite_set_rewriter.cpp
|
|
fpa.cpp
|
|
factor_rewriter.cpp
|
|
finder.cpp
|
|
fixed_bit_vector.cpp
|
|
for_each_file.cpp
|
|
get_consequences.cpp
|
|
get_implied_equalities.cpp
|
|
"${CMAKE_CURRENT_BINARY_DIR}/gparams_register_modules.cpp"
|
|
hashtable.cpp
|
|
heap.cpp
|
|
heap_trie.cpp
|
|
hilbert_basis.cpp
|
|
ho_matcher.cpp
|
|
horn_subsume_model_converter.cpp
|
|
horner.cpp
|
|
hwf.cpp
|
|
inf_rational.cpp
|
|
"${CMAKE_CURRENT_BINARY_DIR}/install_tactic.cpp"
|
|
interval.cpp
|
|
karr.cpp
|
|
lcube.cpp
|
|
list.cpp
|
|
main.cpp
|
|
map.cpp
|
|
matcher.cpp
|
|
"${CMAKE_CURRENT_BINARY_DIR}/mem_initializer.cpp"
|
|
memory.cpp
|
|
model2expr.cpp
|
|
model_based_opt.cpp
|
|
mod_factor.cpp
|
|
model_evaluator.cpp
|
|
model_retrieval.cpp
|
|
monomial_bounds.cpp
|
|
mpbq.cpp
|
|
mpf.cpp
|
|
mpff.cpp
|
|
mpfx.cpp
|
|
mpq.cpp
|
|
mpz.cpp
|
|
nlarith_util.cpp
|
|
nla_intervals.cpp
|
|
nlsat.cpp
|
|
no_overflow.cpp
|
|
object_allocator.cpp
|
|
old_interval.cpp
|
|
optional.cpp
|
|
parray.cpp
|
|
pb2bv.cpp
|
|
pdd.cpp
|
|
pdd_solver.cpp
|
|
permutation.cpp
|
|
polynomial.cpp
|
|
polynomial_factorization.cpp
|
|
polynorm.cpp
|
|
prime_generator.cpp
|
|
proof_checker.cpp
|
|
qe_arith.cpp
|
|
mbp_qel.cpp
|
|
quant_elim.cpp
|
|
quant_solve.cpp
|
|
random.cpp
|
|
rational.cpp
|
|
rcf.cpp
|
|
region.cpp
|
|
sat_local_search.cpp
|
|
sat_lookahead.cpp
|
|
sat_user_scope.cpp
|
|
scoped_timer.cpp
|
|
scoped_vector.cpp
|
|
simple_parser.cpp
|
|
simplex.cpp
|
|
simplifier.cpp
|
|
sls_test.cpp
|
|
sls_seq_plugin.cpp
|
|
small_object_allocator.cpp
|
|
smt2print_parse.cpp
|
|
smt_context.cpp
|
|
solver_pool.cpp
|
|
sorting_network.cpp
|
|
stack.cpp
|
|
string_buffer.cpp
|
|
substitution.cpp
|
|
symbol.cpp
|
|
symbol_table.cpp
|
|
tbv.cpp
|
|
theory_dl.cpp
|
|
theory_pb.cpp
|
|
timeout.cpp
|
|
tptp.cpp
|
|
total_order.cpp
|
|
totalizer.cpp
|
|
trigo.cpp
|
|
udoc_relation.cpp
|
|
uint_set.cpp
|
|
upolynomial.cpp
|
|
value_generator.cpp
|
|
value_sweep.cpp
|
|
var_subst.cpp
|
|
vector.cpp
|
|
lp/lp.cpp
|
|
lp/nla_solver_test.cpp
|
|
zstring.cpp
|
|
${z3_test_extra_object_files}
|
|
)
|
|
z3_add_install_tactic_rule(${z3_test_deps})
|
|
z3_add_memory_initializer_rule(${z3_test_deps})
|
|
z3_add_gparams_register_modules_rule(${z3_test_deps})
|
|
target_compile_definitions(test-z3 PRIVATE
|
|
${Z3_COMPONENT_CXX_DEFINES}
|
|
)
|
|
target_compile_options(test-z3 PRIVATE ${Z3_COMPONENT_CXX_FLAGS})
|
|
target_link_libraries(test-z3 PRIVATE ${Z3_DEPENDENT_LIBS})
|
|
target_include_directories(test-z3 PRIVATE ${Z3_COMPONENT_EXTRA_INCLUDE_DIRS})
|
|
z3_append_linker_flag_list_to_target(test-z3 ${Z3_DEPENDENT_EXTRA_CXX_LINK_FLAGS})
|
|
z3_add_component_dependencies_to_target(test-z3 ${z3_test_expanded_deps})
|