diff --git a/src/ast/rewriter/seq_axioms.cpp b/src/ast/rewriter/seq_axioms.cpp index b4c142e68..9ab1a067b 100644 --- a/src/ast/rewriter/seq_axioms.cpp +++ b/src/ast/rewriter/seq_axioms.cpp @@ -1336,6 +1336,22 @@ namespace seq { add_clause(emp, mk_ge_e(mk_len(s), idx)); } + /** + * Consider the recursive definition of negated contains: + ~contains(a, b) = + if |b| > |a| then true + else if |b| = |a| then a != b + else ~prefix(b, a) and ~contains(a[1:], b) + + Create the recursive function not_contains that implements this recursive definition. + Add the axiom + contains(a, b) or not_contains(a, b) + */ + + void axioms::not_contains_axiom(expr *e) { + throw default_exception("not implemented"); + } + expr_ref axioms::length_limit(expr* s, unsigned k) { expr_ref bound_tracker = m_sk.mk_length_limit(s, k); expr* s0 = nullptr; diff --git a/src/ast/rewriter/seq_axioms.h b/src/ast/rewriter/seq_axioms.h index 0c29ad5d8..29fffe00f 100644 --- a/src/ast/rewriter/seq_axioms.h +++ b/src/ast/rewriter/seq_axioms.h @@ -113,6 +113,7 @@ namespace seq { void unit_axiom(expr* n); void length_axiom(expr* n); void unroll_not_contains(expr* e); + void not_contains_axiom(expr *e); void replace_re_axiom(expr* e); void replace_all_axiom(expr* e); void replace_re_all_axiom(expr* e);