X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fstatic_2%2Fsyntax%2Flveq_length.ma;h=3154290ebbb942856220b42cceaed88c4f21608e;hb=156d974ad89aa04a086fdf9d332c8b04adf279fd;hp=104d2b8b988d4c0e5d30b3974fc930c669b52a94;hpb=ff612dc35167ec0c145864c9aa8ae5e1ebe20a48;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/static_2/syntax/lveq_length.ma b/matita/matita/contribs/lambdadelta/static_2/syntax/lveq_length.ma index 104d2b8b9..3154290eb 100644 --- a/matita/matita/contribs/lambdadelta/static_2/syntax/lveq_length.ma +++ b/matita/matita/contribs/lambdadelta/static_2/syntax/lveq_length.ma @@ -12,6 +12,7 @@ (* *) (**************************************************************************) +include "ground/arith/nat_le_minus_plus.ma". include "static_2/syntax/lenv_length.ma". include "static_2/syntax/lveq.ma". @@ -19,7 +20,7 @@ include "static_2/syntax/lveq.ma". (* Properties with length for local environments ****************************) -lemma lveq_length_eq: ∀L1,L2. |L1| = |L2| → L1 ≋ⓧ*[0, 0] L2. +lemma lveq_length_eq: ∀L1,L2. |L1| = |L2| → L1 ≋ⓧ*[𝟎,𝟎] L2. #L1 elim L1 -L1 [ #Y2 #H >(length_inv_zero_sn … H) -Y2 /2 width=3 by lveq_atom, ex_intro/ | #K1 #I1 #IH #Y2 #H @@ -30,78 +31,86 @@ qed. (* Forward lemmas with length for local environments ************************) -lemma lveq_fwd_length_le_sn: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1, n2] L2 → n1 ≤ |L1|. -#L1 #L2 #n1 #n2 #H elim H -L1 -L2 -n1 -n2 normalize -/2 width=1 by le_S_S/ +lemma lveq_fwd_length_le_sn: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1,n2] L2 → n1 ≤ |L1|. +#L1 #L2 #n1 #n2 #H elim H -L1 -L2 -n1 -n2 +/2 width=1 by nle_succ_bi/ qed-. -lemma lveq_fwd_length_le_dx: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1, n2] L2 → n2 ≤ |L2|. -#L1 #L2 #n1 #n2 #H elim H -L1 -L2 -n1 -n2 normalize -/2 width=1 by le_S_S/ +lemma lveq_fwd_length_le_dx: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1,n2] L2 → n2 ≤ |L2|. +#L1 #L2 #n1 #n2 #H elim H -L1 -L2 -n1 -n2 +/2 width=1 by nle_succ_bi/ qed-. -lemma lveq_fwd_length: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1, n2] L2 → +lemma lveq_fwd_length: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1,n2] L2 → ∧∧ |L1|-|L2| = n1 & |L2|-|L1| = n2. -#L1 #L2 #n1 #n2 #H elim H -L1 -L2 -n1 -n2 /2 width=1 by conj/ -#K1 #K2 #n #_ * #H1 #H2 >length_bind /3 width=1 by minus_Sn_m, conj/ +#L1 #L2 #n1 #n2 #H elim H -L1 -L2 -n1 -n2 +[ /2 width=1 by conj/ +| #I1 #I2 #K1 #K2 #_ #IH >length_bind >length_bind // +] +#K1 #K2 #n #_ * #H1 #H2 destruct +>length_bind (eq_minus_O … HL) // +>(nle_inv_eq_zero_minus … HL) // qed-. -lemma lveq_length_fwd_dx: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1, n2] L2 → |L2| ≤ |L1| → 0 = n2. +lemma lveq_length_fwd_dx: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1,n2] L2 → |L2| ≤ |L1| → 𝟎 = n2. #L1 #L2 #n1 #n2 #H #HL elim (lveq_fwd_length … H) -H ->(eq_minus_O … HL) // +>(nle_inv_eq_zero_minus … HL) // qed-. -lemma lveq_inj_length: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1, n2] L2 → - |L1| = |L2| → ∧∧ 0 = n1 & 0 = n2. +lemma lveq_inj_length: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1,n2] L2 → + |L1| = |L2| → ∧∧ 𝟎 = n1 & 𝟎 = n2. #L1 #L2 #n1 #n2 #H #HL elim (lveq_fwd_length … H) -H ->HL -HL /2 width=1 by conj/ +>HL -HL /2 width=1 by conj/ qed-. -lemma lveq_fwd_length_plus: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1, n2] L2 → +lemma lveq_fwd_length_plus: ∀L1,L2,n1,n2. L1 ≋ⓧ*[n1,n2] L2 → |L1| + n2 = |L2| + n1. -#L1 #L2 #n1 #n2 #H elim H -L1 -L2 -n1 -n2 normalize -/2 width=2 by injective_plus_r/ +#L1 #L2 #n1 #n2 #H elim H -L1 -L2 -n1 -n2 // +#k1 #K2 #n #_ #IH length_bind >length_bind // +elim (lveq_fwd_length … HL) -HL >length_bind >length_bind +plus_n_Sm #H0 -lapply (plus2_inv_le_sn … H0 HL12) -H0 -HL12 #H0 -elim (le_inv_S1 … H0) -H0 #m2 #_ #H0 destruct +lapply (lveq_fwd_length_plus … H) >length_bind >nplus_succ_shift #H0 +lapply (nplus_2_des_le_sn_sn … H0 HL12) -H0 -HL12 #H0 +elim (nle_inv_succ_sn … H0) -H0 #_ #H0 >H0 in H; -H0 #H elim (lveq_inv_void_succ_dx … H) -H /2 width=3 by ex3_intro/ qed-. -lemma lveq_inv_void_sn_length: ∀L1,L2,n1,n2. L1.ⓧ ≋ⓧ*[n1, n2] L2 → |L2| ≤ |L1| → - ∃∃m1. L1 ≋ ⓧ*[m1, n2] L2 & ↑m1 = n1 & 0 = n2. +(**) (* state with m1 ≝ ↓n1 *) +lemma lveq_inv_void_sn_length: ∀L1,L2,n1,n2. L1.ⓧ ≋ⓧ*[n1,n2] L2 → |L2| ≤ |L1| → + ∃∃m1. L1 ≋ ⓧ*[m1,n2] L2 & ↑m1 = n1 & 𝟎 = n2. #L1 #L2 #n1 #n2 #H #HL lapply (lveq_sym … H) -H #H elim (lveq_inv_void_dx_length … H HL) -H -HL