Type Preservation for MLref

[ language | continuations | typing | evaluation | type preservation || MLref || LLF ]
%%% Mini-ML with References
%%% Type Preservation
%%% Author: Frank Pfenning

%%% Four type preservation theorems
%%% Mode declarations below indicate quantifiers
%%% Lex declarations below indicate structural induction variables

tpex : exec K I W -> ofk K T S -> ofi I T -> off W S -> type.
tpcl : close W W' -> off W T -> off W' T -> type.
tpct : contains C V -> ofc C T -> ofv V T -> type.
tprd : read C V -> ofc C T -> ofv V T -> type.

tpev : ceval E W -> ofe E T -> off W T -> type.

%mode -tpex +Ex +Ok +Oi -Of
%lex Ex

%mode -tpcl +Ec +Of -Of'
%lex Ec

%mode -tpct +Et -Oc -Ov
%lex Et

%mode -tprd +Ed -Oc -Ov
%lex Ed

%mode -tpev +Ev +Oe -Of
%lex Ev

%%% Reading the state without affecting it

tprd_rd : tprd (rd ^ () ^ Et) Oc Ov
            o- tpct Et Oc Ov
            o- .

%%% Execution

% Natural Numbers
tpex_z : tpex (ex_z ^ Ex1) Ok (ofi_ev (ofe_z)) Of
	  o- tpex Ex1 Ok (ofi_return (ofv_z)) Of.

tpex_s : tpex (ex_s ^ Ex1) Ok (ofi_ev (ofe_s Oe1)) Of
	  o- tpex Ex1 (ofk_; Ok ([x1:val] [ov1:ofv x1 nat]
				   ofi_return (ofv_s ov1)))
	          (ofi_ev Oe1) Of.
			 
tpex_case : tpex (ex_case ^ Ex1) Ok (ofi_ev (ofe_case Oe3 Oe2 Oe1)) Of
	     o- tpex Ex1 (ofk_; Ok ([x1:val] [ov1:ofv x1 nat]
				      ofi_case1 Oe3 Oe2 ov1))
		     (ofi_ev Oe1) Of.

tpex_case1_z : tpex (ex_case1_z ^ Ex1) Ok (ofi_case1 Oe3 Oe2 (ofv_z)) Of
		o- tpex Ex1 Ok (ofi_ev Oe2) Of.

tpex_case1_s : tpex (ex_case1_s ^ Ex1) Ok (ofi_case1 Oe3 Oe2 (ofv_s Ov1)) Of
		o- tpex Ex1 Ok (ofi_ev (Oe3 V1 Ov1)) Of.

% Unit
tpex_unit : tpex (ex_unit ^ Ex1) Ok (ofi_ev (ofe_unit)) Of
	     o- tpex Ex1 Ok (ofi_return (ofv_unit)) Of.

% Pairs
tpex_pair : tpex (ex_pair ^ Ex1) Ok (ofi_ev (ofe_pair Oe2 Oe1)) Of
	     o- tpex Ex1 (ofk_; Ok ([x1:val] [ov1:ofv x1 T1]
				      ofi_pair1 Oe2 ov1))
		     (ofi_ev Oe1) Of.

tpex_pair1 : tpex (ex_pair1 ^ Ex1) Ok (ofi_pair1 Oe2 Ov1) Of
	      o- tpex Ex1 (ofk_; Ok ([x2:val] [ov2:ofv x2 T2]
				       ofi_return (ofv_pair ov2 Ov1)))
		      (ofi_ev Oe2) Of.

tpex_fst : tpex (ex_fst ^ Ex1) Ok (ofi_ev (ofe_fst Oe1)) Of
	    o- tpex Ex1 (ofk_; Ok ([x1:val] [ov1:ofv x1 (T1 * T2)]
				     ofi_fst1 ov1))
	            (ofi_ev Oe1) Of.

tpex_fst1 : tpex (ex_fst1 ^ Ex1) Ok (ofi_fst1 (ofv_pair Ov2 Ov1)) Of
	     o- tpex Ex1 Ok (ofi_return Ov1) Of.

tpex_snd : tpex (ex_snd ^ Ex1) Ok (ofi_ev (ofe_snd Oe1)) Of
	    o- tpex Ex1 (ofk_; Ok ([x1:val] [ov1:ofv x1 (T1 * T2)]
				     ofi_snd1 ov1))
	            (ofi_ev Oe1) Of.

tpex_snd1 : tpex (ex_snd1 ^ Ex1) Ok (ofi_snd1 (ofv_pair Ov2 Ov1)) Of
	     o- tpex Ex1 Ok (ofi_return Ov2) Of.

% Functions
tpex_lam : tpex (ex_lam ^ Ex1) Ok (ofi_ev (ofe_lam Oe1)) Of
	    o- tpex Ex1 Ok (ofi_return (ofv_lam Oe1)) Of.

tpex_app : tpex (ex_app ^ Ex1) Ok (ofi_ev (ofe_app Oe2 Oe1)) Of
	    o- tpex Ex1 (ofk_; Ok ([x1:val] [ov1:ofv x1 (T2 => T1)]
				     ofi_app1 Oe2 ov1))
	            (ofi_ev Oe1) Of.

tpex_app1 : tpex (ex_app1 ^ Ex1) Ok (ofi_app1 Oe2 Ov1) Of
	     o- tpex Ex1 (ofk_; Ok ([x2:val] [ov2:ofv x2 T2]
				      ofi_app2 ov2 Ov1))
		     (ofi_ev Oe2) Of.

