Exemple #1
0
static term* elim_over_intro(typing_context* Delta, term* t) {
  check(t && t->args && t->args[t->num_args - 1], "ill formed term");
  check(t->tag == ELIM && t->args[t->num_args - 1]->tag == INTRO,
        "elim_over_intro must be called on an eliminator applied to a constructor");
  term* last = t->args[t->num_args - 1];
  datatype* T = elim_to_datatype(t->var, Delta);
  int index = datatype_intro_index(last->var, T);
  check(index != -1, "bad intro index while evaluating %W", t, print_term);
  term *app = term_dup(t->args[index + 1]);
  int i;
  for (i = 0; i < last->num_args; i++) {
    app = make_app(app, term_dup(last->args[i]));
    if (constructor_arg_is_inductive(T, last->var, i)) {
      term *inductive = term_dup(t);
      free_term(inductive->args[inductive->num_args - 1]);
      inductive->args[inductive->num_args - 1] = term_dup(last->args[i]);
      app = make_app(app, inductive);
    }
  }
  free_term(t);
  t = NULL;
  return app;
 error:
  return NULL;
}
Exemple #2
0
static term* elim_over_intro(typing_context* Delta, term* t) {
  check(t && t->args && t->args[t->num_args - 1], "ill formed term");
  term* last = t->args[t->num_args - 1];
  datatype* T = elim_to_datatype(t->var, Delta);
  int index = datatype_intro_index(last->var, T);
  term *app = term_dup(t->args[index + 1]);
  int i;
  for (i = 0; i < last->num_args; i++) {
    app = make_app(app, term_dup(last->args[i]));
    if (constructor_arg_is_inductive(T, last->var, i)) {
      term *inductive = term_dup(t);
      free_term(inductive->args[inductive->num_args - 1]);
      inductive->args[inductive->num_args - 1] = term_dup(last->args[i]);
      app = make_app(app, inductive);
    }
  }
  free_term(t);
  t = NULL;
  return app;
 error:
  return NULL;
}