From 71e239c08efb201640bb4c0224e87a5c03291964 Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Sun, 6 Jan 2019 11:49:47 -0800 Subject: [PATCH] fix #2061 Signed-off-by: Nikolaj Bjorner --- src/ast/rewriter/seq_rewriter.cpp | 35 +++++++++++++++++++++++++++++++ src/ast/rewriter/seq_rewriter.h | 1 + src/qe/qe_mbp.cpp | 4 ++-- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/ast/rewriter/seq_rewriter.cpp b/src/ast/rewriter/seq_rewriter.cpp index d46f234e2..68ddad07d 100644 --- a/src/ast/rewriter/seq_rewriter.cpp +++ b/src/ast/rewriter/seq_rewriter.cpp @@ -459,6 +459,9 @@ br_status seq_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * con case OP_SEQ_AT: SASSERT(num_args == 2); return mk_seq_at(args[0], args[1], result); + case OP_SEQ_NTH: + SASSERT(num_args == 2); + return mk_seq_nth(args[0], args[1], result); case OP_SEQ_PREFIX: SASSERT(num_args == 2); return mk_seq_prefix(args[0], args[1], result); @@ -877,6 +880,38 @@ br_status seq_rewriter::mk_seq_at(expr* a, expr* b, expr_ref& result) { return BR_DONE; } +br_status seq_rewriter::mk_seq_nth(expr* a, expr* b, expr_ref& result) { + zstring c; + rational r; + if (!m_autil.is_numeral(b, r) || !r.is_unsigned()) { + return BR_FAILED; + } + unsigned len = r.get_unsigned(); + + expr_ref_vector as(m()); + m_util.str.get_concat_units(a, as); + + for (unsigned i = 0; i < as.size(); ++i) { + expr* a = as.get(i), *u = nullptr; + if (m_util.str.is_unit(a, u)) { + if (len == i) { + result = u; + return BR_REWRITE1; + } + } + else if (i > 0) { + SASSERT(len >= i); + result = m_util.str.mk_concat(as.size() - i, as.c_ptr() + i); + result = m().mk_app(m_util.get_family_id(), OP_SEQ_NTH, result, m_autil.mk_int(len - i)); + return BR_REWRITE2; + } + else { + return BR_FAILED; + } + } + return BR_FAILED; +} + br_status seq_rewriter::mk_seq_index(expr* a, expr* b, expr* c, expr_ref& result) { zstring s1, s2; rational r; diff --git a/src/ast/rewriter/seq_rewriter.h b/src/ast/rewriter/seq_rewriter.h index 83793a594..25b8979fc 100644 --- a/src/ast/rewriter/seq_rewriter.h +++ b/src/ast/rewriter/seq_rewriter.h @@ -114,6 +114,7 @@ class seq_rewriter { br_status mk_seq_extract(expr* a, expr* b, expr* c, expr_ref& result); br_status mk_seq_contains(expr* a, expr* b, expr_ref& result); br_status mk_seq_at(expr* a, expr* b, expr_ref& result); + br_status mk_seq_nth(expr* a, expr* b, expr_ref& result); br_status mk_seq_index(expr* a, expr* b, expr* c, expr_ref& result); br_status mk_seq_replace(expr* a, expr* b, expr* c, expr_ref& result); br_status mk_seq_prefix(expr* a, expr* b, expr_ref& result); diff --git a/src/qe/qe_mbp.cpp b/src/qe/qe_mbp.cpp index a0e16727e..becaeb049 100644 --- a/src/qe/qe_mbp.cpp +++ b/src/qe/qe_mbp.cpp @@ -501,7 +501,7 @@ public: expr_ref val(m); model_evaluator eval(model); for (expr * f : fmls) { - VERIFY(model.is_true(f)); + VERIFY(!model.is_false(f)); } return true; } @@ -657,7 +657,7 @@ public: other_vars.reset(); } - SASSERT(eval.is_true(fml)); + SASSERT(!eval.is_false(fml)); vars.reset (); vars.append(other_vars);