]> matita.cs.unibo.it Git - helm.git/blob - matita/library/Fsub/part1a.ma
set -> type
[helm.git] / matita / library / Fsub / part1a.ma
1 (**************************************************************************)
2 (*       ___                                                              *)
3 (*      ||M||                                                             *)
4 (*      ||A||       A project by Andrea Asperti                           *)
5 (*      ||T||                                                             *)
6 (*      ||I||       Developers:                                           *)
7 (*      ||T||         The HELM team.                                      *)
8 (*      ||A||         http://helm.cs.unibo.it                             *)
9 (*      \   /                                                             *)
10 (*       \ /        This file is distributed under the terms of the       *)
11 (*        v         GNU General Public License Version 2                  *)
12 (*                                                                        *)
13 (**************************************************************************)
14
15 set "baseuri" "cic:/matita/Fsub/part1a/".
16 include "logic/equality.ma".
17 include "nat/nat.ma".
18 include "datatypes/bool.ma".
19 include "nat/compare.ma".
20 include "Fsub/util.ma".
21 include "Fsub/defn.ma".
22
23 (*** Lemma A.1 (Reflexivity) ***)
24
25 theorem JS_Refl : \forall T,G.(WFType G T) \to (WFEnv G) \to (JSubtype G T T).
26 apply Typ_len_ind;intro;elim U
27   [(* FIXME *) generalize in match H1;intro;inversion H1
28      [intros;destruct H6
29      |intros;destruct H5
30      |*:intros;destruct H9]
31   |apply (SA_Refl_TVar ? ? H2);(*FIXME*)generalize in match H1;intro;
32    inversion H1
33      [intros;destruct H6;rewrite > Hcut;assumption
34      |intros;destruct H5
35      |*:intros;destruct H9]
36   |apply (SA_Top ? ? H2 H1)
37   |cut ((WFType G t) \land (WFType G t1))
38      [elim Hcut;apply SA_Arrow
39         [apply H2
40            [apply t_len_arrow1
41            |*:assumption]
42         |apply H2
43            [apply t_len_arrow2
44            |*:assumption]]
45      |(*FIXME*)generalize in match H3;intro;inversion H3
46         [intros;destruct H8
47         |intros;destruct H7
48         |intros;destruct H11;rewrite > Hcut;rewrite > Hcut1;split;assumption
49         |intros;destruct H11]]
50   |elim (fresh_name ((fv_type t1) @ (fv_env G)));
51    cut ((\lnot (in_list ? a (fv_type t1))) \land
52         (\lnot (in_list ? a (fv_env G))))
53      [elim Hcut;cut (WFType G t)
54         [apply (SA_All2 ? ? ? ? ? a ? H7 H6 H6)
55            [apply H2
56               [apply t_len_forall1
57               |*:assumption]
58            |apply H2
59               [rewrite > subst_O_nat;rewrite < eq_t_len_TFree_subst;
60                apply t_len_forall2
61               |(*FIXME*)generalize in match H3;intro;inversion H3
62                  [intros;destruct H11
63                  |intros;destruct H10
64                  |intros;destruct H14
65                  |intros;destruct H14;rewrite < Hcut2 in H11;
66                   rewrite < Hcut3 in H11;rewrite < H13;rewrite < H13 in H11;
67                   apply (H11 ? H7 H6)]
68               |apply WFE_cons;assumption]]
69         |(*FIXME*)generalize in match H3;intro;inversion H3
70            [intros;destruct H11
71            |intros;destruct H10
72            |intros;destruct H14
73            |intros;destruct H14;rewrite > Hcut1;assumption]]
74      |split;unfold;intro;apply H5;apply natinG_or_inH_to_natinGH;auto]]
75 qed.
76
77 (* 
78  * A slightly more general variant to lemma A.2.2, where weakening isn't
79  * defined as concatenation of any two disjoint environments, but as
80  * set inclusion.
81  *)
82  
83 lemma JS_weakening : \forall G,T,U.(JSubtype G T U) \to
84                       \forall H.(WFEnv H) \to (incl ? G H) \to (JSubtype H T U).
85 intros 4;elim H
86   [apply (SA_Top ? ? H4);lapply (incl_bound_fv ? ? H5);
87    apply (WFT_env_incl ? ? H2 ? Hletin)
88   |apply (SA_Refl_TVar ? ? H4);lapply (incl_bound_fv ? ? H5);
89    apply (Hletin ? H2)
90   |lapply (H3 ? H5 H6);lapply (H6 ? H1);
91    apply (SA_Trans_TVar ? ? ? ? Hletin1 Hletin)
92   |lapply (H2 ? H6 H7);lapply (H4 ? H6 H7);
93    apply (SA_Arrow ? ? ? ? ? Hletin Hletin1)
94   |lapply (H2 ? H6 H7);apply (SA_All ? ? ? ? ? Hletin);intros;apply H4
95      [unfold;intro;apply H8;lapply (incl_bound_fv ? ? H7);apply (Hletin1 ? H9)
96      |apply WFE_cons
97         [1,2:assumption
98         |lapply (incl_bound_fv ? ? H7);apply (WFT_env_incl ? ? ? ? Hletin1);
99          apply (JS_to_WFT1 ? ? ? H1)]
100      |unfold;intros;inversion H9
101         [intros;lapply (inj_head ? ? ? ? H11);rewrite > Hletin1;apply in_Base
102         |intros;lapply (inj_tail ? ? ? ? ? H13);rewrite < Hletin1 in H10;
103          apply in_Skip;apply (H7 ? H10)]]]
104 qed.
105
106 (* Lemma A.3 (Transitivity and Narrowing) *)
107
108 lemma JS_trans_narrow : \forall n.
109   (\forall G,T,Q,U.
110      (t_len Q) \leq n \to (JSubtype G T Q) \to (JSubtype G Q U) \to 
111      (JSubtype G T U)) \land
112   (\forall G,H,X,P,Q,M,N.
113      (t_len Q) \leq n \to 
114      (JSubtype (H @ ((mk_bound true X Q) :: G)) M N) \to
115      (JSubtype G P Q) \to
116      (JSubtype (H @ ((mk_bound true X P) :: G)) M N)).
117 intro;apply (nat_elim1 n);intros 2;
118 cut (\forall G,T,Q.(JSubtype G T Q) \to 
119         \forall U.(t_len Q \leq m) \to (JSubtype G Q U) \to (JSubtype G T U))
120   [cut (\forall G,M,N.(JSubtype G M N) \to
121            \forall G1,X,Q,G2,P.
122               (G = G2 @ ((mk_bound true X Q) :: G1)) \to (t_len Q) \leq m \to
123               (JSubtype G1 P Q) \to 
124               (JSubtype (G2 @ ((mk_bound true X P) :: G1)) M N))
125      [split
126         [intros;apply (Hcut ? ? ? H2 ? H1 H3)
127         |intros;apply (Hcut1 ? ? ? H3 ? ? ? ? ? ? H2 H4);reflexivity]
128      |intros 9;cut (incl ? (fv_env (G2 @ ((mk_bound true X Q)::G1)))
129                    (fv_env (G2 @ ((mk_bound true X P)::G1))))
130         [intros;
131 (*                 [rewrite > H6 in H2;lapply (JS_to_WFT1 ? ? ? H8);
132                   apply (WFE_Typ_subst ? ? ? ? ? ? ? H2 Hletin) *)
133          generalize in match Hcut1;generalize in match H2;
134          generalize in match H1;generalize in match H4;
135          generalize in match G1;generalize in match G2;elim H1
136            [apply SA_Top
137               [rewrite > H9 in H5;lapply (JS_to_WFT1 ? ? ? H7);
138                apply (WFE_Typ_subst ? ? ? ? ? ? ? H5 Hletin)
139               |rewrite > H9 in H6;apply (WFT_env_incl ? ? H6);elim l
140                  [simplify;unfold;intros;assumption
141                  |simplify;apply (incl_nat_cons ? ? ? H11)]]
142            |apply SA_Refl_TVar
143               [rewrite > H9 in H5;lapply (JS_to_WFT1 ? ? ? H7);
144                apply (WFE_Typ_subst ? ? ? ? ? ? ? H5 Hletin)
145               |apply H10;rewrite < H9;assumption]           
146            |elim (decidable_eq_nat X n1)
147               [apply (SA_Trans_TVar ? ? ? P)
148                  [rewrite < H12;elim l
149                     [simplify;apply in_Base
150                     |simplify;apply in_Skip;assumption]
151                  |lapply (JS_to_WFE ? ? ? H9);rewrite > H10 in Hletin;
152                   rewrite > H10 in H5;
153                   lapply (WFE_bound_bound ? ? ? Q ? Hletin H5)
154                     [lapply (H7 ? ? H8 H6 H10 H11);rewrite > Hletin1 in Hletin2;
155                      apply (Hcut ? ? ? ? ? H3 Hletin2);
156                      lapply (JS_to_WFE ? ? ? Hletin2);
157                      apply (JS_weakening ? ? ? H8 ? Hletin3);unfold;intros;
158                      elim l;simplify;apply in_Skip;assumption
159                     |rewrite > H12;elim l
160                        [simplify;apply in_Base
161                        |simplify;apply in_Skip;assumption]]]
162               |rewrite > H10 in H5;apply (SA_Trans_TVar ? ? ? t1)
163                  [apply (lookup_env_extends ? ? ? ? ? ? ? ? ? ? H5);unfold;
164                   intro;apply H12;symmetry;assumption
165                  |apply (H7 ? ? H8 H6 H10 H11)]]
166            |apply SA_Arrow
167               [apply (H6 ? ? H9 H5 H11 H12)
168               |apply (H8 ? ? H9 H7 H11 H12)]
169            |apply SA_All
170               [apply (H6 ? ? H9 H5 H11 H12)
171               |intros;apply (H8 ? ? (mk_bound true X1 t2::l) l1)
172                  [unfold;intro;apply H13;rewrite > H11 in H14;apply (H12 ? H14)
173                  |assumption
174                  |apply H7;rewrite > H11;unfold;intro;apply H13;apply (H12 ? H14)
175                  |simplify;rewrite < H11;reflexivity
176                  |simplify;apply incl_nat_cons;assumption]]]
177         |elim G2 0
178            [simplify;unfold;intros;assumption
179            |intro;elim t 0;simplify;intros;apply incl_nat_cons;assumption]]]
180   |intros 4;(*generalize in match H1;*)elim H1
181      [inversion H5
182         [intros;rewrite < H8;apply (SA_Top ? ? H2 H3)
183         |intros;destruct H9
184         |intros;destruct H10
185         |*:intros;destruct H11]
186      |assumption
187      |apply (SA_Trans_TVar ? ? ? ? H2);apply (H4 ? H5 H6)
188      |inversion H7
189         [intros;apply (SA_Top ? ? H8);rewrite < H10;apply WFT_Arrow
190            [apply (JS_to_WFT2 ? ? ? H2)
191            |apply (JS_to_WFT1 ? ? ? H4)]
192         |intros;destruct H11
193         |intros;destruct H12
194         |intros;destruct H13;elim (H (pred m))
195            [apply SA_Arrow
196               [rewrite > H12 in H2;rewrite < Hcut in H8;
197                apply (H15 ? ? ? ? ? H8 H2);lapply (t_len_arrow1 t2 t3);
198                unfold in Hletin;lapply (trans_le ? ? ? Hletin H6);
199                apply (t_len_pred ? ? Hletin1)
200               |rewrite > H12 in H4;rewrite < Hcut1 in H10;
201                apply (H15 ? ? ? ? ? H4 H10);lapply (t_len_arrow2 t2 t3);
202                unfold in Hletin;lapply (trans_le ? ? ? Hletin H6);
203                apply (t_len_pred ? ? Hletin1)]
204            |apply (pred_m_lt_m ? ? H6)]
205         |intros;destruct H13]
206      |inversion H7
207         [intros;apply (SA_Top ? ? H8);rewrite < H10;apply WFT_Forall
208            [apply (JS_to_WFT2 ? ? ? H2)
209            |intros;lapply (H4 ? H13);lapply (JS_to_WFT1 ? ? ? Hletin);
210             apply (WFT_env_incl ? ? Hletin1);simplify;unfold;intros;
211             assumption]
212         |intros;destruct H11
213         |intros;destruct H12
214         |intros;destruct H13
215         |intros;destruct H13;elim (H (pred m))
216            [elim (fresh_name ((fv_env e1) @ (fv_type t1) @ (fv_type t7)));
217             cut ((\lnot (in_list ? a (fv_env e1))) \land 
218                  (\lnot (in_list ? a (fv_type t1))) \land
219                  (\lnot (in_list ? a (fv_type t7))))
220               [elim Hcut2;elim H18;clear Hcut2 H18;apply (SA_All2 ? ? ? ? ? a)
221                  [rewrite < Hcut in H8;rewrite > H12 in H2;
222                   apply (H15 ? ? ? ? ? H8 H2);lapply (t_len_forall1 t2 t3);
223                   unfold in Hletin;lapply (trans_le ? ? ? Hletin H6);
224                   apply (t_len_pred ? ? Hletin1)
225                  |5:lapply (H10 ? H20);rewrite > H12 in H5;
226                   lapply (H5 ? H20 (subst_type_O t5 (TFree a)))
227                     [apply (H15 ? ? ? ? ? ? Hletin)
228                        [rewrite < Hcut1;rewrite > subst_O_nat;
229                         rewrite < eq_t_len_TFree_subst;
230                         lapply (t_len_forall2 t2 t3);unfold in Hletin2;
231                         lapply (trans_le ? ? ? Hletin2 H6);
232                         apply (t_len_pred ? ? Hletin3)
233                        |rewrite < Hcut in H8;
234                         apply (H16 e1 (nil ?) a t6 t2 ? ? ? Hletin1 H8);
235                         lapply (t_len_forall1 t2 t3);unfold in Hletin2;
236                         lapply (trans_le ? ? ? Hletin2 H6);
237                         apply (t_len_pred ? ? Hletin3)]
238                     |rewrite > subst_O_nat;rewrite < eq_t_len_TFree_subst;
239                      lapply (t_len_forall2 t2 t3);unfold in Hletin1;
240                      lapply (trans_le ? ? ? Hletin1 H6);
241                      apply (trans_le ? ? ? ? Hletin2);constructor 2;
242                      constructor 1
243                     |rewrite > Hcut1;rewrite > H12 in H4;
244                      lapply (H4 ? H20);rewrite < Hcut1;apply JS_Refl
245                        [apply (JS_to_WFT2 ? ? ? Hletin1)
246                        |apply (JS_to_WFE ? ? ? Hletin1)]]
247                  |*:assumption]
248               |split
249                  [split
250                     [unfold;intro;apply H17;
251                      apply (natinG_or_inH_to_natinGH ? (fv_env e1));right;
252                      assumption
253                     |unfold;intro;apply H17;
254                      apply (natinG_or_inH_to_natinGH 
255                                ((fv_type t1) @ (fv_type t7)));left;
256                      apply natinG_or_inH_to_natinGH;right;assumption]
257                  |unfold;intro;apply H17;
258                   apply (natinG_or_inH_to_natinGH 
259                             ((fv_type t1) @ (fv_type t7)));left;
260                   apply natinG_or_inH_to_natinGH;left;assumption]]
261            |apply (pred_m_lt_m ? ? H6)]]]]
262 qed.
263
264 theorem JS_trans : \forall G,T,U,V.(JSubtype G T U) \to 
265                                    (JSubtype G U V) \to
266                                    (JSubtype G T V).
267 intros;elim (JS_trans_narrow (t_len U));apply (H2 ? ? ? ? ? H H1);constructor 1;
268 qed.
269
270 theorem JS_narrow : \forall G1,G2,X,P,Q,T,U.
271                        (JSubtype (G2 @ (mk_bound true X Q :: G1)) T U) \to
272                        (JSubtype G1 P Q) \to
273                        (JSubtype (G2 @ (mk_bound true X P :: G1)) T U).
274 intros;elim (JS_trans_narrow (t_len Q));apply (H3 ? ? ? ? ? ? ? ? H H1);
275 constructor 1;
276 qed.