Ejemplo n.º 1
0
bool func_ift(cell_t **cp, type_rep_t t) {
  cell_t *c = clear_ptr(*cp, 3);
  alt_set_t alt_set = 0;
  if(!reduce_arg(c, 0, &alt_set, T_INT)) goto fail;
  clear_flags(c);
  if(c->arg[0]->val[0] > 1) goto fail;
  if(is_var(c->arg[0])) {
    drop(c->arg[0]); // need to add assertions
    cell_t *res = id(c->arg[1]);
    res->alt = id(c->arg[2]);
    store_lazy(cp, c, res); // ***
  } else if(c->arg[0]->val[0]) {
    drop(c->arg[0]);
    drop(c->arg[2]);
    store_lazy(cp, c, c->arg[1]);
  } else {
    drop(c->arg[0]);
    drop(c->arg[1]);
    store_lazy(cp, c, c->arg[2]);
  }
  return false;
 fail:
  fail(cp);
  return false;
}
Ejemplo n.º 2
0
 bool reduce_args(unsigned sz, expr*const* as, expr_ref_vector& result) {
     expr_ref tmp(m);
     for (unsigned i = 0; i < sz; ++i) {
         if (!reduce_arg(as[i], tmp)) return false;
         result.push_back(tmp);
     }
     return true;
 }
Ejemplo n.º 3
0
bool func_compose(cell_t **cp, type_rep_t t) {
  cell_t *const c = clear_ptr(*cp, 3);
  alt_set_t alt_set = 0;

  if(!(reduce_arg(c, 0, &alt_set, T_LIST) &&
       reduce_arg(c, 1, &alt_set, T_LIST))) goto fail;
  clear_flags(c);
  cell_t *res = compose_nd(ref(c->arg[0]), ref(c->arg[1]));
  res->alt_set = alt_set_ref(alt_set);
  drop(res->alt);
  res->alt = c->alt;
  store_reduced(cp, res);
  return true;

 fail:
  fail(cp);
  return false;
}
Ejemplo n.º 4
0
bool func_quote(cell_t **cp, type_rep_t t) {
  cell_t *c = clear_ptr(*cp, 3);
  cell_t res = { .size = 2, .ptr = {ref(c->arg[0])} };
  store_reduced(cp, &res);
  return true;
}
cell_t *build_quote(cell_t *x) {
  return build11(func_quote, x);
}

bool func_popr(cell_t **cp, type_rep_t t) {
  cell_t *c = clear_ptr(*cp, 3);
  cell_t *d = c->arg[1];
  alt_set_t alt_set = 0;
  if(!reduce_arg(c, 0, &alt_set, T_LIST)) goto fail;
  clear_flags(c);
  cell_t *p = c->arg[0];
  if(list_size(p) == 0) goto fail;
  if(is_placeholder(p->ptr[0])) {
    ++p->size;
    cell_t *h = expand_inplace_dep(p->ptr[0], 1); // *** no shift here
    p->ptr[0] = h->arg[closure_in(h)] = dep(ref(h));
    p->ptr[1] = h;
  }

  if(d) {
    drop(c);
    d->func = func_id;
    d->arg[0] = ref(p->ptr[0]);
    d->arg[1] = (cell_t *)alt_set_ref(alt_set);
    c->arg[1] = p->ptr[0];
  }

  /* drop the right list element */
  cell_t *res = closure_alloc(closure_args(p)-1);
  int elems = list_size(res);
  res->type = T_LIST;
  int i;
  for(i = 0; i < elems; ++i)
    res->ptr[i] = ref(p->ptr[i+1]);

  res->alt_set = alt_set_ref(alt_set);
  res->alt = c->alt;
  store_reduced(cp, res);
  return true;

 fail:
  if(d) {
    drop(c);
    store_fail(d, d->alt);
  }
  c->arg[1] = 0;
  fail(cp);
  return false;
}
Ejemplo n.º 5
0
 br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
     expr_ref a0(m), a1(m);
     expr_ref_vector _args(m);
     if (m.is_eq(f) && reduce_arg(args[0], a0) && reduce_arg(args[1], a1)) {
         result = m.mk_eq(a0, a1);
         return BR_DONE;
     }
     else if (m.is_distinct(f) && reduce_args(num, args, _args)) {
         result = m.mk_distinct(_args.size(), _args.c_ptr());
         return BR_DONE;
     }
     else if (m_dt.is_recognizer(f) && reduce_arg(args[0], a0)) {
         unsigned idx = m_dt.get_recognizer_constructor_idx(f);
         a1 = m_bv.mk_numeral(rational(idx), get_sort(a0));
         result = m.mk_eq(a0, a1);
         return BR_DONE;
     }
     else {
         check_for_fd(num, args);
         return BR_FAILED;
     }
 }
