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