X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambda%2Flabelled_sequential_reduction.ma;h=40d5188469b701c6eb37f4044f62688dd0999be1;hb=4bb6799d029b7b377f7aa28b0e90f0a69c149a9c;hp=c5bf4ba999564949a784eced2a19890315e5c2d6;hpb=9def1b8a298aac85a7abdc75c4a33657fe7e6df7;p=helm.git diff --git a/matita/matita/contribs/lambda/labelled_sequential_reduction.ma b/matita/matita/contribs/lambda/labelled_sequential_reduction.ma index c5bf4ba99..40d518846 100644 --- a/matita/matita/contribs/lambda/labelled_sequential_reduction.ma +++ b/matita/matita/contribs/lambda/labelled_sequential_reduction.ma @@ -12,33 +12,73 @@ (* *) (**************************************************************************) -include "redex_pointer.ma". +include "pointer.ma". include "multiplicity.ma". -(* LABELLED SEQUENTIAL REDUCTION (ONE STEP) *********************************) +(* LABELLED SEQUENTIAL REDUCTION (SINGLE STEP) ******************************) (* Note: the application "(A B)" is represented by "@B.A" following: F. Kamareddine and R.P. Nederpelt: "A useful λ-notation". Theoretical Computer Science 155(1), Elsevier (1996), pp. 85-109. *) -inductive lsred: rpointer → relation term ≝ -| lsred_beta : ∀A,D. lsred (◊) (@D.𝛌.A) ([⬐D]A) -| lsred_abst : ∀p,A,C. lsred p A C → lsred p (𝛌.A) (𝛌.C) -| lsred_appl_sn: ∀p,B,D,A. lsred p B D → lsred (true::p) (@B.A) (@D.A) -| lsred_appl_dx: ∀p,B,A,C. lsred p A C → lsred (false::p) (@B.A) (@B.C) +inductive lsred: ptr → relation term ≝ +| lsred_beta : ∀B,A. lsred (◊) (@B.𝛌.A) ([↙B]A) +| lsred_abst : ∀p,A1,A2. lsred p A1 A2 → lsred (sn::p) (𝛌.A1) (𝛌.A2) +| lsred_appl_sn: ∀p,B1,B2,A. lsred p B1 B2 → lsred (sn::p) (@B1.A) (@B2.A) +| lsred_appl_dx: ∀p,B,A1,A2. lsred p A1 A2 → lsred (dx::p) (@B.A1) (@B.A2) . interpretation "labelled sequential reduction" - 'LablSeqRed M p N = (lsred p M N). + 'SeqRed M p N = (lsred p M N). (* Note: we do not use → since it is reserved by CIC *) -notation "hvbox( M break ⇀ [ term 46 p ] break term 46 N )" +notation "hvbox( M break ↦ [ term 46 p ] break term 46 N )" non associative with precedence 45 - for @{ 'LablSeqRed $M $p $N }. + for @{ 'SeqRed $M $p $N }. -theorem lsred_fwd_mult: ∀p,M,N. M ⇀[p] N → #{N} < #{M} * #{M}. +lemma lsred_inv_vref: ∀p,M,N. M ↦[p] N → ∀i. #i = M → ⊥. +#p #M #N * -p -M -N +[ #B #A #i #H destruct +| #p #A1 #A2 #_ #i #H destruct +| #p #B1 #B2 #A #_ #i #H destruct +| #p #B #A1 #A2 #_ #i #H destruct +] +qed-. + +lemma lsred_inv_nil: ∀p,M,N. M ↦[p] N → ◊ = p → + ∃∃B,A. @B. 𝛌.A = M & [↙B] A = N. +#p #M #N * -p -M -N +[ #B #A #_ destruct /2 width=4/ +| #p #A1 #A2 #_ #H destruct +| #p #B1 #B2 #A #_ #H destruct +| #p #B #A1 #A2 #_ #H destruct +] +qed-. + +lemma lsred_inv_sn: ∀p,M,N. M ↦[p] N → ∀q. sn::q = p → + (∃∃A1,A2. A1 ↦[q] A2 & 𝛌.A1 = M & 𝛌.A2 = N) ∨ + ∃∃B1,B2,A. B1 ↦[q] B2 & @B1.A = M & @B2.A = N. +#p #M #N * -p -M -N +[ #B #A #q #H destruct +| #p #A1 #A2 #HA12 #q #H destruct /3 width=5/ +| #p #B1 #B2 #A #HB12 #q #H destruct /3 width=6/ +| #p #B #A1 #A2 #_ #q #H destruct +] +qed-. + +lemma lsred_inv_dx: ∀p,M,N. M ↦[p] N → ∀q. dx::q = p → + ∃∃B,A1,A2. A1 ↦[q] A2 & @B.A1 = M & @B.A2 = N. +#p #M #N * -p -M -N +[ #B #A #q #H destruct +| #p #A1 #A2 #_ #q #H destruct +| #p #B1 #B2 #A #_ #q #H destruct +| #p #B #A1 #A2 #HA12 #q #H destruct /2 width=6/ +] +qed-. + +lemma lsred_fwd_mult: ∀p,M,N. M ↦[p] N → #{N} < #{M} * #{M}. #p #M #N #H elim H -p -M -N -[ #A #D @(le_to_lt_to_lt … (#{A}*#{D})) // +[ #B #A @(le_to_lt_to_lt … (#{A}*#{B})) // normalize /3 width=1 by lt_minus_to_plus_r, lt_times/ (**) (* auto: too slow without trace *) | // | #p #B #D #A #_ #IHBD @@ -49,3 +89,48 @@ theorem lsred_fwd_mult: ∀p,M,N. M ⇀[p] N → #{N} < #{M} * #{M}. @(transitive_le … (#{B}*#{B}+#{A}*#{A})) [ /2 width=1/ ] >distributive_times_plus normalize /2 width=1/ qed-. + +lemma lsred_lift: ∀p. liftable (lsred p). +#p #h #M1 #M2 #H elim H -p -M1 -M2 normalize /2 width=1/ +#B #A #d dsubst_dsubst_ge // +qed. + +theorem lsred_mono: ∀p. singlevalued … (lsred p). +#p #M #N1 #H elim H -p -M -N1 +[ #B #A #N2 #H elim (lsred_inv_nil … H ?) -H // #D #C #H #HN2 destruct // +| #p #A1 #A2 #_ #IHA12 #N2 #H elim (lsred_inv_sn … H ??) -H [4: // |2: skip ] * (**) (* simplify line *) + [ #C1 #C2 #HC12 #H #HN2 destruct /3 width=1/ + | #D1 #D2 #C #_ #H destruct + ] +| #p #B1 #B2 #A #_ #IHB12 #N2 #H elim (lsred_inv_sn … H ??) -H [4: // |2: skip ] * (**) (* simplify line *) + [ #C1 #C2 #_ #H destruct + | #D1 #D2 #C #HD12 #H #HN2 destruct /3 width=1/ + ] +| #p #B #A1 #A2 #_ #IHA12 #N2 #H elim (lsred_inv_dx … H ??) -H [3: // |2: skip ] #D #C1 #C2 #HC12 #H #HN2 destruct /3 width=1/ (**) (* simplify line *) +] +qed-.