X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambda_delta%2Fbasic_2%2Fsubstitution%2Flift.ma;h=36c353ba9c75cb1a5d6e694426110fd783927646;hb=b405363d37a437e86705bd85f5b549a36878e7d5;hp=cb8aac3a00ccd2c676a4fba4eccf6009ed572513;hpb=eb918fc784eacd2094e3986ba321ef47690d9983;p=helm.git diff --git a/matita/matita/contribs/lambda_delta/basic_2/substitution/lift.ma b/matita/matita/contribs/lambda_delta/basic_2/substitution/lift.ma index cb8aac3a0..36c353ba9 100644 --- a/matita/matita/contribs/lambda_delta/basic_2/substitution/lift.ma +++ b/matita/matita/contribs/lambda_delta/basic_2/substitution/lift.ma @@ -12,8 +12,8 @@ (* *) (**************************************************************************) -include "Basic_2/grammar/term_weight.ma". -include "Basic_2/grammar/term_simple.ma". +include "basic_2/grammar/term_weight.ma". +include "basic_2/grammar/term_simple.ma". (* BASIC TERM RELOCATION ****************************************************) @@ -25,9 +25,9 @@ inductive lift: nat → nat → relation term ≝ | lift_lref_lt: ∀i,d,e. i < d → lift d e (#i) (#i) | lift_lref_ge: ∀i,d,e. d ≤ i → lift d e (#i) (#(i + e)) | lift_gref : ∀p,d,e. lift d e (§p) (§p) -| lift_bind : ∀I,V1,V2,T1,T2,d,e. +| lift_bind : ∀a,I,V1,V2,T1,T2,d,e. lift d e V1 V2 → lift (d + 1) e T1 T2 → - lift d e (ⓑ{I} V1. T1) (ⓑ{I} V2. T2) + lift d e (ⓑ{a,I} V1. T1) (ⓑ{a,I} V2. T2) | lift_flat : ∀I,V1,V2,T1,T2,d,e. lift d e V1 V2 → lift d e T1 T2 → lift d e (ⓕ{I} V1. T1) (ⓕ{I} V2. T2) @@ -35,6 +35,14 @@ inductive lift: nat → nat → relation term ≝ interpretation "relocation" 'RLift d e T1 T2 = (lift d e T1 T2). +definition t_liftable: relation term → Prop ≝ + λR. ∀T1,T2. R T1 T2 → ∀U1,d,e. ⇧[d, e] T1 ≡ U1 → + ∀U2. ⇧[d, e] T2 ≡ U2 → R U1 U2. + +definition t_deliftable_sn: relation term → Prop ≝ + λR. ∀U1,U2. R U1 U2 → ∀T1,d,e. ⇧[d, e] T1 ≡ U1 → + ∃∃T2. ⇧[d, e] T2 ≡ U2 & R T1 T2. + (* Basic inversion lemmas ***************************************************) fact lift_inv_refl_O2_aux: ∀d,e,T1,T2. ⇧[d, e] T1 ≡ T2 → e = 0 → T1 = T2. @@ -47,7 +55,7 @@ lemma lift_inv_refl_O2: ∀d,T1,T2. ⇧[d, 0] T1 ≡ T2 → T1 = T2. fact lift_inv_sort1_aux: ∀d,e,T1,T2. ⇧[d,e] T1 ≡ T2 → ∀k. T1 = ⋆k → T2 = ⋆k. #d #e #T1 #T2 * -d -e -T1 -T2 // [ #i #d #e #_ #k #H destruct -| #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct +| #a #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct | #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct ] qed. @@ -62,7 +70,7 @@ fact lift_inv_lref1_aux: ∀d,e,T1,T2. ⇧[d,e] T1 ≡ T2 → ∀i. T1 = #i → | #j #d #e #Hj #i #Hi destruct /3 width=1/ | #j #d #e #Hj #i #Hi destruct /3 width=1/ | #p #d #e #i #H destruct -| #I #V1 #V2 #T1 #T2 #d #e #_ #_ #i #H destruct +| #a #I #V1 #V2 #T1 #T2 #d #e #_ #_ #i #H destruct | #I #V1 #V2 #T1 #T2 #d #e #_ #_ #i #H destruct ] qed. @@ -86,7 +94,7 @@ qed-. fact lift_inv_gref1_aux: ∀d,e,T1,T2. ⇧[d,e] T1 ≡ T2 → ∀p. T1 = §p → T2 = §p. #d #e #T1 #T2 * -d -e -T1 -T2 // [ #i #d #e #_ #k #H destruct -| #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct +| #a #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct | #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct ] qed. @@ -95,22 +103,22 @@ lemma lift_inv_gref1: ∀d,e,T2,p. ⇧[d,e] §p ≡ T2 → T2 = §p. /2 width=5/ qed-. fact lift_inv_bind1_aux: ∀d,e,T1,T2. ⇧[d,e] T1 ≡ T2 → - ∀I,V1,U1. T1 = ⓑ{I} V1.U1 → + ∀a,I,V1,U1. T1 = ⓑ{a,I} V1.U1 → ∃∃V2,U2. ⇧[d,e] V1 ≡ V2 & ⇧[d+1,e] U1 ≡ U2 & - T2 = ⓑ{I} V2. U2. + T2 = ⓑ{a,I} V2. U2. #d #e #T1 #T2 * -d -e -T1 -T2 -[ #k #d #e #I #V1 #U1 #H destruct -| #i #d #e #_ #I #V1 #U1 #H destruct -| #i #d #e #_ #I #V1 #U1 #H destruct -| #p #d #e #I #V1 #U1 #H destruct -| #J #W1 #W2 #T1 #T2 #d #e #HW #HT #I #V1 #U1 #H destruct /2 width=5/ -| #J #W1 #W2 #T1 #T2 #d #e #HW #HT #I #V1 #U1 #H destruct +[ #k #d #e #a #I #V1 #U1 #H destruct +| #i #d #e #_ #a #I #V1 #U1 #H destruct +| #i #d #e #_ #a #I #V1 #U1 #H destruct +| #p #d #e #a #I #V1 #U1 #H destruct +| #b #J #W1 #W2 #T1 #T2 #d #e #HW #HT #a #I #V1 #U1 #H destruct /2 width=5/ +| #J #W1 #W2 #T1 #T2 #d #e #_ #HT #a #I #V1 #U1 #H destruct ] qed. -lemma lift_inv_bind1: ∀d,e,T2,I,V1,U1. ⇧[d,e] ⓑ{I} V1. U1 ≡ T2 → +lemma lift_inv_bind1: ∀d,e,T2,a,I,V1,U1. ⇧[d,e] ⓑ{a,I} V1. U1 ≡ T2 → ∃∃V2,U2. ⇧[d,e] V1 ≡ V2 & ⇧[d+1,e] U1 ≡ U2 & - T2 = ⓑ{I} V2. U2. + T2 = ⓑ{a,I} V2. U2. /2 width=3/ qed-. fact lift_inv_flat1_aux: ∀d,e,T1,T2. ⇧[d,e] T1 ≡ T2 → @@ -122,7 +130,7 @@ fact lift_inv_flat1_aux: ∀d,e,T1,T2. ⇧[d,e] T1 ≡ T2 → | #i #d #e #_ #I #V1 #U1 #H destruct | #i #d #e #_ #I #V1 #U1 #H destruct | #p #d #e #I #V1 #U1 #H destruct -| #J #W1 #W2 #T1 #T2 #d #e #HW #HT #I #V1 #U1 #H destruct +| #a #J #W1 #W2 #T1 #T2 #d #e #_ #_ #I #V1 #U1 #H destruct | #J #W1 #W2 #T1 #T2 #d #e #HW #HT #I #V1 #U1 #H destruct /2 width=5/ ] qed. @@ -135,7 +143,7 @@ lemma lift_inv_flat1: ∀d,e,T2,I,V1,U1. ⇧[d,e] ⓕ{I} V1. U1 ≡ T2 → fact lift_inv_sort2_aux: ∀d,e,T1,T2. ⇧[d,e] T1 ≡ T2 → ∀k. T2 = ⋆k → T1 = ⋆k. #d #e #T1 #T2 * -d -e -T1 -T2 // [ #i #d #e #_ #k #H destruct -| #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct +| #a #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct | #I #V1 #V2 #T1 #T2 #d #e #_ #_ #k #H destruct ] qed. @@ -151,7 +159,7 @@ fact lift_inv_lref2_aux: ∀d,e,T1,T2. ⇧[d,e] T1 ≡ T2 → ∀i. T2 = #i → | #j #d #e #Hj #i #Hi destruct /3 width=1/ | #j #d #e #Hj #i #Hi destruct (plus_minus_m_m e2 e1 ?) // /3 width=3/ | /3 width=3/ -| #I #V1 #V2 #T1 #T2 #d1 #e2 #_ #_ #IHV #IHT #d2 #e1 #Hd12 #Hd21 #He12 +| #a #I #V1 #V2 #T1 #T2 #d1 #e2 #_ #_ #IHV #IHT #d2 #e1 #Hd12 #Hd21 #He12 elim (IHV … Hd12 Hd21 He12) -IHV #V0 #HV0a #HV0b elim (IHT (d2+1) … ? ? He12) /2 width=1/ /3 width=5/ | #I #V1 #V2 #T1 #T2 #d1 #e2 #_ #_ #IHV #IHT #d2 #e1 #Hd12 #Hd21 #He12 @@ -346,7 +354,7 @@ lemma is_lift_dec: ∀T2,d,e. Decidable (∃T1. ⇧[d,e] T1 ≡ T2). | lapply (false_lt_to_le … Hide) -Hide /4 width=2/ ] ] -| * #I #V2 #T2 #IHV2 #IHT2 #d #e +| * [ #a ] #I #V2 #T2 #IHV2 #IHT2 #d #e [ elim (IHV2 d e) -IHV2 [ * #V1 #HV12 elim (IHT2 (d+1) e) -IHT2 [ * #T1 #HT12 @or_introl /3 width=2/ @@ -369,6 +377,24 @@ lemma is_lift_dec: ∀T2,d,e. Decidable (∃T1. ⇧[d,e] T1 ≡ T2). ] qed. +lemma t_liftable_TC: ∀R. t_liftable R → t_liftable (TC … R). +#R #HR #T1 #T2 #H elim H -T2 +[ /3 width=7/ +| #T #T2 #_ #HT2 #IHT1 #U1 #d #e #HTU1 #U2 #HTU2 + elim (lift_total T d e) /3 width=9/ +] +qed. + +lemma t_deliftable_sn_TC: ∀R. t_deliftable_sn R → t_deliftable_sn (TC … R). +#R #HR #U1 #U2 #H elim H -U2 +[ #U2 #HU12 #T1 #d #e #HTU1 + elim (HR … HU12 … HTU1) -U1 /3 width=3/ +| #U #U2 #_ #HU2 #IHU1 #T1 #d #e #HTU1 + elim (IHU1 … HTU1) -U1 #T #HTU #HT1 + elim (HR … HU2 … HTU) -U /3 width=5/ +] +qed-. + (* Basic_1: removed theorems 7: lift_head lift_gen_head lift_weight_map lift_weight lift_weight_add lift_weight_add_O