Inductive evaluates : term -> value -> Prop :=
| CAPPLY : forall lt lv c, evaluates_list lt lv -> evaluates (capply c lt) (c_capply c lv)
| FAPPLY : forall lt lv f v i s t, evaluates_list lt lv ->
first_rule (f, lv) = Some (i, s, t) ->
evaluates t v ->
evaluates (fapply f lt) v
with evaluates_list : list term -> list value -> Prop :=
| E_nil : evaluates_list [] []
| E_cons : forall t v lt lv, evaluates t v -> evaluates_list lt lv -> evaluates_list (t :: lt) (v :: lv).
Scheme evaluates_mut := Induction for evaluates Sort Prop
with evaluates_list_mut := Induction for evaluates_list Sort Prop.

(* Specifications: *)
Lemma evaluates_ind2 : forall P,
(forall lt lv c, Forall2 evaluates lt lv ->
Forall2 P lt lv ->
P (capply c lt) (c_capply c lv)) ->
(forall lt lv f i s v t,
Forall2 evaluates lt lv -> Forall2 P lt lv ->
first_rule (f, lv) = Some (i, s, t) ->
evaluates t v -> P t v ->
P (fapply f lt) v) ->
forall (t : term) (v : value), evaluates t v -> P t v.