Exemple #1
0
 // treat src as a homogeneous matrix.
 void dualizeH(matrix& dst, matrix const& src) {
     hilbert_basis hb;
     for (unsigned i = 0; i < src.size(); ++i) {
         vector<rational> v(src.A[i]);
         v.push_back(src.b[i]);
         hb.add_eq(v, rational(0));
     }
     for (unsigned i = 0; i < 1 + src.A[0].size(); ++i) {
         hb.set_is_int(i);
     }
     lbool is_sat = hb.saturate();
     hb.display(std::cout);
     SASSERT(is_sat == l_true);
     dst.reset();
     unsigned basis_size = hb.get_basis_size();
     for (unsigned i = 0; i < basis_size; ++i) {
         bool is_initial;
         vector<rational> soln;
         hb.get_basis_solution(i, soln, is_initial);
         if (!is_initial) {
             dst.b.push_back(soln.back());
             soln.pop_back();
             dst.A.push_back(soln);
         }
     }
 }
Exemple #2
0
//
// Find rationals c, x, such that c + epsilon*x <= r1/r2
//
// let r1 = a + d_1
// let r2 = b + d_2
//
// suppose b != 0:
//
//      r1/b <= r1/r2
// <=> { if b > 0, then r2 > 0, and cross multiplication does not change the sign }
//     { if b < 0, then r2 < 0, and cross multiplication changes sign twice }
//      r1 * r2 <= b * r1
// <=>
//      r1 * (b + d_2) <= r1 * b
// <=>
//      r1 * d_2 <= 0
//
// if r1 * d_2 > 0, then r1/(b + sign_of(r1)*1/2*|b|) <= r1/r2
//
// Not handled here:
// if b = 0, then d_2 != 0
//   if r1 * d_2 = 0 then it's 0.
//   if r1 * d_2 > 0, then result is +oo
//   if r1 * d_2 < 0, then result is -oo
//
inf_rational inf_div(inf_rational const& r1, inf_rational const& r2)
{
    SASSERT(!r2.m_first.is_zero());
    inf_rational result;

    if (r2.m_second.is_neg() && r1.is_neg()) {
        result = r1 / (r2.m_first - (abs(r2.m_first)/rational(2)));
    }
    else if (r2.m_second.is_pos() && r1.is_pos()) {
        result = r1 / (r2.m_first + (abs(r2.m_first)/rational(2)));
    }
    else {
        result = r1 / r2.m_first;
    }
    return result;
}
 app * process_le_ge(func_decl * f, expr * arg1, expr * arg2, bool le) {
     expr * v;
     expr * t;
     if (uncnstr(arg1)) {
         v = arg1;
         t = arg2;
     }
     else if (uncnstr(arg2)) {
         v = arg2;
         t = arg1;
         le = !le;
     }
     else {
         return nullptr;
     }
     app * u;
     if (!mk_fresh_uncnstr_var_for(f, arg1, arg2, u))
         return u;
     if (!m_mc)
         return u;
     // v = ite(u, t, t + 1) if le
     // v = ite(u, t, t - 1) if !le
     add_def(v, m().mk_ite(u, t, m_a_util.mk_add(t, m_a_util.mk_numeral(rational(le ? 1 : -1), m().get_sort(arg1)))));
     return u;
 }
Exemple #4
0
    void transition(
        matrix& dst,
        matrix const& src,
        matrix const& Ab) {
        matrix T;
        // length of rows in Ab are twice as long as
        // length of rows in src.
        SASSERT(2*src.A[0].size() == Ab.A[0].size());
        vector<rational> zeros;
        for (unsigned i = 0; i < src.A[0].size(); ++i) {
            zeros.push_back(rational(0));
        }
        for (unsigned i = 0; i < src.size(); ++i) {
            T.A.push_back(src.A[i]);
            T.A.back().append(zeros);            
        }
        T.b.append(src.b);
        T.append(Ab);

        T.display(std::cout << "T:\n");
        matrix TD;
        dualizeI(TD, T);
        TD.display(std::cout << "TD:\n");
        for (unsigned i = 0; i < TD.size(); ++i) {
            vector<rational> v;            
            v.append(src.size(), TD.A[i].c_ptr() + src.size());
            dst.A.push_back(v);
            dst.b.push_back(TD.b[i]);
        }
        dst.display(std::cout << "dst\n");
    }
 app * process_bv_mul(func_decl * f, unsigned num, expr * const * args) {
     if (num == 0)
         return nullptr;
     if (uncnstr(num, args)) {
         sort * s = m().get_sort(args[0]);
         app * r;
         if (!mk_fresh_uncnstr_var_for(f, num, args, r))
             return r;
         if (m_mc)
             add_defs(num, args, r, m_bv_util.mk_numeral(rational(1), s));
         return r;
     }
     // c * v (c is even) case
     unsigned bv_size;
     rational val;
     rational inv;
     if (num == 2 && 
         uncnstr(args[1]) && 
         m_bv_util.is_numeral(args[0], val, bv_size) &&
         m_bv_util.mult_inverse(val, bv_size, inv)) {
         app * r;
         if (!mk_fresh_uncnstr_var_for(f, num, args, r))
             return r;
         sort * s = m().get_sort(args[1]);
         if (m_mc)
             add_def(args[1], m_bv_util.mk_bv_mul(m_bv_util.mk_numeral(inv, s), r));
         return r;
     }
     return nullptr;
 }
cons_t* proc_add(cons_t *p, environment_t* env)
{
  /*
   * Integers have an IDENTITY, so we can do this,
   * but a more correct approach would be to take
   * the value of the FIRST number we find and
   * return that.
   */
  rational_t sum;
  sum.numerator = 0;
  sum.denominator = 1;
  bool exact = true;

  for ( ; !nullp(p); p = cdr(p) ) {
    cons_t *i = listp(p)? car(p) : p;

    if ( integerp(i) ) {
      if ( !i->number.exact ) exact = false;
      sum += i->number.integer;
    } else if ( rationalp(i) ) {
      if ( !i->number.exact ) exact = false;
      sum += i->number.rational;
    } else if ( realp(i) ) {
      // automatically convert; perform rest of computation in floats
      exact = false;
      return proc_addf(cons(real(sum), p), env);
    } else
      raise(runtime_exception(
        "Cannot add integer with " + to_s(type_of(i)) + ": " + sprint(i)));
  }

  return rational(sum, exact);
}
Exemple #7
0
 void add_ineq() {
     pb_util pb(m);
     expr_ref fml(m), tmp(m);
     th_rewriter rw(m);
     vector<rational> coeffs(vars.size());
     expr_ref_vector args(vars);
     while (true) {
         rational k(rand(6));
         for (unsigned i = 0; i < coeffs.size(); ++i) {
             int v = 3 - rand(5);
             coeffs[i] = rational(v);
             if (coeffs[i].is_neg()) {
                 args[i] = m.mk_not(args[i].get());
                 coeffs[i].neg();
                 k += coeffs[i];
             }
         }       
         fml = pb.mk_ge(args.size(), coeffs.c_ptr(), args.c_ptr(), k);
         rw(fml, tmp);
         rw(tmp, tmp);
         if (pb.is_ge(tmp)) {
             fml = tmp;
             break;
         }
     }
     std::cout << "(assert " << fml << ")\n";
     ctx.assert_expr(fml);
 }
