From 419f99c329dfcc628b05e53c6f5d463fe4701c26 Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Fri, 13 Sep 2013 15:30:56 -0700 Subject: [PATCH] fix bug found by Ethan: fresh values for bit-vectors loops if the domain of bit-vectors is truly small Signed-off-by: Nikolaj Bjorner --- src/ast/datatype_decl_plugin.cpp | 3 ++- src/muz/pdr/pdr_farkas_learner.cpp | 2 -- src/smt/proto_model/value_factory.h | 14 ++++++++++++++ src/test/qe_arith.cpp | 4 ++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/ast/datatype_decl_plugin.cpp b/src/ast/datatype_decl_plugin.cpp index 0714af28b..ee3271b9b 100644 --- a/src/ast/datatype_decl_plugin.cpp +++ b/src/ast/datatype_decl_plugin.cpp @@ -84,7 +84,8 @@ class datatype_decl { ptr_vector m_constructors; public: datatype_decl(const symbol & n, unsigned num_constructors, constructor_decl * const * constructors): - m_name(n), m_constructors(num_constructors, constructors) {} + m_name(n), m_constructors(num_constructors, constructors) { + } ~datatype_decl() { std::for_each(m_constructors.begin(), m_constructors.end(), delete_proc()); } diff --git a/src/muz/pdr/pdr_farkas_learner.cpp b/src/muz/pdr/pdr_farkas_learner.cpp index b54eb0117..7c38bf86f 100644 --- a/src/muz/pdr/pdr_farkas_learner.cpp +++ b/src/muz/pdr/pdr_farkas_learner.cpp @@ -212,8 +212,6 @@ namespace pdr { // partition inequalities into variable disjoint sets. void partition_ineqs() { - m_roots.reset(); - m_size.reset(); m_reps.reset(); m_his.reset(); ++m_time; diff --git a/src/smt/proto_model/value_factory.h b/src/smt/proto_model/value_factory.h index b7df55f43..115a01345 100644 --- a/src/smt/proto_model/value_factory.h +++ b/src/smt/proto_model/value_factory.h @@ -180,10 +180,24 @@ public: value_set * set = get_value_set(s); bool is_new = false; expr * result = 0; + sort_info* s_info = s->get_info(); + sort_size const* sz = s_info?&s_info->get_num_elements():0; + bool has_max = false; + Number max_size; + if (sz && sz->is_finite()) { + if (sz->size() < UINT_MAX) { + unsigned usz = static_cast(sz->size()); + max_size = Number(usz); + has_max = true; + } + } Number & next = set->m_next; while (!is_new) { result = mk_value(next, s, is_new); next++; + if (has_max && next >= max_size) { + return 0; + } } SASSERT(result != 0); return result; diff --git a/src/test/qe_arith.cpp b/src/test/qe_arith.cpp index d54ac1ccf..e25abc48c 100644 --- a/src/test/qe_arith.cpp +++ b/src/test/qe_arith.cpp @@ -105,8 +105,8 @@ static void test2(char const *ex) { names.push_back(vars[i]->get_decl()->get_name()); sorts.push_back(m.get_sort(vars[i].get())); } - expr_abstract(m, 0, 3, bound.c_ptr(), fml, fml2); - fml2 = m.mk_exists(3, sorts.c_ptr(), names.c_ptr(), fml2); + expr_abstract(m, 0, bound.size(), bound.c_ptr(), fml, fml2); + fml2 = m.mk_exists(boud.size(), sorts.c_ptr(), names.c_ptr(), fml2); qe::expr_quant_elim qe(m, params); expr_ref pr1 = qe::arith_project(*md, vars, lits); qe(m.mk_true(), fml2, pr2);