(* ---------------------------------------------------------------------------- *)
(* Simple types. *)
(* These types do not contain any variables. They have no binding structure. *)
Inductive ty :=
| TyIota: ty
| TyArrow: ty -> ty -> ty.
(* The typing judgement of the simply-typed lambda-calculus. *)
Inductive j : env ty -> term -> ty -> Prop :=
| JVar:
forall E x T,
lookup x E = Some T ->
j E (TVar x) T
| JAbs:
forall E t T1 T2,
j (insert 0 T1 E) t T2 ->
j E (TAbs t) (TyArrow T1 T2)
| JApp:
forall E t1 t2 T1 T2,
j E t1 (TyArrow T1 T2) ->
j E t2 T1 ->
j E (TApp t1 t2) T2.
Hint Constructors j : j.
(* ---------------------------------------------------------------------------- *)
(* The typing judgement is compatible with weakening, i.e., inserting a new term variable. *)

(* Specifications: *)
Lemma weakening:
forall E t T,
j E t T ->
forall x U E',
insert x U E = E' ->
j E' (shift x t) T.