X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fbasic_2%2Fgrammar%2Fleq.ma;h=a898abdb566f65941eb7d63cb572bdf85838a536;hb=52e675f555f559c047d5449db7fc89a51b977d35;hp=095e1ced3765ad8a590868ec495f1db205f84e1a;hpb=1cc9a122e904468085545bb53543cc1a0f2f48f5;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/basic_2/grammar/leq.ma b/matita/matita/contribs/lambdadelta/basic_2/grammar/leq.ma index 095e1ced3..a898abdb5 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/grammar/leq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/grammar/leq.ma @@ -12,70 +12,181 @@ (* *) (**************************************************************************) -include "ground_2/ynat/ynat_succ.ma". -include "basic_2/notation/relations/iso_4.ma". +include "ground_2/ynat/ynat_lt.ma". +include "basic_2/notation/relations/midiso_4.ma". include "basic_2/grammar/lenv_length.ma". (* EQUIVALENCE FOR LOCAL ENVIRONMENTS ***************************************) -inductive leq: ynat → ynat → relation lenv ≝ +inductive leq: relation4 ynat ynat lenv lenv ≝ | leq_atom: ∀d,e. leq d e (⋆) (⋆) -| leq_zero: ∀I,L1,L2,V. leq 0 0 L1 L2 → leq 0 0 (L1.ⓑ{I}V) (L2.ⓑ{I}V) -| leq_pair: ∀I1,I2,L1,L2,V1,V2,e. - leq 0 e L1 L2 → leq 0 (⫯e) (L1.ⓑ{I1}V1) (L2.ⓑ{I2}V2) -| leq_succ: ∀I,L1,L2,V,d,e. leq d e L1 L2 → leq (⫯d) e (L1.ⓑ{I}V) (L2.ⓑ{I}V) +| leq_zero: ∀I1,I2,L1,L2,V1,V2. + leq 0 0 L1 L2 → leq 0 0 (L1.ⓑ{I1}V1) (L2.ⓑ{I2}V2) +| leq_pair: ∀I,L1,L2,V,e. leq 0 e L1 L2 → + leq 0 (⫯e) (L1.ⓑ{I}V) (L2.ⓑ{I}V) +| leq_succ: ∀I1,I2,L1,L2,V1,V2,d,e. + leq d e L1 L2 → leq (⫯d) e (L1.ⓑ{I1}V1) (L2.ⓑ{I2}V2) . interpretation - "equivalence (local environment)" - 'Iso d e L1 L2 = (leq d e L1 L2). + "equivalence (local environment)" + 'MidIso d e L1 L2 = (leq d e L1 L2). (* Basic properties *********************************************************) -lemma leq_refl: ∀L,d,e. L ≃[d, e] L. -#L elim L -L /2 width=1 by/ -#L #I #V #IHL #d #e elim (ynat_cases … d) [ | * /2 width=1 by leq_succ/ ] -elim (ynat_cases … e) [ | * ] -/2 width=1 by leq_zero, leq_pair/ +lemma leq_pair_lt: ∀I,L1,L2,V,e. L1 ⩬[0, ⫰e] L2 → 0 < e → + L1.ⓑ{I}V ⩬[0, e] L2.ⓑ{I}V. +#I #L1 #L2 #V #e #HL12 #He <(ylt_inv_O1 … He) /2 width=1 by leq_pair/ qed. -lemma leq_sym: ∀L1,L2,d,e. L1 ≃[d, e] L2 → L2 ≃[d, e] L1. -#L1 #L2 #d #e #H elim H -L1 -L2 -d -e -/2 width=1 by leq_atom, leq_zero, leq_pair, leq_succ/ -qed-. +lemma leq_succ_lt: ∀I1,I2,L1,L2,V1,V2,d,e. L1 ⩬[⫰d, e] L2 → 0 < d → + L1.ⓑ{I1}V1 ⩬[d, e] L2. ⓑ{I2}V2. +#I1 #I2 #L1 #L2 #V1 #V2 #d #e #HL12 #Hd <(ylt_inv_O1 … Hd) /2 width=1 by leq_succ/ +qed. -lemma leq_O_Y: ∀L1,L2. |L1| = |L2| → L1 ≃[0, ∞] L2. -#L1 elim L1 -L1 -[ #X #H lapply (length_inv_zero_sn … H) -H // -| #L1 #I1 #V1 #IHL1 #X #H elim (length_inv_pos_sn … H) -H - #L2 #I2 #V2 #HL12 #H destruct - @(leq_pair … (∞)) /2 width=1 by/ (**) (* explicit constructor *) -] +lemma leq_pair_O_Y: ∀L1,L2. L1 ⩬[0, ∞] L2 → + ∀I,V. L1.ⓑ{I}V ⩬[0, ∞] L2.ⓑ{I}V. +#L1 #L2 #HL12 #I #V lapply (leq_pair I … V … HL12) -HL12 // qed. -(* Basic forward lemmas *****************************************************) +lemma leq_refl: ∀L,d,e. L ⩬[d, e] L. +#L elim L -L // +#L #I #V #IHL #d elim (ynat_cases … d) [| * #x ] +#Hd destruct /2 width=1 by leq_succ/ +#e elim (ynat_cases … e) [| * #x ] +#He destruct /2 width=1 by leq_zero, leq_pair/ +qed. -lemma leq_fwd_length: ∀L1,L2,d,e. L1 ≃[d, e] L2 → |L1| = |L2|. -#L1 #L2 #d #e #H elim H -L1 -L2 -d -e normalize // +lemma leq_O2: ∀L1,L2,d. |L1| = |L2| → L1 ⩬[d, yinj 0] L2. +#L1 elim L1 -L1 [| #L1 #I1 #V1 #IHL1 ] +* // [1,3: #L2 #I2 #V2 ] #d normalize +[1,3: