X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambda_delta%2Fbasic_2%2Funfold%2Fdelift_lift.ma;h=26c4e3e8a6e27cdcd704685a1622acce0b194b61;hb=439b6ec33d749ba4e6ae0938e973a85bc23e306e;hp=a7f31fb809643badd7894803607de1d22ed3d1d1;hpb=fc5a0d62ece398d8547dda0f429b9f1e24bca306;p=helm.git diff --git a/matita/matita/contribs/lambda_delta/basic_2/unfold/delift_lift.ma b/matita/matita/contribs/lambda_delta/basic_2/unfold/delift_lift.ma index a7f31fb80..26c4e3e8a 100644 --- a/matita/matita/contribs/lambda_delta/basic_2/unfold/delift_lift.ma +++ b/matita/matita/contribs/lambda_delta/basic_2/unfold/delift_lift.ma @@ -12,25 +12,58 @@ (* *) (**************************************************************************) +include "basic_2/substitution/ldrop_sfr.ma". include "basic_2/unfold/tpss_lift.ma". include "basic_2/unfold/delift.ma". -(* INVERSE TERM RELOCATION *************************************************) +(* INVERSE BASIC TERM RELOCATION *******************************************) (* Advanced properties ******************************************************) lemma delift_lref_be: ∀L,K,V1,V2,U2,i,d,e. d ≤ i → i < d + e → - ⇩[0, i] L ≡ K. ⓓV1 → K ⊢ V1 [0, d + e - i - 1] ≡ V2 → - ⇧[0, d] V2 ≡ U2 → L ⊢ #i [d, e] ≡ U2. + ⇩[0, i] L ≡ K. ⓓV1 → K ⊢ ▼*[0, d + e - i - 1] V1 ≡ V2 → + ⇧[0, d] V2 ≡ U2 → L ⊢ ▼*[d, e] #i ≡ U2. #L #K #V1 #V2 #U2 #i #d #e #Hdi #Hide #HLK * #V #HV1 #HV2 #HVU2 elim (lift_total V 0 (i+1)) #U #HVU -lapply (lift_trans_be … HV2 … HVU ? ?) -HV2 // >minus_plus minus_plus commutative_plus in ⊢ (??%??→?); H -H /2 width=1/ ] -Hde -H #V2 #V12 (**) (* H erased two times *) + elim (lift_total V2 0 d) /3 width=7/ +| #a #I #V1 #T1 #d #e #Hde #HL #H destruct + elim (IH … V1 … Hde HL ?) [2,4: // |3: skip ] #V2 #HV12 + elim (IH (L.ⓑ{I}V1) T1 ? ? (d+1) e ? ? ?) -IH [3,6: // |2: skip |4,5: /2 width=1/ ] -Hde -HL #T2 #HT12 + lapply (delift_lsubs_trans … HT12 (L.ⓑ{I}V2) ?) -HT12 /2 width=1/ /3 width=4/ +| #I #V1 #T1 #d #e #Hde #HL #H destruct + elim (IH … V1 … Hde HL ?) [2,4: // |3: skip ] #V2 #HV12 + elim (IH … T1 … Hde HL ?) -IH -Hde -HL [3,4: // |2: skip ] /3 width=2/ +] +qed. + +lemma sfr_delift: ∀L,T1,d,e. d + e ≤ |L| → ≽ [d, e] L → + ∃T2. L ⊢ ▼*[d, e] T1 ≡ T2. +/2 width=2/ qed-. + +(* Advanced inversion lemmas ************************************************) + +lemma delift_inv_lref1_lt: ∀L,U2,i,d,e. L ⊢ ▼*[d, e] #i ≡ U2 → i < d → U2 = #i. #L #U2 #i #d #e * #U #HU #HU2 #Hid elim (tpss_inv_lref1 … HU) -HU [ #H destruct >(lift_inv_lref2_lt … HU2) // @@ -40,10 +73,10 @@ elim (tpss_inv_lref1 … HU) -HU ] qed-. -lemma delift_inv_lref1_be: ∀L,U2,d,e,i. L ⊢ #i [d, e] ≡ U2 → +lemma delift_inv_lref1_be: ∀L,U2,d,e,i. L ⊢ ▼*[d, e] #i ≡ U2 → d ≤ i → i < d + e → ∃∃K,V1,V2. ⇩[0, i] L ≡ K. ⓓV1 & - K ⊢ V1 [0, d + e - i - 1] ≡ V2 & + K ⊢ ▼*[0, d + e - i - 1] V1 ≡ V2 & ⇧[0, d] V2 ≡ U2. #L #U2 #d #e #i * #U #HU #HU2 #Hdi #Hide elim (tpss_inv_lref1 … HU) -HU @@ -53,7 +86,7 @@ elim (tpss_inv_lref1 … HU) -HU ] qed-. -lemma delift_inv_lref1_ge: ∀L,U2,i,d,e. L ⊢ #i [d, e] ≡ U2 → +lemma delift_inv_lref1_ge: ∀L,U2,i,d,e. L ⊢ ▼*[d, e] #i ≡ U2 → d + e ≤ i → U2 = #(i - e). #L #U2 #i #d #e * #U #HU #HU2 #Hdei elim (tpss_inv_lref1 … HU) -HU @@ -64,11 +97,11 @@ elim (tpss_inv_lref1 … HU) -HU ] qed-. -lemma delift_inv_lref1: ∀L,U2,i,d,e. L ⊢ #i [d, e] ≡ U2 → +lemma delift_inv_lref1: ∀L,U2,i,d,e. L ⊢ ▼*[d, e] #i ≡ U2 → ∨∨ (i < d ∧ U2 = #i) | (∃∃K,V1,V2. d ≤ i & i < d + e & ⇩[0, i] L ≡ K. ⓓV1 & - K ⊢ V1 [0, d + e - i - 1] ≡ V2 & + K ⊢ ▼*[0, d + e - i - 1] V1 ≡ V2 & ⇧[0, d] V2 ≡ U2 ) | (d + e ≤ i ∧ U2 = #(i - e)). @@ -82,12 +115,12 @@ elim (lt_or_ge i d) #Hdi ] qed-. -(* Relocation properties ****************************************************) +(* Properties on basic term relocation **************************************) -lemma delift_lift_le: ∀K,T1,T2,dt,et. K ⊢ T1 [dt, et] ≡ T2 → +lemma delift_lift_le: ∀K,T1,T2,dt,et. K ⊢ ▼*[dt, et] T1 ≡ T2 → ∀L,U1,d,e. dt + et ≤ d → ⇩[d, e] L ≡ K → ⇧[d, e] T1 ≡ U1 → ∀U2. ⇧[d - et, e] T2 ≡ U2 → - L ⊢ U1 [dt, et] ≡ U2. + L ⊢ ▼*[dt, et] U1 ≡ U2. #K #T1 #T2 #dt #et * #T #HT1 #HT2 #L #U1 #d #e #Hdetd #HLK #HTU1 #U2 #HTU2 elim (lift_total T d e) #U #HTU lapply (tpss_lift_le … HT1 … HLK HTU1 … HTU) -T1 -HLK // #HU1 @@ -95,23 +128,40 @@ elim (lift_trans_ge … HT2 … HTU ?) -T // -Hdetd #T #HT2 #HTU >(lift_mono … HTU2 … HT2) -T2 /2 width=3/ qed. -lemma delift_lift_be: ∀K,T1,T2,dt,et. K ⊢ T1 [dt, et] ≡ T2 → +lemma delift_lift_be: ∀K,T1,T2,dt,et. K ⊢ ▼*[dt, et] T1 ≡ T2 → ∀L,U1,d,e. dt ≤ d → d ≤ dt + et → ⇩[d, e] L ≡ K → ⇧[d, e] T1 ≡ U1 → - L ⊢ U1 [dt, et + e] ≡ T2. + L ⊢ ▼*[dt, et + e] U1 ≡ T2. #K #T1 #T2 #dt #et * #T #HT1 #HT2 #L #U1 #d #e #Hdtd #Hddet #HLK #HTU1 elim (lift_total T d e) #U #HTU lapply (tpss_lift_be … HT1 … HLK HTU1 … HTU) -T1 -HLK // #HU1 lapply (lift_trans_be … HT2 … HTU ? ?) -T // -Hdtd -Hddet /2 width=3/ qed. -lemma delift_lift_ge: ∀K,T1,T2,dt,et. K ⊢ T1 [dt, et] ≡ T2 → +lemma delift_lift_ge: ∀K,T1,T2,dt,et. K ⊢ ▼*[dt, et] T1 ≡ T2 → ∀L,U1,d,e. d ≤ dt → ⇩[d, e] L ≡ K → ⇧[d, e] T1 ≡ U1 → ∀U2. ⇧[d, e] T2 ≡ U2 → - L ⊢ U1 [dt + e, et] ≡ U2. + L ⊢ ▼*[dt + e, et] U1 ≡ U2. #K #T1 #T2 #dt #et * #T #HT1 #HT2 #L #U1 #d #e #Hddt #HLK #HTU1 #U2 #HTU2 elim (lift_total T d e) #U #HTU lapply (tpss_lift_ge … HT1 … HLK HTU1 … HTU) -T1 -HLK // #HU1 elim (lift_trans_le … HT2 … HTU ?) -T // -Hddt #T #HT2 #HTU >(lift_mono … HTU2 … HT2) -T2 /2 width=3/ qed. + +lemma delift_inv_lift1_eq: ∀L,U1,T2,d,e. L ⊢ ▼*[d, e] U1 ≡ T2 → + ∀K. ⇩[d, e] L ≡ K → ∀T1. ⇧[d, e] T1 ≡ U1 → T1 = T2. +#L #U1 #T2 #d #e * #U2 #HU12 #HTU2 #K #HLK #T1 #HTU1 +lapply (tpss_inv_lift1_eq … HU12 … HTU1) -L -K #H destruct +lapply (lift_inj … HTU1 … HTU2) -U2 // +qed-. + +lemma delift_lift_div_be: ∀L,T1,T,d,e,i. L ⊢ ▼*[i, d + e - i] T1 ≡ T → + ∀T2. ⇧[d, i - d] T2 ≡ T → d ≤ i → i ≤ d + e → + L ⊢ ▼*[d, e] T1 ≡ T2. +#L #T1 #T #d #e #i * #T0 #HT10 #HT0 #T2 #HT2 #Hdi #Hide +lapply (tpss_weak … HT10 d e ? ?) -HT10 // [ >commutative_plus /2 width=1/ ] #HT10 +lapply (lift_trans_be … HT2 … HT0 ? ?) -T // +>commutative_plus >commutative_plus in ⊢ (? ? (? % ?) ? ? → ?); +