Skip to content
Documentation out of dateLearn more

POPL Tutorial/cps-rp

%sort tp %.
%term o tp %.
%term => %pi tp %-> tp %-> tp %.
%prec %right 3 => %.
%sort e {_ tp} %.
%sort v {_ tp} %.
%term app %pi (e (A => B)) %-> (e A) %-> (e B) %.
%term lam %pi (%pi (v A) %-> (e B)) %-> (v (A => B)) %.
%term inj %pi (v A) %-> (e A) %.
%block sourceb [A tp] {x v A}%.
%worlds (sourceb) (e _) (v _) %.
%sort ctp %.
%term co ctp %.
%term carr %pi ctp %-> ctp %-> ctp %.
%sort ce %.
%sort cv {_ ctp} %.
%term capp %pi (cv (carr A B)) %-> (cv A) %-> (%pi (cv B) %-> ce) %-> ce %.
%term clam %pi (%pi (cv A) %-> (%pi (cv B) %-> ce) %-> ce) %-> (cv (carr A B)) %.
%block targetb1 [A ctp] {x cv A}%.
%block targetb2 [A ctp] {y %pi (cv A) %-> ce}%.
%worlds (targetb1 targetb2) (ce) (cv _) %.
%sort trans-tp {_ tp} {_ ctp} %.
%term trans-tp/o trans-tp o co %.
%term trans-tp/arr %pi (trans-tp (T1 => T2) (carr P1 P2)) %<- (trans-tp T1 P1) %<- (trans-tp T2 P2) %.
%sort can-trans-tp {A tp} {_ trans-tp A A'} %.
%mode can-trans-tp %in %out %.
%term _ can-trans-tp _ trans-tp/o %.
%term _
%pi (can-trans-tp (A => B) (trans-tp/arr D2 D1))
%<- (can-trans-tp A D1)
%<- (can-trans-tp B D2) %.
%worlds () (can-trans-tp _ _) %.
%total (D1) (can-trans-tp D1 _) %.
%sort ctp-eq {_ ctp} {_ ctp} %.
%term ctp-eq/i ctp-eq A' A' %.
%sort ctp-eq-resp {C %pi ctp %-> ctp %-> ctp} {_ ctp-eq A1 A1'} {_ ctp-eq A2 A2'} {_ ctp-eq (C A1 A2) (C A1' A2')} %.
%mode ctp-eq-resp %in %in %in %out %.
%term _ ctp-eq-resp C (%the (ctp-eq A A) ctp-eq/i) (%the (ctp-eq B B) ctp-eq/i) (%the (ctp-eq (C A B) (C A B)) ctp-eq/i) %.
%worlds () (ctp-eq-resp _ _ _ _) %.
%total {} (ctp-eq-resp _ _ _ _) %.
%sort trans-tp-unique {_ trans-tp A A'} {_ trans-tp A A''} {_ ctp-eq A' A''} %.
%mode trans-tp-unique %in %in %out %.
%term _ trans-tp-unique trans-tp/o trans-tp/o ctp-eq/i %.
%term _
%pi (trans-tp-unique (trans-tp/arr D2 D1) (trans-tp/arr D2' D1') DQ3)
%<- (trans-tp-unique D1 D1' DQ1)
%<- (trans-tp-unique D2 D2' DQ2)
%<- (ctp-eq-resp carr DQ1 DQ2 DQ3) %.
%worlds () (trans-tp-unique _ _ _) %.
%total (D1) (trans-tp-unique D1 _ _) %.
%sort ceo-resp-ctp-eq {_ ctp-eq A A'} {_ %pi (%pi (cv A) %-> ce) %-> ce} {_ %pi (%pi (cv A') %-> ce) %-> ce} %.
%mode ceo-resp-ctp-eq %in %in %out %.
%term _ ceo-resp-ctp-eq _ D1 D1 %.
%worlds (targetb1 targetb2) (ceo-resp-ctp-eq _ _ _) %.
%total {} (ceo-resp-ctp-eq _ _ _) %.
%sort cps {_ v A} {_ trans-tp A A'} {_ cv A'} %.
%mode cps %in %out %out %.
%sort cpse {_ e A} {_ trans-tp A A'} {_ %pi (%pi (cv A') %-> ce) %-> ce} %.
%mode cpse %in %out %out %.
%sort cpse+ {_ e A} {_ trans-tp A A'} {_ %pi (%pi (cv A') %-> ce) %-> ce} %.
%mode cpse+ %in %in %out %.
%term cps/lam
%pi (cps (lam E) (trans-tp/arr D2 D1) (clam E'))
%<- (can-trans-tp _ D1)
%<- ({x v A} {x' cv A'} %pi (cps x D1 x') %-> (cpse (E x) D2 (E' x'))) %.
%term cpse/app
%pi (cpse (app E1 E2) D2 ([c %pi (cv A') %-> ce] E1' ([w1] E2' ([w2] capp w1 w2 c))))
%<- (cpse E1 (trans-tp/arr D2 D1) E1')
%<- (cpse+ E2 D1 E2') %.
%term cpse/inj %pi (cpse (inj E) D1 ([c %pi (cv A) %-> ce] c E')) %<- (cps E D1 E') %.
%term cpse+/i
%pi (cpse+ E D1 E'')
%<- (cpse E D1' E')
%<- (trans-tp-unique D1' D1 DQ)
%<- (ceo-resp-ctp-eq DQ E' E'') %.
%block cpsb [A tp] [A' ctp] [D1 trans-tp A A'] {x v A} {x' cv A'} {d cps x D1 x'}%.
%worlds (cpsb) (cps _ _ _) (cpse _ _ _) (cpse+ _ _ _) %.
%total (E V E') (cps E _ _) (cpse V _ _) (cpse+ E' _ _) %.