Ejemplo n.º 6
0
/* should probably cut them, or hide select */
bool func_select(cell_t **cp, type_rep_t t) {
  cell_t *c = *cp;
  cell_t *p;
  alt_set_t alt_set = 0;
  if(reduce_arg(c, 0, &alt_set, t)) {
    clear_flags(c);
    p = c->arg[0];
  } else if(reduce_arg(c, 1, &alt_set, t)) {
    clear_flags(c);
    drop(c->arg[0]);
    p = c->arg[1];
    c->func = func_id;
    c->size = 1;
    c->arg[0] = p;
  } else goto fail;
  store_reduced(cp, ref(p));
  return true;

 fail:
  fail(cp);
  return false;
}
Ejemplo n.º 7
0
bool func_op2(cell_t **cp, type_rep_t t, intptr_t (*op)(intptr_t, intptr_t)) {
  cell_t *res = 0;
  cell_t *const c = clear_ptr(*cp, 3);
  alt_set_t alt_set = 0;

  if(t == T_ANY || t == T_INT) t = T_INT;
  else goto fail;

  if(!reduce_arg(c, 0, &alt_set, t) ||
     !reduce_arg(c, 1, &alt_set, t)) goto fail;
  clear_flags(c);
  cell_t *p = c->arg[0], *q = c->arg[1];
  res = is_var(p) || is_var(q) ? var(t) : _op2(op, p, q);
  res->alt = c->alt;
  res->alt_set = alt_set_ref(alt_set);
  store_reduced(cp, res);
  return true;

 fail:
  drop(res);
  fail(cp);
  return false;
}
Ejemplo n.º 8
0
bool func_assert(cell_t **cp, type_rep_t t) {
  cell_t *c = clear_ptr(*cp, 3);
  alt_set_t alt_set = 0;
  if(!reduce_arg(c, 1, &alt_set, T_INT)) goto fail;
  clear_flags(c);  
  cell_t *p = c->arg[1];
  if(!(is_var(p) || p->val[0])) goto fail;
  c->func = func_id;
  c->size = 1;
  c->arg[1] = (cell_t *)alt_set_ref(alt_set);
  drop(p);
  return false;
 fail:
  fail(cp);
  return false;
}
Ejemplo n.º 9
0
bool func_cut(cell_t **cp, type_rep_t t) {
  cell_t *c = *cp;
  alt_set_t alt_set = 0;
  if(!reduce_arg(c, 0, &alt_set, t)) goto fail;
  clear_flags(c);
  cell_t *p = c->arg[0];
  bool v = is_var(p);
  cell_t *alt = p->alt;
  p->alt = 0;
  store_reduced(cp, ref(p));
  if(v) trace_expand_select(c, alt, t);
  drop(alt);
  return true;

 fail:
  fail(cp);
  return false;
}
Ejemplo n.º 10
0
bool func_pushl(cell_t **cp, type_rep_t t) {
  cell_t *c = clear_ptr(*cp, 3);
  alt_set_t alt_set = 0;
  if(!reduce_arg(c, 1, &alt_set, T_LIST)) goto fail;
  clear_flags(c);
  cell_t *q = c->arg[1];
  bool rvar = is_var(q);
  cell_t *res = pushl_nd(ref(c->arg[0]), ref(q));
  if(rvar) res->type |= T_VAR;
  drop(res->alt);
  res->alt = c->alt;
  res->alt_set = alt_set_ref(alt_set);
  store_reduced(cp, res);
  return true;

  fail:
    fail(cp);
    return false;
}
Ejemplo n.º 11
0
/*
bool type_check(cell_t **cp, type_t type) {
  cell_t *c = clear_ptr(*cp, 3);
  if(!reduce(&c->arg[0], type)) goto fail;
  c->alt = closure_split1(c, 0);
  cell_t *p = get(c->arg[0]);
  if(!((p->type == type) ||
       is_var(p))) goto fail;
  store_reduced(c, mod_alt(c->arg[0], c->alt,
			   c->arg[0]->alt_set));
  return true;
 fail:
  fail(cp);
  return false;
}
*/
bool func_id(cell_t **cp, type_rep_t t) {
  cell_t *c = clear_ptr(*cp, 3);
  alt_set_t alt_set = (alt_set_t)c->arg[1];
  if(alt_set || c->alt) {
    if(!reduce_arg(c, 0, &alt_set, t)) goto fail;
    clear_flags(c);
    cell_t *p = c->arg[0];
    if(p->alt) alt_set_ref(alt_set);
    store_reduced(cp, mod_alt(ref(p), c->alt, alt_set));
    alt_set_drop(alt_set);
    return true;
  } else {
    cell_t *p = ref(c->arg[0]);
    drop(c);
    *cp = p;
    return false;
  }

 fail:
  fail(cp);
  return false;
}
Ejemplo n.º 12
0
bool func_pushr(cell_t **cp, type_rep_t t) {
  cell_t *c = clear_ptr(*cp, 3);
  alt_set_t alt_set = 0;
  if(!reduce_arg(c, 0, &alt_set, T_LIST)) goto fail;
  clear_flags(c);
  cell_t *p = c->arg[0];

  int n = list_size(p);
  cell_t *res = expand(ref(p), 1);
  memmove(res->ptr+1, res->ptr, sizeof(cell_t *)*n);
  res->ptr[0] = ref(c->arg[1]);
  res->alt_set = alt_set_ref(alt_set);
  drop(res->alt);
  res->alt = c->alt;

  store_reduced(cp, res);
  return true;

 fail:
  fail(cp);
  return false;
}