λProlog module poplmark-2a

poplmark-2a.sig

sig poplmark-2a. kind tm, ty type. type top ty. type arrow ty -> ty -> ty. type all ty -> (ty -> ty) -> ty. type abs ty -> (tm -> tm) -> tm. type app tm -> tm -> tm. type tabs ty -> (ty -> tm) -> tm. type tapp tm -> ty -> tm. type sub ty -> ty -> o. type of tm -> ty -> o. type value tm -> o. type step tm -> tm -> o.

poplmark-2a.mod

module poplmark-2a. % Subtyping (Declarative version) sub S top. sub T T. sub S T :- sub S Q, sub Q T. sub (arrow S1 S2) (arrow T1 T2) :- sub T1 S1, sub S2 T2. sub (all S1 (x\ S2 x)) (all T1 (x\ T2 x)) :- sub T1 S1, pi x\ (sub x T1 => sub (S2 x) (T2 x)). % Typing of (abs T1 E) (arrow T1 T2) :- pi x\ of x T1 => of (E x) T2. of (app E1 E2) T12 :- of E1 (arrow T11 T12), of E2 T11. of (tabs T1 E) (all T1 T2) :- pi x\ sub x T1 => of (E x) (T2 x). of (tapp E T2) (T12 T2) :- of E (all T11 T12), sub T2 T11. of E T :- of E S, sub S T. % Small step evaluation value (abs T E). value (tabs T E). step (app (abs T E1) V2) (E1 V2) :- value V2. step (tapp (tabs T1 E) T2) (E T2). step (app E1 E2) (app E1' E2) :- step E1 E1'. step (app V1 E2) (app V1 E2') :- value V1, step E2 E2'. step (tapp E T) (tapp E' T) :- step E E'.