From d5da44537d93ee16e1f440e5ce3fd69b32c3b730 Mon Sep 17 00:00:00 2001 From: Ferruccio Guidi Date: Tue, 27 Nov 2012 21:09:22 +0000 Subject: [PATCH] - the theory of delifting substitution is done - the theory of multiplicity is done --- .../{dsubst.ma => delifting_substitution.ma} | 69 +++++++++++++++++-- matita/matita/contribs/lambda/multiplicity.ma | 52 ++++++++++++++ 2 files changed, 115 insertions(+), 6 deletions(-) rename matita/matita/contribs/lambda/{dsubst.ma => delifting_substitution.ma} (53%) create mode 100644 matita/matita/contribs/lambda/multiplicity.ma diff --git a/matita/matita/contribs/lambda/dsubst.ma b/matita/matita/contribs/lambda/delifting_substitution.ma similarity index 53% rename from matita/matita/contribs/lambda/dsubst.ma rename to matita/matita/contribs/lambda/delifting_substitution.ma index 4d686ef37..6e648c9a8 100644 --- a/matita/matita/contribs/lambda/dsubst.ma +++ b/matita/matita/contribs/lambda/delifting_substitution.ma @@ -35,20 +35,20 @@ notation > "hvbox( [ ⬐ C ] break term 55 M )" non associative with precedence 55 for @{ 'DSubst $C 0 $M }. -lemma dsubst_vref_lt: ∀i,d,C. i < d → [ d ⬐ C ] #i = #i. +lemma dsubst_vref_lt: ∀i,d,C. i < d → [d ⬐ C] #i = #i. normalize /2 width=1/ qed. -lemma dsubst_vref_eq: ∀d,C. [ d ⬐ C ] #d = ↑[d]C. +lemma dsubst_vref_eq: ∀d,C. [d ⬐ C] #d = ↑[d]C. normalize // qed. -lemma dsubst_vref_gt: ∀i,d,C. d < i → [ d ⬐ C ] #i = #(i-1). +lemma dsubst_vref_gt: ∀i,d,C. d < i → [d ⬐ C] #i = #(i-1). normalize /2 width=1/ qed. theorem dsubst_lift_le: ∀h,C,M,d1,d2. d2 ≤ d1 → - [ d2 ⬐ ↑[d1 - d2, h] C ] ↑[d1 + 1, h] M = ↑[d1, h] [ d2 ⬐ C ] M. + [d2 ⬐ ↑[d1 - d2, h] C] ↑[d1 + 1, h] M = ↑[d1, h] [d2 ⬐ C] M. #h #C #M elim M -M [ #i #d1 #d2 #Hd21 elim (lt_or_eq_or_gt i d2) #Hid2 [ lapply (lt_to_le_to_lt … Hid2 Hd21) -Hd21 #Hid1 @@ -66,9 +66,9 @@ theorem dsubst_lift_le: ∀h,C,M,d1,d2. d2 ≤ d1 → >IHB -IHB // >IHA -IHA // ] qed. - + theorem dsubst_lift_be: ∀h,C,M,d1,d2. d1 ≤ d2 → d2 ≤ d1 + h → - [ d2 ⬐ C ] ↑[d1, h + 1] M = ↑[d1, h] M. + [d2 ⬐ C] ↑[d1, h + 1] M = ↑[d1, h] M. #h #C #M elim M -M [ #i #d1 #d2 #Hd12 #Hd21 elim (lt_or_ge i d1) #Hid1 [ lapply (lt_to_le_to_lt … Hid1 Hd12) -Hd12 -Hd21 #Hid2 @@ -83,3 +83,60 @@ theorem dsubst_lift_be: ∀h,C,M,d1,d2. d1 ≤ d2 → d2 ≤ d1 + h → >IHB -IHB // >IHA -IHA // ] qed. + +theorem dsubst_lift_ge: ∀h,C,M,d1,d2. d1 + h ≤ d2 → + [d2 ⬐ C] ↑[d1, h] M = ↑[d1, h] [d2 - h ⬐ C] M. +#h #C #M elim M -M +[ #i #d1 #d2 #Hd12 elim (lt_or_eq_or_gt i (d2-h)) #Hid2h + [ >(dsubst_vref_lt … Hid2h) elim (lt_or_ge i d1) #Hid1 + [ lapply (lt_to_le_to_lt … (d1+h) Hid1 ?) -Hid2h // #Hid1h + lapply (lt_to_le_to_lt … Hid1h Hd12) -Hid1h -Hd12 #Hid2 + >(lift_vref_lt … Hid1) -Hid1 /2 width=1/ + | >(lift_vref_ge … Hid1) -Hid1 -Hd12 /3 width=1/ + ] + | destruct elim (le_inv_plus_l … Hd12) -Hd12 #Hd12 #Hhd2 + >dsubst_vref_eq >lift_vref_ge // >lift_lift_be // (dsubst_vref_gt … Hid2h) + >lift_vref_ge /2 width=1/ >lift_vref_ge /2 width=1/ -Hid1 + >dsubst_vref_gt /2 width=1/ -Hid2h >plus_minus // + ] +| normalize #A #IHA #d1 #d2 #Hd12 + elim (le_inv_plus_l … Hd12) #_ #Hhd2 + >IHA -IHA /2 width=1/ IHB -IHB // >IHA -IHA // +] +qed. + +theorem subst_subst_ge: ∀C1,C2,M,d1,d2. d1 ≤ d2 → + [d2 ⬐ C2] [d1 ⬐ C1] M = [d1 ⬐ [d2 - d1 ⬐ C2] C1] [d2 + 1 ⬐ C2] M. +#C1 #C2 #M elim M -M +[ #i #d1 #d2 #Hd12 elim (lt_or_eq_or_gt i d1) #Hid1 + [ lapply (lt_to_le_to_lt … Hid1 Hd12) -Hd12 #Hid2 + >(dsubst_vref_lt … Hid1) >(dsubst_vref_lt … Hid2) >dsubst_vref_lt /2 width=1/ + | destruct >dsubst_vref_eq >dsubst_vref_lt /2 width=1/ + | >(dsubst_vref_gt … Hid1) elim (lt_or_eq_or_gt i (d2+1)) #Hid2 + [ lapply (ltn_to_ltO … Hid1) #Hi + >(dsubst_vref_lt … Hid2) >dsubst_vref_lt /2 width=1/ + | destruct /2 width=1/ + | lapply (le_to_lt_to_lt (d1+1) … Hid2) -Hid1 /2 width=1/ -Hd12 #Hid1 + >(dsubst_vref_gt … Hid2) >dsubst_vref_gt /2 width=1/ + >dsubst_vref_gt // /2 width=1/ + ] + ] +| normalize #A #IHA #d1 #d2 #Hd12 + lapply (IHA (d1+1) (d2+1) ?) -IHA /2 width=1/ +| normalize #B #A #IHB #IHA #d1 #d2 #Hd12 + >IHB -IHB // >IHA -IHA // +] +qed. + +theorem subst_subst_lt: ∀C1,C2,M,d1,d2. d2 < d1 → + [d2 ⬐ [d1 - d2 -1 ⬐ C1] C2] [d1 ⬐ C1] M = [d1 - 1 ⬐ C1] [d2 ⬐ C2] M. +#C1 #C2 #M #d1 #d2 #Hd21 +lapply (ltn_to_ltO … Hd21) #Hd1 +>subst_subst_ge in ⊢ (???%); /2 width=1/ (dsubst_vref_lt … Hid) normalize // + | destruct >dsubst_vref_eq normalize // + | >(dsubst_vref_gt … Hid) normalize // + ] +| normalize // +| normalize #B #A #IHB #IHA #d + >distributive_times_plus_r /2 width=1/ +] +qed. -- 2.39.2