]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matita/contribs/lambda_delta/Basic_2/unfold/ldrops.ma
- update in Basic_2
[helm.git] / matita / matita / contribs / lambda_delta / Basic_2 / unfold / ldrops.ma
index 896415581910b592d23bf0e5875c5a23df1b2399..28b9a8c7e7787ed1751a8814c0eb2d14b01ef069 100644 (file)
@@ -13,6 +13,7 @@
 (**************************************************************************)
 
 include "Basic_2/substitution/ldrop.ma".
+include "Basic_2/unfold/gr2_minus.ma".
 include "Basic_2/unfold/lifts.ma".
 
 (* GENERIC LOCAL ENVIRONMENT SLICING ****************************************)
@@ -20,16 +21,63 @@ include "Basic_2/unfold/lifts.ma".
 inductive ldrops: list2 nat nat → relation lenv ≝
 | ldrops_nil : ∀L. ldrops ⟠ L L
 | ldrops_cons: ∀L1,L,L2,des,d,e.
-               ldrops des L1 L â\86\92 â\87\93[d,e] L ≡ L2 → ldrops ({d, e} :: des) L1 L2
+               ldrops des L1 L â\86\92 â\87©[d,e] L ≡ L2 → ldrops ({d, e} :: des) L1 L2
 .
 
 interpretation "generic local environment slicing"
-   'RLDrop des T1 T2 = (ldrops des T1 T2).
+   'RDropStar des T1 T2 = (ldrops des T1 T2).
+
+(* Basic inversion lemmas ***************************************************)
+
+fact ldrops_inv_nil_aux: ∀L1,L2,des. ⇩*[des] L1 ≡ L2 → des = ⟠ → L1 = L2.
+#L1 #L2 #des * -L1 -L2 -des //
+#L1 #L #L2 #d #e #des #_ #_ #H destruct
+qed.
+
+(* Basic_1: was: drop1_gen_pnil *)
+lemma ldrops_inv_nil: ∀L1,L2. ⇩*[⟠] L1 ≡ L2 → L1 = L2.
+/2 width=3/ qed-.
+
+fact ldrops_inv_cons_aux: ∀L1,L2,des. ⇩*[des] L1 ≡ L2 →
+                          ∀d,e,tl. des = {d, e} :: tl →
+                          ∃∃L. ⇩*[tl] L1 ≡ L & ⇩[d, e] L ≡ L2.
+#L1 #L2 #des * -L1 -L2 -des
+[ #L #d #e #tl #H destruct
+| #L1 #L #L2 #des #d #e #HT1 #HT2 #hd #he #tl #H destruct
+  /2 width=3/
+qed.
+
+(* Basic_1: was: drop1_gen_pcons *)
+lemma ldrops_inv_cons: ∀L1,L2,d,e,des. ⇩*[{d, e} :: des] L1 ≡ L2 →
+                       ∃∃L. ⇩*[des] L1 ≡ L & ⇩[d, e] L ≡ L2.
+/2 width=3/ qed-.
+
+lemma ldrops_inv_skip2: ∀I,des,i,des2. des ▭ i ≡ des2 →
+                        ∀L1,K2,V2. ⇩*[des2] L1 ≡ K2. ⓑ{I} V2 →
+                        ∃∃K1,V1,des1. des + 1 ▭ i + 1 ≡ des1 + 1 &
+                                      ⇩*[des1] K1 ≡ K2 &
+                                      ⇧*[des1] V2 ≡ V1 &
+                                      L1 = K1. ⓑ{I} V1.
+#I #des #i #des2 #H elim H -des -i -des2
+[ #i #L1 #K2 #V2 #H
+  >(ldrops_inv_nil … H) -L1 /2 width=7/
+| #des #des2 #d #e #i #Hid #_ #IHdes2 #L1 #K2 #V2 #H
+  elim (ldrops_inv_cons … H) -H #L #HL1 #H
+  elim (ldrop_inv_skip2 … H ?) -H /2 width=1/ #K #V >minus_plus #HK2 #HV2 #H destruct
+  elim (IHdes2 … HL1) -IHdes2 -HL1 #K1 #V1 #des1 #Hdes1 #HK1 #HV1 #X destruct
+  @(ex4_3_intro … K1 V1 … ) // [3,4: /2 width=7/ | skip ]
+  normalize >plus_minus // @minuss_lt // /2 width=1/ (**) (* explicit constructors, /3 width=1/ is a bit slow *)
+| #des #des2 #d #e #i #Hid #_ #IHdes2 #L1 #K2 #V2 #H
+  elim (IHdes2 … H) -IHdes2 -H #K1 #V1 #des1 #Hdes1 #HK1 #HV1 #X destruct
+  /4 width=7/
+]
+qed-.
 
 (* Basic properties *********************************************************)
 
-lemma ldrops_skip: ∀L1,L2,des. ⇓[des] L1 ≡ L2 → ∀V1,V2. ⇑[des] V2 ≡ V1 →
-                   ∀I. ⇓[ss des] L1. 𝕓{I} V1 ≡ L2. 𝕓{I} V2.
+(* Basic_1: was: drop1_skip_bind *)
+lemma ldrops_skip: ∀L1,L2,des. ⇩*[des] L1 ≡ L2 → ∀V1,V2. ⇧*[des] V2 ≡ V1 →
+                   ∀I. ⇩*[des + 1] L1. ⓑ{I} V1 ≡ L2. ⓑ{I} V2.
 #L1 #L2 #des #H elim H -L1 -L2 -des
 [ #L #V1 #V2 #HV12 #I
   >(lifts_inv_nil … HV12) -HV12 //
@@ -37,3 +85,6 @@ lemma ldrops_skip: ∀L1,L2,des. ⇓[des] L1 ≡ L2 → ∀V1,V2. ⇑[des] V2 
   elim (lifts_inv_cons … H) -H /3 width=5/
 ].
 qed.
+
+(* Basic_1: removed theorems 1: drop1_getl_trans
+*)