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_type_at : forall G P Q l,
G |-- |>(P <=> Q) ->
G |-- type_at l P >=> type_at l Q.