Exemple #8
0
Z3_ast mk_max(Z3_context ctx, Z3_sort bv, bool is_signed) {
    unsigned bvsize = Z3_get_bv_sort_size(ctx, bv);
    unsigned sz = is_signed ? bvsize - 1 : bvsize;
    rational max_bound = power(rational(2), sz);
    --max_bound;
    return Z3_mk_numeral(ctx, max_bound.to_string().c_str(), bv);
}
cons_t* proc_mul(cons_t *p, environment_t *env)
{
  rational_t product;
  product.numerator = 1;
  product.denominator = 1;
  bool exact = true;

  for ( ; !nullp(p); p = cdr(p) ) {
    cons_t *i = listp(p)? car(p) : p;

    if ( integerp(i) ) {
      product *= i->number.integer;
      if ( !i->number.exact ) exact = false;
    } else if ( rationalp(i) ) {
      if ( !i->number.exact ) exact = false;
      product *= i->number.rational;
    } else if ( realp(i) ) {
      // automatically convert; perform rest of computation in floats
      exact = false;
      return proc_mulf(cons(real(product), p), env);
    } else
      raise(runtime_exception("Cannot multiply integer with " + to_s(type_of(i)) + ": " + sprint(i)));
  }

  return rational(product, exact);
}
rational pb_util::to_rational(parameter const& p) const {
    if (p.is_int()) {
        return rational(p.get_int());
    }
    SASSERT(p.is_rational());
    return p.get_rational();
}
Exemple #11
0
 sort * dl_decl_plugin::mk_relation_sort( unsigned num_parameters, parameter const * parameters) {
             bool is_finite = true;
     rational r(1);
     for (unsigned i = 0; is_finite && i < num_parameters; ++i) {
         if (!parameters[i].is_ast() || !is_sort(parameters[i].get_ast())) {
             m_manager->raise_exception("expecting sort parameters");
             return 0;
         }
         sort* s = to_sort(parameters[i].get_ast());
         sort_size sz1 = s->get_num_elements();
         if (sz1.is_finite()) {
             r *= rational(sz1.size(),rational::ui64());
         }
         else {
             is_finite = false;
         }
     }
     sort_size sz;
     if (is_finite && r.is_uint64()) {
         sz = sort_size::mk_finite(r.get_uint64());
     }
     else {
         sz = sort_size::mk_very_big();
     }
     sort_info info(m_family_id, DL_RELATION_SORT, sz, num_parameters, parameters);
     return m_manager->mk_sort(symbol("Table"),info);
 }
