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').

Lemma progress : forall e T, typing nil e T -> value e \/ exists e', eval e e'.