tp: type. %name tp T. arrow: tp -> tp -> tp. forall: (tp -> tp) -> tp. exp: tp -> type. %name exp E. lam: (exp T1 -> exp T2) -> exp (arrow T1 T2). app: exp (arrow T1 T2) -> exp T1 -> exp T2. tlam: ({t:tp} exp (F t)) -> exp (forall F). tapp: exp (forall F) -> {t:tp} (exp (F t)). eval: exp T -> exp T -> type. ev_lam: eval (lam F) (lam F). ev_app: eval (app E1 E2) V <- eval E1 (lam F1) <- eval E2 V2 <- eval (F1 V2) V. eval_tlam: eval (tlam F) (tlam F). eval_tapp: eval (tapp E T) V <- eval E (tlam F) <- eval (F T) V.