From f02d273ee39ae047222e362c37213d29135dc661 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 2 Feb 2016 23:39:11 +0000 Subject: [PATCH 01/11] Convert stream to bool explicitly In C++11 there is no implicit conversion from iostream classes to `void*`, just an explicit conversion to bool. --- src/util/debug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/debug.cpp b/src/util/debug.cpp index 54c67feca..66676c619 100644 --- a/src/util/debug.cpp +++ b/src/util/debug.cpp @@ -76,7 +76,7 @@ void invoke_gdb() { for (;;) { std::cerr << "(C)ontinue, (A)bort, (S)top, (T)hrow exception, Invoke (G)DB\n"; char result; - bool ok = (std::cin >> result); + bool ok = bool(std::cin >> result); if (!ok) exit(ERR_INTERNAL_FATAL); // happens if std::cin is eof or unattached. switch(result) { case 'C': From 21b85c27e18748c76002bb2773407ecce96bec9c Mon Sep 17 00:00:00 2001 From: "Christoph M. Wintersteiger" Date: Fri, 5 Feb 2016 13:47:14 +0000 Subject: [PATCH 02/11] whitespace --- src/ast/rewriter/bv_rewriter.cpp | 348 +++++++++++++++---------------- 1 file changed, 174 insertions(+), 174 deletions(-) diff --git a/src/ast/rewriter/bv_rewriter.cpp b/src/ast/rewriter/bv_rewriter.cpp index 6a652c2f7..a45f20d9e 100644 --- a/src/ast/rewriter/bv_rewriter.cpp +++ b/src/ast/rewriter/bv_rewriter.cpp @@ -78,91 +78,91 @@ void bv_rewriter::get_param_descrs(param_descrs & r) { poly_rewriter::get_param_descrs(r); bv_rewriter_params::collect_param_descrs(r); #ifndef _EXTERNAL_RELEASE - r.insert("mkbv2num", CPK_BOOL, "(default: false) convert (mkbv [true/false]*) into a numeral"); + r.insert("mkbv2num", CPK_BOOL, "(default: false) convert (mkbv [true/false]*) into a numeral"); #endif } br_status bv_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result) { SASSERT(f->get_family_id() == get_fid()); - + switch(f->get_decl_kind()) { case OP_BIT0: SASSERT(num_args == 0); result = m_util.mk_numeral(0, 1); return BR_DONE; case OP_BIT1: SASSERT(num_args == 0); result = m_util.mk_numeral(1, 1); return BR_DONE; - case OP_ULEQ: - SASSERT(num_args == 2); + case OP_ULEQ: + SASSERT(num_args == 2); return mk_ule(args[0], args[1], result); - case OP_UGEQ: - SASSERT(num_args == 2); - return mk_uge(args[0], args[1], result); - case OP_ULT: - SASSERT(num_args == 2); - return mk_ult(args[0], args[1], result); - case OP_UGT: - SASSERT(num_args == 2); - return mk_ult(args[1], args[0], result); - case OP_SLEQ: - SASSERT(num_args == 2); - return mk_sle(args[0], args[1], result); - case OP_SGEQ: - SASSERT(num_args == 2); - return mk_sge(args[0], args[1], result); - case OP_SLT: - SASSERT(num_args == 2); - return mk_slt(args[0], args[1], result); - case OP_SGT: - SASSERT(num_args == 2); - return mk_slt(args[1], args[0], result); - case OP_BADD: - SASSERT(num_args > 0); - return mk_bv_add(num_args, args, result); + case OP_UGEQ: + SASSERT(num_args == 2); + return mk_uge(args[0], args[1], result); + case OP_ULT: + SASSERT(num_args == 2); + return mk_ult(args[0], args[1], result); + case OP_UGT: + SASSERT(num_args == 2); + return mk_ult(args[1], args[0], result); + case OP_SLEQ: + SASSERT(num_args == 2); + return mk_sle(args[0], args[1], result); + case OP_SGEQ: + SASSERT(num_args == 2); + return mk_sge(args[0], args[1], result); + case OP_SLT: + SASSERT(num_args == 2); + return mk_slt(args[0], args[1], result); + case OP_SGT: + SASSERT(num_args == 2); + return mk_slt(args[1], args[0], result); + case OP_BADD: + SASSERT(num_args > 0); + return mk_bv_add(num_args, args, result); case OP_BMUL: - SASSERT(num_args > 0); - return mk_bv_mul(num_args, args, result); - case OP_BSUB: - SASSERT(num_args > 0); - return mk_sub(num_args, args, result); - case OP_BNEG: - SASSERT(num_args == 1); + SASSERT(num_args > 0); + return mk_bv_mul(num_args, args, result); + case OP_BSUB: + SASSERT(num_args > 0); + return mk_sub(num_args, args, result); + case OP_BNEG: + SASSERT(num_args == 1); return mk_uminus(args[0], result); - case OP_BSHL: - SASSERT(num_args == 2); - return mk_bv_shl(args[0], args[1], result); + case OP_BSHL: + SASSERT(num_args == 2); + return mk_bv_shl(args[0], args[1], result); case OP_BLSHR: - SASSERT(num_args == 2); - return mk_bv_lshr(args[0], args[1], result); - case OP_BASHR: - SASSERT(num_args == 2); + SASSERT(num_args == 2); + return mk_bv_lshr(args[0], args[1], result); + case OP_BASHR: + SASSERT(num_args == 2); return mk_bv_ashr(args[0], args[1], result); - case OP_BSDIV: - SASSERT(num_args == 2); + case OP_BSDIV: + SASSERT(num_args == 2); return mk_bv_sdiv(args[0], args[1], result); - case OP_BUDIV: - SASSERT(num_args == 2); - return mk_bv_udiv(args[0], args[1], result); - case OP_BSREM: - SASSERT(num_args == 2); - return mk_bv_srem(args[0], args[1], result); - case OP_BUREM: - SASSERT(num_args == 2); - return mk_bv_urem(args[0], args[1], result); - case OP_BSMOD: - SASSERT(num_args == 2); - return mk_bv_smod(args[0], args[1], result); - case OP_BSDIV_I: - SASSERT(num_args == 2); - return mk_bv_sdiv_i(args[0], args[1], result); - case OP_BUDIV_I: - SASSERT(num_args == 2); + case OP_BUDIV: + SASSERT(num_args == 2); + return mk_bv_udiv(args[0], args[1], result); + case OP_BSREM: + SASSERT(num_args == 2); + return mk_bv_srem(args[0], args[1], result); + case OP_BUREM: + SASSERT(num_args == 2); + return mk_bv_urem(args[0], args[1], result); + case OP_BSMOD: + SASSERT(num_args == 2); + return mk_bv_smod(args[0], args[1], result); + case OP_BSDIV_I: + SASSERT(num_args == 2); + return mk_bv_sdiv_i(args[0], args[1], result); + case OP_BUDIV_I: + SASSERT(num_args == 2); return mk_bv_udiv_i(args[0], args[1], result); - case OP_BSREM_I: - SASSERT(num_args == 2); + case OP_BSREM_I: + SASSERT(num_args == 2); return mk_bv_srem_i(args[0], args[1], result); - case OP_BUREM_I: - SASSERT(num_args == 2); + case OP_BUREM_I: + SASSERT(num_args == 2); return mk_bv_urem_i(args[0], args[1], result); - case OP_BSMOD_I: - SASSERT(num_args == 2); - return mk_bv_smod_i(args[0], args[1], result); + case OP_BSMOD_I: + SASSERT(num_args == 2); + return mk_bv_smod_i(args[0], args[1], result); case OP_CONCAT: return mk_concat(num_args, args, result); case OP_EXTRACT: @@ -193,10 +193,10 @@ br_status bv_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * cons case OP_BXNOR: return mk_bv_xnor(num_args, args, result); case OP_ROTATE_LEFT: - SASSERT(num_args == 1); - return mk_bv_rotate_left(f->get_parameter(0).get_int(), args[0], result); - case OP_ROTATE_RIGHT: - SASSERT(num_args == 1); + SASSERT(num_args == 1); + return mk_bv_rotate_left(f->get_parameter(0).get_int(), args[0], result); + case OP_ROTATE_RIGHT: + SASSERT(num_args == 1); return mk_bv_rotate_right(f->get_parameter(0).get_int(), args[0], result); case OP_EXT_ROTATE_LEFT: SASSERT(num_args == 2); @@ -210,14 +210,14 @@ br_status bv_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * cons case OP_INT2BV: SASSERT(num_args == 1); return mk_int2bv(m_util.get_bv_size(f->get_range()), args[0], result); - case OP_BREDOR: - SASSERT(num_args == 1); - return mk_bv_redor(args[0], result); - case OP_BREDAND: - SASSERT(num_args == 1); - return mk_bv_redand(args[0], result); - case OP_BCOMP: - SASSERT(num_args == 2); + case OP_BREDOR: + SASSERT(num_args == 1); + return mk_bv_redor(args[0], result); + case OP_BREDAND: + SASSERT(num_args == 1); + return mk_bv_redand(args[0], result); + case OP_BCOMP: + SASSERT(num_args == 2); return mk_bv_comp(args[0], args[1], result); case OP_MKBV: return mk_mkbv(num_args, args, result); @@ -232,7 +232,7 @@ br_status bv_rewriter::mk_ule(expr * a, expr * b, expr_ref & result) { br_status bv_rewriter::mk_uge(expr * a, expr * b, expr_ref & result) { br_status st = mk_ule(b, a, result); - if (st != BR_FAILED) + if (st != BR_FAILED) return st; result = m_util.mk_ule(b, a); return BR_DONE; @@ -249,7 +249,7 @@ br_status bv_rewriter::mk_sle(expr * a, expr * b, expr_ref & result) { br_status bv_rewriter::mk_sge(expr * a, expr * b, expr_ref & result) { br_status st = mk_sle(b, a, result); - if (st != BR_FAILED) + if (st != BR_FAILED) return st; result = m_util.mk_sle(b, a); return BR_DONE; @@ -272,7 +272,7 @@ br_status bv_rewriter::mk_leq_core(bool is_signed, expr * a, expr * b, expr_ref return BR_DONE; } - if (is_num1) + if (is_num1) r1 = m_util.norm(r1, sz, is_signed); if (is_num2) r2 = m_util.norm(r2, sz, is_signed); @@ -322,7 +322,7 @@ br_status bv_rewriter::mk_leq_core(bool is_signed, expr * a, expr * b, expr_ref #if 0 if (!is_signed && m_util.is_concat(b) && to_app(b)->get_num_args() == 2 && m_util.is_zero(to_app(b)->get_arg(0))) { - // + // // a <=_u (concat 0 c) ---> a[h:l] = 0 && a[l-1:0] <=_u c // expr * b_1 = to_app(b)->get_arg(0); @@ -337,9 +337,9 @@ br_status bv_rewriter::mk_leq_core(bool is_signed, expr * a, expr * b, expr_ref if (!is_signed) { // Extended version of the rule above using is_zero_bit. // It also catches examples atoms such as: - // + // // a <=_u #x000f - // + // unsigned bv_sz = m_util.get_bv_size(b); unsigned i = bv_sz; unsigned first_non_zero = UINT_MAX; @@ -350,7 +350,7 @@ br_status bv_rewriter::mk_leq_core(bool is_signed, expr * a, expr * b, expr_ref break; } } - + if (first_non_zero == UINT_MAX) { // all bits are zero result = m().mk_eq(a, m_util.mk_numeral(numeral(0), bv_sz)); @@ -361,7 +361,7 @@ br_status bv_rewriter::mk_leq_core(bool is_signed, expr * a, expr * b, expr_ref m_util.mk_ule(m_mk_extract(first_non_zero, 0, a), m_mk_extract(first_non_zero, 0, b))); return BR_REWRITE3; } - + } #endif @@ -385,7 +385,7 @@ br_status bv_rewriter::mk_extract(unsigned high, unsigned low, expr * arg, expr_ result = arg; return BR_DONE; } - + numeral v; if (is_numeral(arg, v, sz)) { sz = high - low + 1; @@ -420,7 +420,7 @@ br_status bv_rewriter::mk_extract(unsigned high, unsigned low, expr * arg, expr_ if (idx > high) continue; // found first argument - if (idx <= low) { + if (idx <= low) { // result is a fragment of this argument if (low == idx && high - idx == curr_sz - 1) { result = curr; @@ -486,13 +486,13 @@ br_status bv_rewriter::mk_extract(unsigned high, unsigned low, expr * arg, expr_ m_mk_extract(high, low, to_app(arg)->get_arg(2))); return BR_REWRITE2; } - + return BR_FAILED; } br_status bv_rewriter::mk_bv_shl(expr * arg1, expr * arg2, expr_ref & result) { numeral r1, r2; - unsigned bv_size = get_bv_size(arg1); + unsigned bv_size = get_bv_size(arg1); unsigned sz; if (is_numeral(arg2, r2, sz)) { @@ -501,9 +501,9 @@ br_status bv_rewriter::mk_bv_shl(expr * arg1, expr * arg2, expr_ref & result) { result = arg1; return BR_DONE; } - + if (r2 >= numeral(bv_size)) { - result = mk_numeral(0, bv_size); + result = mk_numeral(0, bv_size); return BR_DONE; } @@ -511,7 +511,7 @@ br_status bv_rewriter::mk_bv_shl(expr * arg1, expr * arg2, expr_ref & result) { if (bv_size <= 64) { SASSERT(r1.is_uint64() && r2.is_uint64()); SASSERT(r2.get_uint64() < bv_size); - + uint64 r = shift_left(r1.get_uint64(), r2.get_uint64()); numeral rn(r, numeral::ui64()); rn = m_util.norm(rn, bv_size); @@ -519,7 +519,7 @@ br_status bv_rewriter::mk_bv_shl(expr * arg1, expr * arg2, expr_ref & result) { return BR_DONE; } - + SASSERT(r2 < numeral(bv_size)); SASSERT(r2.is_unsigned()); r1 = m_util.norm(r1 * rational::power_of_two(r2.get_unsigned()), bv_size); @@ -539,10 +539,10 @@ br_status bv_rewriter::mk_bv_shl(expr * arg1, expr * arg2, expr_ref & result) { return BR_FAILED; } - + br_status bv_rewriter::mk_bv_lshr(expr * arg1, expr * arg2, expr_ref & result) { numeral r1, r2; - unsigned bv_size = get_bv_size(arg1); + unsigned bv_size = get_bv_size(arg1); unsigned sz; if (is_numeral(arg2, r2, sz)) { @@ -551,15 +551,15 @@ br_status bv_rewriter::mk_bv_lshr(expr * arg1, expr * arg2, expr_ref & result) { result = arg1; return BR_DONE; } - + if (r2 >= numeral(bv_size)) { result = mk_numeral(0, bv_size); return BR_DONE; } if (is_numeral(arg1, r1, sz)) { - if (bv_size <= 64) { - SASSERT(r1.is_uint64()); + if (bv_size <= 64) { + SASSERT(r1.is_uint64()); SASSERT(r2.is_uint64()); uint64 r = shift_right(r1.get_uint64(), r2.get_uint64()); numeral rn(r, numeral::ui64()); @@ -574,7 +574,7 @@ br_status bv_rewriter::mk_bv_lshr(expr * arg1, expr * arg2, expr_ref & result) { result = mk_numeral(r1, bv_size); return BR_DONE; } - + SASSERT(r2.is_pos()); SASSERT(r2 < numeral(bv_size)); // (bvlshr x k) -> (concat bv0:k (extract [n-1:k] x)) @@ -652,13 +652,13 @@ br_status bv_rewriter::mk_bv_ashr(expr * arg1, expr * arg2, expr_ref & result) { result = mk_numeral(r1, bv_size); return BR_DONE; } - + // (bvashr (bvashr x r1) r2) --> (bvashr x r1+r2) if (is_num2 && m_util.is_bv_ashr(arg1) && is_numeral(to_app(arg1)->get_arg(1), r1, bv_size)) { r1 += r2; if (r1 > numeral(bv_size)) r1 = numeral(bv_size); - result = m().mk_app(get_fid(), OP_BASHR, + result = m().mk_app(get_fid(), OP_BASHR, to_app(arg1)->get_arg(0), mk_numeral(r1, bv_size)); return BR_REWRITE1; // not really needed at this time. @@ -709,13 +709,13 @@ br_status bv_rewriter::mk_bv_sdiv_core(expr * arg1, expr * arg2, bool hi_div0, e result = arg1; return BR_DONE; } - + if (!r2.is_zero() && is_numeral(arg1, r1, bv_size)) { r1 = m_util.norm(r1, bv_size, true); result = mk_numeral(machine_div(r1, r2), bv_size); return BR_DONE; } - + result = m().mk_app(get_fid(), OP_BSDIV_I, arg1, arg2); return BR_DONE; } @@ -735,9 +735,9 @@ br_status bv_rewriter::mk_bv_sdiv_core(expr * arg1, expr * arg2, bool hi_div0, e br_status bv_rewriter::mk_bv_udiv_core(expr * arg1, expr * arg2, bool hi_div0, expr_ref & result) { numeral r1, r2; unsigned bv_size; - + TRACE("bv_udiv", tout << "hi_div0: " << hi_div0 << "\n";); - + TRACE("udiv2mul", tout << mk_ismt2_pp(arg2, m()) << " udiv2mul: " << m_udiv2mul << "\n";); if (is_numeral(arg2, r2, bv_size)) { @@ -751,7 +751,7 @@ br_status bv_rewriter::mk_bv_udiv_core(expr * arg1, expr * arg2, bool hi_div0, e // The "hardware interpretation" for (bvudiv x 0) is #xffff result = mk_numeral(rational::power_of_two(bv_size) - numeral(1), bv_size); return BR_DONE; - + } } @@ -765,7 +765,7 @@ br_status bv_rewriter::mk_bv_udiv_core(expr * arg1, expr * arg2, bool hi_div0, e result = mk_numeral(machine_div(r1, r2), bv_size); return BR_DONE; } - + unsigned shift; if (r2.is_power_of_two(shift)) { result = m().mk_app(get_fid(), OP_BLSHR, arg1, mk_numeral(shift, bv_size)); @@ -821,13 +821,13 @@ br_status bv_rewriter::mk_bv_srem_core(expr * arg1, expr * arg2, bool hi_div0, e result = mk_numeral(0, bv_size); return BR_DONE; } - + if (!r2.is_zero() && is_numeral(arg1, r1, bv_size)) { r1 = m_util.norm(r1, bv_size, true); result = mk_numeral(r1 % r2, bv_size); return BR_DONE; } - + result = m().mk_app(get_fid(), OP_BSREM_I, arg1, arg2); return BR_DONE; } @@ -890,7 +890,7 @@ br_status bv_rewriter::mk_bv_urem_core(expr * arg1, expr * arg2, bool hi_div0, e result = mk_numeral(0, bv_size); return BR_DONE; } - + if (!r2.is_zero() && is_num1) { r1 = m_util.norm(r1, bv_size); r1 %= r2; @@ -907,7 +907,7 @@ br_status bv_rewriter::mk_bv_urem_core(expr * arg1, expr * arg2, bool hi_div0, e result = m_util.mk_concat(2, args); return BR_REWRITE2; } - + result = m().mk_app(get_fid(), OP_BUREM_I, arg1, arg2); return BR_DONE; } @@ -921,7 +921,7 @@ br_status bv_rewriter::mk_bv_urem_core(expr * arg1, expr * arg2, bool hi_div0, e zero); return BR_REWRITE2; } - + // urem(x - 1, x) ==> ite(x = 0, urem0(x-1), x - 1) ==> ite(x = 0, urem0(-1), x - 1) expr * x; if (is_x_minus_one(arg1, x) && x == arg2) { @@ -942,7 +942,7 @@ br_status bv_rewriter::mk_bv_urem_core(expr * arg1, expr * arg2, bool hi_div0, e result = zero; return BR_DONE; } - + // urem(x - 1, x) --> x - 1 expr * x; if (is_x_minus_one(arg1, x) && x == arg2) { @@ -986,7 +986,7 @@ br_status bv_rewriter::mk_bv_smod_core(expr * arg1, expr * arg2, bool hi_div0, e result = arg1; return BR_DONE; } - + if (is_num1) { numeral abs_r1 = m_util.norm(abs(r1), bv_size); numeral abs_r2 = m_util.norm(abs(r2), bv_size); @@ -1012,7 +1012,7 @@ br_status bv_rewriter::mk_bv_smod_core(expr * arg1, expr * arg2, bool hi_div0, e return BR_REWRITE2; } } - + if (hi_div0) { result = m().mk_app(get_fid(), OP_BSMOD_I, arg1, arg2); return BR_DONE; @@ -1028,13 +1028,13 @@ br_status bv_rewriter::mk_bv_smod_core(expr * arg1, expr * arg2, bool hi_div0, e br_status bv_rewriter::mk_int2bv(unsigned bv_size, expr * arg, expr_ref & result) { numeral val; bool is_int; - + if (m_autil.is_numeral(arg, val, is_int)) { val = m_util.norm(val, bv_size); result = mk_numeral(val, bv_size); return BR_DONE; } - + // (int2bv (bv2int x)) --> x if (m_util.is_bv2int(arg) && bv_size == get_bv_size(to_app(arg)->get_arg(0))) { result = to_app(arg)->get_arg(0); @@ -1051,7 +1051,7 @@ br_status bv_rewriter::mk_bv2int(expr * arg, expr_ref & result) { result = m_autil.mk_numeral(v, true); return BR_DONE; } - + // TODO: add other simplifications return BR_FAILED; @@ -1068,7 +1068,7 @@ br_status bv_rewriter::mk_concat(unsigned num_args, expr * const * args, expr_re for (unsigned i = 0; i < num_args; i++) { expr * arg = args[i]; expr * prev = 0; - if (i > 0) + if (i > 0) prev = new_args.back(); if (is_numeral(arg, v1, sz1) && prev != 0 && is_numeral(prev, v2, sz2)) { v2 *= rational::power_of_two(sz1); @@ -1084,7 +1084,7 @@ br_status bv_rewriter::mk_concat(unsigned num_args, expr * const * args, expr_re } expanded = true; } - else if (m_util.is_extract(arg) && + else if (m_util.is_extract(arg) && prev != 0 && m_util.is_extract(prev) && to_app(arg)->get_arg(0) == to_app(prev)->get_arg(0) && @@ -1101,7 +1101,7 @@ br_status bv_rewriter::mk_concat(unsigned num_args, expr * const * args, expr_re new_args.push_back(arg); } } - if (!fused_numeral && !expanded && !fused_extract) + if (!fused_numeral && !expanded && !fused_extract) return BR_FAILED; SASSERT(!new_args.empty()); if (new_args.size() == 1) { @@ -1144,18 +1144,18 @@ br_status bv_rewriter::mk_sign_extend(unsigned n, expr * arg, expr_ref & result) result = mk_numeral(r, result_bv_size); return BR_DONE; } - + if (m_elim_sign_ext) { unsigned sz = get_bv_size(arg); expr * sign = m_mk_extract(sz-1, sz-1, arg); ptr_buffer args; - for (unsigned i = 0; i < n; i++) + for (unsigned i = 0; i < n; i++) args.push_back(sign); args.push_back(arg); result = m_util.mk_concat(args.size(), args.c_ptr()); return BR_REWRITE2; } - + return BR_FAILED; } @@ -1185,7 +1185,7 @@ br_status bv_rewriter::mk_bv_or(unsigned num, expr * const * args, expr_ref & re expr * arg = args[i]; if (m_util.is_bv_or(arg)) { unsigned num2 = to_app(arg)->get_num_args(); - for (unsigned j = 0; j < num2; j++) + for (unsigned j = 0; j < num2; j++) flat_args.push_back(to_app(arg)->get_arg(j)); } else { @@ -1244,12 +1244,12 @@ br_status bv_rewriter::mk_bv_or(unsigned num, expr * const * args, expr_ref & re result = mk_numeral(v1, sz); return BR_DONE; } - + // Simplifications of the form: // (bvor (concat x #x00) (concat #x00 y)) --> (concat x y) - if (new_args.size() == 2 && - num_coeffs == 0 && - m_util.is_concat(new_args[0]) && + if (new_args.size() == 2 && + num_coeffs == 0 && + m_util.is_concat(new_args[0]) && m_util.is_concat(new_args[1])) { app * concat1 = to_app(new_args[0]); app * concat2 = to_app(new_args[1]); @@ -1311,8 +1311,8 @@ br_status bv_rewriter::mk_bv_or(unsigned num, expr * const * args, expr_ref & re } std::reverse(exs.begin(), exs.end()); result = m_util.mk_concat(exs.size(), exs.c_ptr()); - TRACE("mask_bug", - tout << "(assert (distinct (bvor (_ bv" << old_v1 << " " << sz << ")\n" << mk_ismt2_pp(t, m()) << ")\n"; + TRACE("mask_bug", + tout << "(assert (distinct (bvor (_ bv" << old_v1 << " " << sz << ")\n" << mk_ismt2_pp(t, m()) << ")\n"; tout << mk_ismt2_pp(result, m()) << "))\n";); return BR_REWRITE2; } @@ -1324,7 +1324,7 @@ br_status bv_rewriter::mk_bv_or(unsigned num, expr * const * args, expr_ref & re if (!v1.is_zero()) { new_args.push_back(mk_numeral(v1, sz)); } - + switch (new_args.size()) { case 0: result = mk_numeral(0, sz); @@ -1354,7 +1354,7 @@ br_status bv_rewriter::mk_bv_xor(unsigned num, expr * const * args, expr_ref & r expr * arg = args[i]; if (m_util.is_bv_xor(arg)) { unsigned num2 = to_app(arg)->get_num_args(); - for (unsigned j = 0; j < num2; j++) + for (unsigned j = 0; j < num2; j++) flat_args.push_back(to_app(arg)->get_arg(j)); } else { @@ -1367,7 +1367,7 @@ br_status bv_rewriter::mk_bv_xor(unsigned num, expr * const * args, expr_ref & r args = flat_args.c_ptr(); } } - + expr_fast_mark1 pos_args; expr_fast_mark2 neg_args; bool merged = false; @@ -1380,7 +1380,7 @@ br_status bv_rewriter::mk_bv_xor(unsigned num, expr * const * args, expr_ref & r num_coeffs++; continue; } - + if (m_util.is_bv_not(arg)) { expr * atom = to_app(arg)->get_arg(0); if (neg_args.is_marked(atom)) { @@ -1411,14 +1411,14 @@ br_status bv_rewriter::mk_bv_xor(unsigned num, expr * const * args, expr_ref & r } } } - + // XOR is a mask // All arguments but one is a numeral. - // + // // Apply a transformation of the form: // // (bvxor a 0011) --> (concat ((_ extract 3 2) a) ((_ extract 1 0) (bvnot a))) - // + // if (!v1.is_zero() && num_coeffs == num - 1) { // find argument that is not a numeral expr * t = 0; @@ -1453,12 +1453,12 @@ br_status bv_rewriter::mk_bv_xor(unsigned num, expr * const * args, expr_ref & r } } std::reverse(exs.c_ptr(), exs.c_ptr() + exs.size()); - if (exs.size() == 1) + if (exs.size() == 1) result = exs[0]; else result = m_util.mk_concat(exs.size(), exs.c_ptr()); return BR_REWRITE3; - } + } if (!merged && !flattened && (num_coeffs == 0 || (num_coeffs == 1 && !v1.is_zero() && v1 != (rational::power_of_two(sz) - numeral(1)))) && (!m_bv_sort_ac || is_sorted(num, args))) @@ -1487,7 +1487,7 @@ br_status bv_rewriter::mk_bv_xor(unsigned num, expr * const * args, expr_ref & r pos_args.mark(arg, false); } } - + switch (new_args.size()) { case 0: result = mk_numeral(0, sz); @@ -1653,7 +1653,7 @@ br_status bv_rewriter::mk_bv_comp(expr * arg1, expr * arg2, expr_ref & result) { br_status bv_rewriter::mk_bv_add(unsigned num_args, expr * const * args, expr_ref & result) { br_status st = mk_add_core(num_args, args, result); - if (st != BR_FAILED && st != BR_DONE) + if (st != BR_FAILED && st != BR_DONE) return st; #if 0 expr * x; @@ -1673,14 +1673,14 @@ br_status bv_rewriter::mk_bv_add(unsigned num_args, expr * const * args, expr_re return st; if (!m_util.is_concat(y) && !is_numeral(y)) return st; - + unsigned sz = get_bv_size(x); - + for (unsigned i = 0; i < sz; i++) { if (!is_zero_bit(x,i) && !is_zero_bit(y,i)) return st; } - + result = m().mk_app(get_fid(), OP_BOR, x, y); return BR_REWRITE1; #else @@ -1747,7 +1747,7 @@ bool bv_rewriter::is_zero_bit(expr * x, unsigned idx) { br_status bv_rewriter::mk_bv_mul(unsigned num_args, expr * const * args, expr_ref & result) { br_status st = mk_mul_core(num_args, args, result); - if (st != BR_FAILED && st != BR_DONE) + if (st != BR_FAILED && st != BR_DONE) return st; expr * x; expr * y; @@ -1761,7 +1761,7 @@ br_status bv_rewriter::mk_bv_mul(unsigned num_args, expr * const * args, expr_re else { return st; } - + if (m_mul2concat) { numeral v; unsigned bv_size; @@ -1810,12 +1810,12 @@ br_status bv_rewriter::mk_bit2bool(expr * lhs, expr * rhs, expr_ref & result) { result = m().mk_eq(to_app(lhs)->get_arg(0), mk_numeral(numeral(1) - v, 1)); return BR_REWRITE1; } - + bool is_one = v.is_one(); expr_ref bit1(m()); bit1 = is_one ? rhs : mk_numeral(numeral(1), 1); - + if (m_util.is_bv_or(lhs)) { ptr_buffer new_args; unsigned num = to_app(lhs)->get_num_args(); @@ -1831,8 +1831,8 @@ br_status bv_rewriter::mk_bit2bool(expr * lhs, expr * rhs, expr_ref & result) { return BR_REWRITE3; } } - - + + if (m_util.is_bv_xor(lhs)) { ptr_buffer new_args; unsigned num = to_app(lhs)->get_num_args(); @@ -1849,7 +1849,7 @@ br_status bv_rewriter::mk_bit2bool(expr * lhs, expr * rhs, expr_ref & result) { return BR_REWRITE3; } } - + return BR_FAILED; } @@ -1861,14 +1861,14 @@ br_status bv_rewriter::mk_blast_eq_value(expr * lhs, expr * rhs, expr_ref & resu TRACE("blast_eq_value", tout << "sz: " << sz << "\n" << mk_ismt2_pp(lhs, m()) << "\n";); if (is_numeral(lhs)) std::swap(lhs, rhs); - + numeral v; if (!is_numeral(rhs, v, sz)) return BR_FAILED; if (!m_util.is_bv_or(lhs) && !m_util.is_bv_xor(lhs) && !m_util.is_bv_not(lhs)) return BR_FAILED; - + numeral two(2); ptr_buffer new_args; for (unsigned i = 0; i < sz; i++) { @@ -1888,7 +1888,7 @@ br_status bv_rewriter::mk_eq_concat(expr * lhs, expr * rhs, expr_ref & result) { if (m_util.is_concat(lhs)) { num1 = to_app(lhs)->get_num_args(); - args1 = to_app(lhs)->get_args(); + args1 = to_app(lhs)->get_args(); } else { num1 = 1; @@ -1897,7 +1897,7 @@ br_status bv_rewriter::mk_eq_concat(expr * lhs, expr * rhs, expr_ref & result) { if (m_util.is_concat(rhs)) { num2 = to_app(rhs)->get_num_args(); - args2 = to_app(rhs)->get_args(); + args2 = to_app(rhs)->get_args(); } else { num2 = 1; @@ -1930,7 +1930,7 @@ br_status bv_rewriter::mk_eq_concat(expr * lhs, expr * rhs, expr_ref & result) { new_eqs.push_back(m().mk_eq(m_mk_extract(sz1 - 1, low1, arg1), m_mk_extract(rsz1 + low2 - 1, low2, arg2))); low1 = 0; - low2 += rsz1; + low2 += rsz1; --i1; } else { @@ -1948,8 +1948,8 @@ br_status bv_rewriter::mk_eq_concat(expr * lhs, expr * rhs, expr_ref & result) { } bool bv_rewriter::is_concat_split_target(expr * t) const { - return - m_split_concat_eq || + return + m_split_concat_eq || m_util.is_concat(t) || m_util.is_numeral(t) || m_util.is_bv_or(t); @@ -1964,7 +1964,7 @@ void bv_rewriter::mk_t1_add_t2_eq_c(expr * t1, expr * t2, expr * c, expr_ref & r SASSERT(is_numeral(c)); if (is_minus_one_times_t(t1)) result = m().mk_eq(t2, m_util.mk_bv_sub(c, t1)); - else + else result = m().mk_eq(t1, m_util.mk_bv_sub(c, t2)); } @@ -2024,14 +2024,14 @@ bool bv_rewriter::has_numeral(app* a) const { } br_status bv_rewriter::mk_mul_eq(expr * lhs, expr * rhs, expr_ref & result) { - + expr * c, * x; numeral c_val, c_inv_val; unsigned sz; - if (m_util.is_bv_mul(lhs, c, x) && - m_util.is_numeral(c, c_val, sz) && + if (m_util.is_bv_mul(lhs, c, x) && + m_util.is_numeral(c, c_val, sz) && m_util.mult_inverse(c_val, sz, c_inv_val)) { - + SASSERT(m_util.norm(c_val * c_inv_val, sz).is_one()); numeral rhs_val; @@ -2048,7 +2048,7 @@ br_status bv_rewriter::mk_mul_eq(expr * lhs, expr * rhs, expr_ref & result) { if (m_util.is_bv_mul(rhs, c2, x2) && m_util.is_numeral(c2, c2_val, sz)) { // x = c_inv * c2 * x2 numeral new_c2 = m_util.norm(c_inv_val * c2_val, sz); - if (new_c2.is_one()) + if (new_c2.is_one()) result = m().mk_eq(x, x2); else result = m().mk_eq(x, m_util.mk_bv_mul(m_util.mk_numeral(c_inv_val * c2_val, sz), x2)); @@ -2077,7 +2077,7 @@ br_status bv_rewriter::mk_mul_eq(expr * lhs, expr * rhs, expr_ref & result) { } } if (found) { - result = m().mk_eq(m_util.mk_numeral(c2_inv_val*c_val, sz), + result = m().mk_eq(m_util.mk_numeral(c2_inv_val*c_val, sz), m_util.mk_bv_mul(m_util.mk_numeral(c2_inv_val, sz), rhs)); return BR_REWRITE3; } @@ -2095,7 +2095,7 @@ br_status bv_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) { result = m().mk_false(); return BR_DONE; } - + bool swapped = false; if (is_numeral(lhs)) { swapped = true; @@ -2120,7 +2120,7 @@ br_status bv_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) { TRACE("mk_mul_eq", tout << mk_ismt2_pp(lhs, m()) << "\n=\n" << mk_ismt2_pp(rhs, m()) << "\n----->\n" << mk_ismt2_pp(result,m()) << "\n";); return st; } - + if (m_blast_eq_value) { st = mk_blast_eq_value(lhs, rhs, result); if (st != BR_FAILED) @@ -2142,10 +2142,10 @@ br_status bv_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) { new_lhs = lhs; new_rhs = rhs; } - + lhs = new_lhs; rhs = new_rhs; - // Try to rewrite t1 + t2 = c --> t1 = c - t2 + // Try to rewrite t1 + t2 = c --> t1 = c - t2 // Reason: it is much cheaper to bit-blast. if (isolate_term(lhs, rhs, result)) { return BR_REWRITE2; @@ -2155,7 +2155,7 @@ br_status bv_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) { } if (st != BR_FAILED) { - result = m().mk_eq(lhs, rhs); + result = m().mk_eq(lhs, rhs); return BR_DONE; } } From b87f4ca6772093f3130b67f37a02f4858c2de47b Mon Sep 17 00:00:00 2001 From: "Christoph M. Wintersteiger" Date: Fri, 5 Feb 2016 13:48:05 +0000 Subject: [PATCH 03/11] whitespace --- src/ast/bv_decl_plugin.h | 52 ++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/ast/bv_decl_plugin.h b/src/ast/bv_decl_plugin.h index eea4f46d6..756ff1ed4 100644 --- a/src/ast/bv_decl_plugin.h +++ b/src/ast/bv_decl_plugin.h @@ -33,7 +33,7 @@ enum bv_op_kind { OP_BADD, OP_BSUB, OP_BMUL, - + OP_BSDIV, OP_BUDIV, OP_BSREM, @@ -41,20 +41,20 @@ enum bv_op_kind { OP_BSMOD, // special functions to record the division by 0 cases - // these are internal functions - OP_BSDIV0, + // these are internal functions + OP_BSDIV0, OP_BUDIV0, OP_BSREM0, OP_BUREM0, OP_BSMOD0, // special functions where division by 0 has a fixed interpretation. - OP_BSDIV_I, + OP_BSDIV_I, OP_BUDIV_I, OP_BSREM_I, OP_BUREM_I, OP_BSMOD_I, - + OP_ULEQ, OP_SLEQ, OP_UGEQ, @@ -95,7 +95,7 @@ enum bv_op_kind { OP_BSMUL_NO_UDFL, // no signed multiplication underflow predicate OP_BIT2BOOL, // predicate - OP_MKBV, // bools to bv + OP_MKBV, // bools to bv OP_INT2BV, OP_BV2INT, @@ -176,7 +176,7 @@ protected: ptr_vector m_bv_slt; ptr_vector m_bv_ugt; ptr_vector m_bv_sgt; - + ptr_vector m_bv_and; ptr_vector m_bv_or; ptr_vector m_bv_not; @@ -184,7 +184,7 @@ protected: ptr_vector m_bv_nand; ptr_vector m_bv_nor; ptr_vector m_bv_xnor; - + ptr_vector m_bv_redor; ptr_vector m_bv_redand; ptr_vector m_bv_comp; @@ -203,7 +203,7 @@ protected: ptr_vector m_int2bv; vector > m_bit2bool; ptr_vector m_mkbv; - + virtual void set_manager(ast_manager * m, family_id id); void mk_bv_sort(unsigned bv_size); sort * get_bv_sort(unsigned bv_size); @@ -218,9 +218,9 @@ protected: bool get_bv_size(sort * t, int & result); bool get_bv_size(expr * t, int & result); bool get_concat_size(unsigned arity, sort * const * domain, int & result); - bool get_extend_size(unsigned num_parameters, parameter const * parameters, + bool get_extend_size(unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, int & result); - bool get_extract_size(unsigned num_parameters, parameter const * parameters, + bool get_extract_size(unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, int & result); func_decl * mk_bv2int(unsigned bv_size, unsigned num_parameters, parameter const * parameters, @@ -229,13 +229,13 @@ protected: func_decl * mk_int2bv(unsigned bv_size, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain); - func_decl * mk_bit2bool(unsigned bv_size, unsigned num_parameters, parameter const * parameters, + func_decl * mk_bit2bool(unsigned bv_size, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain); func_decl * mk_mkbv(unsigned arity, sort * const * domain); bool get_int2bv_size(unsigned num_parameters, parameter const * parameters, int & result); - + func_decl * mk_num_decl(unsigned num_parameters, parameter const * parameters, unsigned arity); void get_offset_term(app * a, expr * & t, rational & offset) const; @@ -248,23 +248,23 @@ public: virtual decl_plugin * mk_fresh() { return alloc(bv_decl_plugin); } virtual sort * mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters); - - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range); - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned num_args, expr * const * args, sort * range); virtual bool is_value(app * e) const; - + virtual bool is_unique_value(app * e) const { return is_value(e); } virtual void get_op_names(svector & op_names, symbol const & logic); virtual void get_sort_names(svector & sort_names, symbol const & logic); - + virtual bool are_distinct(app* a, app* b) const; - + virtual expr * get_some_value(sort * s); }; @@ -282,7 +282,7 @@ public: bool is_zero(expr const * e) const; bool is_bv_sort(sort const * s) const; bool is_bv(expr const* e) const { return is_bv_sort(get_sort(e)); } - + bool is_concat(expr const * e) const { return is_app_of(e, get_fid(), OP_CONCAT); } bool is_extract(func_decl const * f) const { return is_decl_of(f, get_fid(), OP_EXTRACT); } bool is_extract(expr const * e) const { return is_app_of(e, get_fid(), OP_EXTRACT); } @@ -353,7 +353,7 @@ public: rational norm(rational const & val, unsigned bv_size) const { return norm(val, bv_size, false); } bool has_sign_bit(rational const & n, unsigned bv_size) const; bool mult_inverse(rational const & n, unsigned bv_size, rational & result); - + }; class bv_util : public bv_recognizers { @@ -369,8 +369,8 @@ public: app * mk_numeral(rational const & val, unsigned bv_size); app * mk_numeral(uint64 u, unsigned bv_size) { return mk_numeral(rational(u, rational::ui64()), bv_size); } sort * mk_sort(unsigned bv_size); - - unsigned get_bv_size(sort const * s) const { + + unsigned get_bv_size(sort const * s) const { SASSERT(is_bv_sort(s)); return static_cast(s->get_parameter(0).get_int()); } @@ -393,11 +393,11 @@ public: app * mk_bv_add(expr * arg1, expr * arg2) { return m_manager.mk_app(get_fid(), OP_BADD, arg1, arg2); } app * mk_bv_sub(expr * arg1, expr * arg2) { return m_manager.mk_app(get_fid(), OP_BSUB, arg1, arg2); } app * mk_bv_mul(expr * arg1, expr * arg2) { return m_manager.mk_app(get_fid(), OP_BMUL, arg1, arg2); } - app * mk_zero_extend(unsigned n, expr* e) { + app * mk_zero_extend(unsigned n, expr* e) { parameter p(n); return m_manager.mk_app(get_fid(), OP_ZERO_EXT, 1, &p, 1, &e); } - app * mk_sign_extend(unsigned n, expr* e) { + app * mk_sign_extend(unsigned n, expr* e) { parameter p(n); return m_manager.mk_app(get_fid(), OP_SIGN_EXT, 1, &p, 1, &e); } @@ -413,6 +413,6 @@ public: app * mk_bv(unsigned n, expr* const* es) { return m_manager.mk_app(get_fid(), OP_MKBV, n, es); } }; - + #endif /* BV_DECL_PLUGIN_H_ */ From 88f007e9da0c044cbaa34e383a6e1e545f222285 Mon Sep 17 00:00:00 2001 From: "Christoph M. Wintersteiger" Date: Fri, 5 Feb 2016 13:48:47 +0000 Subject: [PATCH 04/11] whitespace --- src/model/model_evaluator.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/model/model_evaluator.cpp b/src/model/model_evaluator.cpp index 7488e6b18..a565ea5ac 100644 --- a/src/model/model_evaluator.cpp +++ b/src/model/model_evaluator.cpp @@ -49,9 +49,9 @@ struct evaluator_cfg : public default_rewriter_cfg { evaluator_cfg(ast_manager & m, model & md, params_ref const & p): m_model(md), m_b_rw(m), - // We must allow customers to set parameters for arithmetic rewriter/evaluator. + // We must allow customers to set parameters for arithmetic rewriter/evaluator. // In particular, the maximum degree of algebraic numbers that will be evaluated. - m_a_rw(m, p), + m_a_rw(m, p), m_bv_rw(m), // See comment above. We want to allow customers to set :sort-store m_ar_rw(m, p), @@ -73,7 +73,7 @@ struct evaluator_cfg : public default_rewriter_cfg { m_model_completion = p.completion(); m_cache = p.cache(); } - + ast_manager & m() const { return m_model.get_manager(); } bool evaluate(func_decl* f, unsigned num, expr * const * args, expr_ref & result) { @@ -89,11 +89,11 @@ struct evaluator_cfg : public default_rewriter_cfg { SASSERT(fi->get_arity() == num); bool actuals_are_values = true; - + for (unsigned i = 0; actuals_are_values && i < num; i++) { actuals_are_values = m().is_value(args[i]); } - + if (!actuals_are_values) return false; // let get_macro handle it @@ -115,7 +115,7 @@ struct evaluator_cfg : public default_rewriter_cfg { result = val; return BR_DONE; } - + if (m_model_completion) { sort * s = f->get_range(); expr * val = m_model.get_some_value(s); @@ -154,7 +154,7 @@ struct evaluator_cfg : public default_rewriter_cfg { st = m_a_rw.mk_app_core(f, num, args, result); else if (fid == m_bv_rw.get_fid()) st = m_bv_rw.mk_app_core(f, num, args, result); - else if (fid == m_ar_rw.get_fid()) + else if (fid == m_ar_rw.get_fid()) st = m_ar_rw.mk_app_core(f, num, args, result); else if (fid == m_dt_rw.get_fid()) st = m_dt_rw.mk_app_core(f, num, args, result); @@ -180,9 +180,9 @@ struct evaluator_cfg : public default_rewriter_cfg { return st; } - bool get_macro(func_decl * f, expr * & def, quantifier * & q, proof * & def_pr) { + bool get_macro(func_decl * f, expr * & def, quantifier * & q, proof * & def_pr) { - func_interp * fi = m_model.get_func_interp(f); + func_interp * fi = m_model.get_func_interp(f); if (fi != 0) { if (fi->is_partial()) { if (m_model_completion) { @@ -193,7 +193,7 @@ struct evaluator_cfg : public default_rewriter_cfg { else { return false; } - } + } def = fi->get_interp(); SASSERT(def != 0); return true; @@ -211,8 +211,8 @@ struct evaluator_cfg : public default_rewriter_cfg { return false; } - - bool max_steps_exceeded(unsigned num_steps) const { + + bool max_steps_exceeded(unsigned num_steps) const { cooperate("model evaluator"); if (memory::get_allocation_size() > m_max_memory) throw rewriter_exception(Z3_MAX_MEMORY_MSG); @@ -228,7 +228,7 @@ template class rewriter_tpl; struct model_evaluator::imp : public rewriter_tpl { evaluator_cfg m_cfg; imp(model & md, params_ref const & p): - rewriter_tpl(md.get_manager(), + rewriter_tpl(md.get_manager(), false, // no proofs for evaluator m_cfg), m_cfg(md.get_manager(), md, p) { From bb5118acbb9e9c74953a463601389ed635d874c8 Mon Sep 17 00:00:00 2001 From: "Christoph M. Wintersteiger" Date: Fri, 5 Feb 2016 13:53:35 +0000 Subject: [PATCH 05/11] Bugfix for bv*div0 model construction. --- src/ast/bv_decl_plugin.h | 15 +++++++++++++++ src/ast/rewriter/bv_rewriter.cpp | 6 +++--- src/ast/rewriter/bv_rewriter.h | 6 ++++-- src/model/model_evaluator.cpp | 6 +++++- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/ast/bv_decl_plugin.h b/src/ast/bv_decl_plugin.h index 756ff1ed4..a4a0b1f57 100644 --- a/src/ast/bv_decl_plugin.h +++ b/src/ast/bv_decl_plugin.h @@ -354,6 +354,21 @@ public: bool has_sign_bit(rational const & n, unsigned bv_size) const; bool mult_inverse(rational const & n, unsigned bv_size, rational & result); + bool is_considered_uninterpreted(func_decl * f) { + if (f->get_family_id() != get_family_id()) + return false; + switch (f->get_decl_kind()) { + case OP_BSDIV0: + case OP_BUDIV0: + case OP_BSREM0: + case OP_BUREM0: + case OP_BSMOD0: + return true; + default: + return false; + } + return false; + } }; class bv_util : public bv_recognizers { diff --git a/src/ast/rewriter/bv_rewriter.cpp b/src/ast/rewriter/bv_rewriter.cpp index a45f20d9e..ca55db38f 100644 --- a/src/ast/rewriter/bv_rewriter.cpp +++ b/src/ast/rewriter/bv_rewriter.cpp @@ -694,7 +694,7 @@ br_status bv_rewriter::mk_bv_sdiv_core(expr * arg1, expr * arg2, bool hi_div0, e if (r2.is_zero()) { if (!hi_div0) { result = m().mk_app(get_fid(), OP_BSDIV0, arg1); - return BR_DONE; + return BR_REWRITE1; } else { // The "hardware interpretation" for (bvsdiv x 0) is (ite (bvslt x #x0000) #x0001 #xffff) @@ -745,7 +745,7 @@ br_status bv_rewriter::mk_bv_udiv_core(expr * arg1, expr * arg2, bool hi_div0, e if (r2.is_zero()) { if (!hi_div0) { result = m().mk_app(get_fid(), OP_BUDIV0, arg1); - return BR_DONE; + return BR_REWRITE1; } else { // The "hardware interpretation" for (bvudiv x 0) is #xffff @@ -808,7 +808,7 @@ br_status bv_rewriter::mk_bv_srem_core(expr * arg1, expr * arg2, bool hi_div0, e if (r2.is_zero()) { if (!hi_div0) { result = m().mk_app(get_fid(), OP_BSREM0, arg1); - return BR_DONE; + return BR_REWRITE1; } else { // The "hardware interpretation" for (bvsrem x 0) is x diff --git a/src/ast/rewriter/bv_rewriter.h b/src/ast/rewriter/bv_rewriter.h index 78d3fb4f1..f01743ca9 100644 --- a/src/ast/rewriter/bv_rewriter.h +++ b/src/ast/rewriter/bv_rewriter.h @@ -155,7 +155,7 @@ public: void updt_params(params_ref const & p); static void get_param_descrs(param_descrs & r); - + void set_mkbv2num(bool f) { m_mkbv2num = f; } unsigned get_bv_size(expr * t) const {return m_util.get_bv_size(t); } @@ -164,7 +164,7 @@ public: bool is_bv(expr * t) const { return m_util.is_bv(t); } expr * mk_numeral(numeral const & v, unsigned sz) { return m_util.mk_numeral(v, sz); } expr * mk_numeral(unsigned v, unsigned sz) { return m_util.mk_numeral(numeral(v), sz); } - + br_status mk_app_core(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result); void mk_app(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result) { if (mk_app_core(f, num_args, args, result) == BR_FAILED) @@ -174,6 +174,8 @@ public: br_status mk_eq_core(expr * lhs, expr * rhs, expr_ref & result); bool hi_div0() const { return m_hi_div0; } + + bv_util & get_util() { return m_util; } }; #endif diff --git a/src/model/model_evaluator.cpp b/src/model/model_evaluator.cpp index a565ea5ac..366678cf8 100644 --- a/src/model/model_evaluator.cpp +++ b/src/model/model_evaluator.cpp @@ -181,6 +181,7 @@ struct evaluator_cfg : public default_rewriter_cfg { } bool get_macro(func_decl * f, expr * & def, quantifier * & q, proof * & def_pr) { + TRACE("model_evaluator", tout << "get_macro for " << f->get_name() << " (model completion: " << m_model_completion << ")\n";); func_interp * fi = m_model.get_func_interp(f); if (fi != 0) { @@ -199,7 +200,10 @@ struct evaluator_cfg : public default_rewriter_cfg { return true; } - if (f->get_family_id() == null_family_id && m_model_completion) { + if (m_model_completion && + (f->get_family_id() == null_family_id || + m_bv_rw.get_util().is_considered_uninterpreted(f))) + { sort * s = f->get_range(); expr * val = m_model.get_some_value(s); func_interp * new_fi = alloc(func_interp, m(), f->get_arity()); From 6112ea2ec7bf28c738aaba709629defc777596d4 Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Fri, 5 Feb 2016 14:38:41 +0000 Subject: [PATCH 06/11] Fix typo --- scripts/mk_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mk_util.py b/scripts/mk_util.py index 3ca0012e7..6db45d970 100644 --- a/scripts/mk_util.py +++ b/scripts/mk_util.py @@ -596,7 +596,7 @@ def display_help(exit_code): else: print(" --parallel=num use cl option /MP with 'num' parallel processes") print(" --pypkgdir= Force a particular Python package directory (default %s)" % PYTHON_PACKAGE_DIR) - print(" -b , --build= subdirectory where Z3 will be built (default: build).") + print(" -b , --build= subdirectory where Z3 will be built (default: build).") print(" --githash=hash include the given hash in the binaries.") print(" -d, --debug compile Z3 in debug mode.") print(" -t, --trace enable tracing in release mode.") From 33f676ef6b7d8b5dfc58607319849cdf101c2457 Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Fri, 5 Feb 2016 14:39:27 +0000 Subject: [PATCH 07/11] Do not hardcode default build directory name. --- scripts/mk_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mk_util.py b/scripts/mk_util.py index 6db45d970..1e940ad13 100644 --- a/scripts/mk_util.py +++ b/scripts/mk_util.py @@ -596,7 +596,7 @@ def display_help(exit_code): else: print(" --parallel=num use cl option /MP with 'num' parallel processes") print(" --pypkgdir= Force a particular Python package directory (default %s)" % PYTHON_PACKAGE_DIR) - print(" -b , --build= subdirectory where Z3 will be built (default: build).") + print(" -b , --build= subdirectory where Z3 will be built (default: %s)." % BUILD_DIR) print(" --githash=hash include the given hash in the binaries.") print(" -d, --debug compile Z3 in debug mode.") print(" -t, --trace enable tracing in release mode.") From 508d2e32c8fc228e010e0b02d269c9df1d97f69c Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Fri, 5 Feb 2016 14:51:15 +0000 Subject: [PATCH 08/11] Fix a bug in Python build scripts where an extra ending slash in the build directory would cause REV_BUILD_DIR to be set incorrectly and would lead to a broken Makefile being generated. What would happen before: ``` $ python scripts/mk_make.py --build FOO_1 ... REV_BUILD_DIR='..' ``` ``` $ python scripts/mk_make.py --build FOO_1/ ... REV_BUILD_DIR='../..' ``` ^^^^^ that's wrong. It should be REV_BUILD_DIR='..' To fix this the ``reverse_path()`` function has been taught to ignore empty components in ``p.split(os.sep)``. --- scripts/mk_util.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/mk_util.py b/scripts/mk_util.py index 1e940ad13..53f891d28 100644 --- a/scripts/mk_util.py +++ b/scripts/mk_util.py @@ -742,7 +742,8 @@ def extract_c_includes(fname): # Given a path dir1/subdir2/subdir3 returns ../../.. def reverse_path(p): - l = p.split(os.sep) + # Filter out empty components (e.g. will have one if path ends in a slash) + l = list(filter(lambda x: len(x) > 0, p.split(os.sep))) n = len(l) r = '..' for i in range(1, n): From c11b6d90cefe176a3e97de61eb9111e80ffd00b5 Mon Sep 17 00:00:00 2001 From: "Christoph M. Wintersteiger" Date: Fri, 5 Feb 2016 15:16:19 +0000 Subject: [PATCH 09/11] whitespace --- src/ast/ast.h | 490 +++++++++++++++++++++++++------------------------- 1 file changed, 245 insertions(+), 245 deletions(-) diff --git a/src/ast/ast.h b/src/ast/ast.h index 0c058fce8..77dd68372 100644 --- a/src/ast/ast.h +++ b/src/ast/ast.h @@ -93,7 +93,7 @@ public: // PARAM_EXTERNAL is not supported by z3 low level input format. This format is legacy, so // this is not a big problem. // Remark: PARAM_EXTERNAL can only be used to decorate theory decls. - PARAM_EXTERNAL + PARAM_EXTERNAL }; private: kind_t m_kind; @@ -123,7 +123,7 @@ public: ~parameter(); parameter& operator=(parameter const& other); - + kind_t get_kind() const { return m_kind; } bool is_int() const { return m_kind == PARAM_INT; } bool is_ast() const { return m_kind == PARAM_AST; } @@ -131,7 +131,7 @@ public: bool is_rational() const { return m_kind == PARAM_RATIONAL; } bool is_double() const { return m_kind == PARAM_DOUBLE; } bool is_external() const { return m_kind == PARAM_EXTERNAL; } - + bool is_int(int & i) const { return is_int() && (i = get_int(), true); } bool is_ast(ast * & a) const { return is_ast() && (a = get_ast(), true); } bool is_symbol(symbol & s) const { return is_symbol() && (s = get_symbol(), true); } @@ -150,7 +150,7 @@ public: deleted. */ void del_eh(ast_manager & m, family_id fid); - + int get_int() const { SASSERT(is_int()); return m_int; } ast * get_ast() const { SASSERT(is_ast()); return m_ast; } symbol const & get_symbol() const { SASSERT(is_symbol()); return *(reinterpret_cast(m_symbol)); } @@ -162,7 +162,7 @@ public: bool operator!=(parameter const & p) const { return !operator==(p); } unsigned hash() const; - + std::ostream& display(std::ostream& out) const; }; @@ -192,7 +192,7 @@ public: /** \brief Return the family_id for s, a new id is created if !has_family(s) - + If has_family(s), then this method is equivalent to get_family_id(s) */ family_id mk_family_id(symbol const & s); @@ -201,11 +201,11 @@ public: \brief Return the family_id for s, return null_family_id if s was not registered in the manager. */ family_id get_family_id(symbol const & s) const; - + bool has_family(symbol const & s) const; void get_dom(svector& dom) const { m_families.get_dom(dom); } - + void get_range(svector & range) const { m_families.get_range(range); } symbol const & get_name(family_id fid) const { return fid >= 0 && fid < static_cast(m_names.size()) ? m_names[fid] : symbol::null; } @@ -220,15 +220,15 @@ public: // ----------------------------------- /** - \brief Each interpreted function declaration or sort has a kind. + \brief Each interpreted function declaration or sort has a kind. Kinds are used to identify interpreted functions and sorts in a family. */ -typedef int decl_kind; +typedef int decl_kind; const decl_kind null_decl_kind = -1; /** - \brief Interpreted function declarations and sorts are associated with - a family id, kind, and parameters. + \brief Interpreted function declarations and sorts are associated with + a family id, kind, and parameters. */ class decl_info { family_id m_family_id; @@ -236,22 +236,22 @@ class decl_info { vector m_parameters; public: bool m_private_parameters; - decl_info(family_id family_id = null_family_id, decl_kind k = null_decl_kind, + decl_info(family_id family_id = null_family_id, decl_kind k = null_decl_kind, unsigned num_parameters = 0, parameter const * parameters = 0, bool private_params = false); decl_info(decl_info const& other); ~decl_info() {} - + void init_eh(ast_manager & m); void del_eh(ast_manager & m); - + family_id get_family_id() const { return m_family_id; } decl_kind get_decl_kind() const { return m_kind; } unsigned get_num_parameters() const { return m_parameters.size(); } parameter const & get_parameter(unsigned idx) const { return m_parameters[idx]; } parameter const * get_parameters() const { return m_parameters.begin(); } bool private_parameters() const { return m_private_parameters; } - + unsigned hash() const; bool operator==(decl_info const & info) const; }; @@ -274,7 +274,7 @@ class sort_size { // number of elements precisely (e.g., arrays). In this // cases, we mark the sort as too big. That is, the number // of elements is at least bigger than 2^64. - SS_FINITE_VERY_BIG, + SS_FINITE_VERY_BIG, SS_INFINITE } m_kind; uint64 m_size; // It is only meaningful if m_kind == SS_FINITE @@ -296,13 +296,13 @@ public: static sort_size mk_infinite() { return sort_size(SS_INFINITE, 0); } static sort_size mk_very_big() { return sort_size(SS_FINITE_VERY_BIG, 0); } static sort_size mk_finite(uint64 r) { return sort_size(SS_FINITE, r); } - + bool is_infinite() const { return m_kind == SS_INFINITE; } bool is_very_big() const { return m_kind == SS_FINITE_VERY_BIG; } bool is_finite() const { return m_kind == SS_FINITE; } - + static bool is_very_big_base2(unsigned power) { return power >= 64; } - + uint64 size() const { SASSERT(is_finite()); return m_size; } }; @@ -320,16 +320,16 @@ std::ostream& operator<<(std::ostream& out, sort_size const & ss); class sort_info : public decl_info { sort_size m_num_elements; public: - sort_info(family_id family_id = null_family_id, decl_kind k = null_decl_kind, + sort_info(family_id family_id = null_family_id, decl_kind k = null_decl_kind, unsigned num_parameters = 0, parameter const * parameters = 0, bool private_parameters = false): decl_info(family_id, k, num_parameters, parameters, private_parameters) { } - + sort_info(family_id family_id, decl_kind k, uint64 num_elements, unsigned num_parameters = 0, parameter const * parameters = 0, bool private_parameters = false): decl_info(family_id, k, num_parameters, parameters, private_parameters), m_num_elements(num_elements) { } - + sort_info(family_id family_id, decl_kind k, sort_size const& num_elements, unsigned num_parameters = 0, parameter const * parameters = 0, bool private_parameters = false): decl_info(family_id, k, num_parameters, parameters, private_parameters), m_num_elements(num_elements) { @@ -337,7 +337,7 @@ public: sort_info(sort_info const& other) : decl_info(other), m_num_elements(other.m_num_elements) { } ~sort_info() {} - + bool is_infinite() const { return m_num_elements.is_infinite(); } bool is_very_big() const { return m_num_elements.is_very_big(); } sort_size const & get_num_elements() const { return m_num_elements; } @@ -367,7 +367,7 @@ struct func_decl_info : public decl_info { func_decl_info(family_id family_id = null_family_id, decl_kind k = null_decl_kind, unsigned num_parameters = 0, parameter const * parameters = 0); ~func_decl_info() {} - + bool is_associative() const { return m_left_assoc && m_right_assoc; } bool is_left_associative() const { return m_left_assoc; } bool is_right_associative() const { return m_right_assoc; } @@ -394,8 +394,8 @@ struct func_decl_info : public decl_info { // Return true if the func_decl_info is equivalent to the null one (i.e., it does not contain any useful info). bool is_null() const { - return - get_family_id() == null_family_id && !is_left_associative() && !is_right_associative() && !is_commutative() && + return + get_family_id() == null_family_id && !is_left_associative() && !is_right_associative() && !is_commutative() && !is_chainable() && !is_pairwise() && !is_injective() && !is_idempotent() && !is_skolem(); } }; @@ -416,7 +416,7 @@ class shared_occs_mark; class ast { protected: friend class ast_manager; - + unsigned m_id; unsigned m_kind:16; // Warning: the marks should be used carefully, since they are shared. @@ -428,10 +428,10 @@ protected: // So, it is only safe to use mark by "self-contained" code. // They should be viewed as temporary information. // - The functor shared_occs is used by some AST pretty printers. - // - So, a code that uses marks could not use the pretty printer if + // - So, a code that uses marks could not use the pretty printer if // shared_occs used one of the public marks. // - This was a constant source of assertion violations. - unsigned m_mark_shared_occs:1; + unsigned m_mark_shared_occs:1; friend class shared_occs_mark; void mark_so(bool flag) { m_mark_shared_occs = flag; } void reset_mark_so() { m_mark_shared_occs = false; } @@ -442,18 +442,18 @@ protected: // In debug mode, we store who is the owner of the mark. void * m_mark1_owner; void * m_mark2_owner; -#endif +#endif - void inc_ref() { + void inc_ref() { SASSERT(m_ref_count < UINT_MAX); - m_ref_count ++; + m_ref_count ++; } - - void dec_ref() { - SASSERT(m_ref_count > 0); - m_ref_count --; + + void dec_ref() { + SASSERT(m_ref_count > 0); + m_ref_count --; } - + ast(ast_kind k):m_id(UINT_MAX), m_kind(k), m_mark1(false), m_mark2(false), m_mark_shared_occs(false), m_ref_count(0) { DEBUG_CODE({ m_mark1_owner = 0; @@ -521,7 +521,7 @@ public: // ----------------------------------- /** - The ids of expressions and declarations are in different ranges. + The ids of expressions and declarations are in different ranges. */ const unsigned c_first_decl_id = (1u << 31u); @@ -556,9 +556,9 @@ public: class sort : public decl { friend class ast_manager; - + static unsigned get_obj_size() { return sizeof(sort); } - + sort(symbol const & name, sort_info * info):decl(AST_SORT, name, info) {} public: sort_info * get_info() const { return static_cast(m_info); } @@ -577,13 +577,13 @@ public: class func_decl : public decl { friend class ast_manager; - + unsigned m_arity; sort * m_range; sort * m_domain[0]; - - static unsigned get_obj_size(unsigned arity) { return sizeof(func_decl) + arity * sizeof(sort *); } - + + static unsigned get_obj_size(unsigned arity) { return sizeof(func_decl) + arity * sizeof(sort *); } + func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, func_decl_info * info); public: func_decl_info * get_info() const { return static_cast(m_info); } @@ -616,7 +616,7 @@ public: class expr : public ast { protected: friend class ast_manager; - + expr(ast_kind k):ast(k) {} public: }; @@ -641,20 +641,20 @@ struct app_flags { class app : public expr { friend class ast_manager; - + func_decl * m_decl; unsigned m_num_args; expr * m_args[0]; - + static app_flags g_constant_flags; - + // remark: store term depth in the end of the app. the depth is only stored if the num_args > 0 - static unsigned get_obj_size(unsigned num_args) { - return num_args == 0 ? sizeof(app) : sizeof(app) + num_args * sizeof(expr *) + sizeof(app_flags); - } + static unsigned get_obj_size(unsigned num_args) { + return num_args == 0 ? sizeof(app) : sizeof(app) + num_args * sizeof(expr *) + sizeof(app_flags); + } friend class tmp_app; - + app_flags * flags() const { return m_num_args == 0 ? &g_constant_flags : reinterpret_cast(const_cast(m_args + m_num_args)); } app(func_decl * decl, unsigned num_args, expr * const * args); @@ -706,11 +706,11 @@ public: expr ** get_args() { return get_app()->m_args; } - + void set_decl(func_decl * d) { get_app()->m_decl = d; } - + void set_num_args(unsigned num_args) { get_app()->m_num_args = num_args; } @@ -746,12 +746,12 @@ public: class var : public expr { friend class ast_manager; - + unsigned m_idx; sort * m_sort; - + static unsigned get_obj_size() { return sizeof(var); } - + var(unsigned idx, sort * s):expr(AST_VAR), m_idx(idx), m_sort(s) {} public: unsigned get_idx() const { return m_idx; } @@ -775,13 +775,13 @@ class quantifier : public expr { int m_weight; bool m_has_unused_vars; bool m_has_labels; - symbol m_qid; - symbol m_skid; + symbol m_qid; + symbol m_skid; unsigned m_num_patterns; unsigned m_num_no_patterns; char m_patterns_decls[0]; - - static unsigned get_obj_size(unsigned num_decls, unsigned num_patterns, unsigned num_no_patterns) { + + static unsigned get_obj_size(unsigned num_decls, unsigned num_patterns, unsigned num_no_patterns) { return sizeof(quantifier) + num_decls * (sizeof(sort *) + sizeof(symbol)) + (num_patterns + num_no_patterns) * sizeof(expr*); } @@ -811,7 +811,7 @@ public: expr * get_no_pattern(unsigned idx) const { return get_no_patterns()[idx]; } bool has_patterns() const { return m_num_patterns > 0 || m_num_no_patterns > 0; } unsigned get_size() const { return get_obj_size(m_num_decls, m_num_patterns, m_num_no_patterns); } - + bool may_have_unused_vars() const { return m_has_unused_vars; } void set_no_unused_vars() { m_has_unused_vars = false; } @@ -884,8 +884,8 @@ unsigned get_decl_hash(unsigned sz, func_decl* const* ns, unsigned init); // This is the internal comparison functor for hash-consing AST nodes. struct ast_eq_proc { - bool operator()(ast const * n1, ast const * n2) const { - return n1->hash() == n2->hash() && compare_nodes(n1, n2); + bool operator()(ast const * n1, ast const * n2) const { + return n1->hash() == n2->hash() && compare_nodes(n1, n2); } }; @@ -917,18 +917,18 @@ class decl_plugin { protected: ast_manager * m_manager; family_id m_family_id; - + virtual void set_manager(ast_manager * m, family_id id) { SASSERT(m_manager == 0); m_manager = m; m_family_id = id; } - + friend class ast_manager; - + public: decl_plugin():m_manager(0), m_family_id(null_family_id) {} - + virtual ~decl_plugin() {} virtual void finalize() {} @@ -936,24 +936,24 @@ public: virtual decl_plugin * mk_fresh() = 0; family_id get_family_id() const { return m_family_id; } - + virtual sort * mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters) = 0; - - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range) = 0; - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const* parameters, + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const* parameters, unsigned num_args, expr * const * args, sort * range); /** \brief Return true if the plugin can decide whether two interpreted constants are equal or not. - + For all a, b: If is_value(a) and is_value(b) Then, are_equal(a, b) != are_distinct(a, b) - + The may be much more expensive than checking a pointer. We need this because some plugin values are too expensive too canonize. @@ -963,7 +963,7 @@ public: /** \brief Return true if \c a is a unique plugin value. The following property should hold for unique theory values: - + For all a, b: If is_unique_value(a) and is_unique_value(b) Then, @@ -976,11 +976,11 @@ public: virtual bool is_unique_value(app * a) const { return false; } virtual bool are_equal(app * a, app * b) const { return a == b && is_unique_value(a) && is_unique_value(b); } - + virtual bool are_distinct(app * a, app * b) const { return a != b && is_unique_value(a) && is_unique_value(b); } - + virtual void get_op_names(svector & op_names, symbol const & logic = symbol()) {} - + virtual void get_sort_names(svector & sort_names, symbol const & logic = symbol()) {} virtual expr * get_some_value(sort * s) { return 0; } @@ -989,7 +989,7 @@ public: // This may be the case, for example, for array and datatype sorts. virtual bool is_fully_interp(sort const * s) const { return true; } - // Event handlers for deleting/translating PARAM_EXTERNAL + // Event handlers for deleting/translating PARAM_EXTERNAL virtual void del(parameter const & p) {} virtual parameter translate(parameter const & p, decl_plugin & target) { UNREACHABLE(); return p; } }; @@ -1009,12 +1009,12 @@ enum basic_op_kind { OP_TRUE, OP_FALSE, OP_EQ, OP_DISTINCT, OP_ITE, OP_AND, OP_OR, OP_IFF, OP_XOR, OP_NOT, OP_IMPLIES, OP_OEQ, OP_INTERP, LAST_BASIC_OP, PR_UNDEF, PR_TRUE, PR_ASSERTED, PR_GOAL, PR_MODUS_PONENS, PR_REFLEXIVITY, PR_SYMMETRY, PR_TRANSITIVITY, PR_TRANSITIVITY_STAR, PR_MONOTONICITY, PR_QUANT_INTRO, - PR_DISTRIBUTIVITY, PR_AND_ELIM, PR_NOT_OR_ELIM, PR_REWRITE, PR_REWRITE_STAR, PR_PULL_QUANT, + PR_DISTRIBUTIVITY, PR_AND_ELIM, PR_NOT_OR_ELIM, PR_REWRITE, PR_REWRITE_STAR, PR_PULL_QUANT, PR_PULL_QUANT_STAR, PR_PUSH_QUANT, PR_ELIM_UNUSED_VARS, PR_DER, PR_QUANT_INST, - + PR_HYPOTHESIS, PR_LEMMA, PR_UNIT_RESOLUTION, PR_IFF_TRUE, PR_IFF_FALSE, PR_COMMUTATIVITY, PR_DEF_AXIOM, - PR_DEF_INTRO, PR_APPLY_DEF, PR_IFF_OEQ, PR_NNF_POS, PR_NNF_NEG, PR_NNF_STAR, PR_SKOLEMIZE, PR_CNF_STAR, + PR_DEF_INTRO, PR_APPLY_DEF, PR_IFF_OEQ, PR_NNF_POS, PR_NNF_NEG, PR_NNF_STAR, PR_SKOLEMIZE, PR_CNF_STAR, PR_MODUS_PONENS_OEQ, PR_TH_LEMMA, PR_HYPER_RESOLVE, LAST_BASIC_PR }; @@ -1067,7 +1067,7 @@ protected: func_decl * m_lemma_decl; ptr_vector m_unit_resolution_decls; - func_decl * m_def_intro_decl; + func_decl * m_def_intro_decl; func_decl * m_iff_oeq_decl; func_decl * m_skolemize_decl; func_decl * m_mp_oeq_decl; @@ -1083,7 +1083,7 @@ protected: static bool is_proof(decl_kind k) { return k > LAST_BASIC_OP; } bool check_proof_sorts(basic_op_kind k, unsigned arity, sort * const * domain) const; bool check_proof_args(basic_op_kind k, unsigned num_args, expr * const * args) const; - func_decl * mk_bool_op_decl(char const * name, basic_op_kind k, unsigned num_args = 0, + func_decl * mk_bool_op_decl(char const * name, basic_op_kind k, unsigned num_args = 0, bool asooc = false, bool comm = false, bool idempotent = false, bool flat_associative = false, bool chainable = false); func_decl * mk_implies_decl(); func_decl * mk_proof_decl(char const * name, basic_op_kind k, unsigned num_parents); @@ -1093,10 +1093,10 @@ protected: func_decl * mk_proof_decl(basic_op_kind k, unsigned num_parents); func_decl * mk_proof_decl(basic_op_kind k, unsigned num_parameters, parameter const* params, unsigned num_parents); func_decl * mk_proof_decl( - char const * name, basic_op_kind k, + char const * name, basic_op_kind k, unsigned num_parameters, parameter const* params, unsigned num_parents); - + virtual void set_manager(ast_manager * m, family_id id); func_decl * mk_eq_decl_core(char const * name, decl_kind k, sort * s, ptr_vector & cache); func_decl * mk_ite_decl(sort * s); @@ -1105,7 +1105,7 @@ protected: sort* join(unsigned n, expr*const* es); public: basic_decl_plugin(); - + virtual ~basic_decl_plugin() {} virtual void finalize(); @@ -1114,23 +1114,23 @@ public: } virtual sort * mk_sort(decl_kind k, unsigned num_parameters, parameter const* parameters); - - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range); - - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned num_args, expr * const * args, sort * range); - + virtual void get_op_names(svector & op_names, symbol const & logic); - + virtual void get_sort_names(svector & sort_names, symbol const & logic); - virtual bool is_value(app* a) const; + virtual bool is_value(app* a) const; + + virtual bool is_unique_value(app* a) const; - virtual bool is_unique_value(app* a) const; - sort * mk_bool_sort() const { return m_bool_sort; } - sort * mk_proof_sort() const { return m_proof_sort; } + sort * mk_proof_sort() const { return m_proof_sort; } virtual expr * get_some_value(sort * s); }; @@ -1139,7 +1139,7 @@ typedef app proof; /* a proof is just an applicaton */ // ----------------------------------- // -// label_decl_plugin +// label_decl_plugin // // ----------------------------------- @@ -1168,7 +1168,7 @@ public: /** contract: when label - parameter[0] (int): 0 - if the label is negative, 1 - if positive. + parameter[0] (int): 0 - if the label is negative, 1 - if positive. parameter[1] (symbol): label's tag. ... parameter[n-1] (symbol): label's tag. @@ -1178,13 +1178,13 @@ public: ... parameter[n-1] (symbol): label's tag. */ - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range); }; // ----------------------------------- // -// pattern_decl_plugin +// pattern_decl_plugin // // ----------------------------------- @@ -1202,7 +1202,7 @@ public: virtual sort * mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters); - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range); }; @@ -1222,7 +1222,7 @@ enum model_value_op_kind { introduce unsoundess if the sort of a value is finite. Moreover, values should never be internalized in a logical context. - + However, values can be used during evaluation (i.e., simplification). \remark Model values can be viewed as the partion ids in Z3 1.x. @@ -1234,18 +1234,18 @@ public: virtual decl_plugin * mk_fresh() { return alloc(model_value_decl_plugin); } virtual sort * mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters); - + /** - contract: + contract: parameter[0]: (integer) value idx parameter[1]: (ast) sort of the value. */ - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range); virtual bool is_value(app* n) const; - virtual bool is_unique_value(app* a) const; + virtual bool is_unique_value(app* a) const; }; // ----------------------------------- @@ -1261,7 +1261,7 @@ public: user_sort_plugin() {} virtual sort * mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters); - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range); decl_kind register_name(symbol s); virtual decl_plugin * mk_fresh(); @@ -1321,7 +1321,7 @@ public: bool is_term_ite(expr const * n) const { return is_ite(n) && !is_bool(n); } bool is_true(expr const * n) const { return is_app_of(n, m_fid, OP_TRUE); } bool is_false(expr const * n) const { return is_app_of(n, m_fid, OP_FALSE); } - bool is_complement_core(expr const * n1, expr const * n2) const { + bool is_complement_core(expr const * n1, expr const * n2) const { return (is_true(n1) && is_false(n2)) || (is_not(n1) && to_app(n1)->get_arg(0) == n2); } bool is_complement(expr const * n1, expr const * n2) const { return is_complement_core(n1, n2) || is_complement_core(n2, n1); } @@ -1353,7 +1353,7 @@ public: // // Get Some Value functor // -// Functor for returning some value +// Functor for returning some value // of the given sort. // // ----------------------------------- @@ -1394,11 +1394,11 @@ protected: static const unsigned max_trail_sz = 16; static const unsigned factor = 2; }; - + struct expr_array_config : public array_config { typedef expr * value; }; - + typedef parray_manager expr_array_manager; struct expr_dependency_config : public config { @@ -1439,7 +1439,7 @@ protected: family_id m_model_value_family_id; family_id m_user_sort_family_id; family_id m_arith_family_id; - ast_table m_ast_table; + ast_table m_ast_table; id_gen m_expr_id_gen; id_gen m_decl_id_gen; sort * m_bool_sort; @@ -1477,20 +1477,20 @@ public: void enable_int_real_coercions(bool f) { m_int_real_coercions = f; } bool int_real_coercions() const { return m_int_real_coercions; } - + // Return true if s1 and s2 are equal, or coercions are enabled, and s1 and s2 are compatible. bool compatible_sorts(sort * s1, sort * s2) const; // For debugging purposes void display_free_ids(std::ostream & out) { m_expr_id_gen.display_free_ids(out); out << "\n"; m_decl_id_gen.display_free_ids(out); } - + void compact_memory(); void compress_ids(); // Equivalent to throw ast_exception(msg) void raise_exception(char const * msg); - + bool is_format_manager() const { return m_format_manager == 0; } ast_manager & get_format_manager() { return is_format_manager() ? *this : *m_format_manager; } @@ -1498,7 +1498,7 @@ public: void copy_families_plugins(ast_manager const & from); small_object_allocator & get_allocator() { return m_alloc; } - + family_id mk_family_id(symbol const & s) { return m_family_manager.mk_family_id(s); } family_id mk_family_id(char const * s) { return mk_family_id(symbol(s)); } @@ -1507,70 +1507,70 @@ public: symbol const & get_family_name(family_id fid) const { return m_family_manager.get_name(fid); } - bool is_builtin_family_id(family_id fid) const { - return - fid == null_family_id || - fid == m_basic_family_id || - fid == m_label_family_id || - fid == m_pattern_family_id || + bool is_builtin_family_id(family_id fid) const { + return + fid == null_family_id || + fid == m_basic_family_id || + fid == m_label_family_id || + fid == m_pattern_family_id || fid == m_model_value_family_id || - fid == m_user_sort_family_id; + fid == m_user_sort_family_id; } reslimit& limit() { return m_limit; } bool canceled() { return !limit().inc(); } void register_plugin(symbol const & s, decl_plugin * plugin); - + void register_plugin(family_id id, decl_plugin * plugin); decl_plugin * get_plugin(family_id fid) const; - + bool has_plugin(family_id fid) const { return get_plugin(fid) != 0; } - + bool has_plugin(symbol const & s) const { return m_family_manager.has_family(s) && has_plugin(m_family_manager.get_family_id(s)); } - + void get_dom(svector & dom) const { m_family_manager.get_dom(dom); } - + void get_range(svector & range) const { m_family_manager.get_range(range); } - + family_id get_basic_family_id() const { return m_basic_family_id; } - + basic_decl_plugin * get_basic_decl_plugin() const { return static_cast(get_plugin(m_basic_family_id)); } family_id get_user_sort_family_id() const { return m_user_sort_family_id; } - + user_sort_plugin * get_user_sort_plugin() const { return static_cast(get_plugin(m_user_sort_family_id)); } /** \brief Debugging support method: set the next expression identifier to be the least value id' s.t. - id' >= id - id' is not used by any AST in m_table - - id' is not in the expression m_free_ids + - id' is not in the expression m_free_ids This method should be only used to create small repros that exposes bugs in Z3. */ void set_next_expr_id(unsigned id); - - bool is_value(expr * e) const; - + + bool is_value(expr * e) const; + bool is_unique_value(expr * e) const; bool are_equal(expr * a, expr * b) const; - + bool are_distinct(expr * a, expr * b) const; - + bool contains(ast * a) const { return m_ast_table.contains(a); } - + unsigned get_num_asts() const { return m_ast_table.size(); } void debug_ref_count() { m_debug_ref_count = true; } - - void inc_ref(ast * n) { + + void inc_ref(ast * n) { if (n) n->inc_ref(); } - + void dec_ref(ast * n) { if (n) { n->dec_ref(); @@ -1578,45 +1578,45 @@ public: delete_node(n); } } - + template void inc_array_ref(unsigned sz, T * const * a) { for(unsigned i = 0; i < sz; i++) { inc_ref(a[i]); } } - + template void dec_array_ref(unsigned sz, T * const * a) { for(unsigned i = 0; i < sz; i++) { dec_ref(a[i]); } } - + static unsigned get_node_size(ast const * n); - - size_t get_allocation_size() const { - return m_alloc.get_allocation_size(); + + size_t get_allocation_size() const { + return m_alloc.get_allocation_size(); } - + protected: ast * register_node_core(ast * n); - + template - T * register_node(T * n) { - return static_cast(register_node_core(n)); + T * register_node(T * n) { + return static_cast(register_node_core(n)); } - + void delete_node(ast * n); - - void * allocate_node(unsigned size) { + + void * allocate_node(unsigned size) { return m_alloc.allocate(size); } - + void deallocate_node(ast * n, unsigned sz) { m_alloc.deallocate(sz, n); } - + public: sort * get_sort(expr const * n) const { return ::get_sort(n); } void check_sort(func_decl const * decl, unsigned num_args, expr * const * args) const; @@ -1629,12 +1629,12 @@ public: private: sort * mk_sort(symbol const & name, sort_info * info); - + public: sort * mk_uninterpreted_sort(symbol const & name, unsigned num_parameters, parameter const * parameters); sort * mk_uninterpreted_sort(symbol const & name) { return mk_uninterpreted_sort(name, 0, 0); } - + sort * mk_sort(symbol const & name, sort_info const & info) { if (info.get_family_id() == null_family_id) { return mk_uninterpreted_sort(name); @@ -1643,45 +1643,45 @@ public: return mk_sort(name, &const_cast(info)); } } - + sort * mk_sort(family_id fid, decl_kind k, unsigned num_parameters = 0, parameter const * parameters = 0); - + sort * mk_bool_sort() const { return m_bool_sort; } - + sort * mk_proof_sort() const { return m_proof_sort; } sort * mk_fresh_sort(char const * prefix = ""); bool is_uninterp(sort const * s) const { return s->get_family_id() == null_family_id || s->get_family_id() == m_user_sort_family_id; } - + /** \brief A sort is "fully" interpreted if it is interpreted, - and doesn't depend on other uninterpreted sorts. + and doesn't depend on other uninterpreted sorts. */ bool is_fully_interp(sort const * s) const; - func_decl * mk_func_decl(family_id fid, decl_kind k, unsigned num_parameters, parameter const * parameters, + func_decl * mk_func_decl(family_id fid, decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range = 0); - func_decl * mk_func_decl(family_id fid, decl_kind k, unsigned num_parameters, parameter const * parameters, + func_decl * mk_func_decl(family_id fid, decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned num_args, expr * const * args, sort * range = 0); - app * mk_app(family_id fid, decl_kind k, unsigned num_parameters = 0, parameter const * parameters = 0, + app * mk_app(family_id fid, decl_kind k, unsigned num_parameters = 0, parameter const * parameters = 0, unsigned num_args = 0, expr * const * args = 0, sort * range = 0); app * mk_app(family_id fid, decl_kind k, unsigned num_args, expr * const * args); app * mk_app(family_id fid, decl_kind k, expr * arg); - + app * mk_app(family_id fid, decl_kind k, expr * arg1, expr * arg2); - + app * mk_app(family_id fid, decl_kind k, expr * arg1, expr * arg2, expr * arg3); app * mk_const(family_id fid, decl_kind k) { return mk_app(fid, k, 0, static_cast(0)); } private: - func_decl * mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, + func_decl * mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, func_decl_info * info); - + app * mk_app_core(func_decl * decl, expr * arg1, expr * arg2); app * mk_app_core(func_decl * decl, unsigned num_args, expr * const * args); @@ -1690,8 +1690,8 @@ public: func_decl * mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range) { return mk_func_decl(name, arity, domain, range, static_cast(0)); } - - func_decl * mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, + + func_decl * mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, func_decl_info const & info) { if (info.is_null()) { return mk_func_decl(name, arity, domain, range, static_cast(0)); @@ -1700,69 +1700,69 @@ public: return mk_func_decl(name, arity, domain, range, & const_cast(info)); } } - + func_decl * mk_func_decl(unsigned arity, sort * const * domain, func_decl_info const & info) { - return mk_func_decl(info.get_family_id(), info.get_decl_kind(), info.get_num_parameters(), info.get_parameters(), + return mk_func_decl(info.get_family_id(), info.get_decl_kind(), info.get_num_parameters(), info.get_parameters(), arity, domain); } - + func_decl * mk_const_decl(symbol const & name, sort * s) { return mk_func_decl(name, static_cast(0), 0, s); } - + func_decl * mk_const_decl(symbol const & name, sort * s, func_decl_info const & info) { return mk_func_decl(name, static_cast(0), 0, s, info); } - + func_decl * mk_func_decl(symbol const & name, sort * domain, sort * range, func_decl_info const & info) { return mk_func_decl(name, 1, &domain, range, info); } - + func_decl * mk_func_decl(symbol const & name, sort * domain, sort * range) { return mk_func_decl(name, 1, &domain, range); } - + func_decl * mk_func_decl(symbol const & name, sort * domain1, sort * domain2, sort * range, func_decl_info const & info) { sort * d[2] = { domain1, domain2 }; return mk_func_decl(name, 2, d, range, info); } - - func_decl * mk_func_decl(symbol const & name, sort * domain1, sort * domain2, sort * range) { + + func_decl * mk_func_decl(symbol const & name, sort * domain1, sort * domain2, sort * range) { sort * d[2] = { domain1, domain2 }; return mk_func_decl(name, 2, d, range); } - - func_decl * mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, + + func_decl * mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, bool assoc, bool comm = false, bool inj = false); func_decl * mk_func_decl(symbol const & name, sort * domain1, sort * domain2, sort * range, bool assoc, bool comm = false) { sort * d[2] = { domain1, domain2 }; return mk_func_decl(name, 2, d, range, assoc, comm, false); } - + app * mk_app(func_decl * decl, unsigned num_args, expr * const * args); app * mk_app(func_decl * decl, expr * const * args) { return mk_app(decl, decl->get_arity(), args); } - + app * mk_app(func_decl * decl, expr * arg) { SASSERT(decl->get_arity() == 1); return mk_app(decl, 1, &arg); } - + app * mk_app(func_decl * decl, expr * arg1, expr * arg2) { SASSERT(decl->get_arity() == 2); expr * args[2] = { arg1, arg2 }; return mk_app(decl, 2, args); } - + app * mk_app(func_decl * decl, expr * arg1, expr * arg2, expr * arg3) { SASSERT(decl->get_arity() == 3); expr * args[3] = { arg1, arg2, arg3 }; return mk_app(decl, 3, args); } - + app * mk_const(func_decl * decl) { SASSERT(decl->get_arity() == 0); return mk_app(decl, static_cast(0), static_cast(0)); @@ -1771,21 +1771,21 @@ public: app * mk_const(symbol const & name, sort * s) { return mk_const(mk_const_decl(name, s)); } - + func_decl * mk_fresh_func_decl(symbol const & prefix, symbol const & suffix, unsigned arity, sort * const * domain, sort * range); func_decl * mk_fresh_func_decl(unsigned arity, sort * const * domain, sort * range) { return mk_fresh_func_decl(symbol::null, symbol::null, arity, domain, range); } - - func_decl * mk_fresh_func_decl(char const * prefix, char const * suffix, unsigned arity, + + func_decl * mk_fresh_func_decl(char const * prefix, char const * suffix, unsigned arity, sort * const * domain, sort * range) { return mk_fresh_func_decl(symbol(prefix), symbol(suffix), arity, domain, range); } - + func_decl * mk_fresh_func_decl(char const * prefix, unsigned arity, sort * const * domain, sort * range) { return mk_fresh_func_decl(symbol(prefix), symbol::null, arity, domain, range); } - + app * mk_fresh_const(char const * prefix, sort * s) { return mk_const(mk_fresh_func_decl(prefix, 0, 0, s)); } symbol mk_fresh_var_name(char const * prefix = 0); @@ -1808,7 +1808,7 @@ public: return is_label(n)?(l = to_app(n)->get_arg(0), true):false; } - bool is_label(expr const * n, bool& pos) const { + bool is_label(expr const * n, bool& pos) const { if (is_app_of(n, m_label_family_id, OP_LABEL)) { pos = to_app(n)->get_decl()->get_parameter(0).get_int() != 0; return true; @@ -1832,37 +1832,37 @@ public: app * mk_pattern(app * expr) { return mk_pattern(1, &expr); } - bool is_pattern(expr const * n) const; + bool is_pattern(expr const * n) const; -public: +public: - quantifier * mk_quantifier(bool forall, unsigned num_decls, sort * const * decl_sorts, symbol const * decl_names, expr * body, + quantifier * mk_quantifier(bool forall, unsigned num_decls, sort * const * decl_sorts, symbol const * decl_names, expr * body, int weight = 0, symbol const & qid = symbol::null, symbol const & skid = symbol::null, - unsigned num_patterns = 0, expr * const * patterns = 0, + unsigned num_patterns = 0, expr * const * patterns = 0, unsigned num_no_patterns = 0, expr * const * no_patterns = 0); - quantifier * mk_forall(unsigned num_decls, sort * const * decl_sorts, symbol const * decl_names, expr * body, + quantifier * mk_forall(unsigned num_decls, sort * const * decl_sorts, symbol const * decl_names, expr * body, int weight = 0, symbol const & qid = symbol::null, symbol const & skid = symbol::null, - unsigned num_patterns = 0, expr * const * patterns = 0, + unsigned num_patterns = 0, expr * const * patterns = 0, unsigned num_no_patterns = 0, expr * const * no_patterns = 0) { return mk_quantifier(true, num_decls, decl_sorts, decl_names, body, weight, qid, skid, num_patterns, patterns, num_no_patterns, no_patterns); } - quantifier * mk_exists(unsigned num_decls, sort * const * decl_sorts, symbol const * decl_names, expr * body, + quantifier * mk_exists(unsigned num_decls, sort * const * decl_sorts, symbol const * decl_names, expr * body, int weight = 0, symbol const & qid = symbol::null, symbol const & skid = symbol::null, - unsigned num_patterns = 0, expr * const * patterns = 0, + unsigned num_patterns = 0, expr * const * patterns = 0, unsigned num_no_patterns = 0, expr * const * no_patterns = 0) { return mk_quantifier(false, num_decls, decl_sorts, decl_names, body, weight, qid, skid, num_patterns, patterns, num_no_patterns, no_patterns); } - + quantifier * update_quantifier(quantifier * q, unsigned new_num_patterns, expr * const * new_patterns, expr * new_body); quantifier * update_quantifier(quantifier * q, unsigned new_num_patterns, expr * const * new_patterns, unsigned new_num_no_patterns, expr * const * new_no_patterns, expr * new_body); - + quantifier * update_quantifier(quantifier * q, expr * new_body); - + quantifier * update_quantifier_weight(quantifier * q, int new_weight); quantifier * update_quantifier(quantifier * q, bool new_is_forall, expr * new_body); @@ -1919,12 +1919,12 @@ public: bool empty(expr_dependency_array const & r) const { return m_expr_dependency_array_manager.empty(r); } expr_dependency * get(expr_dependency_array const & r, unsigned i) const { return m_expr_dependency_array_manager.get(r, i); } void set(expr_dependency_array & r, unsigned i, expr_dependency * v) { m_expr_dependency_array_manager.set(r, i, v); } - void set(expr_dependency_array const & s, unsigned i, expr_dependency * v, expr_dependency_array & r) { - m_expr_dependency_array_manager.set(s, i, v, r); + void set(expr_dependency_array const & s, unsigned i, expr_dependency * v, expr_dependency_array & r) { + m_expr_dependency_array_manager.set(s, i, v, r); } void push_back(expr_dependency_array & r, expr_dependency * v) { m_expr_dependency_array_manager.push_back(r, v); } - void push_back(expr_dependency_array const & s, expr_dependency * v, expr_dependency_array & r) { - m_expr_dependency_array_manager.push_back(s, v, r); + void push_back(expr_dependency_array const & s, expr_dependency * v, expr_dependency_array & r) { + m_expr_dependency_array_manager.push_back(s, v, r); } void pop_back(expr_dependency_array & r) { m_expr_dependency_array_manager.pop_back(r); } void pop_back(expr_dependency_array const & s, expr_dependency_array & r) { m_expr_dependency_array_manager.pop_back(s, r); } @@ -1953,7 +1953,7 @@ public: bool is_term_ite(expr const * n) const { return is_ite(n) && !is_bool(n); } bool is_true(expr const * n) const { return n == m_true; } bool is_false(expr const * n) const { return n == m_false; } - bool is_complement_core(expr const * n1, expr const * n2) const { + bool is_complement_core(expr const * n1, expr const * n2) const { return (is_true(n1) && is_false(n2)) || (is_not(n1) && to_app(n1)->get_arg(0) == n2); } bool is_complement(expr const * n1, expr const * n2) const { return is_complement_core(n1, n2) || is_complement_core(n2, n1); } @@ -1981,14 +1981,14 @@ public: MATCH_TERNARY(is_and); MATCH_TERNARY(is_or); - bool is_ite(expr const* n, expr*& t1, expr*& t2, expr*& t3) const { - if (is_ite(n)) { - t1 = to_app(n)->get_arg(0); - t2 = to_app(n)->get_arg(1); + bool is_ite(expr const* n, expr*& t1, expr*& t2, expr*& t3) const { + if (is_ite(n)) { + t1 = to_app(n)->get_arg(0); + t2 = to_app(n)->get_arg(1); t3 = to_app(n)->get_arg(2); - return true; - } - return false; + return true; + } + return false; } public: @@ -2014,14 +2014,14 @@ public: app * mk_interp(expr * arg) { return mk_app(m_basic_family_id, OP_INTERP, arg); } - func_decl* mk_and_decl() { + func_decl* mk_and_decl() { sort* domain[2] = { m_bool_sort, m_bool_sort }; - return mk_func_decl(m_basic_family_id, OP_AND, 0, 0, 2, domain); + return mk_func_decl(m_basic_family_id, OP_AND, 0, 0, 2, domain); } func_decl* mk_not_decl() { return mk_func_decl(m_basic_family_id, OP_NOT, 0, 0, 1, &m_bool_sort); } func_decl* mk_or_decl() { sort* domain[2] = { m_bool_sort, m_bool_sort }; - return mk_func_decl(m_basic_family_id, OP_OR, 0, 0, 2, domain); + return mk_func_decl(m_basic_family_id, OP_OR, 0, 0, 2, domain); } // ----------------------------------- @@ -2036,7 +2036,7 @@ public: app * mk_model_value(unsigned idx, sort * s); bool is_model_value(expr const * n) const { return is_app_of(n, m_model_value_family_id, OP_MODEL_VALUE); } bool is_model_value(func_decl const * d) const { return is_decl_of(d, m_model_value_family_id, OP_MODEL_VALUE); } - + expr * get_some_value(sort * s, some_value_proc * p); expr * get_some_value(sort * s); @@ -2059,7 +2059,7 @@ public: bool fine_grain_proofs() const { return m_proof_mode == PGM_FINE; } proof_gen_mode proof_mode() const { return m_proof_mode; } void toggle_proof_mode(proof_gen_mode m) { m_proof_mode = m; } // APIs for creating proof objects return [undef] - + proof * mk_undef_proof() const { return m_undef_proof; } bool is_proof(expr const * n) const { return is_app(n) && to_app(n)->get_decl()->get_range() == m_proof_sort; } @@ -2067,7 +2067,7 @@ public: proof* mk_hyper_resolve(unsigned num_premises, proof* const* premises, expr* concl, svector > const& positions, vector > const& substs); - + bool is_undef_proof(expr const * e) const { return e == m_undef_proof; } bool is_asserted(expr const * e) const { return is_app_of(e, m_basic_family_id, PR_ASSERTED); } @@ -2089,30 +2089,30 @@ public: bool is_quant_inst(expr const* e, expr*& not_q_or_i, ptr_vector& binding) const; bool is_rewrite(expr const* e, expr*& r1, expr*& r2) const; bool is_hyper_resolve(proof* p) const { return is_app_of(p, m_basic_family_id, PR_HYPER_RESOLVE); } - bool is_hyper_resolve(proof* p, + bool is_hyper_resolve(proof* p, ref_vector& premises, obj_ref& conclusion, svector > & positions, vector >& substs); - + bool is_def_intro(expr const * e) const { return is_app_of(e, m_basic_family_id, PR_DEF_INTRO); } bool is_apply_def(expr const * e) const { return is_app_of(e, m_basic_family_id, PR_APPLY_DEF); } bool is_skolemize(expr const * e) const { return is_app_of(e, m_basic_family_id, PR_SKOLEMIZE); } MATCH_UNARY(is_asserted); - MATCH_UNARY(is_lemma); + MATCH_UNARY(is_lemma); - bool has_fact(proof const * p) const { - SASSERT(is_proof(p)); - unsigned n = p->get_num_args(); - return n > 0 && get_sort(p->get_arg(n - 1)) != m_proof_sort; + bool has_fact(proof const * p) const { + SASSERT(is_proof(p)); + unsigned n = p->get_num_args(); + return n > 0 && get_sort(p->get_arg(n - 1)) != m_proof_sort; } expr * get_fact(proof const * p) const { SASSERT(is_proof(p)); SASSERT(has_fact(p)); return p->get_arg(p->get_num_args() - 1); } - unsigned get_num_parents(proof const * p) const { - SASSERT(is_proof(p)); + unsigned get_num_parents(proof const * p) const { + SASSERT(is_proof(p)); unsigned n = p->get_num_args(); - return !has_fact(p) ? n : n - 1; + return !has_fact(p) ? n : n - 1; } proof * get_parent(proof const * p, unsigned idx) const { SASSERT(is_proof(p)); return to_app(p->get_arg(idx)); } proof * mk_true_proof(); @@ -2147,7 +2147,7 @@ public: proof * mk_quant_inst(expr * not_q_or_i, unsigned num_bind, expr* const* binding); proof * mk_def_axiom(expr * ax); - proof * mk_unit_resolution(unsigned num_proofs, proof * const * proofs); + proof * mk_unit_resolution(unsigned num_proofs, proof * const * proofs); proof * mk_unit_resolution(unsigned num_proofs, proof * const * proofs, expr * new_fact); proof * mk_hypothesis(expr * h); proof * mk_lemma(proof * p, expr * lemma); @@ -2166,7 +2166,7 @@ public: proof * mk_and_elim(proof * p, unsigned i); proof * mk_not_or_elim(proof * p, unsigned i); - proof * mk_th_lemma(family_id tid, + proof * mk_th_lemma(family_id tid, expr * fact, unsigned num_proofs, proof * const * proofs, unsigned num_params = 0, parameter const* params = 0); @@ -2180,7 +2180,7 @@ private: worklist.push_back(n); } } - + template void dec_array_ref(ptr_buffer & worklist, unsigned sz, T * const * a) { for(unsigned i = 0; i < sz; i++) { @@ -2315,7 +2315,7 @@ public: void mark(ast * n, bool flag) { if (flag) mark(n); else reset_mark(n); } - unsigned get_level() { + unsigned get_level() { return m_to_unmark.size(); } @@ -2334,7 +2334,7 @@ typedef ast_fast_mark1 expr_fast_mark1; typedef ast_fast_mark2 expr_fast_mark2; /** - Similar to ast_fast_mark, but increases reference counter. + Similar to ast_fast_mark, but increases reference counter. */ template class ast_ref_fast_mark { @@ -2369,7 +2369,7 @@ public: } m_to_unmark.push_back(n); } - + void reset() { ast * const * it = m_to_unmark.c_ptr(); ast * const * end = it + m_to_unmark.size(); @@ -2378,7 +2378,7 @@ public: } m_to_unmark.reset(); } - + void mark(ast * n, bool flag) { if (flag) mark(n); else reset_mark(n); } }; @@ -2396,7 +2396,7 @@ typedef ast_ref_fast_mark2 expr_ref_fast_mark2; /** \brief A mapping from AST to Boolean - \warning This map does not cleanup the entry associated with a node N, + \warning This map does not cleanup the entry associated with a node N, when N is deleted. */ class ast_mark { @@ -2422,7 +2422,7 @@ public: */ class scoped_mark : public ast_mark { ast_ref_vector m_stack; - unsigned_vector m_lim; + unsigned_vector m_lim; public: scoped_mark(ast_manager& m): m_stack(m) {} virtual ~scoped_mark() {} @@ -2459,4 +2459,4 @@ public: #endif /* AST_H_ */ - + From 3d37c25bcc71ecf645b42f363c58ed8cff9065ef Mon Sep 17 00:00:00 2001 From: "Christoph M. Wintersteiger" Date: Fri, 5 Feb 2016 15:16:54 +0000 Subject: [PATCH 10/11] whitespace --- src/ast/arith_decl_plugin.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/ast/arith_decl_plugin.h b/src/ast/arith_decl_plugin.h index 8df4234fa..dd48ef727 100644 --- a/src/ast/arith_decl_plugin.h +++ b/src/ast/arith_decl_plugin.h @@ -115,7 +115,7 @@ protected: func_decl * m_i_div_decl; func_decl * m_i_mod_decl; func_decl * m_i_rem_decl; - + func_decl * m_to_real_decl; func_decl * m_to_int_decl; func_decl * m_is_int_decl; @@ -140,7 +140,7 @@ protected: app * m_pi; app * m_e; - + app * m_0_pw_0_int; app * m_0_pw_0_real; func_decl * m_neg_root_decl; @@ -149,7 +149,7 @@ protected: func_decl * m_mod_0_decl; func_decl * m_u_asin_decl; func_decl * m_u_acos_decl; - + ptr_vector m_small_ints; ptr_vector m_small_reals; @@ -175,11 +175,11 @@ public: } virtual sort * mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters); - - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort * range); - virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, + virtual func_decl * mk_func_decl(decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned num_args, expr * const * args, sort * range); virtual bool is_value(app * e) const; @@ -202,11 +202,11 @@ public: app * mk_numeral(sexpr const * p, unsigned i); app * mk_pi() const { return m_pi; } - + app * mk_e() const { return m_e; } app * mk_0_pw_0_int() const { return m_0_pw_0_int; } - + app * mk_0_pw_0_real() const { return m_0_pw_0_real; } virtual expr * get_some_value(sort * s); @@ -258,7 +258,7 @@ public: bool is_to_int(expr const * n) const { return is_app_of(n, m_afid, OP_TO_INT); } bool is_is_int(expr const * n) const { return is_app_of(n, m_afid, OP_IS_INT); } bool is_power(expr const * n) const { return is_app_of(n, m_afid, OP_POWER); } - + bool is_int(sort const * s) const { return is_sort_of(s, m_afid, INT_SORT); } bool is_int(expr const * n) const { return is_int(get_sort(n)); } bool is_real(sort const * s) const { return is_sort_of(s, m_afid, REAL_SORT); } @@ -275,7 +275,7 @@ public: MATCH_BINARY(is_le); MATCH_BINARY(is_ge); MATCH_BINARY(is_lt); - MATCH_BINARY(is_gt); + MATCH_BINARY(is_gt); MATCH_BINARY(is_mod); MATCH_BINARY(is_rem); MATCH_BINARY(is_div); @@ -297,25 +297,25 @@ class arith_util : public arith_recognizers { SASSERT(m_plugin != 0); return *m_plugin; } - + public: arith_util(ast_manager & m); ast_manager & get_manager() const { return m_manager; } - algebraic_numbers::manager & am() { - return plugin().am(); + algebraic_numbers::manager & am() { + return plugin().am(); } bool is_irrational_algebraic_numeral(expr const * n) const { return is_app_of(n, m_afid, OP_IRRATIONAL_ALGEBRAIC_NUM); } bool is_irrational_algebraic_numeral(expr const * n, algebraic_numbers::anum & val); algebraic_numbers::anum const & to_irrational_algebraic_numeral(expr const * n); - + sort * mk_int() { return m_manager.mk_sort(m_afid, INT_SORT); } sort * mk_real() { return m_manager.mk_sort(m_afid, REAL_SORT); } - app * mk_numeral(rational const & val, bool is_int) const { - return plugin().mk_numeral(val, is_int); + app * mk_numeral(rational const & val, bool is_int) const { + return plugin().mk_numeral(val, is_int); } app * mk_numeral(rational const & val, sort const * s) const { SASSERT(is_int(s) || is_real(s)); @@ -379,9 +379,9 @@ public: app * mk_neg_root(expr * arg1, expr * arg2) { return m_manager.mk_app(m_afid, OP_NEG_ROOT, arg1, arg2); } app * mk_u_asin(expr * arg) { return m_manager.mk_app(m_afid, OP_U_ASIN, arg); } app * mk_u_acos(expr * arg) { return m_manager.mk_app(m_afid, OP_U_ACOS, arg); } - + /** - \brief Return the equality (= lhs rhs), but it makes sure that + \brief Return the equality (= lhs rhs), but it makes sure that if one of the arguments is a numeral, then it will be in the right-hand-side; if none of them are numerals, then the left-hand-side has a smaller id than the right hand side. */ From 7ddd2856c8f7bcac549d2472d0b733296a759dfe Mon Sep 17 00:00:00 2001 From: "Christoph M. Wintersteiger" Date: Fri, 5 Feb 2016 15:22:37 +0000 Subject: [PATCH 11/11] Added is_considered_uninterpreted() to decl_plugins. --- src/ast/arith_decl_plugin.h | 19 +++++++++++++++++++ src/ast/ast.h | 2 ++ src/ast/bv_decl_plugin.h | 32 ++++++++++++++++---------------- src/model/model_evaluator.cpp | 2 +- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/ast/arith_decl_plugin.h b/src/ast/arith_decl_plugin.h index dd48ef727..25356a667 100644 --- a/src/ast/arith_decl_plugin.h +++ b/src/ast/arith_decl_plugin.h @@ -211,6 +211,25 @@ public: virtual expr * get_some_value(sort * s); + virtual bool is_considered_uninterpreted(func_decl * f) { + if (f->get_family_id() != get_family_id()) + return false; + switch (f->get_decl_kind()) + { + case OP_0_PW_0_INT: + case OP_0_PW_0_REAL: + case OP_NEG_ROOT: + case OP_DIV_0: + case OP_IDIV_0: + case OP_MOD_0: + case OP_U_ASIN: + case OP_U_ACOS: + return true; + default: + return false; + } + return false; + } }; /** diff --git a/src/ast/ast.h b/src/ast/ast.h index 77dd68372..0dba6039c 100644 --- a/src/ast/ast.h +++ b/src/ast/ast.h @@ -992,6 +992,8 @@ public: // Event handlers for deleting/translating PARAM_EXTERNAL virtual void del(parameter const & p) {} virtual parameter translate(parameter const & p, decl_plugin & target) { UNREACHABLE(); return p; } + + virtual bool is_considered_uninterpreted(func_decl * f) { return false; } }; // ----------------------------------- diff --git a/src/ast/bv_decl_plugin.h b/src/ast/bv_decl_plugin.h index a4a0b1f57..563622338 100644 --- a/src/ast/bv_decl_plugin.h +++ b/src/ast/bv_decl_plugin.h @@ -266,6 +266,22 @@ public: virtual bool are_distinct(app* a, app* b) const; virtual expr * get_some_value(sort * s); + + virtual bool is_considered_uninterpreted(func_decl * f) { + if (f->get_family_id() != get_family_id()) + return false; + switch (f->get_decl_kind()) { + case OP_BSDIV0: + case OP_BUDIV0: + case OP_BSREM0: + case OP_BUREM0: + case OP_BSMOD0: + return true; + default: + return false; + } + return false; + } }; class bv_recognizers { @@ -353,22 +369,6 @@ public: rational norm(rational const & val, unsigned bv_size) const { return norm(val, bv_size, false); } bool has_sign_bit(rational const & n, unsigned bv_size) const; bool mult_inverse(rational const & n, unsigned bv_size, rational & result); - - bool is_considered_uninterpreted(func_decl * f) { - if (f->get_family_id() != get_family_id()) - return false; - switch (f->get_decl_kind()) { - case OP_BSDIV0: - case OP_BUDIV0: - case OP_BSREM0: - case OP_BUREM0: - case OP_BSMOD0: - return true; - default: - return false; - } - return false; - } }; class bv_util : public bv_recognizers { diff --git a/src/model/model_evaluator.cpp b/src/model/model_evaluator.cpp index 366678cf8..1697b74ed 100644 --- a/src/model/model_evaluator.cpp +++ b/src/model/model_evaluator.cpp @@ -202,7 +202,7 @@ struct evaluator_cfg : public default_rewriter_cfg { if (m_model_completion && (f->get_family_id() == null_family_id || - m_bv_rw.get_util().is_considered_uninterpreted(f))) + m().get_plugin(f->get_family_id())->is_considered_uninterpreted(f))) { sort * s = f->get_range(); expr * val = m_model.get_some_value(s);