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 set "baseuri" "cic:/matita/Fsub/part1a/".
16 include "logic/equality.ma".
18 include "datatypes/bool.ma".
19 include "nat/compare.ma".
20 include "Fsub/util.ma".
21 include "Fsub/defn.ma".
23 (*** Lemma A.1 (Reflexivity) ***)
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
30 |*:intros;destruct H9]
31 |apply (SA_Refl_TVar ? ? H2);(*FIXME*)generalize in match H1;intro;
33 [intros;destruct H6;rewrite > Hcut;assumption
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
45 |(*FIXME*)generalize in match H3;intro;inversion H3
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)
59 [rewrite > subst_O_nat;rewrite < eq_t_len_TFree_subst;
61 |(*FIXME*)generalize in match H3;intro;inversion H3
65 |intros;destruct H14;rewrite < Hcut2 in H11;
66 rewrite < Hcut3 in H11;rewrite < H13;rewrite < H13 in H11;
68 |apply WFE_cons;assumption]]
69 |(*FIXME*)generalize in match H3;intro;inversion H3
73 |intros;destruct H14;rewrite > Hcut1;assumption]]
74 |split;unfold;intro;apply H5;apply natinG_or_inH_to_natinGH;auto]]
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
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).
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);
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)
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)]]]
106 (* Lemma A.3 (Transitivity and Narrowing) *)
108 lemma JS_trans_narrow : \forall n.
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.
114 (JSubtype (H @ ((mk_bound true X Q) :: G)) M N) \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
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))
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))))
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
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)]]
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;
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)]]
167 [apply (H6 ? ? H9 H5 H11 H12)
168 |apply (H8 ? ? H9 H7 H11 H12)]
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)
174 |apply H7;rewrite > H11;unfold;intro;apply H13;apply (H12 ? H14)
175 |simplify;rewrite < H11;reflexivity
176 |simplify;apply incl_nat_cons;assumption]]]
178 [simplify;unfold;intros;assumption
179 |intro;elim s 0;simplify;intros;apply incl_nat_cons;assumption]]]
180 |intros 4;(*generalize in match H1;*)elim H1
182 [intros;rewrite < H8;apply (SA_Top ? ? H2 H3)
185 |*:intros;destruct H11]
187 |apply (SA_Trans_TVar ? ? ? ? H2);apply (H4 ? H5 H6)
189 [intros;apply (SA_Top ? ? H8);rewrite < H10;apply WFT_Arrow
190 [apply (JS_to_WFT2 ? ? ? H2)
191 |apply (JS_to_WFT1 ? ? ? H4)]
194 |intros;destruct H13;elim (H (pred m))
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]
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;
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;
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)]]
250 [unfold;intro;apply H17;
251 apply (natinG_or_inH_to_natinGH ? (fv_env e1));right;
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)]]]]
264 theorem JS_trans : \forall G,T,U,V.(JSubtype G T U) \to
267 intros;elim (JS_trans_narrow (t_len U));apply (H2 ? ? ? ? ? H H1);constructor 1;
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);