From 19146322d3aadfa7675f41363ff5300d3cdd3665 Mon Sep 17 00:00:00 2001 From: Kathy Gray Date: Mon, 14 Nov 2016 14:21:01 +0000 Subject: Add new type checking file. Small changes to type inference, temporary change to printing --- language/l2_rules.ott | 99 ++++++++++++++++++++++++++------------------------ language/manual.pdf | Bin 361269 -> 361603 bytes 2 files changed, 52 insertions(+), 47 deletions(-) (limited to 'language') diff --git a/language/l2_rules.ott b/language/l2_rules.ott index b925d8cd..7fb54c9a 100644 --- a/language/l2_rules.ott +++ b/language/l2_rules.ott @@ -751,45 +751,45 @@ defns check_lit :: '' ::= defn -t |- lit : t' => exp , S_N :: :: check_lit :: check_lit_ +widening , t |- lit : t' => exp , S_N :: :: check_lit :: check_lit_ {{ com Typing literal constants, coercing to expected type t }} by ------------------------------------------------------------ :: num -range |- num : atom < num > => num , { ne <= num, num <= ne' } +widening, range |- num : atom < num > => num , { ne <= num, num <= ne' } ------------------------------------------------------------ :: numToVec -vector |- num : atom < num > => to_vec num , { num + one <= 2**ne' } +widening, vector |- num : atom < num > => to_vec num , { num + one <= 2**ne' } ------------------------------------------------------------ :: numbitzero - bit |- numZero : atom < zero > => bitzero, {} +widening, bit |- numZero : atom < zero > => bitzero, {} ------------------------------------------------------------ :: numbitone - bit |- numOne : atom < one > => bitone, {} +widening, bit |- numOne : atom < one > => bitone, {} ------------------------------------------------------------- :: string - string |- :L_string: string : :T_string_typ: string => :E_lit: string, {} +widening, string |- :L_string: string : :T_string_typ: string => :E_lit: string, {} ne == bitlength(hex) ------------------------------------------------------------ :: hex - vector |- hex : vector< ne1 ne order bit> => hex, {ne=ne2} +widening, vector |- hex : vector< ne1 ne order bit> => hex, {ne=ne2} ne == bitlength(bin) ------------------------------------------------------------ :: bin -vector |- bin : vector< ne1 ne order bit> => bin, {ne=ne2} +widening,vector |- bin : vector< ne1 ne order bit> => bin, {ne=ne2} ------------------------------------------------------------ :: unit -unit |- () : unit => unit, {} +widening, unit |- () : unit => unit, {} ------------------------------------------------------------ :: bitzero -bit |- bitzero : bit => bitzero, {} +widening, bit |- bitzero : bit => bitzero, {} ------------------------------------------------------------ :: bitone -bit |- bitone : bit => bitzero, {} +widening, bit |- bitone : bit => bitzero, {} ------------------------------------------------------------ :: undef -t |- undefined : t => undefined, {} +widening, t |- undefined : t => undefined, {} defns check_pat :: '' ::= @@ -800,7 +800,7 @@ E , t |- pat : t' gives pat' , E_t , S_N :: :: check_pat :: check_pat_ by lit NOTEQ undefined -t |- lit : u => lit',S_N +(none,none),t |- lit : u => lit',S_N E_d,(nums,none) |- u ~< t: t', S_N' ------------------------------------------------------------ :: lit , t |- lit : t' gives lit', {}, S_N u+ S_N' @@ -1143,87 +1143,92 @@ E,t,widening |- lit : u gives exp,,E_t ,unit,widening |- nondet { exp ; } : unit gives {exp'; }, I1 u+ I2, E_t E,t,widening |- exp:u gives exp', I1, E_t1 -E |- lexp:t gives lexp', I2, E_t2 +E,widening |- lexp:t gives lexp', I2, E_t2 ------------------------------------------------------------ :: assign E,unit,widening |- lexp := exp : unit gives lexp' := exp', I u+ I2, E_t2 defn -E |- lexp : t gives lexp' , I , E_t :: :: check_lexp :: check_lexp_ +E , widening |- lexp : t gives lexp' , I , E_t :: :: check_lexp :: check_lexp_ {{ com Check the left hand side of an assignment }} by E_t(id) gives register ---------------------------------------------------------- :: wreg - |- id : t gives id,<{},{ wreg }>, E_t +,widening |- id : t gives id,<{},{ wreg }>, E_t E_t(id) gives reg ---------------------------------------------------------- :: wlocl - |- id : t gives id,Ie, E_t +,widening |- id : t gives id,Ie, E_t E_t(id) gives t ---------------------------------------------------------- :: var - |- id : t gives id,Ie,E_t +,widening |- id : t gives id,Ie,E_t id NOTIN dom(E_t) ---------------------------------------------------------- :: wnew - |- id : t gives id,Ie, {id |-> reg} +,widening |- id : t gives id,Ie, {id |-> reg} E_t(id) gives register E_d |- typ ~> u -E_d |- u ~< t, S_N +E_d,widening |- u ~< t : u, S_N ---------------------------------------------------------- :: wregCast - |- (typ) id : t gives id,, E_t +,widening |- (typ) id : t gives id,, E_t E_t(id) gives reg E_d |- typ ~> u -E_d |- u ~< t, S_N +E_d,widening |- u ~< t : u, S_N ---------------------------------------------------------- :: wloclCast - |- (typ) id : t gives id,, E_t +,widening |- (typ) id : t gives id,, E_t E_t(id) gives t E_d |- typ ~> u -E_d |- u ~< t, S_N +E_d,widening |- u ~< t : u, S_N ---------------------------------------------------------- :: varCast - |- (typ) id : t gives id,,E_t +,widening |- (typ) id : t gives id,,E_t id NOTIN dom(E_t) E_d |- typ ~> t ---------------------------------------------------------- :: wnewCast - |- (typ) id : t gives id,Ie, {id |-> reg} +, widening |- (typ) id : t gives id,Ie, {id |-> reg} -E_t(id) gives E_k, S_N, Extern, t1 -> t {, wmem, } -,t1 |- exp : u1 gives exp',I,E_t1 +E_t(id) gives E_k, S_N, Extern, (t1, .. ,tn, t) -> t' {, wmem, } +,(t1, .. , tn),widening |- exp : u1 gives exp',I,E_t1 ---------------------------------------------------------- :: wmem - |- :LEXP_memory: id(exp) : t gives :LEXP_memory: id(exp'),I u+ ,E_t +,widening |- :LEXP_memory: id(exp) : t gives :LEXP_memory: id(exp'),I u+ ,E_t -E,atom |- exp : u gives exp',I1,E_t -E |- lexp : vector gives lexp',I2,E_t +E_t(id) gives E_k, S_N, Extern, (t1, ..,tn,t) -> t' {, wreg, } +,(t1,..,tn),widening |- exp : u1 gives exp',I,E_t1 +---------------------------------------------------------- :: wregCall +,widening |- :LEXP_memory: id(exp) : t gives :LEXP_memory: id(exp'),I u+ ,E_t + +E,atom,(nums,none) |- exp : u gives exp',I1,E_t +E,(none,vectors) |- lexp : vector gives lexp',I2,E_t ---------------------------------------------------------- :: wbitInc -E |- lexp [exp] : t gives lexp'[exp'], I1 u+ I2 u+ <{ne1 <= ne, ne1 + ne2 >= ne},pure>,E_t +E,widening |- lexp [exp] : t gives lexp'[exp'], I1 u+ I2 u+ <{ne1 <= ne, ne1 + ne2 >= ne},pure>,E_t -E,atom |- exp : u gives exp',I1,E_t -E |- lexp : vector gives lexp',I2,E_t +E,atom,(nums,none) |- exp : u gives exp',I1,E_t +E,(none,vectors) |- lexp : vector gives lexp',I2,E_t ---------------------------------------------------------- :: wbitDec -E |- lexp [exp] : t gives lexp'[exp'], I1 u+ I2 u+ <{ne <= ne1, ne1 + (-ne2) <= ne},pure>,E_t +E,widening |- lexp [exp] : t gives lexp'[exp'], I1 u+ I2 u+ <{ne <= ne1, ne1 + (-ne2) <= ne},pure>,E_t -E,atom |- exp1 : u1 gives exp1',I1,E_t -E,atom |- exp2 : u2 gives exp2',I2,E_t -E |- lexp : vector gives lexp',I3,E_t +E,atom,(nums,none) |- exp1 : u1 gives exp1',I1,E_t +E,atom,(nums,none) |- exp2 : u2 gives exp2',I2,E_t +E,(none,vectors) |- lexp : vector gives lexp',I3,E_t ---------------------------------------------------------- :: wsliceInc -E |- lexp [exp1 : exp2] : vector< ne1 ne2 + (-ne1) inc t> gives lexp'[exp1':exp2'],I1 u+ I2 u+ I3 u+ <{ne3<=ne1, ne3+ne4<= ne2 + (-ne1)},pure> ,E_t +E,widening |- lexp [exp1 : exp2] : vector< ne1 ne2 + (-ne1) inc t> gives lexp'[exp1':exp2'],I1 u+ I2 u+ I3 u+ <{ne3<=ne1, ne3+ne4<= ne2 + (-ne1)},pure> ,E_t -E,atom |- exp1 : u1 gives exp1',I1,E_t -E,atom |- exp2 : u2 gives exp2',I2,E_t -E |- lexp : vector gives lexp',I3,E_t +E,atom,(nums,none) |- exp1 : u1 gives exp1',I1,E_t +E,atom,(nums,none) |- exp2 : u2 gives exp2',I2,E_t +E,(none,vectors) |- lexp : vector gives lexp',I3,E_t ---------------------------------------------------------- :: wsliceDec -E |- lexp [exp1 : exp2] : vector< ne1 ne2 + (-ne1) inc t> gives lexp'[exp1':exp2'],I1 u+ I2 u+ I3 u+ <{ne1<=ne3, ne3 + (-ne4)<= ne1 + (-ne2)},pure> ,E_t +E,widening |- lexp [exp1 : exp2] : vector< ne1 ne2 + (-ne1) inc t> gives lexp'[exp1':exp2'],I1 u+ I2 u+ I3 u+ <{ne1<=ne3, ne3 + (-ne4)<= ne1 + (-ne2)},pure> ,E_t E_r (x) gives id : t -> |- lexp : x gives lexp',I,E_t +>,widening |- lexp : x gives lexp',I,E_t ---------------------------------------------------------- :: wrecord -> |- lexp.id : t gives lexp'.id,I,E_t +>,widening |- lexp.id : t gives lexp'.id,I,E_t defn E |- letbind gives letbind' , E_t , S_N , effect , E_k :: :: check_letbind :: check_letbind_ @@ -1232,8 +1237,8 @@ by |- typschm ~> t,E_k2,S_N >,t |- pat : u gives pat',E_t1, S_N1 ->,t |- exp : u' gives exp', ,E_t2 - |- u' ~< u, S_N3 +>,t,(none,none) |- exp : u' gives exp', ,E_t2 +,(none,none) |- u' ~< u, S_N3 ------------------------------------------------------------ :: val_annot > |- let typschm pat = exp gives let typschm pat' = exp', E_t1, S_N u+ S_N1 u+ S_N2 u+ S_N3, effect, E_k2 diff --git a/language/manual.pdf b/language/manual.pdf index 13fef4aa..22b4c5c3 100644 Binary files a/language/manual.pdf and b/language/manual.pdf differ -- cgit v1.2.3