1(* Interactive: 2 load "wordsLib"; 3 quietdec := true; 4 open wordsLib arithmeticTheory; 5 quietdec := false; 6*) 7 8open HolKernel Parse boolLib bossLib wordsLib 9 arithmeticTheory; 10 11(*---------------------------------------------------------------------------------*) 12(* Theorems used for pre-processing, normalization, normal format optimization, *) 13(* inlining, closure conversion and register allocation. *) 14(* To do: break them into several theories. *) 15(*---------------------------------------------------------------------------------*) 16 17val _ = new_theory "Normal"; (* This name is misleading *) 18 19(*---------------------------------------------------------------------------------*) 20(* Preprocessing *) 21(*---------------------------------------------------------------------------------*) 22 23(* Conjunction in condtions *) 24val AND_COND = Q.store_thm ( 25 "AND_COND", 26 `(if c1 /\ c2 then e1 else e2) = 27 let x = e2 in 28 (if c1 then 29 if c2 then e1 else x 30 else x)`, 31 RW_TAC std_ss [LET_THM] THEN 32 METIS_TAC [] 33 ); 34 35(* Disjunction in condtions *) 36val OR_COND = Q.store_thm ( 37 "OR_COND", 38 `(if c1 \/ c2 then e1 else e2) = 39 let x = e1 in 40 (if c1 then x else 41 if c2 then x else e2)`, 42 RW_TAC std_ss [LET_THM] THEN 43 METIS_TAC [] 44 ); 45 46(* Normalize the conditions in branches *) 47val BRANCH_NORM = Q.store_thm ( 48 "BRANCH_NORM", 49 `((if (a:num) > b then x else y) = (if a <= b then y else x)) /\ 50 ((if a >= b then x else y) = (if a < b then y else x)) /\ 51 ((if aw > bw then xw else yw) = (if aw <= bw then yw else xw)) /\ 52 ((if aw >= bw then xw else yw) = (if aw < bw then yw else xw)) /\ 53 ((if aw >+ bw then xw else yw) = (if aw <=+ bw then yw else xw)) /\ 54 ((if aw >=+ bw then xw else yw) = (if aw <+ bw then yw else xw)) 55 `, 56 RW_TAC arith_ss [wordsTheory.WORD_LO, wordsTheory.WORD_LS, wordsTheory.WORD_HI, wordsTheory.WORD_HS] THEN 57 FULL_SIMP_TAC std_ss [GREATER_DEF, GREATER_EQ, NOT_LESS, NOT_LESS_EQUAL, wordsTheory.WORD_GREATER, 58 wordsTheory.WORD_GREATER_EQ, wordsTheory.WORD_NOT_LESS_EQUAL] THEN 59 METIS_TAC [LESS_EQ_ANTISYM, wordsTheory.WORD_LESS_EQ_ANTISYM] 60 ); 61 62(*---------------------------------------------------------------------------------*) 63(* Normalization: turn program into normal forms. *) 64(*---------------------------------------------------------------------------------*) 65 66val C_def = Define ` 67 C e = \k. k e`; 68 69val atom_def = Define ` 70 atom = \x.x`; 71 72val C_ATOM_INTRO = Q.store_thm ( 73 "C_ATOM_INTRO", 74 `!v. C v = C (atom v)`, 75 SIMP_TAC std_ss [atom_def, C_def] 76 ); 77 78val ATOM_ID = Q.store_thm ( 79 "ATOM_ID", 80 `atom x = x`, 81 SIMP_TAC std_ss [atom_def] 82 ); 83 84val C_ATOM = Q.store_thm ( 85 "C_ATOM", 86 `C (atom v) = 87 \k. k v`, 88 SIMP_TAC std_ss [C_def, atom_def] 89 ); 90 91val C_INTRO = Q.store_thm ( 92 "C_INTRO", 93 `!f. f = C f (\x.x)`, 94 SIMP_TAC std_ss [C_def, LET_THM] 95 ); 96 97val C_2_LET = Q.store_thm ( 98 "C_2_LET", 99 `(C e k = let x = e in k x)`, 100 SIMP_TAC std_ss [C_def, atom_def, LET_THM] 101 ); 102 103(*---------------------------------------------------------------------------*) 104(* Convert an expression to it continuation format *) 105(* Theorems used for rewriting *) 106(*---------------------------------------------------------------------------*) 107 108val ABS_C_BINOP = Q.store_thm 109("ABS_C_BINOP", 110 `!f e1 e2. C (f e1 e2) = \k. C e1 (\x. C e2 (\y. C (f x y) k))`, 111 SIMP_TAC std_ss [C_def, LET_THM]); 112 113val C_BINOP = Q.store_thm ( 114 "C_BINOP", 115 `(C (e1 + e2) = \k. C e1 (\x. C e2 (\y. C (x + y) k))) /\ 116 (C (e1 - e2) = \k. C e1 (\x. C e2 (\y. C (x - y) k))) /\ 117 (C (e1 * e2) = \k. C e1 (\x. C e2 (\y. C (x * y) k))) /\ 118 (C (e1 ** e2) = \k. C e1 (\x. C e2 (\y. C (x ** y) k)))`, 119 METIS_TAC [ABS_C_BINOP] 120 ); 121 122val C_BINOP_SYM = Q.store_thm ( 123 "C_BINOP_SYM", 124 `(C (e1 + e2) = \k. C e1 (\x. C e2 (\y. C (y + x) k))) /\ 125 (C (e1 - e2) = \k. C e2 (\x. C e1 (\y. C (y - x) k))) /\ 126 (C (e1 * e2) = \k. C e1 (\x. C e2 (\y. C (y * x) k))) /\ 127 (C (e1 ** e2) = \k. C e1 (\x. C e2 (\y. C (x ** y) k)))`, 128 SIMP_TAC arith_ss [C_def, LET_THM] 129 ); 130 131val C_PAIR = Q.store_thm ( 132 "C_PAIR", 133 `C (e1, e2) = \k. C e1 (\x. C e2 (\y. k (x,y)))`, 134 RW_TAC std_ss [C_def] 135 ); 136 137val C_WORDS_BINOP = Q.store_thm ( 138 "C_WORDS_BINOP", 139 `!w1 w2 : 'a word. 140 (C (w1 + w2) = \k. C w1 (\x. C w2 (\y. C (x + y) k))) /\ 141 (C (w1 - w2) = \k. C w1 (\x. C w2 (\y. C (x - y) k))) /\ 142 (C (w1 * w2) = \k. C w1 (\x. C w2 (\y. C (x * y) k))) /\ 143 (C (w1 && w2) = \k. C w1 (\x. C w2 (\y. C (x && y) k))) /\ 144 (C (w1 ?? w2) = \k. C w1 (\x. C w2 (\y. C (x ?? y) k))) /\ 145 (C (w1 !! w2) = \k. C w1 (\x. C w2 (\y. C (x !! y) k))) /\ 146 147 (C (w1 < w2) = \k. C w1 (\x. C w2 (\y. C (x < y) k))) /\ 148 (C (w1 <= w2) = \k. C w1 (\x. C w2 (\y. C (x <= y) k))) /\ 149 (C (w1 > w2) = \k. C w2 (\x. C w1 (\y. C (x < y) k))) /\ 150 (C (w1 >= w2) = \k. C w2 (\x. C w1 (\y. C (x <= y) k))) /\ 151 (C (w1 <+ w2) = \k. C w1 (\x. C w2 (\y. C (x <+ y) k))) /\ 152 (C (w1 <=+ w2) = \k. C w1 (\x. C w2 (\y. C (x <=+ y) k))) /\ 153 (C (w1 >+ w2) = \k. C w2 (\x. C w1 (\y. C (x <+ y) k))) /\ 154 (C (w1 >=+ w2) = \k. C w2 (\x. C w1 (\y. C (x <=+ y) k))) /\ 155 156 (C (w1 >> n) = \k. C w1 (\x. C n (\y. C (x >> y) k))) /\ 157 (C (w1 >>> n) = \k. C w1 (\x. C n (\y. C (x >>> y) k))) /\ 158 (C (w1 << n) = \k. C w1 (\x. C n (\y. C (x << y) k))) /\ 159 (C (w1 #>> n) = \k. C w1 (\x. C n (\y. C (x #>> y) k))) /\ 160 (C (w1 #<< n) = \k. C w1 (\x. C n (\y. C (x #<< y) k))) 161 `, 162 SIMP_TAC arith_ss [C_def, LET_THM] THEN 163 SIMP_TAC bool_ss [wordsTheory.WORD_GREATER, wordsTheory.WORD_GREATER_EQ, 164 wordsTheory.WORD_HIGHER, wordsTheory.WORD_HIGHER_EQ] 165 ); 166 167val rsb_def = Define `rsb x y = y - x`; 168 169val C_WORDS_BINOP_SYM = Q.store_thm ( 170 "C_WORDS_BINOP_SYM", 171 `!w1 w2 : 'a word. 172 (C (w1 + w2) = \k. C w1 (\x. C w2 (\y. C (y + x) k))) /\ 173 (C (w1 - w2) = \k. C w1 (\x. C w2 (\y. C (rsb y x) k))) /\ 174 (C (w1 * w2) = \k. C w1 (\x. C w2 (\y. C (y * x) k))) /\ 175 (C (w1 && w2) = \k. C w1 (\x. C w2 (\y. C (y && x) k))) /\ 176 (C (w1 ?? w2) = \k. C w1 (\x. C w2 (\y. C (y ?? x) k))) /\ 177 (C (w1 !! w2) = \k. C w1 (\x. C w2 (\y. C (y !! x) k))) /\ 178 179 (C (w1 >> n) = \k. C w1 (\x. C n (\y. C (x >> y) k))) /\ 180 (C (w1 >>> n) = \k. C w1 (\x. C n (\y. C (x >>> y) k))) /\ 181 (C (w1 << n) = \k. C w1 (\x. C n (\y. C (x << y) k))) /\ 182 (C (w1 #>> n) = \k. C w1 (\x. C n (\y. C (x #>> y) k))) /\ 183 (C (w1 #<< n) = \k. C w1 (\x. C n (\y. C (x #<< y) k))) 184 `, 185 SIMP_TAC std_ss [C_def, LET_THM, rsb_def] THEN 186 SIMP_TAC bool_ss [wordsTheory.WORD_ADD_COMM, wordsTheory.WORD_MULT_COMM, wordsTheory.WORD_AND_COMM, 187 wordsTheory.WORD_XOR_COMM, wordsTheory.WORD_OR_COMM, wordsTheory.WORD_GREATER, wordsTheory.WORD_GREATER_EQ, 188 wordsTheory.WORD_HIGHER, wordsTheory.WORD_HIGHER_EQ] 189 ); 190 191val COND_SWAP = Q.store_thm ( 192 "COND_SWAP", 193 `((x : 'a word < y) = (y > x)) /\ 194 ((x <= y) = (y >= x)) /\ 195 ((x > y) = (y < x)) /\ 196 ((x >= y) = (y <= x)) /\ 197 ((x <+ y) = (y >+ x)) /\ 198 ((x <=+ y) = (y >=+ x)) /\ 199 ((x >+ y) = (y <+ x)) /\ 200 ((x >=+ y) = (y <=+ x))`, 201 SIMP_TAC bool_ss [wordsTheory.WORD_GREATER, wordsTheory.WORD_GREATER_EQ, 202 wordsTheory.WORD_HIGHER, wordsTheory.WORD_HIGHER_EQ] 203 ); 204 205(*---------------------------------------------------------------------------*) 206(* LET expressions are processed in a way that generates A-normal forms *) 207(*---------------------------------------------------------------------------*) 208 209val C_LET = Q.store_thm ( 210 "C_LET", 211 `C (let v = e in f v) = \k. C e (\x. C (f x) (\y. k y))`, 212 SIMP_TAC std_ss [C_def, LET_THM] 213 ); 214 215(*---------------------------------------------------------------------------*) 216(* For K-normal forms, use the following for LET expressions *) 217(*---------------------------------------------------------------------------*) 218 219val C_LET_K = Q.store_thm ( 220 "C_LET_K", 221 `C (let v = e in f v) = \k. C e (\x. C x (\y. C (f y) (\z.k z)))`, 222 SIMP_TAC std_ss [C_def, LET_THM] 223 ); 224 225val C_ABS = Q.store_thm ( 226 "C_ABS", 227 `C (\v. f v) = C (\v. (C (f v) (\x. x)))`, 228 RW_TAC std_ss [C_def, LET_THM] 229 ); 230 231(* 232val C_APP = Q.store_thm ( 233 "C_APP", 234 `C (f e) = \k. C f (\g. C e (\x. k (g x)))`, 235 SIMP_TAC std_ss [C_def, LET_THM] 236 ); 237*) 238 239val C_APP = Q.store_thm ( 240 "C_APP", 241 `C (f e) = \k. C f (\g. C e (\x. C (g x) (\y. k y)))`, 242 SIMP_TAC std_ss [C_def, LET_THM] 243 ); 244 245val C_ATOM_COND = Q.store_thm ( 246 "C_ATOM_COND", 247 `C (if cmpop c1 c2 then e1 else e2) = 248 \k. C c1 (\p. C c2 (\q. 249 C (if cmpop p q then C e1 (\x.x) 250 else C e2 (\y.y)) (\z. k z)))`, 251 SIMP_TAC std_ss [C_def, LET_THM] 252 ); 253 254val C_ATOM_COND_EX = Q.store_thm ( 255 "C_ATOM_COND_EX", 256 `C (if cmpop c1 c2 then e1 else e2) = 257 \k. C c1 (\p. C c2 (\q. 258 k (if cmpop p q then C e1 (\x.x) 259 else C e2 (\y.y) 260 )))`, 261 SIMP_TAC std_ss [C_def, LET_THM] 262 ); 263 264(*---------------------------------------------------------------------------------*) 265(* Optimization of normal forms. *) 266(*---------------------------------------------------------------------------------*) 267 268val BETA_REDUCTION = Q.store_thm ( 269 "BETA_REDUCTION", 270 `(let x = atom y in f x) = f y`, 271 SIMP_TAC std_ss [atom_def, LET_THM] 272 ); 273 274val ELIM_USELESS_LET = Q.store_thm ( 275 "ELIM_USELESS_LET", 276 `(let x = e1 in e2) = e2`, 277 SIMP_TAC std_ss [C_def, LET_THM] 278 ); 279 280val FLATTEN_LET = Q.store_thm ( 281 "FLATTEN_LET", 282 `(let x = (let y = e1 in e2 y) in e3 x) = 283 (let y = e1 in let x = e2 y in e3 x)`, 284 SIMP_TAC std_ss [LET_THM] 285 ); 286 287(*---------------------------------------------------------------------------*) 288(* Definitions used in inline.sml *) 289(*---------------------------------------------------------------------------*) 290 291val fun_def = Define ` 292 fun = \x.x`; 293 294val fun_ID = store_thm ( 295 "fun_ID", 296 ``fun f = f``, 297 SIMP_TAC std_ss [fun_def] 298 ); 299 300val INLINE_EXPAND = store_thm ( 301 "INLINE_EXPAND", 302 ``(let f = fun e1 in e2 f) = e2 e1``, 303 SIMP_TAC std_ss [LET_THM, fun_def] 304 ); 305 306 307(* Definitions and theorems used in closure.sml *) 308(*---------------------------------------------------------------------------*) 309(* Closure conversion *) 310(* Eliminate nested function definitions *) 311(*---------------------------------------------------------------------------*) 312 313val CLOSE_ONE = store_thm ( 314 "CLOSE_ONE", 315 ``(let v = atom v in let f = fun (e1 v) in e2 f) = 316 let f = fun (\v. e1 v) in e2 (f v)``, 317 SIMP_TAC std_ss [LET_THM, fun_def, atom_def] 318 ); 319 320(*---------------------------------------------------------------------------*) 321(* Eliminate administrative terms *) 322(*---------------------------------------------------------------------------*) 323 324val LET_ATOM = store_thm ( 325 "LET_ATOM", 326 ``(let x = atom y in f x) = f y``, 327 SIMP_TAC std_ss [LET_THM, atom_def] 328 ); 329 330val LET_FUN = store_thm ( 331 "LET_FUN", 332 ``(let f = fun e1 in e2 f) = e2 e1``, 333 SIMP_TAC std_ss [LET_THM, fun_def] 334 ); 335 336 337val TOP_LEVEL_ABS = store_thm ( 338 "TOP_LEVEL_ABS", 339 ``(\x. let f = fun e1 in e2 f) = (let f = fun e1 in (\x. e2 f))``, 340 SIMP_TAC std_ss [LET_THM] 341 ); 342 343val TOP_LEVEL_LET = store_thm ( 344 "TOP_LEVEL_LET", 345 ``(let v = e1 in let f = fun e2 in e3 v f) = 346 (let f = fun e2 in let v = e1 in e3 v f)``, 347 SIMP_TAC std_ss [LET_THM] 348 ); 349 350val TOP_LEVEL_COND_1 = store_thm ( 351 "TOP_LEVEL_COND_1", 352 ``(if e1 then let f = fun k1 in e2 f else e3) = 353 (let f = fun k1 in if e1 then e2 f else e3)``, 354 SIMP_TAC std_ss [LET_THM] 355 ); 356 357val TOP_LEVEL_COND_2 = store_thm ( 358 "TOP_LEVEL_COND_2", 359 ``(if e1 then e2 else let f = fun k1 in e3 f) = 360 (let f = fun k1 in if e1 then e2 else e3 f)``, 361 SIMP_TAC std_ss [LET_THM] 362 ); 363 364 365(* --------------------------------------------------------------------*) 366(* Used in regAlloc.sml *) 367(* Administrative terms: save and loc *) 368(* --------------------------------------------------------------------*) 369 370val save_def = Define ` 371 save = \x.x`; 372 373val LET_SAVE = store_thm ( 374 "LET_SAVE", 375 ``(let x = save y in f x) = f y``, 376 SIMP_TAC std_ss [LET_THM, save_def] 377 ); 378 379val loc_def = Define ` 380 loc = \x.x`; 381 382val LET_LOC = store_thm ( 383 "LET_LOC", 384 ``(let x = loc y in f x) = f y``, 385 SIMP_TAC std_ss [LET_THM, loc_def] 386 ); 387 388(* --------------------------------------------------------------------*) 389 390val _ = export_theory(); 391