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; }
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; }