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.