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:
parent
4fb6b90630
commit
50f2747136
3 changed files with 78 additions and 2 deletions
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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-
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue