Inductive value : exp -> Prop :=
  | value_abs : forall e T1,
      lc (abs T1 e) ->
      value (abs T1 e).Inductive value : exp -> Prop :=
  | value_abs : forall e T1,
      lc (abs T1 e) ->
      value (abs T1 e).Inductive eval : exp -> exp -> Prop :=
  | eval_beta : forall e1 e2 T1,
      lc (abs T1 e1) ->
      value e2 ->
      eval (app (abs T1 e1) e2) (open e1 e2)
  | eval_app_1 : forall e1 e1' e2,
      lc e2 ->
      eval e1 e1' ->
      eval (app e1 e2) (app e1' e2)
  | eval_app_2 : forall e1 e2 e2',
      value e1 ->
      eval e2 e2' ->
      eval (app e1 e2) (app e1 e2').Inductive eval : exp -> exp -> Prop :=
  | eval_beta : forall e1 e2 T1,
      lc (abs T1 e1) ->
      value e2 ->
      eval (app (abs T1 e1) e2) (open e1 e2)
  | eval_app_1 : forall e1 e1' e2,
      lc e2 ->
      eval e1 e1' ->
      eval (app e1 e2) (app e1' e2)
  | eval_app_2 : forall e1 e2 e2',
      value e1 ->
      eval e2 e2' ->
      eval (app e1 e2) (app e1 e2').Inductive eval : exp -> exp -> Prop :=
  | eval_beta : forall e1 e2 T1,
      lc (abs T1 e1) ->
      value e2 ->
      eval (app (abs T1 e1) e2) (open e1 e2)
  | eval_app_1 : forall e1 e1' e2,
      lc e2 ->
      eval e1 e1' ->
      eval (app e1 e2) (app e1' e2)
  | eval_app_2 : forall e1 e2 e2',
      value e1 ->
      eval e2 e2' ->
      eval (app e1 e2) (app e1 e2').Inductive eval : exp -> exp -> Prop :=
  | eval_beta : forall e1 e2 T1,
      lc (abs T1 e1) ->
      value e2 ->
      eval (app (abs T1 e1) e2) (open e1 e2)
  | eval_app_1 : forall e1 e1' e2,
      lc e2 ->
      eval e1 e1' ->
      eval (app e1 e2) (app e1' e2)
  | eval_app_2 : forall e1 e2 e2',
      value e1 ->
      eval e2 e2' ->
      eval (app e1 e2) (app e1 e2').

(* Specifications: *)
Lemma lc_to_lc_c : forall e, lc e -> lc_c e.
Lemma lc_c_to_lc : forall e, lc_c e -> lc e.
Lemma typing_to_typing_c : forall E e T, typing E e T -> typing_c E e T.
Lemma typing_c_to_typing : forall E e T, typing_c E e T -> typing E e T.
Lemma value_to_value_c : forall e, value e -> value_c e.
Lemma value_c_to_value : forall e, value_c e -> value e.
Lemma eval_to_eval_c : forall e e', eval e e' -> eval_c e e'.
Lemma eval_c_to_eval : forall e e', eval_c e e' -> eval e e'.
Lemma preservation : forall E e e' T, typing E e T -> eval e e' -> typing E e' T.
Lemma progress : forall e T, typing nil e T -> value e \/ exists e', eval e e'.
Lemma open_abs : forall e u T1, lc (abs T1 e) -> lc u -> lc (open e u).
Lemma value_to_lc : forall e, value e -> lc e.
Lemma eval_to_lc : forall e1 e2, eval e1 e2 -> lc e1 /\ lc e2.
Lemma typing_to_lc : forall E e T, typing E e T -> lc e.
Lemma eq_typ_dec : forall (T T' : typ), { T = T' } + { T <> T' }.
Lemma typing_c_unique : forall E e T1 T2, typing_c E e T1 -> typing_c E e T2 -> T1 = T2.
Lemma lc_to_lc_c : forall e, lc e -> lc_c e.
Lemma lc_c_to_lc : forall e, lc_c e -> lc e.
Lemma typing_to_typing_c : forall E e T, typing E e T -> typing_c E e T.
Lemma typing_c_to_typing : forall E e T, typing_c E e T -> typing E e T.
Lemma value_to_value_c : forall e, value e -> value_c e.
Lemma value_c_to_value : forall e, value_c e -> value e.
Lemma eval_to_eval_c : forall e e', eval e e' -> eval_c e e'.
Lemma eval_c_to_eval : forall e e', eval_c e e' -> eval e e'.
Lemma preservation : forall E e e' T, typing E e T -> eval e e' -> typing E e' T.
Lemma progress : forall e T, typing nil e T -> value e \/ exists e', eval e e'.
Lemma open_abs : forall e u T1, lc (abs T1 e) -> lc u -> lc (open e u).
Lemma value_to_lc : forall e, value e -> lc e.
Lemma eval_to_lc : forall e1 e2, eval e1 e2 -> lc e1 /\ lc e2.
Lemma typing_to_lc : forall E e T, typing E e T -> lc e.
Lemma eq_typ_dec : forall (T T' : typ), { T = T' } + { T <> T' }.
Lemma typing_c_unique : forall E e T1 T2, typing_c E e T1 -> typing_c E e T2 -> T1 = T2.