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 (* Sviluppo: 2008-2010 *)
21 (* ********************************************************************** *)
23 include "compiler/ast_type.ma".
24 include "common/list_utility_lemmas.ma".
26 (* ************************* *)
27 (* dimensioni degli elementi *)
28 (* ************************* *)
31 ndefinition astbasetype_destruct_aux ≝
32 Πb1,b2:ast_base_type.ΠP:Prop.b1 = b2 →
33 match eq_astbasetype b1 b2 with [ true ⇒ P → P | false ⇒ P ].
35 ndefinition astbasetype_destruct : astbasetype_destruct_aux.
44 nlemma eq_to_eqastbasetype : ∀n1,n2.n1 = n2 → eq_astbasetype n1 n2 = true.
52 nlemma neqastbasetype_to_neq : ∀n1,n2.eq_astbasetype n1 n2 = false → n1 ≠ n2.
54 napply (not_to_not (n1 = n2) (eq_astbasetype n1 n2 = true) …);
55 ##[ ##1: napply (eq_to_eqastbasetype n1 n2)
56 ##| ##2: napply (eqfalse_to_neqtrue … H)
60 nlemma eqastbasetype_to_eq : ∀b1,b2.eq_astbasetype b1 b2 = true → b1 = b2.
61 #b1; #b2; ncases b1; ncases b2; nnormalize;
62 ##[ ##1,5,9: #H; napply refl_eq
63 ##| ##*: #H; ndestruct (*napply (bool_destruct … H)*)
67 nlemma neq_to_neqastbasetype : ∀n1,n2.n1 ≠ n2 → eq_astbasetype n1 n2 = false.
69 napply (neqtrue_to_eqfalse (eq_astbasetype n1 n2));
70 napply (not_to_not (eq_astbasetype n1 n2 = true) (n1 = n2) ? H);
71 napply (eqastbasetype_to_eq n1 n2).
74 nlemma decidable_astbasetype : ∀x,y:ast_base_type.decidable (x = y).
76 napply (or2_elim (eq_astbasetype x y = true) (eq_astbasetype x y = false) ? (decidable_bexpr ?));
77 ##[ ##1: #H; napply (or2_intro1 (x = y) (x ≠ y) (eqastbasetype_to_eq … H))
78 ##| ##2: #H; napply (or2_intro2 (x = y) (x ≠ y) (neqastbasetype_to_neq … H))
82 nlemma symmetric_eqastbasetype : symmetricT ast_base_type bool eq_astbasetype.
84 napply (or2_elim (n1 = n2) (n1 ≠ n2) ? (decidable_astbasetype n1 n2));
85 ##[ ##1: #H; nrewrite > H; napply refl_eq
86 ##| ##2: #H; nrewrite > (neq_to_neqastbasetype n1 n2 H);
87 napply (symmetric_eq ? (eq_astbasetype n2 n1) false);
88 napply (neq_to_neqastbasetype n2 n1 (symmetric_neq ? n1 n2 H))
92 nlemma asttype_destruct_base_base : ∀b1,b2.AST_TYPE_BASE b1 = AST_TYPE_BASE b2 → b1 = b2.
94 nchange with (match AST_TYPE_BASE b2 with [ AST_TYPE_BASE a ⇒ b1 = a | _ ⇒ False ]);
100 nlemma asttype_destruct_array_array_1 : ∀x1,x2,y1,y2.AST_TYPE_ARRAY x1 y1 = AST_TYPE_ARRAY x2 y2 → x1 = x2.
101 #x1; #x2; #y1; #y2; #H;
102 nchange with (match AST_TYPE_ARRAY x2 y2 with [ AST_TYPE_ARRAY a _ ⇒ x1 = a | _ ⇒ False ]);
108 nlemma asttype_destruct_array_array_2 : ∀x1,x2,y1,y2.AST_TYPE_ARRAY x1 y1 = AST_TYPE_ARRAY x2 y2 → y1 = y2.
109 #x1; #x2; #y1; #y2; #H;
110 nchange with (match AST_TYPE_ARRAY x2 y2 with [ AST_TYPE_ARRAY _ b ⇒ y1 = b | _ ⇒ False ]);
116 nlemma asttype_destruct_struct_struct : ∀b1,b2.AST_TYPE_STRUCT b1 = AST_TYPE_STRUCT b2 → b1 = b2.
118 nchange with (match AST_TYPE_STRUCT b2 with [ AST_TYPE_STRUCT a ⇒ b1 = a | _ ⇒ False ]);
125 ndefinition asttype_destruct_aux ≝
126 Πb1,b2:ast_type.ΠP:Prop.b1 = b2 →
127 match eq_asttype b1 b2 with [ true ⇒ P → P | false ⇒ P ].
129 ndefinition asttype_destruct : asttype_destruct_aux.
132 napply (ast_type_index … b2);
133 ##[ ##1: #e; nchange with (match eq_astbasetype e e with [ true ⇒ P → P | false ⇒ P ]);
134 nrewrite > (eq_to_eqastbasetype e e (refl_eq …));
135 nnormalize; napply (λx.x);
136 ##| ##2: #e; #n; #H; nchange with (match (eq_asttype e e)⊗(eq_nat n n) with [ true ⇒ P → P | false ⇒ P]);
137 nrewrite > (eq_to_eqnat n n (refl_eq …));
138 nrewrite > (symmetric_andbool (eq_asttype e e) true);
139 nchange with (match eq_asttype e e with [ true ⇒ P → P | false ⇒ P]);
141 ##| ##3: #e; #H; nchange with (match eq_asttype e e with [ true ⇒ P → P | false ⇒ P]);
143 ##| ##4: #hh; #tt; #H;
144 nchange with (match bfold_right_neList2 ?? tt tt with [ true ⇒ P → P | false ⇒ P ] →
145 match (eq_asttype hh hh)⊗(bfold_right_neList2 ?? tt tt) with [ true ⇒ P → P | false ⇒ P ]);
147 ncases (eq_asttype hh hh) in H:(%) ⊢ %; #H;
148 ncases (bfold_right_neList2 ? (λx1,x2.eq_asttype x1 x2) tt tt) in H1:(%) ⊢ %; #H1;
149 ##[ ##1: nnormalize; napply (λx.x);
150 ##| ##3: nnormalize in H:(%) ⊢ %; napply H
151 ##| ##*: nnormalize in H1:(%) ⊢ %; napply H1
157 nlemma eq_to_eqasttype_aux1
159 ((eq_asttype (AST_TYPE_STRUCT nl1) (AST_TYPE_STRUCT nl2)) = true) →
160 ((bfold_right_neList2 ? (λx,y.eq_asttype x y) nl1 nl2) = true).
165 nlemma eq_to_eqasttype : ∀t1,t2.t1 = t2 → eq_asttype t1 t2 = true.
167 napply (ast_type_index … t1);
168 ##[ ##1: #b1; #t2; ncases t2;
169 ##[ ##1: #b2; #H; nrewrite > (asttype_destruct_base_base … H);
170 nchange with ((eq_astbasetype b2 b2) = true);
171 nrewrite > (eq_to_eqastbasetype b2 b2 (refl_eq …));
173 ##| ##2: #st2; #n2; #H; ndestruct (*napply (asttype_destruct … H)*)
174 ##| ##3: #nl2; #H; ndestruct (*napply (asttype_destruct … H)*)
176 ##| ##2: #st1; #n1; #H; #t2; ncases t2;
177 ##[ ##2: #st2; #n2; #H1; nchange with (((eq_asttype st1 st2)⊗(eq_nat n1 n2)) = true);
178 nrewrite > (H st2 (asttype_destruct_array_array_1 … H1));
179 nrewrite > (eq_to_eqnat n1 n2 (asttype_destruct_array_array_2 … H1));
182 ##| ##1: #b2; #H1; ndestruct (*napply (asttype_destruct … H1)*)
183 ##| ##3: #nl2; #H1; ndestruct (*napply (asttype_destruct … H1)*)
185 ##| ##3: #hh1; #H; #t2; ncases t2;
186 ##[ ##3: #nl2; ncases nl2;
187 ##[ ##1: #hh2; #H1; nchange with ((eq_asttype hh1 hh2) = true);
188 nrewrite > (H hh2 (nelist_destruct_nil_nil ? hh1 hh2 (asttype_destruct_struct_struct … H1)));
190 ##| ##2: #hh2; #ll2; #H1;
191 (* !!! ndestruct non va *)
192 nelim (nelist_destruct_nil_cons ? hh1 hh2 ll2 (asttype_destruct_struct_struct … H1))
194 ##| ##1: #b2; #H1; ndestruct (*napply (asttype_destruct … H1)*)
195 ##| ##2: #st2; #n2; #H1; ndestruct (*napply (asttype_destruct … H1)*)
197 ##| ##4: #hh1; #ll1; #H; #H1; #t2; ncases t2;
198 ##[ ##3: #nl2; ncases nl2;
200 (* !!! ndestruct non va *)
201 nelim (nelist_destruct_cons_nil ? hh1 hh2 ll1 (asttype_destruct_struct_struct … H2))
202 ##| ##2: #hh2; #ll2; #H2; nchange with (((eq_asttype hh1 hh2)⊗(bfold_right_neList2 ? (λx,y.eq_asttype x y) ll1 ll2)) = true);
203 nrewrite > (H hh2 (nelist_destruct_cons_cons_1 … (asttype_destruct_struct_struct … H2)));
204 nrewrite > (eq_to_eqasttype_aux1 ll1 ll2 (H1 (AST_TYPE_STRUCT ll2) ?));
205 ##[ ##1: nnormalize; napply refl_eq
206 ##| ##2: nrewrite > (nelist_destruct_cons_cons_2 … (asttype_destruct_struct_struct … H2));
210 ##| ##1: #b2; #H2; ndestruct (*napply (asttype_destruct … H2)*)
211 ##| ##2: #st2; #n2; #H2; ndestruct (*napply (asttype_destruct … H2)*)
216 nlemma neqasttype_to_neq : ∀n1,n2.eq_asttype n1 n2 = false → n1 ≠ n2.
218 napply (not_to_not (n1 = n2) (eq_asttype n1 n2 = true) …);
219 ##[ ##1: napply (eq_to_eqasttype n1 n2)
220 ##| ##2: napply (eqfalse_to_neqtrue … H)
224 nlemma eqasttype_to_eq : ∀t1,t2.eq_asttype t1 t2 = true → t1 = t2.
226 napply (ast_type_index … t1);
227 ##[ ##1: #b1; #t2; ncases t2;
228 ##[ ##1: #b2; #H; nchange in H:(%) with ((eq_astbasetype b1 b2) = true);
229 nrewrite > (eqastbasetype_to_eq b1 b2 H);
231 ##| ##2: #st2; #n2; nnormalize; #H; ndestruct (*napply (bool_destruct … H)*)
232 ##| ##3: #nl2; nnormalize; #H; ndestruct (*napply (bool_destruct … H)*)
234 ##| ##2: #st1; #n1; #H; #t2; ncases t2;
235 ##[ ##2: #st2; #n2; #H1; nchange in H1:(%) with (((eq_asttype st1 st2)⊗(eq_nat n1 n2)) = true);
236 nrewrite > (H st2 (andb_true_true_l … H1));
237 nrewrite > (eqnat_to_eq n1 n2 (andb_true_true_r … H1));
239 ##| ##1: #b2; nnormalize; #H1; ndestruct (*napply (bool_destruct … H1)*)
240 ##| ##3: #nl2; nnormalize; #H1; ndestruct (*napply (bool_destruct … H1)*)
242 ##| ##3: #hh1; #H; #t2; ncases t2;
243 ##[ ##3: #nl2; ncases nl2;
244 ##[ ##1: #hh2; #H1; nchange in H1:(%) with ((eq_asttype hh1 hh2) = true);
245 nrewrite > (H hh2 H1);
247 ##| ##2: #hh2; #ll2; nnormalize; #H1; ndestruct (*napply (bool_destruct … H1)*)
249 ##| ##1: #b2; nnormalize; #H1; ndestruct (*napply (bool_destruct … H1)*)
250 ##| ##2: #st2; #n2; nnormalize; #H1; ndestruct (*napply (bool_destruct … H1)*)
252 ##| ##4: #hh1; #ll1; #H; #H1; #t2; ncases t2;
253 ##[ ##3: #nl2; ncases nl2;
254 ##[ ##1: #hh2; nnormalize; #H2; ndestruct (*napply (bool_destruct … H2)*)
255 ##| ##2: #hh2; #ll2; #H2; nchange in H2:(%) with (((eq_asttype hh1 hh2)⊗(bfold_right_neList2 ? (λx,y.eq_asttype x y) ll1 ll2)) = true);
256 nrewrite > (H hh2 (andb_true_true_l … H2));
257 nrewrite > (asttype_destruct_struct_struct ll1 ll2 (H1 (AST_TYPE_STRUCT ll2) (andb_true_true_r … H2)));
260 ##| ##1: #b2; nnormalize; #H2; ndestruct (*napply (bool_destruct … H2)*)
261 ##| ##2: #st2; #n2; nnormalize; #H2; ndestruct (*napply (bool_destruct … H2)*)
266 nlemma neq_to_neqasttype : ∀n1,n2.n1 ≠ n2 → eq_asttype n1 n2 = false.
268 napply (neqtrue_to_eqfalse (eq_asttype n1 n2));
269 napply (not_to_not (eq_asttype n1 n2 = true) (n1 = n2) ? H);
270 napply (eqasttype_to_eq n1 n2).
273 nlemma decidable_asttype : ∀x,y:ast_type.decidable (x = y).
275 napply (or2_elim (eq_asttype x y = true) (eq_asttype x y = false) ? (decidable_bexpr ?));
276 ##[ ##1: #H; napply (or2_intro1 (x = y) (x ≠ y) (eqasttype_to_eq … H))
277 ##| ##2: #H; napply (or2_intro2 (x = y) (x ≠ y) (neqasttype_to_neq … H))
281 nlemma symmetric_eqasttype : symmetricT ast_type bool eq_asttype.
283 napply (or2_elim (n1 = n2) (n1 ≠ n2) ? (decidable_asttype n1 n2));
284 ##[ ##1: #H; nrewrite > H; napply refl_eq
285 ##| ##2: #H; nrewrite > (neq_to_neqasttype n1 n2 H);
286 napply (symmetric_eq ? (eq_asttype n2 n1) false);
287 napply (neq_to_neqasttype n2 n1 (symmetric_neq ? n1 n2 H))
291 nlemma isbastbasetype_to_isastbasetype : ∀ast.isb_ast_base_type ast = true → is_ast_base_type ast.
295 ##[ ##1: #t; #H; napply I
296 ##| ##2: #t; #n; #H; ndestruct (*napply (bool_destruct … H)*)
297 ##| ##3: #t; #H; ndestruct (*napply (bool_destruct … H)*)
301 nlemma isntbastbasetype_to_isntastbasetype : ∀ast.isntb_ast_base_type ast = true → isnt_ast_base_type ast.
305 ##[ ##1: #t; #H; ndestruct (*napply (bool_destruct … H)*)
306 ##| ##2: #t; #n; #H; napply I
307 ##| ##3: #l; #H; napply I