X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fbasic_2%2Frelocation%2Flifts.ma;h=31f416f12fcec83c6a36b10efd450b9cbf25580c;hb=268e7f336d036f77ffc9663358e9afda92b97730;hp=495d5e45fa9cbddac708ae4aa0f836db860e484d;hpb=384b04944ac31922ee41418b106b8e19a19ba9f0;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 495d5e45f..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 ***************************************************) @@ -210,6 +225,28 @@ lemma lifts_inv_flat2: ∀f:rtmap. ∀I,V2,T2,X. ⬆*[f] X ≡ ⓕ{I}V2.T2 → (* 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 @@ -243,10 +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 *)