X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fbasic_2%2Frelocation%2Flifts.ma;h=31f416f12fcec83c6a36b10efd450b9cbf25580c;hb=4738096e93f997fb36d35dd723b87682a2f6de90;hp=ceaca58a944a6c4884fd476b000b8f2315bebcd2;hpb=e9da8e091898b6e67a2f270581bdc5cdbe80e9b0;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/basic_2/relocation/lifts.ma b/matita/matita/contribs/lambdadelta/basic_2/relocation/lifts.ma index ceaca58a9..31f416f12 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/relocation/lifts.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/relocation/lifts.ma @@ -15,7 +15,7 @@ include "ground_2/relocation/nstream_after.ma". include "basic_2/notation/relations/rliftstar_3.ma". -include "basic_2/grammar/term.ma". +include "basic_2/syntax/term.ma". (* GENERIC RELOCATION FOR TERMS *********************************************) @@ -41,6 +41,21 @@ interpretation "uniform relocation (term)" interpretation "generic relocation (term)" 'RLiftStar f T1 T2 = (lifts f T1 T2). +definition liftable2_sn: predicate (relation term) ≝ + λR. ∀T1,T2. R T1 T2 → ∀f,U1. ⬆*[f] T1 ≡ U1 → + ∃∃U2. ⬆*[f] T2 ≡ U2 & R U1 U2. + +definition deliftable2_sn: predicate (relation term) ≝ + λR. ∀U1,U2. R U1 U2 → ∀f,T1. ⬆*[f] T1 ≡ U1 → + ∃∃T2. ⬆*[f] T2 ≡ U2 & R T1 T2. + +definition liftable2_bi: predicate (relation term) ≝ + λR. ∀T1,T2. R T1 T2 → ∀f,U1. ⬆*[f] T1 ≡ U1 → + ∀U2. ⬆*[f] T2 ≡ U2 → R U1 U2. + +definition deliftable2_bi: predicate (relation term) ≝ + λR. ∀U1,U2. R U1 U2 → ∀f,T1. ⬆*[f] T1 ≡ U1 → + ∀T2. ⬆*[f] T2 ≡ U2 → R T1 T2. (* Basic inversion lemmas ***************************************************) @@ -208,6 +223,30 @@ lemma lifts_inv_flat2: ∀f:rtmap. ∀I,V2,T2,X. ⬆*[f] X ≡ ⓕ{I}V2.T2 → X = ⓕ{I}V1.T1. /2 width=3 by lifts_inv_flat2_aux/ qed-. +(* Advanced inversion lemmas ************************************************) + +lemma lifts_inv_atom1: ∀f,I,Y. ⬆*[f] ⓪{I} ≡ Y → + ∨∨ ∃∃s. I = Sort s & Y = ⋆s + | ∃∃i,j. @⦃i, f⦄ ≡ j & I = LRef i & Y = #j + | ∃∃l. I = GRef l & Y = §l. +#f * #n #Y #H +[ lapply (lifts_inv_sort1 … H) +| elim (lifts_inv_lref1 … H) +| lapply (lifts_inv_gref1 … H) +] -H /3 width=5 by or3_intro0, or3_intro1, or3_intro2, ex3_2_intro, ex2_intro/ +qed-. + +lemma lifts_inv_atom2: ∀f,I,X. ⬆*[f] X ≡ ⓪{I} → + ∨∨ ∃∃s. X = ⋆s & I = Sort s + | ∃∃i,j. @⦃i, f⦄ ≡ j & X = #i & I = LRef j + | ∃∃l. X = §l & I = GRef l. +#f * #n #X #H +[ lapply (lifts_inv_sort2 … H) +| elim (lifts_inv_lref2 … H) +| lapply (lifts_inv_gref2 … H) +] -H /3 width=5 by or3_intro0, or3_intro1, or3_intro2, ex3_2_intro, ex2_intro/ +qed-. + (* Basic_2A1: includes: lift_inv_pair_xy_x *) lemma lifts_inv_pair_xy_x: ∀f,I,V,T. ⬆*[f] ②{I}V.T ≡ V → ⊥. #f #J #V elim V -V @@ -241,6 +280,28 @@ lemma lifts_inv_pair_xy_y: ∀I,T,V,f. ⬆*[f] ②{I}V.T ≡ T → ⊥. ] qed-. +(* Inversion lemmas with uniform relocations ********************************) + +lemma lifts_inv_lref1_uni: ∀l,Y,i. ⬆*[l] #i ≡ Y → Y = #(l+i). +#l #Y #i1 #H elim (lifts_inv_lref1 … H) -H /4 width=4 by at_mono, eq_f/ +qed-. + +lemma lifts_inv_lref2_uni: ∀l,X,i2. ⬆*[l] X ≡ #i2 → + ∃∃i1. X = #i1 & i2 = l + i1. +#l #X #i2 #H elim (lifts_inv_lref2 … H) -H +/3 width=3 by at_inv_uni, ex2_intro/ +qed-. + +lemma lifts_inv_lref2_uni_ge: ∀l,X,i. ⬆*[l] X ≡ #(l + i) → X = #i. +#l #X #i2 #H elim (lifts_inv_lref2_uni … H) -H +#i1 #H1 #H2 destruct /4 width=2 by injective_plus_r, eq_f, sym_eq/ +qed-. + +lemma lifts_inv_lref2_uni_lt: ∀l,X,i. ⬆*[l] X ≡ #i → i < l → ⊥. +#l #X #i2 #H elim (lifts_inv_lref2_uni … H) -H +#i1 #_ #H1 #H2 destruct /2 width=4 by lt_le_false/ +qed-. + (* Basic forward lemmas *****************************************************) (* Basic_2A1: includes: lift_inv_O2 *) @@ -371,6 +432,11 @@ lemma is_lifts_dec: ∀T2,f. Decidable (∃T1. ⬆*[f] T1 ≡ T2). ] qed-. +(* Properties with uniform relocation ***************************************) + +lemma lifts_uni: ∀n1,n2,T,U. ⬆*[𝐔❴n1❵∘𝐔❴n2❵] T ≡ U → ⬆*[n1+n2] T ≡ U. +/3 width=4 by lifts_eq_repl_back, after_inv_total/ qed. + (* Basic_2A1: removed theorems 14: lifts_inv_nil lifts_inv_cons lift_inv_Y1 lift_inv_Y2 lift_inv_lref_Y1 lift_inv_lref_Y2 lift_lref_Y lift_Y1