%%% Translation to representation using de Bruijn indices %%% Author: Frank Pfenning, based on [Hannan & Pfenning 92] trans : env -> exp' -> exp -> type. %name trans C. vtrans : val -> exp -> type. %name vtrans U. % can be used in different directions %mode trans +N +F -E. %mode vtrans +W -V. % Natural numbers tr_z : trans N z' z. tr_s : trans N (s' F) (s E) <- trans N F E. tr_case : trans N (case' F1 F2 F3) (case E1 E2 E3) <- trans N F1 E1 <- trans N F2 E2 <- ({w:val} {x:exp} vtrans w x -> trans (N , w) F3 (E3 x)). % Pairs tr_pair : trans N (pair' F1 F2) (pair E1 E2) <- trans N F1 E1 <- trans N F2 E2. tr_fst : trans N (fst' F1) (fst E1) <- trans N F1 E1. tr_snd : trans N (snd' F1) (snd E1) <- trans N F1 E1. % Functions tr_lam : trans N (lam' F) (lam E) <- ({w:val} {x:exp} vtrans w x -> trans (N , w) F (E x)). tr_app : trans N (app' F1 F2) (app E1 E2) <- trans N F1 E1 <- trans N F2 E2. % Definitions tr_letv: trans N (letv' F1 F2) (letv E1 E2) <- trans N F1 E1 <- ({w:val} {x:exp} vtrans w x -> trans (N , w) F2 (E2 x)). tr_letn: trans N (letn' F1 F2) (letn E1 E2) <- trans N F1 E1 <- ({f:exp'} {x:exp} trans N f x -> trans (N + f) F2 (E2 x)). % Recursion tr_fix : trans N (fix' F) (fix E) <- ({f:exp'} {x:exp} trans N f x -> trans (N + f) F (E x)). % Variables tr_1 : trans (N , W) 1 E <- vtrans W E. tr_^ : trans (N , W) (F ^) E <- trans N F E. tr_1+ : trans (N + F) 1 E <- trans N F E. tr_^+ : trans (N + F') (F ^) E <- trans N F E. % Natural number values vtr_z : vtrans z* z. vtr_s : vtrans (s* W) (s V) <- vtrans W V. % Pair values vtr_pair : vtrans (pair* W1 W2) (pair V1 V2) <- vtrans W1 V1 <- vtrans W2 V2. % Function values vtr_lam : vtrans (clo N (lam' F)) (lam E) <- trans N (lam' F) (lam E). % termination cannot be checked.