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:
parent
109ab7d098
commit
8795bf06fb
5 changed files with 179 additions and 49 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue