mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 14:13:23 +00:00
seq
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
d81186eaca
commit
30580a012a
3 changed files with 36 additions and 18 deletions
|
@ -72,6 +72,10 @@ br_status seq_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * con
|
||||||
SASSERT(num_args == 2);
|
SASSERT(num_args == 2);
|
||||||
return mk_seq_suffix(args[0], args[1], result);
|
return mk_seq_suffix(args[0], args[1], result);
|
||||||
case OP_SEQ_INDEX:
|
case OP_SEQ_INDEX:
|
||||||
|
if (num_args == 2) {
|
||||||
|
expr_ref arg3(m_autil.mk_int(0), m());
|
||||||
|
return mk_seq_index(args[0], args[1], arg3, result);
|
||||||
|
}
|
||||||
SASSERT(num_args == 3);
|
SASSERT(num_args == 3);
|
||||||
return mk_seq_index(args[0], args[1], args[2], result);
|
return mk_seq_index(args[0], args[1], args[2], result);
|
||||||
case OP_SEQ_REPLACE:
|
case OP_SEQ_REPLACE:
|
||||||
|
|
|
@ -220,7 +220,7 @@ public:
|
||||||
MATCH_TERNARY(is_extract);
|
MATCH_TERNARY(is_extract);
|
||||||
MATCH_BINARY(is_contains);
|
MATCH_BINARY(is_contains);
|
||||||
MATCH_BINARY(is_at);
|
MATCH_BINARY(is_at);
|
||||||
MATCH_BINARY(is_index);
|
MATCH_TERNARY(is_index);
|
||||||
MATCH_TERNARY(is_replace);
|
MATCH_TERNARY(is_replace);
|
||||||
MATCH_BINARY(is_prefix);
|
MATCH_BINARY(is_prefix);
|
||||||
MATCH_BINARY(is_suffix);
|
MATCH_BINARY(is_suffix);
|
||||||
|
|
|
@ -745,33 +745,47 @@ void theory_seq::tightest_prefix(expr* s, expr* x, literal lit) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
let i = Index(s, t)
|
let i = Index(s, t, offset)
|
||||||
|
|
||||||
(!contains(s, t) -> i = -1)
|
if offset = 0:
|
||||||
(s = empty -> i = 0)
|
(!contains(s, t) -> i = -1)
|
||||||
(contains(s, t) & s != empty -> t = xsy)
|
(s = empty -> i = 0)
|
||||||
(contains(s, t) -> tightest_prefix(s, x))
|
(contains(s, t) & s != empty -> t = xsy)
|
||||||
|
(contains(s, t) -> tightest_prefix(s, x))
|
||||||
|
if 0 <= offset < len(t):
|
||||||
|
t = zt' & len(z) == offset
|
||||||
|
add above constraints with t'
|
||||||
|
if offset >= len(t):
|
||||||
|
i = -1
|
||||||
|
if offset < 0:
|
||||||
|
?
|
||||||
|
|
||||||
optional lemmas:
|
optional lemmas:
|
||||||
(len(s) > len(t) -> i = -1)
|
(len(s) > len(t) -> i = -1)
|
||||||
(len(s) <= len(t) -> i <= len(t)-len(s))
|
(len(s) <= len(t) -> i <= len(t)-len(s))
|
||||||
*/
|
*/
|
||||||
void theory_seq::add_indexof_axiom(expr* i) {
|
void theory_seq::add_indexof_axiom(expr* i) {
|
||||||
expr* s, *t;
|
expr* s, *t, *offset;
|
||||||
VERIFY(m_util.str.is_index(i, s, t));
|
rational r;
|
||||||
expr_ref fml(m), emp(m), minus_one(m), zero(m), xsy(m);
|
VERIFY(m_util.str.is_index(i, s, t, offset));
|
||||||
expr_ref x = mk_skolem(m_contains_left_sym, s, t);
|
expr_ref emp(m), minus_one(m), zero(m), xsy(m);
|
||||||
expr_ref y = mk_skolem(m_contains_right_sym, s, t);
|
|
||||||
minus_one = m_autil.mk_int(-1);
|
minus_one = m_autil.mk_int(-1);
|
||||||
zero = m_autil.mk_int(0);
|
zero = m_autil.mk_int(0);
|
||||||
emp = m_util.str.mk_empty(m.get_sort(s));
|
emp = m_util.str.mk_empty(m.get_sort(s));
|
||||||
xsy = m_util.str.mk_concat(x,s,y);
|
if (m_autil.is_numeral(offset, r) && r.is_zero()) {
|
||||||
literal cnt = mk_literal(m_util.str.mk_contains(s, t));
|
expr_ref x = mk_skolem(m_contains_left_sym, s, t);
|
||||||
literal eq_empty = mk_eq(s, emp, false);
|
expr_ref y = mk_skolem(m_contains_right_sym, s, t);
|
||||||
add_axiom(cnt, mk_eq(i, minus_one, false));
|
xsy = m_util.str.mk_concat(x,s,y);
|
||||||
add_axiom(~eq_empty, mk_eq(i, zero, false));
|
literal cnt = mk_literal(m_util.str.mk_contains(s, t));
|
||||||
add_axiom(~cnt, eq_empty, mk_eq(t, xsy, false));
|
literal eq_empty = mk_eq(s, emp, false);
|
||||||
tightest_prefix(s, x, ~cnt);
|
add_axiom(cnt, mk_eq(i, minus_one, false));
|
||||||
|
add_axiom(~eq_empty, mk_eq(i, zero, false));
|
||||||
|
add_axiom(~cnt, eq_empty, mk_eq(t, xsy, false));
|
||||||
|
tightest_prefix(s, x, ~cnt);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// TBD
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue