diff --git a/src/ast/rewriter/seq_rewriter.cpp b/src/ast/rewriter/seq_rewriter.cpp index 2406e92ed..857cc0e36 100644 --- a/src/ast/rewriter/seq_rewriter.cpp +++ b/src/ast/rewriter/seq_rewriter.cpp @@ -689,11 +689,10 @@ br_status seq_rewriter::mk_seq_extract(expr* a, expr* b, expr* c, expr_ref& resu if (offset == 0) { return BR_FAILED; } - expr_ref len1(m()), pos1(m()); + expr_ref pos1(m()); pos1 = m_autil.mk_sub(b, m_autil.mk_int(offset)); - len1 = m_autil.mk_sub(c, m_autil.mk_int(offset)); result = m_util.str.mk_concat(as.size() - offset, as.c_ptr() + offset); - result = m_util.str.mk_substr(result, pos1, len1); + result = m_util.str.mk_substr(result, pos1, c); return BR_REWRITE3; } diff --git a/src/smt/theory_seq.cpp b/src/smt/theory_seq.cpp index 9be03ad6e..d9bb352aa 100644 --- a/src/smt/theory_seq.cpp +++ b/src/smt/theory_seq.cpp @@ -4735,7 +4735,6 @@ bool theory_seq::get_length(expr* e, rational& val) const { } /* - TBD: check semantics of extract. let e = extract(s, i, l) @@ -4797,15 +4796,16 @@ void theory_seq::add_extract_axiom(expr* e) { literal li_ge_ls = mk_simplified_literal(m_autil.mk_ge(ls_minus_i_l, zero)); literal l_ge_zero = mk_simplified_literal(m_autil.mk_ge(l, zero)); literal ls_le_0 = mk_simplified_literal(m_autil.mk_le(ls, zero)); + literal le_is_0 = mk_eq(le, zero, false); add_axiom(~i_ge_0, ~ls_le_i, mk_seq_eq(xey, s)); add_axiom(~i_ge_0, ~ls_le_i, mk_eq(lx, i, false)); add_axiom(~i_ge_0, ~ls_le_i, ~l_ge_zero, ~li_ge_ls, mk_eq(le, l, false)); add_axiom(~i_ge_0, ~ls_le_i, li_ge_ls, mk_eq(le, mk_sub(ls, i), false)); add_axiom(~i_ge_0, ~ls_le_i, l_ge_zero, mk_eq(le, zero, false)); - add_axiom(i_ge_0, mk_eq(le, zero, false)); - add_axiom(ls_le_i, mk_eq(le, zero, false)); - add_axiom(~ls_le_0, mk_eq(le, zero, false)); + add_axiom(i_ge_0, le_is_0); + add_axiom(ls_le_i, le_is_0); + add_axiom(~ls_le_0, le_is_0); } void theory_seq::add_tail_axiom(expr* e, expr* s) {