Definition ty_lam (tau1 tau2 : pred world) : pred world :=
EX e:expr, EX H:closed' 1 e, just (v_Lam e H) &&
|>%(ALL v':value, with_val v' (%tau1) --> expr_type (subst 0 v' e) tau2).
Definition etype : Type := list (pred world).
Fixpoint etype_valid (e : env) (G : etype) : pred world :=
match (e,G) with
| (v :: es, tau :: Gs) => with_val v (%tau) && etype_valid es Gs
| (nil, nil) => TT
| _ => FF
end.
(* Not in paper, but should add.  Taken from VMM. *)
Definition Typ (G : etype) (exp : expr) (tau : pred world) : Prop :=
closed' (length G) exp  /\
forall env, etype_valid env G |-- expr_type (subst_env env exp) tau.

Lemma subp_expr_type : forall G P P',
G |-- P >=> P' ->
G |-- ALL e:expr, expr_type e P >=> expr_type e P'.