tpex_app2 : tpex (ex_app2 ^ Ex1) Ok (ofi_app2 Ov2 (ofv_lam Oe1)) Of
	     o- tpex Ex1 Ok (ofi_ev (Oe1 V2 Ov2)) Of.

% References
tpex_ref : tpex (ex_ref ^ Ex1) Ok (ofi_ev (ofe_ref Oe1)) Of
	    o- tpex Ex1 (ofk_; Ok ([x1:val] [ov1:ofv x1 T1] ofi_ref1 ov1))
	            (ofi_ev Oe1) Of.

tpex_ref1 : tpex (ex_ref1 ^ Ex1) Ok (ofi_ref1 Ov1) (off_new Of)
	     o- ({c:cell} {et:contains c V1} {oc:ofc c T1}
		   tpct et oc Ov1
		   -o tpex (Ex1 c ^ et) Ok (ofi_return (ofv_ref oc))
		           (Of c oc)).

tpex_deref : tpex (ex_deref ^ Ex1) Ok (ofi_ev (ofe_deref Oe1)) Of
	      o- tpex Ex1 (ofk_; Ok ([x1:val] [Ov1:ofv x1 (rf T1)]
				       ofi_deref1 Ov1))
		      (ofi_ev Oe1) Of.

tpex_deref1 : tpex (ex_deref1 ^ (Rd1 , Ex1)) Ok (ofi_deref1 (ofv_ref Oc)) Of
                o- tprd Rd1 Oc Ov1 & tpex Ex1 Ok (ofi_return Ov1) Of.

%{ or, multiplicatively:
tpex_deref1 : tpex (ex_deref1 ^ Ex2 ^ Et1) Ok (ofi_deref1 (ofv_ref Oc)) Of
	       o- tpct Et1 Oc Ov1  % Oc is unique!
	       o- ({et1:contains C1 V1}
		      tpct et1 Oc Ov1
		      -o tpex (Ex2 ^ et1) Ok (ofi_return Ov1) Of).
}%

tpex_assign : tpex (ex_assign ^ Ex1) Ok (ofi_ev (ofe_assign Oe2 Oe1)) Of
	       o- tpex Ex1 (ofk_; Ok ([x1:val] [Ov1:ofv x1 (rf T)]
					ofi_assign1 Oe2 Ov1))
		  (ofi_ev Oe1) Of.

tpex_assign1 : tpex (ex_assign1 ^ Ex1) Ok (ofi_assign1 Oe2 Ov1) Of
		o- tpex Ex1 (ofk_; Ok ([x2:val] [Ov2:ofv x2 T]
					 ofi_assign2 Ov2 Ov1))
		        (ofi_ev Oe2) Of.

tpex_assign2 : tpex (ex_assign2 ^ Ex2 ^ Et1) Ok
                    (ofi_assign2 Ov2 (ofv_ref Oc)) Of
		o- tpct Et1 Oc Ov1  % Oc is unique!
		o- ({et2:contains C1 V2} 
		      tpct et2 Oc Ov2
		      -o tpex (Ex2 ^ et2) Ok (ofi_return (ofv_unit)) Of).

tpex_seq : tpex (ex_seq ^ Ex1) Ok (ofi_ev (ofe_seq Oe2 Oe1)) Of
	    o- tpex Ex1 (ofk_; Ok ([x1:val] [Ov1:ofv x1 T1]
				     ofi_ev Oe2))
	            (ofi_ev Oe1) Of.

% Let
tpex_let : tpex (ex_let ^ Ex1) Ok (ofi_ev (ofe_let Oe2 Oe1)) Of
	    o- tpex Ex1 (ofk_; Ok ([x1:val] [ov1:ofv x1 T1]
				     ofi_let1 Oe2 ov1))
	            (ofi_ev Oe1) Of.

tpex_let1 : tpex (ex_let1 ^ Ex2) Ok (ofi_let1 Oe2 Ov1) Of
	     o- tpex Ex2 Ok (ofi_ev (Oe2 V1 Ov1)) Of.

tpex_letv : tpex (ex_letv ^ Ex2) Ok (ofi_ev (ofe_letv Oe2)) Of
	     o- tpex Ex2 Ok (ofi_ev Oe2) Of.

% Recursion
tpex_fix  : % {Oe: {u:exp} ofe u T -> ofe (E u) T}
	     tpex (ex_fix ^ Ex1) Ok (ofi_ev (ofe_fix Oe)) Of
	     o- tpex Ex1 Ok (ofi_ev (Oe (fix E) (ofe_fix Oe))) Of.

% Values
tpex_vl   : tpex (ex_vl ^ Ex1) Ok (ofi_ev (ofe_vl Ov)) Of
	     o- tpex Ex1 Ok (ofi_return Ov) Of.

tpex_return : tpex (ex_return ^ Ex1) (ofk_; Ok Oc) (ofi_return Ov) Of
	       o- tpex Ex1 Ok (Oc V Ov) Of.

tpex_init : tpex (ex_init ^ Ec1) (ofk_init) (ofi_return Ov) Of
	     o- tpcl Ec1 (off_val Ov) Of.

%%% Collecting the final state

tpcl_done : tpcl (close_done) Of Of.

tpcl_loc  : tpcl (close_loc ^ Ec2 ^ Et1) Of Of'
	     o- tpct Et1 Oc1 Ov1
	     o- tpcl Ec2 (off_loc Of Ov1 Oc1) Of'.

%%% Evaluation

tpev_cev : tpev (cev ^ Ex) Oe Of
	    o- tpex Ex (ofk_init) (ofi_ev Oe) Of.

[ language | continuations | typing | evaluation | type preservation || MLref || LLF ]

Frank Pfenning