(*************************************************************************)
(** ** Exists-Fresh Definition *)
(*************************************************************************)
(** The use of cofinite quantification may make some people worry that we are not formalizing the "right" language. Below, we show that the "exists-fresh" version of the rules is the same as the cofinite version. *)

Lemma typing_abs_exists : forall E e T1 T2 (x : atom),
x `notin` dom E \u fv_exp e ->
typing ([(x,T1)] ++ E) (e ^ x) T2 ->
typing E (abs e) (typ_arrow T1 T2).