% The typing rules are no longer operational, % so we have to give derivations for type-checking. % Extrinsic _ : of (lam [x] x) (all [a] a => a) = tp_alli [a:tp] tp_lam [x:exp] [u:of x a] u. _ : of (lam [x] app x x) ((all [a] a) => (all [a] a)) = tp_lam [x:exp] [u:of x (all [a] a)] tp_app u (tp_alle ((all [a] a) => (all [a] a)) u). one : tp = all [a] a => a. _ : of (lam [x] app x x) (one => one) = tp_lam [x] [u:of x one] tp_app u (tp_alle one u). % Intrinsic %query 1 * D : of* (tlam* [a] lam* a [x:term*] x) T. %query 0 * D : of* (lam* T1 [x] app* x x) T. one = all [a] a => a. %query 1 * D : of* (lam* one [x:term*] app* (tapp* x one) x) T. % Indexed _ = tlam' [a] lam' [x:term a] x. _ = tlam' [a] lam' [x] x. % _ = lam [x] app x x. % fails % constraints remain in next example % _ = lam [x] app (tapp x _) x. one = all [a] a => a. id : term (one) = tlam' [a] lam' [x:term a] x. selfApp : term (one => one) = lam' [x:term one] app' (tapp' x one) x.