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 *)
18 (* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *)
19 (* Ultima modifica: 05/08/2009 *)
21 (* ********************************************************************** *)
23 include "compiler/ast_type.ma".
24 include "common/list_utility_lemmas.ma".
26 (* ************************* *)
27 (* dimensioni degli elementi *)
28 (* ************************* *)
30 ndefinition astbasetype_destruct_aux ≝
31 Πb1,b2:ast_base_type.ΠP:Prop.b1 = b2 →
33 [ AST_BASE_TYPE_BYTE8 ⇒ match b2 with [ AST_BASE_TYPE_BYTE8 ⇒ P → P | _ ⇒ P ]
34 | AST_BASE_TYPE_WORD16 ⇒ match b2 with [ AST_BASE_TYPE_WORD16 ⇒ P → P | _ ⇒ P ]
35 | AST_BASE_TYPE_WORD32 ⇒ match b2 with [ AST_BASE_TYPE_WORD32 ⇒ P → P | _ ⇒ P ]
38 ndefinition astbasetype_destruct : astbasetype_destruct_aux.
44 ##[ ##1,5,9: napply (λx:P.x)
45 ##| ##2,3: napply False_ind;
46 nchange with (match AST_BASE_TYPE_BYTE8 with [ AST_BASE_TYPE_BYTE8 ⇒ False | _ ⇒ True]);
50 ##| ##4,6: napply False_ind;
51 nchange with (match AST_BASE_TYPE_WORD16 with [ AST_BASE_TYPE_WORD16 ⇒ False | _ ⇒ True]);
55 ##| ##7,8: napply False_ind;
56 nchange with (match AST_BASE_TYPE_WORD32 with [ AST_BASE_TYPE_WORD32 ⇒ False | _ ⇒ True]);
63 nlemma symmetric_eqastbasetype : symmetricT ast_base_type bool eq_ast_base_type.
64 #b1; #b2; ncases b1; ncases b2; nnormalize; napply refl_eq. nqed.
66 nlemma eqastbasetype_to_eq : ∀b1,b2.eq_ast_base_type b1 b2 = true → b1 = b2.
67 #b1; #b2; ncases b1; ncases b2; nnormalize;
68 ##[ ##1,5,9: #H; napply refl_eq
69 ##| ##*: #H; napply (bool_destruct … H)
73 nlemma eq_to_eqastbasetype : ∀b1,b2.b1 = b2 → eq_ast_base_type b1 b2 = true.
74 #b1; #b2; ncases b1; ncases b2; nnormalize;
75 ##[ ##1,5,9: #H; napply refl_eq
76 ##| ##*: #H; napply (astbasetype_destruct … H)
80 nlemma asttype_destruct_base_base : ∀b1,b2.AST_TYPE_BASE b1 = AST_TYPE_BASE b2 → b1 = b2.
82 nchange with (match AST_TYPE_BASE b2 with [ AST_TYPE_BASE a ⇒ b1 = a | _ ⇒ False ]);
88 nlemma asttype_destruct_array_array_1 : ∀x1,x2,y1,y2.AST_TYPE_ARRAY x1 y1 = AST_TYPE_ARRAY x2 y2 → x1 = x2.
89 #x1; #x2; #y1; #y2; #H;
90 nchange with (match AST_TYPE_ARRAY x2 y2 with [ AST_TYPE_ARRAY a _ ⇒ x1 = a | _ ⇒ False ]);
96 nlemma asttype_destruct_array_array_2 : ∀x1,x2,y1,y2.AST_TYPE_ARRAY x1 y1 = AST_TYPE_ARRAY x2 y2 → y1 = y2.
97 #x1; #x2; #y1; #y2; #H;
98 nchange with (match AST_TYPE_ARRAY x2 y2 with [ AST_TYPE_ARRAY _ b ⇒ y1 = b | _ ⇒ False ]);
104 nlemma asttype_destruct_struct_struct : ∀b1,b2.AST_TYPE_STRUCT b1 = AST_TYPE_STRUCT b2 → b1 = b2.
106 nchange with (match AST_TYPE_STRUCT b2 with [ AST_TYPE_STRUCT a ⇒ b1 = a | _ ⇒ False ]);
112 ndefinition asttype_destruct_aux ≝
113 Πb1,b2:ast_type.ΠP:Prop.b1 = b2 →
115 [ AST_TYPE_BASE s1 ⇒ match b2 with
116 [ AST_TYPE_BASE s2 ⇒ match s1 with
117 [ AST_BASE_TYPE_BYTE8 ⇒ match s2 with [ AST_BASE_TYPE_BYTE8 ⇒ P → P | _ ⇒ P ]
118 | AST_BASE_TYPE_WORD16 ⇒ match s2 with [ AST_BASE_TYPE_WORD16 ⇒ P → P | _ ⇒ P ]
119 | AST_BASE_TYPE_WORD32 ⇒ match s2 with [ AST_BASE_TYPE_WORD32 ⇒ P → P | _ ⇒ P ]
121 | AST_TYPE_ARRAY _ _ ⇒ match b2 with [ AST_TYPE_ARRAY _ _ ⇒ P → P | _ ⇒ P ]
122 | AST_TYPE_STRUCT _ ⇒ match b2 with [ AST_TYPE_STRUCT _ ⇒ P → P | _ ⇒ P ]
125 ndefinition asttype_destruct : asttype_destruct_aux.
129 ##[ ##1: nnormalize; #s1; #s2; ncases s1; ncases s2; nnormalize;
130 ##[ ##1,5,9: #H; napply (λx:P.x)
131 ##| ##*: #H; napply (astbasetype_destruct … (asttype_destruct_base_base … H))
133 ##| ##2: #t; #n; #b; nnormalize; #H
134 ##| ##3: #l; #b; nnormalize; #H
137 nchange with (match AST_TYPE_BASE b with [ AST_TYPE_BASE _ ⇒ False | _ ⇒ True ]);
138 nrewrite > H; nnormalize; napply I
140 ##[ ##2: #t1; #n1; #t2; #n2; nnormalize; #H; napply (λx:P.x)
141 ##| ##1: #b; #t; #n; nnormalize; #H
142 ##| ##3: #l; #t; #n; nnormalize; #H
145 nchange with (match AST_TYPE_ARRAY t n with [ AST_TYPE_ARRAY _ _ ⇒ False | _ ⇒ True ]);
146 nrewrite > H; nnormalize; napply I
148 ##[ ##3: #l1; #l2; nnormalize; #H; napply (λx:P.x)
149 ##| ##1: #b; #l; nnormalize; #H
150 ##| ##2: #t; #n; #l; nnormalize; #H
153 nchange with (match AST_TYPE_STRUCT l with [ AST_TYPE_STRUCT _ ⇒ False | _ ⇒ True ]);
154 nrewrite > H; nnormalize; napply I
158 nlemma symmetric_eqasttype_aux1
160 (eq_ast_type (AST_TYPE_STRUCT nl1) (AST_TYPE_STRUCT nl2)) = (eq_ast_type (AST_TYPE_STRUCT nl2) (AST_TYPE_STRUCT nl1)) →
161 (bfold_right_neList2 ? (λx,y.eq_ast_type x y) nl1 nl2) = (bfold_right_neList2 ? (λx,y.eq_ast_type x y) nl2 nl1).
166 nlemma symmetric_eqasttype : symmetricT ast_type bool eq_ast_type.
167 #t1; napply (ast_type_index … t1);
168 ##[ ##1: #b1; #t2; ncases t2;
169 ##[ ##1: #b2; nchange with ((eq_ast_base_type b1 b2) = (eq_ast_base_type b2 b1));
170 nrewrite > (symmetric_eqastbasetype b1 b2);
172 ##| ##2: #st2; #n2; nnormalize; napply refl_eq
173 ##| ##3: #nl2; nnormalize; napply refl_eq
175 ##| ##2: #st1; #n1; #H; #t2; ncases t2;
176 ##[ ##2: #st2; #n2; nchange with (((eq_ast_type st1 st2)⊗(eq_nat n1 n2)) = ((eq_ast_type st2 st1)⊗(eq_nat n2 n1)));
177 nrewrite > (symmetric_eqnat n1 n2);
180 ##| ##1: #b2; nnormalize; napply refl_eq
181 ##| ##3: #nl2; nnormalize; napply refl_eq
183 ##| ##3: #hh1; #H; #t2; ncases t2;
184 ##[ ##3: #nl2; ncases nl2;
185 ##[ ##1: #hh2; nchange with ((eq_ast_type hh1 hh2) = (eq_ast_type hh2 hh1));
188 ##| ##2: #hh2; #ll2; nnormalize; napply refl_eq
190 ##| ##1: #b2; nnormalize; napply refl_eq
191 ##| ##2: #st2; #n2; nnormalize; napply refl_eq
193 ##| ##4: #hh1; #ll1; #H; #H1; #t2; ncases t2;
194 ##[ ##3: #nl2; ncases nl2;
195 ##[ ##1: #hh2; nnormalize; napply refl_eq
196 ##| ##2: #hh2; #ll2; nnormalize;
198 nrewrite > (symmetric_eqasttype_aux1 ll1 ll2 (H1 (AST_TYPE_STRUCT ll2)));
201 ##| ##1: #b2; nnormalize; napply refl_eq
202 ##| ##2: #st2; #n2; nnormalize; napply refl_eq
207 nlemma eqasttype_to_eq : ∀t1,t2.eq_ast_type t1 t2 = true → t1 = t2.
209 napply (ast_type_index … t1);
210 ##[ ##1: #b1; #t2; ncases t2;
211 ##[ ##1: #b2; #H; nchange in H:(%) with ((eq_ast_base_type b1 b2) = true);
212 nrewrite > (eqastbasetype_to_eq b1 b2 H);
214 ##| ##2: #st2; #n2; nnormalize; #H; napply (bool_destruct … H)
215 ##| ##3: #nl2; nnormalize; #H; napply (bool_destruct … H)
217 ##| ##2: #st1; #n1; #H; #t2; ncases t2;
218 ##[ ##2: #st2; #n2; #H1; nchange in H1:(%) with (((eq_ast_type st1 st2)⊗(eq_nat n1 n2)) = true);
219 nrewrite > (H st2 (andb_true_true_l … H1));
220 nrewrite > (eqnat_to_eq n1 n2 (andb_true_true_r … H1));
222 ##| ##1: #b2; nnormalize; #H1; napply (bool_destruct … H1)
223 ##| ##3: #nl2; nnormalize; #H1; napply (bool_destruct … H1)
225 ##| ##3: #hh1; #H; #t2; ncases t2;
226 ##[ ##3: #nl2; ncases nl2;
227 ##[ ##1: #hh2; #H1; nchange in H1:(%) with ((eq_ast_type hh1 hh2) = true);
228 nrewrite > (H hh2 H1);
230 ##| ##2: #hh2; #ll2; nnormalize; #H1; napply (bool_destruct … H1)
232 ##| ##1: #b2; nnormalize; #H1; napply (bool_destruct … H1)
233 ##| ##2: #st2; #n2; nnormalize; #H1; napply (bool_destruct … H1)
235 ##| ##4: #hh1; #ll1; #H; #H1; #t2; ncases t2;
236 ##[ ##3: #nl2; ncases nl2;
237 ##[ ##1: #hh2; nnormalize; #H2; napply (bool_destruct … H2)
238 ##| ##2: #hh2; #ll2; #H2; nchange in H2:(%) with (((eq_ast_type hh1 hh2)⊗(bfold_right_neList2 ? (λx,y.eq_ast_type x y) ll1 ll2)) = true);
239 nrewrite > (H hh2 (andb_true_true_l … H2));
240 nrewrite > (asttype_destruct_struct_struct ll1 ll2 (H1 (AST_TYPE_STRUCT ll2) (andb_true_true_r … H2)));
243 ##| ##1: #b2; nnormalize; #H2; napply (bool_destruct … H2)
244 ##| ##2: #st2; #n2; nnormalize; #H2; napply (bool_destruct … H2)
249 nlemma eq_to_eqasttype_aux1
251 ((eq_ast_type (AST_TYPE_STRUCT nl1) (AST_TYPE_STRUCT nl2)) = true) →
252 ((bfold_right_neList2 ? (λx,y.eq_ast_type x y) nl1 nl2) = true).
257 nlemma eq_to_eqasttype : ∀t1,t2.t1 = t2 → eq_ast_type t1 t2 = true.
259 napply (ast_type_index … t1);
260 ##[ ##1: #b1; #t2; ncases t2;
261 ##[ ##1: #b2; #H; nrewrite > (asttype_destruct_base_base … H);
262 nchange with ((eq_ast_base_type b2 b2) = true);
263 nrewrite > (eq_to_eqastbasetype b2 b2 (refl_eq …));
265 ##| ##2: #st2; #n2; #H; napply (asttype_destruct … H)
266 ##| ##3: #nl2; #H; napply (asttype_destruct … H)
268 ##| ##2: #st1; #n1; #H; #t2; ncases t2;
269 ##[ ##2: #st2; #n2; #H1; nchange with (((eq_ast_type st1 st2)⊗(eq_nat n1 n2)) = true);
270 nrewrite > (H st2 (asttype_destruct_array_array_1 … H1));
271 nrewrite > (eq_to_eqnat n1 n2 (asttype_destruct_array_array_2 … H1));
274 ##| ##1: #b2; #H1; napply (asttype_destruct … H1)
275 ##| ##3: #nl2; #H1; napply (asttype_destruct … H1)
277 ##| ##3: #hh1; #H; #t2; ncases t2;
278 ##[ ##3: #nl2; ncases nl2;
279 ##[ ##1: #hh2; #H1; nchange with ((eq_ast_type hh1 hh2) = true);
280 nrewrite > (H hh2 (nelist_destruct_nil_nil ? hh1 hh2 (asttype_destruct_struct_struct … H1)));
282 ##| ##2: #hh2; #ll2; #H1; nelim (nelist_destruct_nil_cons ? hh1 hh2 ll2 (asttype_destruct_struct_struct … H1))
284 ##| ##1: #b2; #H1; napply (asttype_destruct … H1)
285 ##| ##2: #st2; #n2; #H1; napply (asttype_destruct … H1)
287 ##| ##4: #hh1; #ll1; #H; #H1; #t2; ncases t2;
288 ##[ ##3: #nl2; ncases nl2;
289 ##[ ##1: #hh2; #H2; nelim (nelist_destruct_cons_nil ? hh1 hh2 ll1 (asttype_destruct_struct_struct … H2))
290 ##| ##2: #hh2; #ll2; #H2; nchange with (((eq_ast_type hh1 hh2)⊗(bfold_right_neList2 ? (λx,y.eq_ast_type x y) ll1 ll2)) = true);
291 nrewrite > (H hh2 (nelist_destruct_cons_cons_1 … (asttype_destruct_struct_struct … H2)));
292 nrewrite > (eq_to_eqasttype_aux1 ll1 ll2 (H1 (AST_TYPE_STRUCT ll2) ?));
293 ##[ ##1: nnormalize; napply refl_eq
294 ##| ##2: nrewrite > (nelist_destruct_cons_cons_2 … (asttype_destruct_struct_struct … H2));
298 ##| ##1: #b2; #H2; napply (asttype_destruct … H2)
299 ##| ##2: #st2; #n2; #H2; napply (asttype_destruct … H2)
304 nlemma isbastbasetype_to_isastbasetype : ∀ast.isb_ast_base_type ast = true → is_ast_base_type ast.
308 ##[ ##1: #t; #H; napply I
309 ##| ##2: #t; #n; #H; napply (bool_destruct … H)
310 ##| ##3: #t; #H; napply (bool_destruct … H)
314 nlemma isntbastbasetype_to_isntastbasetype : ∀ast.isntb_ast_base_type ast = true → isnt_ast_base_type ast.
318 ##[ ##1: #t; #H; napply (bool_destruct … H)
319 ##| ##2: #t; #n; #H; napply I
320 ##| ##3: #l; #H; napply I