Definition prim (f:nat -> value) : expr -> expr :=
  Prim (val_to_exp oo f).

(* Specifications: *)
Lemma T_Prim : forall G f e sigma, (forall n, Typ nil (val_to_exp (f n)) sigma) -> Typ G e ty_nat -> Typ G (prim f e) sigma.
Lemma T_New: forall G e tau, Typ G e tau -> Typ G (New e) (ty_ref tau).
Lemma T_App: forall G e1 sigma tau e2, Typ G e1 (ty_lam sigma tau) -> Typ G e2 sigma -> Typ G (App e1 e2) tau.
Lemma T_Deref: forall G e tau, Typ G e (ty_ref tau) -> Typ G (Deref e) tau.
Lemma T_Update: forall G e1 tau e2 e3 sigma, Typ G e1 (ty_ref tau) -> Typ G e2 tau -> Typ G e3 sigma -> Typ G (Update e1 e2 e3) sigma.
Lemma AllBnd_ALL : forall (X:pred world -> pred world), allp X = AllBnd TT X.
Lemma T_UnivI : forall G e (X:pred world -> pred world), openValue e -> (forall tau, Typ G e (X tau)) -> Typ G e (allp X).
Lemma T_UnivE : forall G e (X:pred world -> pred world) tau, Typ G e (allp X) -> Typ G e (X tau).
Lemma T_ExtI : forall G e (X:pred world -> pred world) tau (Hext : forall tau, boxy extendM tau -> boxy extendM (X tau)), boxy extendM tau -> Typ G e (X tau) -> Typ G e (ty_ex X).
Lemma T_ExtE : forall G e f (X:pred world -> pred world) sigma (Hext : forall tau, boxy extendM tau -> boxy extendM (X tau)), Typ G e (ty_ex X) -> (forall tau, Typ (X tau::G) f sigma) -> Typ G (App (Lam f) e) sigma.