1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 (* ********************************************************************** *)
16 (* Progetto FreeScale *)
19 (* Cosimo Oliboni, oliboni@cs.unibo.it *)
21 (* Questo materiale fa parte della tesi: *)
22 (* "Formalizzazione Interattiva dei Microcontroller a 8bit FreeScale" *)
24 (* data ultima modifica 15/11/2007 *)
25 (* ********************************************************************** *)
27 include "freescale/bool_lemmas.ma".
28 include "freescale/exadecim.ma".
34 ndefinition exadecim_destruct1 : Πe2.ΠP:Prop.ΠH:x0 = e2.match e2 with [ x0 ⇒ P → P | _ ⇒ P ].
35 #e2; #P; ncases e2; nnormalize; #H;
36 ##[ ##1: napply (λx:P.x)
37 ##| ##*: napply (False_ind ??);
38 nchange with (match x0 with [ x0 ⇒ False | _ ⇒ True ]);
39 nrewrite > H; nnormalize; napply I
43 ndefinition exadecim_destruct2 : Πe2.ΠP:Prop.ΠH:x1 = e2.match e2 with [ x1 ⇒ P → P | _ ⇒ P ].
44 #e2; #P; ncases e2; nnormalize; #H;
45 ##[ ##2: napply (λx:P.x)
46 ##| ##*: napply (False_ind ??);
47 nchange with (match x1 with [ x1 ⇒ False | _ ⇒ True ]);
48 nrewrite > H; nnormalize; napply I
52 ndefinition exadecim_destruct3 : Πe2.ΠP:Prop.ΠH:x2 = e2.match e2 with [ x2 ⇒ P → P | _ ⇒ P ].
53 #e2; #P; ncases e2; nnormalize; #H;
54 ##[ ##3: napply (λx:P.x)
55 ##| ##*: napply (False_ind ??);
56 nchange with (match x2 with [ x2 ⇒ False | _ ⇒ True ]);
57 nrewrite > H; nnormalize; napply I
61 ndefinition exadecim_destruct4 : Πe2.ΠP:Prop.ΠH:x3 = e2.match e2 with [ x3 ⇒ P → P | _ ⇒ P ].
62 #e2; #P; ncases e2; nnormalize; #H;
63 ##[ ##4: napply (λx:P.x)
64 ##| ##*: napply (False_ind ??);
65 nchange with (match x3 with [ x3 ⇒ False | _ ⇒ True ]);
66 nrewrite > H; nnormalize; napply I
70 ndefinition exadecim_destruct5 : Πe2.ΠP:Prop.ΠH:x4 = e2.match e2 with [ x4 ⇒ P → P | _ ⇒ P ].
71 #e2; #P; ncases e2; nnormalize; #H;
72 ##[ ##5: napply (λx:P.x)
73 ##| ##*: napply (False_ind ??);
74 nchange with (match x4 with [ x4 ⇒ False | _ ⇒ True ]);
75 nrewrite > H; nnormalize; napply I
79 ndefinition exadecim_destruct6 : Πe2.ΠP:Prop.ΠH:x5 = e2.match e2 with [ x5 ⇒ P → P | _ ⇒ P ].
80 #e2; #P; ncases e2; nnormalize; #H;
81 ##[ ##6: napply (λx:P.x)
82 ##| ##*: napply (False_ind ??);
83 nchange with (match x5 with [ x5 ⇒ False | _ ⇒ True ]);
84 nrewrite > H; nnormalize; napply I
88 ndefinition exadecim_destruct7 : Πe2.ΠP:Prop.ΠH:x6 = e2.match e2 with [ x6 ⇒ P → P | _ ⇒ P ].
89 #e2; #P; ncases e2; nnormalize; #H;
90 ##[ ##7: napply (λx:P.x)
91 ##| ##*: napply (False_ind ??);
92 nchange with (match x6 with [ x6 ⇒ False | _ ⇒ True ]);
93 nrewrite > H; nnormalize; napply I
97 ndefinition exadecim_destruct8 : Πe2.ΠP:Prop.ΠH:x7 = e2.match e2 with [ x7 ⇒ P → P | _ ⇒ P ].
98 #e2; #P; ncases e2; nnormalize; #H;
99 ##[ ##8: napply (λx:P.x)
100 ##| ##*: napply (False_ind ??);
101 nchange with (match x7 with [ x7 ⇒ False | _ ⇒ True ]);
102 nrewrite > H; nnormalize; napply I
106 ndefinition exadecim_destruct9 : Πe2.ΠP:Prop.ΠH:x8 = e2.match e2 with [ x8 ⇒ P → P | _ ⇒ P ].
107 #e2; #P; ncases e2; nnormalize; #H;
108 ##[ ##9: napply (λx:P.x)
109 ##| ##*: napply (False_ind ??);
110 nchange with (match x8 with [ x8 ⇒ False | _ ⇒ True ]);
111 nrewrite > H; nnormalize; napply I
115 ndefinition exadecim_destruct10 : Πe2.ΠP:Prop.ΠH:x9 = e2.match e2 with [ x9 ⇒ P → P | _ ⇒ P ].
116 #e2; #P; ncases e2; nnormalize; #H;
117 ##[ ##10: napply (λx:P.x)
118 ##| ##*: napply (False_ind ??);
119 nchange with (match x9 with [ x9 ⇒ False | _ ⇒ True ]);
120 nrewrite > H; nnormalize; napply I
124 ndefinition exadecim_destruct11 : Πe2.ΠP:Prop.ΠH:xA = e2.match e2 with [ xA ⇒ P → P | _ ⇒ P ].
125 #e2; #P; ncases e2; nnormalize; #H;
126 ##[ ##11: napply (λx:P.x)
127 ##| ##*: napply (False_ind ??);
128 nchange with (match xA with [ xA ⇒ False | _ ⇒ True ]);
129 nrewrite > H; nnormalize; napply I
133 ndefinition exadecim_destruct12 : Πe2.ΠP:Prop.ΠH:xB = e2.match e2 with [ xB ⇒ P → P | _ ⇒ P ].
134 #e2; #P; ncases e2; nnormalize; #H;
135 ##[ ##12: napply (λx:P.x)
136 ##| ##*: napply (False_ind ??);
137 nchange with (match xB with [ xB ⇒ False | _ ⇒ True ]);
138 nrewrite > H; nnormalize; napply I
142 ndefinition exadecim_destruct13 : Πe2.ΠP:Prop.ΠH:xC = e2.match e2 with [ xC ⇒ P → P | _ ⇒ P ].
143 #e2; #P; ncases e2; nnormalize; #H;
144 ##[ ##13: napply (λx:P.x)
145 ##| ##*: napply (False_ind ??);
146 nchange with (match xC with [ xC ⇒ False | _ ⇒ True ]);
147 nrewrite > H; nnormalize; napply I
151 ndefinition exadecim_destruct14 : Πe2.ΠP:Prop.ΠH:xD = e2.match e2 with [ xD ⇒ P → P | _ ⇒ P ].
152 #e2; #P; ncases e2; nnormalize; #H;
153 ##[ ##14: napply (λx:P.x)
154 ##| ##*: napply (False_ind ??);
155 nchange with (match xD with [ xD ⇒ False | _ ⇒ True ]);
156 nrewrite > H; nnormalize; napply I
160 ndefinition exadecim_destruct15 : Πe2.ΠP:Prop.ΠH:xE = e2.match e2 with [ xE ⇒ P → P | _ ⇒ P ].
161 #e2; #P; ncases e2; nnormalize; #H;
162 ##[ ##15: napply (λx:P.x)
163 ##| ##*: napply (False_ind ??);
164 nchange with (match xE with [ xE ⇒ False | _ ⇒ True ]);
165 nrewrite > H; nnormalize; napply I
169 ndefinition exadecim_destruct16 : Πe2.ΠP:Prop.ΠH:xF = e2.match e2 with [ xF ⇒ P → P | _ ⇒ P ].
170 #e2; #P; ncases e2; nnormalize; #H;
171 ##[ ##16: napply (λx:P.x)
172 ##| ##*: napply (False_ind ??);
173 nchange with (match xF with [ xF ⇒ False | _ ⇒ True ]);
174 nrewrite > H; nnormalize; napply I
178 ndefinition exadecim_destruct_aux ≝
179 Πe1,e2.ΠP:Prop.ΠH:e1 = e2.
181 [ x0 ⇒ match e2 with [ x0 ⇒ P → P | _ ⇒ P ]
182 | x1 ⇒ match e2 with [ x1 ⇒ P → P | _ ⇒ P ]
183 | x2 ⇒ match e2 with [ x2 ⇒ P → P | _ ⇒ P ]
184 | x3 ⇒ match e2 with [ x3 ⇒ P → P | _ ⇒ P ]
185 | x4 ⇒ match e2 with [ x4 ⇒ P → P | _ ⇒ P ]
186 | x5 ⇒ match e2 with [ x5 ⇒ P → P | _ ⇒ P ]
187 | x6 ⇒ match e2 with [ x6 ⇒ P → P | _ ⇒ P ]
188 | x7 ⇒ match e2 with [ x7 ⇒ P → P | _ ⇒ P ]
189 | x8 ⇒ match e2 with [ x8 ⇒ P → P | _ ⇒ P ]
190 | x9 ⇒ match e2 with [ x9 ⇒ P → P | _ ⇒ P ]
191 | xA ⇒ match e2 with [ xA ⇒ P → P | _ ⇒ P ]
192 | xB ⇒ match e2 with [ xB ⇒ P → P | _ ⇒ P ]
193 | xC ⇒ match e2 with [ xC ⇒ P → P | _ ⇒ P ]
194 | xD ⇒ match e2 with [ xD ⇒ P → P | _ ⇒ P ]
195 | xE ⇒ match e2 with [ xE ⇒ P → P | _ ⇒ P ]
196 | xF ⇒ match e2 with [ xF ⇒ P → P | _ ⇒ P ]
199 ndefinition exadecim_destruct : exadecim_destruct_aux.
201 ##[ ##1: napply exadecim_destruct1
202 ##| ##2: napply exadecim_destruct2
203 ##| ##3: napply exadecim_destruct3
204 ##| ##4: napply exadecim_destruct4
205 ##| ##5: napply exadecim_destruct5
206 ##| ##6: napply exadecim_destruct6
207 ##| ##7: napply exadecim_destruct7
208 ##| ##8: napply exadecim_destruct8
209 ##| ##9: napply exadecim_destruct9
210 ##| ##10: napply exadecim_destruct10
211 ##| ##11: napply exadecim_destruct11
212 ##| ##12: napply exadecim_destruct12
213 ##| ##13: napply exadecim_destruct13
214 ##| ##14: napply exadecim_destruct14
215 ##| ##15: napply exadecim_destruct15
216 ##| ##16: napply exadecim_destruct16
220 nlemma symmetric_eqex : symmetricT exadecim bool eq_ex.
228 nlemma symmetric_andex : symmetricT exadecim exadecim and_ex.
236 nlemma associative_andex : ∀e1,e2,e3.(and_ex (and_ex e1 e2) e3) = (and_ex e1 (and_ex e2 e3)).
239 ##[ ##1: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
240 ##| ##2: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
241 ##| ##3: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
242 ##| ##4: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
243 ##| ##5: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
244 ##| ##6: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
245 ##| ##7: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
246 ##| ##8: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
247 ##| ##9: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
248 ##| ##10: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
249 ##| ##11: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
250 ##| ##12: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
251 ##| ##13: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
252 ##| ##14: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
253 ##| ##15: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
254 ##| ##16: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
258 nlemma symmetric_orex : symmetricT exadecim exadecim or_ex.
266 nlemma associative_orex : ∀e1,e2,e3.(or_ex (or_ex e1 e2) e3) = (or_ex e1 (or_ex e2 e3)).
269 ##[ ##1: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
270 ##| ##2: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
271 ##| ##3: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
272 ##| ##4: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
273 ##| ##5: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
274 ##| ##6: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
275 ##| ##7: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
276 ##| ##8: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
277 ##| ##9: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
278 ##| ##10: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
279 ##| ##11: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
280 ##| ##12: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
281 ##| ##13: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
282 ##| ##14: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
283 ##| ##15: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
284 ##| ##16: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
288 nlemma symmetric_xorex : symmetricT exadecim exadecim xor_ex.
296 nlemma associative_xorex : ∀e1,e2,e3.(xor_ex (xor_ex e1 e2) e3) = (xor_ex e1 (xor_ex e2 e3)).
299 ##[ ##1: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
300 ##| ##2: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
301 ##| ##3: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
302 ##| ##4: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
303 ##| ##5: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
304 ##| ##6: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
305 ##| ##7: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
306 ##| ##8: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
307 ##| ##9: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
308 ##| ##10: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
309 ##| ##11: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
310 ##| ##12: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
311 ##| ##13: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
312 ##| ##14: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
313 ##| ##15: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
314 ##| ##16: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
318 nlemma symmetric_plusex_dc_dc : ∀e1,e2,c.plus_ex_dc_dc e1 e2 c = plus_ex_dc_dc e2 e1 c.
327 nlemma plusex_dc_dc_to_dc_d : ∀e1,e2,c.fst ?? (plus_ex_dc_dc e1 e2 c) = plus_ex_dc_d e1 e2 c.
336 nlemma plusex_dc_dc_to_dc_c : ∀e1,e2,c.snd ?? (plus_ex_dc_dc e1 e2 c) = plus_ex_dc_c e1 e2 c.
345 nlemma plusex_dc_dc_to_d_dc : ∀e1,e2.plus_ex_dc_dc e1 e2 false = plus_ex_d_dc e1 e2.
353 nlemma plusex_dc_dc_to_d_d : ∀e1,e2.fst ?? (plus_ex_dc_dc e1 e2 false) = plus_ex_d_d e1 e2.
361 nlemma plusex_dc_dc_to_d_c : ∀e1,e2.snd ?? (plus_ex_dc_dc e1 e2 false) = plus_ex_d_c e1 e2.
369 nlemma symmetric_plusex_dc_d : ∀e1,e2,c.plus_ex_dc_d e1 e2 c = plus_ex_dc_d e2 e1 c.
378 nlemma symmetric_plusex_dc_c : ∀e1,e2,c.plus_ex_dc_c e1 e2 c = plus_ex_dc_c e2 e1 c.
387 nlemma symmetric_plusex_d_dc : ∀e1,e2.plus_ex_d_dc e1 e2 = plus_ex_d_dc e2 e1.
395 nlemma plusex_d_dc_to_d_d : ∀e1,e2.fst ?? (plus_ex_d_dc e1 e2) = plus_ex_d_d e1 e2.
403 nlemma plusex_d_dc_to_d_c : ∀e1,e2.snd ?? (plus_ex_d_dc e1 e2) = plus_ex_d_c e1 e2.
411 nlemma symmetric_plusex_d_d : ∀e1,e2.plus_ex_d_d e1 e2 = plus_ex_d_d e2 e1.
419 nlemma associative_plusex_d_d : ∀e1,e2,e3.(plus_ex_d_d (plus_ex_d_d e1 e2) e3) = (plus_ex_d_d e1 (plus_ex_d_d e2 e3)).
422 ##[ ##1: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
423 ##| ##2: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
424 ##| ##3: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
425 ##| ##4: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
426 ##| ##5: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
427 ##| ##6: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
428 ##| ##7: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
429 ##| ##8: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
430 ##| ##9: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
431 ##| ##10: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
432 ##| ##11: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
433 ##| ##12: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
434 ##| ##13: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
435 ##| ##14: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
436 ##| ##15: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
437 ##| ##16: nelim e2; nelim e3; nnormalize; napply (refl_eq ??)
441 nlemma symmetric_plusex_d_c : ∀e1,e2.plus_ex_d_c e1 e2 = plus_ex_d_c e2 e1.
449 nlemma eqex_to_eq : ∀e1,e2:exadecim.(eq_ex e1 e2 = true) → (e1 = e2).
454 ##[ ##1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,256: #H; napply (refl_eq ??)
455 ##| ##*: #H; napply (bool_destruct ??? H)
459 nlemma eq_to_eqex : ∀e1,e2.e1 = e2 → eq_ex e1 e2 = true.
464 ##[ ##1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,256: #H; napply (refl_eq ??)
465 ##| ##*: #H; napply (exadecim_destruct ??? H)