3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-08-03 04:33:28 +00:00

Add sequence length constraints to seq monadic

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 1a1a0632-f993-4bee-b4f8-a87f960836a1
This commit is contained in:
Nikolaj Bjorner 2026-08-01 10:27:32 -07:00
parent 4fb6b90630
commit 50f2747136
3 changed files with 78 additions and 2 deletions

View file

@ -30,8 +30,6 @@ TODOs:
- encapsulate within general interface:
create: undo_trail x dependency_manager x ast_manager -> regex_membership
add_constraint : expr* x expr* x dependency* -> void
add_lo: expr* x unsigned * dependency* -> void
add_hi: expr* x unsigned * dependency* ->void
check: void -> lbool
explain: void -> dependency*
model: void -> (expr* x expr*) vector or value: expr* -> expr*
@ -426,6 +424,31 @@ void seq_monadic::add(expr* term, expr* regex, u_dependency* d) {
m_undo_trail.push(push_back_vector(m_memberships));
}
void seq_monadic::add_lo(expr* term, unsigned lo, u_dependency* d) {
if (lo == 0)
return;
sort* re_sort = re().mk_re(term->get_sort());
expr_ref all_char(re().mk_full_char(re_sort), m);
expr_ref prefix(re().mk_loop_proper(all_char, lo, lo), m);
expr_ref all(re().mk_full_seq(re_sort), m);
expr_ref regex(re().mk_concat(prefix, all), m);
add(term, regex, d);
}
void seq_monadic::add_hi(expr* term, unsigned hi, u_dependency* d) {
sort* re_sort = re().mk_re(term->get_sort());
expr_ref all_char(re().mk_full_char(re_sort), m);
expr_ref regex(re().mk_loop_proper(all_char, 0, hi), m);
add(term, regex, d);
}
void seq_monadic::add_len(expr* term, unsigned len, u_dependency* d) {
sort* re_sort = re().mk_re(term->get_sort());
expr_ref all_char(re().mk_full_char(re_sort), m);
expr_ref regex(re().mk_loop_proper(all_char, len, len), m);
add(term, regex, d);
}
lbool seq_monadic::decide(vector<std::tuple<expr_ref, expr_ref, u_dependency*>> const& memberships) {
m_model.reset();
if (memberships.empty())

View file

@ -195,6 +195,15 @@ public:
// Memberships remain asserted until the constructor-provided trail is popped.
void add(expr* term, expr* regex, u_dependency* d);
// Assert that `term` has at least `lo` elements. A zero lower bound is a no-op.
void add_lo(expr* term, unsigned lo, u_dependency* d);
// Assert that `term` has at most `hi` elements.
void add_hi(expr* term, unsigned hi, u_dependency* d);
// Assert that `term` has exactly `len` elements.
void add_len(expr* term, unsigned len, u_dependency* d);
// Decide the CONJUNCTION of all memberships asserted via add() jointly: a variable
// shared across memberships is constrained consistently (the DNFs are multiplied and
// each variable's constraints intersected). This is the natural extension of single-