Exemple #12
0
rational operator * ( const rational& r1, const rational& r2 )
{
    int a = r1.num * r2.num;
    int b = r1.denum * r2.denum;
    return rational(a,b);

}
cons_t* parse_exact_real(const char* sc, int radix)
{
  if ( radix != 10 )
    raise(parser_exception(
      "Only reals with decimal radix are supported"));

  /*
   * Since the real is already in string form, we can simply turn it into a
   * rational number.
   */
  char *s = strdup(sc);
  char *d = strchr(s, '.');
  *d = '\0';
  const char* left = s;
  const char* right = d+1;

  int decimals = strlen(right);

  /*
   * NOTE: If we overflow here, we're in big trouble.
   * TODO: Throw an error if we overflow.  Or just implement bignums.
   */
  rational_t r;
  r.numerator = to_i(left, radix)*pow10(decimals) + to_i(right, radix);
  r.denominator = pow10(decimals);

  free(s);
  return rational(r, true);
}
Exemple #14
0
        virtual void operator()(model_ref& md) {
            model_ref old_model = alloc(model, m);
            obj_map<func_decl, func_decl*>::iterator it  = m_new2old.begin();
            obj_map<func_decl, func_decl*>::iterator end = m_new2old.end();
            for (; it != end; ++it) {
                func_decl* old_p = it->m_value;
                func_decl* new_p = it->m_key;
                func_interp* old_fi = alloc(func_interp, m, old_p->get_arity());

                if (new_p->get_arity() == 0) {
                    old_fi->set_else(md->get_const_interp(new_p));
                }
                else {
                    func_interp* new_fi = md->get_func_interp(new_p);
                    expr_ref_vector subst(m);
                    var_subst vs(m, false);
                    expr_ref tmp(m);

                    if (!new_fi) {
                        TRACE("dl", tout << new_p->get_name() << " has no value in the current model\n";);
                        dealloc(old_fi);
                        continue;
                    }
                    for (unsigned i = 0; i < old_p->get_arity(); ++i) {
                        subst.push_back(m.mk_var(i, old_p->get_domain(i)));
                    }
                    subst.push_back(a.mk_numeral(rational(1), a.mk_real()));

                    // Hedge that we don't have to handle the general case for models produced
                    // by Horn clause solvers.
                    SASSERT(!new_fi->is_partial() && new_fi->num_entries() == 0);
                    vs(new_fi->get_else(), subst.size(), subst.c_ptr(), tmp);
                    old_fi->set_else(tmp);
                    old_model->register_decl(old_p, old_fi);
                }
 app * process_bv_le(func_decl * f, expr * arg1, expr * arg2, bool is_signed) {
     if (m_produce_proofs) {
         // The result of bv_le is not just introducing a new fresh name,
         // we need a side condition.
         // TODO: the correct proof step
         return nullptr;
     }
     if (uncnstr(arg1)) {
         // v <= t
         expr * v = arg1;
         expr * t = arg2;
         // v <= t --->  (u or t == MAX)   u is fresh
         //     add definition v = ite(u or t == MAX, t, t+1)
         unsigned bv_sz = m_bv_util.get_bv_size(arg1);
         rational MAX;
         if (is_signed)
             MAX = rational::power_of_two(bv_sz - 1) - rational(1);
         else
             MAX = rational::power_of_two(bv_sz) - rational(1);
         app * u;
         bool is_new = mk_fresh_uncnstr_var_for(f, arg1, arg2, u);
         app * r = m().mk_or(u, m().mk_eq(t, m_bv_util.mk_numeral(MAX, bv_sz)));
         if (m_mc && is_new)
             add_def(v, m().mk_ite(r, t, m_bv_util.mk_bv_add(t, m_bv_util.mk_numeral(rational(1), bv_sz))));
         return r;
     }
     if (uncnstr(arg2)) {
         // v >= t
         expr * v = arg2;
         expr * t = arg1;
         // v >= t --->  (u ot t == MIN)  u is fresh
         //    add definition v = ite(u or t == MIN, t, t-1)
         unsigned bv_sz = m_bv_util.get_bv_size(arg1);
         rational MIN;
         if (is_signed)
             MIN = -rational::power_of_two(bv_sz - 1);
         else
             MIN = rational(0);
         app * u;
         bool is_new = mk_fresh_uncnstr_var_for(f, arg1, arg2, u);
         app * r = m().mk_or(u, m().mk_eq(t, m_bv_util.mk_numeral(MIN, bv_sz)));
         if (m_mc && is_new)
             add_def(v, m().mk_ite(r, t, m_bv_util.mk_bv_sub(t, m_bv_util.mk_numeral(rational(1), bv_sz))));
         return r;
     }
     return nullptr;
 }
Exemple #16
0
    bool utvpi_tester::linearize() {

        m_weight.reset();
        m_coeff_map.reset();

        while (!m_terms.empty()) {
            expr* e1, *e2;
            rational num;
            rational mul = m_terms.back().second;
            expr* e = m_terms.back().first;
            m_terms.pop_back();
            if (a.is_add(e)) {
                for (unsigned i = 0; i < to_app(e)->get_num_args(); ++i) {
                    m_terms.push_back(std::make_pair(to_app(e)->get_arg(i), mul));
                }
            }
            else if (a.is_mul(e, e1, e2) && a.is_numeral(e1, num)) {
                m_terms.push_back(std::make_pair(e2, mul*num));
            }
            else if (a.is_mul(e, e2, e1) && a.is_numeral(e1, num)) {
                m_terms.push_back(std::make_pair(e2, mul*num));
            }
            else if (a.is_sub(e, e1, e2)) {
                m_terms.push_back(std::make_pair(e1, mul));
                m_terms.push_back(std::make_pair(e2, -mul));                
            }
            else if (a.is_uminus(e, e1)) {
                m_terms.push_back(std::make_pair(e1, -mul));
            }
            else if (a.is_numeral(e, num)) {
                m_weight += num*mul;
            }
            else if (a.is_to_real(e, e1)) {
                m_terms.push_back(std::make_pair(e1, mul));
            }
            else if (!is_uninterp_const(e)) {
                return false;
            }
            else {
                m_coeff_map.insert_if_not_there2(e, rational(0))->get_data().m_value += mul;
            }
        }
        obj_map<expr, rational>::iterator it  = m_coeff_map.begin();
        obj_map<expr, rational>::iterator end = m_coeff_map.end();
        for (; it != end; ++it) {
            rational r = it->m_value;
            if (r.is_zero()) {
                continue;
            }
            m_terms.push_back(std::make_pair(it->m_key, r));
            if (m_terms.size() > 2) {
                return false;
            }
            if (!r.is_one() && !r.is_minus_one()) {
                return false;
            }
        }
        return true;
    }
Exemple #17
0
Z3_ast mk_min(Z3_context ctx, Z3_sort bv, bool is_signed) {
    unsigned bvsize = Z3_get_bv_sort_size(ctx, bv);
    if (! is_signed) return Z3_mk_numeral(ctx, "0", bv);
    unsigned sz = bvsize - 1;
    rational min_bound = power(rational(2), sz);
    min_bound.neg();
    return Z3_mk_numeral(ctx, min_bound.to_string().c_str(), bv);
}
Exemple #18
0
 Z3_ast Z3_API Z3_mk_pbeq(Z3_context c, unsigned num_args, 
                          Z3_ast const args[], int _coeffs[],
                          int k) {
     Z3_TRY;
     LOG_Z3_mk_pble(c, num_args, args, _coeffs, k);
     RESET_ERROR_CODE();
     pb_util util(mk_c(c)->m());
     vector<rational> coeffs;
     for (unsigned i = 0; i < num_args; ++i) {
         coeffs.push_back(rational(_coeffs[i]));
     }
     ast* a = util.mk_eq(num_args, coeffs.c_ptr(), to_exprs(args), rational(k));
     mk_c(c)->save_ast_trail(a);
     check_sorts(c, a);
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(0);
 }
Exemple #19
0
br_status fpa_rewriter::mk_to_real_unspecified(expr_ref & result) {
    if (m_hi_fp_unspecified)
        // The "hardware interpretation" is 0.
        result = m_util.au().mk_numeral(rational(0), false);
    else
        result = m_util.mk_internal_to_real_unspecified();

    return BR_DONE;
}
Exemple #20
0
void bv2int_rewriter_ctx::collect_power2(goal const& s) {
    ast_manager& m = m_trail.get_manager();
    arith_util arith(m);
    bv_util bv(m);
    
    for (unsigned j = 0; j < s.size(); ++j) {
        expr* f = s.form(j);
        if (!m.is_or(f)) continue;
        unsigned sz = to_app(f)->get_num_args();
        expr* x, *y, *v = 0;
        rational n;
        vector<rational> bounds;
        bool is_int, ok = true;

        for (unsigned i = 0; ok && i < sz; ++i) {
            expr* e = to_app(f)->get_arg(i);
            if (!m.is_eq(e, x, y)) {
                ok = false;
                break;
            }
            if (arith.is_numeral(y, n, is_int) && is_int &&
                (x == v || v == 0)) {
                v = x;
                bounds.push_back(n);
            }
            else if (arith.is_numeral(x, n, is_int) && is_int &&
                     (y == v || v == 0)) {
                v = y;
                bounds.push_back(n);
            }
            else {
                ok = false;
                break;
            }
        }
        if (!ok || !v) continue;
        SASSERT(!bounds.empty());
        lt_rational lt;
        // lt is a total order on rationals.
        std::sort(bounds.begin(), bounds.end(), lt);
        rational p(1);
        unsigned num_bits = 0;
        for (unsigned i = 0; ok && i < bounds.size(); ++i) {
            ok = (p == bounds[i]); 
            p *= rational(2);
            ++num_bits;
        }
        if (!ok) continue;
        unsigned log2 = 0;
        for (unsigned i = 1; i <= num_bits; i *= 2) ++log2;
        if(log2 == 0) continue;
        expr* logx = m.mk_fresh_const("log2_v", bv.mk_sort(log2));
        logx = bv.mk_zero_extend(num_bits - log2, logx);
        m_trail.push_back(logx);
        TRACE("bv2int_rewriter", tout << mk_pp(v, m) << " |-> " << mk_pp(logx, m) << "\n";);
        m_power2.insert(v, logx);
    }
Exemple #21
0
 expr_ref scaler::undo_k(expr* e, expr* k) {
     expr_safe_replace sub(m);
     th_rewriter rw(m);
     expr_ref result(e, m);
     sub.insert(k, a.mk_numeral(rational(1), false));
     sub(result);
     rw(result);
     return result;
 }
Exemple #22
0
void tst_model2expr() {
    ast_manager m;
    m.register_decl_plugins();
    arith_util a(m);

    ptr_vector<sort> ints;
    ints.push_back(a.mk_int());
    ints.push_back(a.mk_int());
    ints.push_back(a.mk_int());

    func_decl_ref p(m), q(m), x(m);
    p = m.mk_func_decl(symbol("p"), 2, ints.c_ptr(), a.mk_int());
    q = m.mk_func_decl(symbol("q"), 2, ints.c_ptr(), a.mk_int());
    x = m.mk_const_decl(symbol("x"), a.mk_int());
    expr_ref n0(m), n1(m), n2(m);
    n0 = a.mk_numeral(rational(0), true);
    n1 = a.mk_numeral(rational(1), true);
    n2 = a.mk_numeral(rational(2), true);

    model_ref md = alloc(model, m);
    func_interp* fip = alloc(func_interp, m, 2);
    func_interp* fiq = alloc(func_interp, m, 2);
    expr_ref_vector args(m);
    args.push_back(n1);
    args.push_back(n2);
    fip->insert_entry(args.c_ptr(), n1);
    fiq->insert_entry(args.c_ptr(), n1);
    args[0] = n0;
    args[1] = n1;
    fip->insert_entry(args.c_ptr(), n2);
    fiq->insert_entry(args.c_ptr(), n2);
   
    fip->set_else(n0);

    md->register_decl(x, a.mk_numeral(rational(0), true));
    md->register_decl(p, fip); // full
    md->register_decl(q, fiq); // partial

    expr_ref result(m);
    model2expr(md, result);
    
    model_smt2_pp(std::cout, m, *md,  0);
    std::cout << mk_pp(result, m) << "\n";
}
Exemple #23
0
void ext_numeral::inv() {
    SASSERT(!is_zero());
    if (is_infinite()) {
        m_kind = FINITE;
        m_value.reset();
    }
    else {
        m_value = rational(1) / m_value;
    }
}
cons_t* proc_div(cons_t *p, environment_t *e)
{
  assert_length(p, 2);

  cons_t *a = car(p);
  cons_t *b = cadr(p);

  assert_number(a);
  assert_number(b);

  bool exact = (a->number.exact && b->number.exact);

  if ( zerop(b) )
    raise(runtime_exception(format(
      "Division by zero: %s", sprint(cons(symbol("/"), p)).c_str())));

  if ( type_of(a) == type_of(b) ) {
    if ( integerp(a) ) {
      // division yields integer?
      if ( gcd(a->number.integer, b->number.integer) == 0)
        return integer(a->number.integer / b->number.integer, exact);
      else
        return rational(make_rational(a) /= make_rational(b), exact);
    } else if ( realp(a) )
      return real(a->number.real / b->number.real);
    else if ( rationalp(a) )
      return rational(a->number.rational / b->number.rational, exact);
    else
      raise(runtime_exception(format("Cannot perform division on %s",
        indef_art(to_s(type_of(a))).c_str())));
  }

  bool anyrational = (rationalp(a) || rationalp(b));
  bool anyinteger = (integerp(a) || integerp(b));

  // int/rat or rat/int ==> turn into rational, and not an int
  if ( anyrational && anyinteger )
    return rational(make_rational(a) /= make_rational(b), exact, false);

  // proceed with real division
  return proc_divf(p, e);
}
void find_all(vector<IntPair>& cset, vector<IntPair>& s1, vector<IntPair>& s2)
{
    for(auto iter = s1.begin(); iter != s1.end(); ++iter) {
        rational r1 = rational(iter->first, iter->second, 1, 0);
        for(auto iter2 = s2.begin(); iter2 !=s2.end(); ++iter2) {
            rational r2 = rational(iter2->first, iter2->second, 1, 0);
            rational result = r1 + r2;
            if(result > 1)
                insert(IntPair(result.pden(), result.pnum()), cset );
            else
                insert(IntPair(result.pnum(), result.pden()), cset);
            result = rational(iter->first*(iter2->first), iter->second*(iter2->first ) + iter->first*(iter2->second));
            insert(IntPair(result.pnum(), result.pden()), cset);
            result = rational(iter->first*(iter2->second), iter->second*(iter2->second ) + iter->first*(iter2->first));
            insert(IntPair(result.pnum(), result.pden()), cset);
            result = rational(iter2->first*(iter->second), iter->second*(iter2->second) + iter->first*(iter2->first));
            insert(IntPair(result.pnum(), result.pden()), cset);
        }
    }
}
Exemple #26
0
 Z3_ast Z3_API Z3_mk_int(Z3_context c, int value, Z3_sort ty) {
     Z3_TRY;
     LOG_Z3_mk_int(c, value, ty);
     RESET_ERROR_CODE();
     if (!check_numeral_sort(c, ty)) {
         RETURN_Z3(nullptr);
     }
     ast * a = mk_c(c)->mk_numeral_core(rational(value), to_sort(ty));
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(nullptr);
 }
Exemple #27
0
 bool get_neutral_elem(app * t, expr_ref & n) {
     family_id fid = t->get_family_id();
     if (fid == m_a_rw.get_fid()) {
         switch (t->get_decl_kind()) {
         case OP_ADD: n = m_a_util.mk_numeral(rational(0), m().get_sort(t)); return true;
         case OP_MUL: n = m_a_util.mk_numeral(rational(1), m().get_sort(t)); return true;
         default:
             return false;
         }
     }
     if (fid == m_bv_rw.get_fid()) {
         switch (t->get_decl_kind()) {
         case OP_BADD: n = m_bv_util.mk_numeral(rational(0), m().get_sort(t)); return true;
         case OP_BMUL: n = m_bv_util.mk_numeral(rational(1), m().get_sort(t)); return true;
         default:
             return false;
         }
     }
     return false;
 }
Exemple #28
0
int main( int argc, char* argv [ ] )
{
   rational r1( 1, 2 );
   rational r2( -2, 7 ); 
   rational r3( 1, 3 );
   rational r4( 2, 8 );
   matrix m1 = { { r1, r2 }, { r3, r4 } };
   std::cout << m1 << "\n";
   
   r1 = rational(1, -3);
   r2 = rational(2, 5);
   r3 = rational(2, 7);
   r4 = rational(-1, 7);
   matrix m2 = { { r1, r2 }, { r3, r4 } };
   std::cout << m2 << "\n";
   
   matrix m12 = m1 * m2;
   std::cout << m12 << "\n";
   std::cout << m1.inverse() << "\n" << m1.determinant() << "\n";
}
Exemple #29
0
static app_ref generate_ineqs(ast_manager& m, sort* s, vector<expr_ref_vector>& cs, bool mods_too) {
    arith_util a(m);
    app_ref_vector vars(m), nums(m);
    vars.push_back(m.mk_const(symbol("x"), s));
    vars.push_back(m.mk_const(symbol("y"), s));
    vars.push_back(m.mk_const(symbol("z"), s));
    vars.push_back(m.mk_const(symbol("u"), s));
    vars.push_back(m.mk_const(symbol("v"), s));
    vars.push_back(m.mk_const(symbol("w"), s));
    nums.push_back(a.mk_numeral(rational(1),  s));
    nums.push_back(a.mk_numeral(rational(2),  s));
    nums.push_back(a.mk_numeral(rational(3),  s));
    
    app* x = vars[0].get();
    app* y = vars[1].get();
    // app* z = vars[2].get();
    // 
    // ax <= by, ax < by, not (ax >= by), not (ax > by)
    // 
    cs.push_back(mk_ineqs(x, vars[1].get(), nums));
    cs.push_back(mk_ineqs(x, vars[2].get(), nums));
    cs.push_back(mk_ineqs(x, vars[3].get(), nums));
    cs.push_back(mk_ineqs(x, vars[4].get(), nums));
    cs.push_back(mk_ineqs(x, vars[5].get(), nums));

    if (mods_too) {
        expr_ref_vector mods(m);
        expr_ref zero(a.mk_numeral(rational(0), s), m);
        mods.push_back(m.mk_true());
        for (unsigned j = 0; j < nums.size(); ++j) {
            mods.push_back(m.mk_eq(a.mk_mod(a.mk_add(a.mk_mul(nums[j].get(),x), y), nums[1].get()), zero));
        }
        cs.push_back(mods);
        mods.resize(1);
        for (unsigned j = 0; j < nums.size(); ++j) {
            mods.push_back(m.mk_eq(a.mk_mod(a.mk_add(a.mk_mul(nums[j].get(),x), y), nums[2].get()), zero));
        }
        cs.push_back(mods);
    }
    return app_ref(x, m);
}
Exemple #30
0
    void closure::add_variables(unsigned num_vars, expr_ref_vector& fmls) {
        manager& pm = m_pt.get_pdr_manager();
        SASSERT(num_vars > 0);
        while (m_vars.size() < num_vars) {
            m_vars.resize(m_vars.size()+1);
            m_sigma.push_back(m.mk_fresh_const("sigma", a.mk_real()));
        }

        unsigned sz = m_pt.sig_size();

        for (unsigned i = 0; i < sz; ++i) {
            expr* var;
            ptr_vector<expr> vars;
            func_decl* fn0 = m_pt.sig(i);
            func_decl* fn1 = pm.o2n(fn0, 0);
            sort* srt = fn0->get_range();
            if (a.is_int_real(srt)) {
                for (unsigned j = 0; j < num_vars; ++j) {
                    if (!m_vars[j].find(fn1, var)) {
                        var  = m.mk_fresh_const(fn1->get_name().str().c_str(), srt);
                        m_trail.push_back(var);
                        m_vars[j].insert(fn1, var);
                    }
                    vars.push_back(var);
                }
                fmls.push_back(m.mk_eq(m.mk_const(fn1), a.mk_add(num_vars, vars.c_ptr())));
            }
        }
        if (m_is_closure) {
            for (unsigned i = 0; i < num_vars; ++i) {
                fmls.push_back(a.mk_ge(m_sigma[i].get(), a.mk_numeral(rational(0), a.mk_real())));
            }
        }
        else {
            // is interior:
            for (unsigned i = 0; i < num_vars; ++i) {
                fmls.push_back(a.mk_gt(m_sigma[i].get(), a.mk_numeral(rational(0), a.mk_real())));
            }
        }
        fmls.push_back(m.mk_eq(a.mk_numeral(rational(1), a.mk_real()), a.mk_add(num_vars, m_sigma.c_ptr())));
    }