3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-03-20 20:05:51 +00:00

theory_nseq: dispatch assign_eh on all seq predicate cases via m_axioms, add enqueue/dequeue_axiom with variant prop_item (#9040)

* dispatch assign_eh cases via m_axioms: add prefix/suffix/contains true axioms

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

* fix build: remove stale snode_label_html declaration from seq_nielsen.h

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

* theory_nseq: add enqueue/dequeue_axiom + std::variant prop_item + relevant_eh

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
Co-authored-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Copilot 2026-03-19 10:42:18 -07:00 committed by GitHub
parent 109ab7d098
commit 8795bf06fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 179 additions and 49 deletions

View file

@ -1274,6 +1274,40 @@ namespace seq {
}
// prefix(s, t) => t = s ++ prefix_inv(s, t)
void axioms::prefix_true_axiom(expr* e) {
expr* _s = nullptr, *_t = nullptr;
VERIFY(seq.str.is_prefix(e, _s, _t));
auto s = purify(_s);
auto t = purify(_t);
expr_ref inv = m_sk.mk_prefix_inv(s, t);
expr_ref lit(e, m);
add_clause(~lit, mk_seq_eq(t, mk_concat(s, inv)));
}
// suffix(s, t) => t = suffix_inv(s, t) ++ s
void axioms::suffix_true_axiom(expr* e) {
expr* _s = nullptr, *_t = nullptr;
VERIFY(seq.str.is_suffix(e, _s, _t));
auto s = purify(_s);
auto t = purify(_t);
expr_ref inv = m_sk.mk_suffix_inv(s, t);
expr_ref lit(e, m);
add_clause(~lit, mk_seq_eq(t, mk_concat(inv, s)));
}
// contains(t, s) => t = contains_left(t, s) ++ s ++ contains_right(t, s)
void axioms::contains_true_axiom(expr* e) {
expr* _t = nullptr, *_s = nullptr;
VERIFY(seq.str.is_contains(e, _t, _s));
auto t = purify(_t);
auto s = purify(_s);
expr_ref f1 = m_sk.mk_contains_left(t, s);
expr_ref f2 = m_sk.mk_contains_right(t, s);
expr_ref lit(e, m);
add_clause(~lit, mk_seq_eq(t, mk_concat(f1, s, f2)));
}
/**
~contains(a, b) => ~prefix(b, a)
~contains(a, b) => ~contains(tail(a), b)

View file

@ -84,6 +84,9 @@ namespace seq {
void suffix_axiom(expr* n);
void prefix_axiom(expr* n);
void prefix_true_axiom(expr* n);
void suffix_true_axiom(expr* n);
void contains_true_axiom(expr* n);
void extract_axiom(expr* n);
void indexof_axiom(expr* n);
void last_indexof_axiom(expr* n);