X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=matita%2Fmatita%2Fcontribs%2Flambda%2Fparallel_reduction.ma;h=7aa47be7f496bd164c52dfff3fa469c4cab1988a;hb=6b87a3e9d6dd7c3abb922750587444ac3fd08e16;hp=4cb204bb9dea651a629bc2274d306952d552c716;hpb=72ced8ef1347b660fa45437443553ceeea8af57a;p=helm.git diff --git a/matita/matita/contribs/lambda/parallel_reduction.ma b/matita/matita/contribs/lambda/parallel_reduction.ma index 4cb204bb9..7aa47be7f 100644 --- a/matita/matita/contribs/lambda/parallel_reduction.ma +++ b/matita/matita/contribs/lambda/parallel_reduction.ma @@ -12,7 +12,8 @@ (* *) (**************************************************************************) -include "multiplicity.ma". +include "size.ma". +include "labelled_sequential_reduction.ma". (* PARALLEL REDUCTION (SINGLE STEP) *****************************************) @@ -55,6 +56,17 @@ lemma pred_inv_abst: ∀M,N. M ⥤ N → ∀A. 𝛌.A = M → ] qed-. +lemma pred_inv_appl: ∀M,N. M ⥤ N → ∀B,A. @B.A = M → + (∃∃D,C. B ⥤ D & A ⥤ C & @D.C = N) ∨ + ∃∃A0,D,C0. B ⥤ D & A0 ⥤ C0 & 𝛌.A0 = A & [⬐D]C0 = N. +#M #N * -M -N +[ #i #B0 #A0 #H destruct +| #A #C #_ #B0 #A0 #H destruct +| #B #D #A #C #HBD #HAC #B0 #A0 #H destruct /3 width=5/ +| #B #D #A #C #HBD #HAC #B0 #A0 #H destruct /3 width=7/ +] +qed-. + lemma pred_lift: liftable pred. #h #M1 #M2 #H elim H -M1 -M2 normalize // /2 width=1/ #D #D #A #C #_ #_ #IHBD #IHAC #d (dsubst_vref_lt … Hid) >(dsubst_vref_lt … Hid) // + | destruct >dsubst_vref_eq >dsubst_vref_eq /2 width=1/ + | >(dsubst_vref_gt … Hid) >(dsubst_vref_gt … Hid) // + ] +| normalize /2 width=1/ +| normalize /2 width=1/ +| normalize #B #D #A #C #_ #_ #IHBD #IHAC #d + >dsubst_dsubst_ge // /2 width=1/ +] +qed. + +lemma pred_conf1_vref: ∀i. confluent1 … pred (#i). +#i #M1 #H1 #M2 #H2 +<(pred_inv_vref … H1) -H1 [3: // |2: skip ] (**) (* simplify line *) +<(pred_inv_vref … H2) -H2 [3: // |2: skip ] (**) (* simplify line *) +/2 width=3/ +qed-. + +lemma pred_conf1_abst: ∀A. confluent1 … pred A → confluent1 … pred (𝛌.A). +#A #IH #M1 #H1 #M2 #H2 +elim (pred_inv_abst … H1 ??) -H1 [3: // |2: skip ] #A1 #HA1 #H destruct (**) (* simplify line *) +elim (pred_inv_abst … H2 ??) -H2 [3: // |2: skip ] #A2 #HA2 #H destruct (**) (* simplify line *) +elim (IH … HA1 … HA2) -A /3 width=3/ +qed-. + +lemma pred_conf1_appl_beta: ∀B,B1,B2,C,C2,M1. + (∀M0. |M0| < |B|+|𝛌.C|+1 → confluent1 ? pred M0) → (**) (* ? needed in place of … *) + B ⥤ B1 → B ⥤ B2 → 𝛌.C ⥤ M1 → C ⥤ C2 → + ∃∃M. @B1.M1 ⥤ M & [⬐B2]C2 ⥤ M. +#B #B1 #B2 #C #C2 #M1 #IH #HB1 #HB2 #H1 #HC2 +elim (pred_inv_abst … H1 ??) -H1 [3: // |2: skip ] #C1 #HC1 #H destruct (**) (* simplify line *) +elim (IH B … HB1 … HB2) -HB1 -HB2 // +elim (IH C … HC1 … HC2) normalize // -B -C /3 width=5/ +qed-. + +theorem pred_conf: confluent … pred. +#M @(f_ind … size … M) -M #n #IH * normalize +[ /2 width=3 by pred_conf1_vref/ +| /3 width=4 by pred_conf1_abst/ +| #B #A #H #M1 #H1 #M2 #H2 destruct + elim (pred_inv_appl … H1 ???) -H1 [5: // |2,3: skip ] * (**) (* simplify line *) + elim (pred_inv_appl … H2 ???) -H2 [5,10: // |2,3,7,8: skip ] * (**) (* simplify line *) + [ #B2 #A2 #HB2 #HA2 #H2 #B1 #A1 #HB1 #HA1 #H1 destruct + elim (IH A … HA1 … HA2) -HA1 -HA2 // + elim (IH B … HB1 … HB2) // -A -B /3 width=5/ + | #C #B2 #C2 #HB2 #HC2 #H2 #HM2 #B1 #N #HB1 #H #HM1 destruct + @(pred_conf1_appl_beta … IH) // (**) (* /2 width=7 by pred_conf1_appl_beta/ does not work *) + | #B2 #N #B2 #H #HM2 #C #B1 #C1 #HB1 #HC1 #H1 #HM1 destruct + @ex2_1_commute @(pred_conf1_appl_beta … IH) // + | #C #B2 #C2 #HB2 #HC2 #H2 #HM2 #C0 #B1 #C1 #HB1 #HC1 #H1 #HM1 destruct + elim (IH B … HB1 … HB2) -HB1 -HB2 // + elim (IH C … HC1 … HC2) normalize // -B -C /3 width=5/ + ] +] +qed-. + +lemma lsred_pred: ∀p,M,N. M ⇀[p] N → M ⥤ N. +#p #M #N #H elim H -p -M -N /2 width=1/ +qed.