X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fground%2Frelocation%2Ftr_pat.ma;h=73b6dca66b6b85d3de7157b919295d62a3591d20;hb=ad6182251b8192ee7d25c53156afbce35e3715b6;hp=ec7b76a5b4771e88573e09e859fcc4a5034e63a4;hpb=33d0a7a9029859be79b25b5a495e0f30dab11f37;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/ground/relocation/tr_pat.ma b/matita/matita/contribs/lambdadelta/ground/relocation/tr_pat.ma index ec7b76a5b..73b6dca66 100644 --- a/matita/matita/contribs/lambdadelta/ground/relocation/tr_pat.ma +++ b/matita/matita/contribs/lambdadelta/ground/relocation/tr_pat.ma @@ -12,114 +12,68 @@ (* *) (**************************************************************************) -include "ground/notation/functions/apply_2.ma". -include "ground/relocation/tr_map.ma". -(* include "ground/arith/pnat_le_plus.ma". -include "ground/relocation/pstream_eq.ma". -include "ground/relocation/rtmap_istot.ma". -*) -(* POSITIVE APPLICATION FOR TOTAL RELOCATION MAPS ***************************) - -rec definition tr_pat (i: pnat) on i: tr_map → pnat. -* #p #f cases i -i -[ @p -| #i lapply (tr_pat i f) -tr_pat -i -f - #i @(i+p) -] -defined. - -interpretation - "functional positive application (total relocation maps)" - 'apply f i = (tr_pat i f). +include "ground/relocation/pr_pat_lt.ma". +include "ground/relocation/tr_map.ma". -(* Properties on at (specific) ************************************************) +(* TOTAL RELOCATION MAPS ****************************************************) -lemma at_O1: ∀i2,f. @❪𝟏, i2⨮f❫ ≘ i2. -#i2 elim i2 -i2 /2 width=5 by gr_pat_refl, gr_pat_next/ -qed. +(* Constructions with pr_pat ***********************************************) -lemma at_S1: ∀p,f,i1,i2. @❪i1, f❫ ≘ i2 → @❪↑i1, p⨮f❫ ≘ i2+p. -#p elim p -p /3 width=7 by gr_pat_push, gr_pat_next/ +(*** at_O1 *) +lemma tr_pat_unit_sn: ∀i2,f. @⧣❨𝟏,𝐭❨i2⨮f❩❩ ≘ i2. +#i2 elim i2 -i2 /2 width=5 by pr_pat_refl, pr_pat_next/ qed. -lemma at_total: ∀i1,f. @❪i1, f❫ ≘ f@❨i1❩. -#i1 elim i1 -i1 -[ * // | #i #IH * /3 width=1 by at_S1/ ] +(*** at_S1 *) +lemma tr_pat_succ_sn: ∀p,f,i1,i2. @⧣❨i1, 𝐭❨f❩❩ ≘ i2 → @⧣❨↑i1, 𝐭❨p⨮f❩❩ ≘ i2+p. +#p elim p -p /3 width=7 by pr_pat_push, pr_pat_next/ qed. -lemma at_istot: ∀f. 𝐓❪f❫. -/2 width=2 by ex_intro/ qed. - -lemma at_plus2: ∀f,i1,i,p,q. @❪i1, p⨮f❫ ≘ i → @❪i1, (p+q)⨮f❫ ≘ i+q. +(*** at_plus2 *) +lemma tr_pat_plus_dx (f): + ∀i1,i,p,q. @⧣❨i1, 𝐭❨p⨮f❩❩ ≘ i → @⧣❨i1, 𝐭❨(p+q)⨮f❩❩ ≘ i+q. #f #i1 #i #p #q #H elim q -q -/2 width=5 by gr_pat_next/ +/2 width=5 by pr_pat_next/ qed. -(* Inversion lemmas on at (specific) ******************************************) +(* Inversions with pr_pat ***************************************************) -lemma at_inv_O1: ∀f,p,i2. @❪𝟏, p⨮f❫ ≘ i2 → p = i2. -#f #p elim p -p /2 width=6 by gr_pat_inv_unit_push/ -#p #IH #i2 #H elim (gr_pat_inv_next … H) -H [|*: // ] +(*** at_inv_O1 *) +lemma tr_pat_inv_unit_sn (f): + ∀p,i2. @⧣❨𝟏, 𝐭❨p⨮f❩❩ ≘ i2 → p = i2. +#f #p elim p -p /2 width=6 by pr_pat_inv_unit_push/ +#p #IH #i2 #H elim (pr_pat_inv_next … H) -H [|*: // ] #j2 #Hj * -i2 /3 width=1 by eq_f/ qed-. -lemma at_inv_S1: ∀f,p,j1,i2. @❪↑j1, p⨮f❫ ≘ i2 → - ∃∃j2. @❪j1, f❫ ≘ j2 & j2+p = i2. -#f #p elim p -p /2 width=5 by gr_pat_inv_succ_push/ -#p #IH #j1 #i2 #H elim (gr_pat_inv_next … H) -H [|*: // ] +(*** at_inv_S1 *) +lemma tr_pat_inv_succ_sn (f): + ∀p,j1,i2. @⧣❨↑j1, 𝐭❨p⨮f❩❩ ≘ i2 → + ∃∃j2. @⧣❨j1, 𝐭❨f❩❩ ≘ j2 & j2+p = i2. +#f #p elim p -p /2 width=5 by pr_pat_inv_succ_push/ +#p #IH #j1 #i2 #H elim (pr_pat_inv_next … H) -H [|*: // ] #j2 #Hj * -i2 elim (IH … Hj) -IH -Hj #i2 #Hi * -j2 /2 width=3 by ex2_intro/ qed-. -lemma at_inv_total: ∀f,i1,i2. @❪i1, f❫ ≘ i2 → f@❨i1❩ = i2. -/2 width=6 by fr2_nat_mono/ qed-. - -(* Forward lemmas on at (specific) *******************************************) +(* Destructions with pr_pat *************************************************) -lemma at_increasing_plus: ∀f,p,i1,i2. @❪i1, p⨮f❫ ≘ i2 → i1 + p ≤ ↑i2. +(* Note: a better conclusion would be: "i1 + ↓p ≤ i2" *) +(*** at_increasing_plus *) +lemma tr_pat_increasing_plus (f): + ∀p,i1,i2. @⧣❨i1, 𝐭❨p⨮f❩❩ ≘ i2 → i1 + p ≤ ↑i2. #f #p * -[ #i2 #H <(at_inv_O1 … H) -i2 // -| #i1 #i2 #H elim (at_inv_S1 … H) -H +[ #i2 #H <(tr_pat_inv_unit_sn … H) -i2 // +| #i1 #i2 #H elim (tr_pat_inv_succ_sn … H) -H #j1 #Ht * -i2 tr_pat_S1 >tr_pat_S1 /3 width=1 by eq_f2/ -qed. - -lemma tr_pat_S2: ∀f,i. (↑f)@❨i❩ = ↑(f@❨i❩). -* #p #f * // -qed. - -(* Main inversion lemmas ****************************************************) - -theorem tr_pat_inj: ∀f,i1,i2,j. f@❨i1❩ = j → f@❨i2❩ = j → i1 = i2. -/2 width=4 by gr_pat_inj/ qed-. - -corec theorem nstream_eq_inv_ext: ∀f1,f2. (∀i. f1@❨i❩ = f2@❨i❩) → f1 ≗ f2. -* #p1 #f1 * #p2 #f2 #Hf @stream_eq_cons -[ @(Hf (𝟏)) -| @nstream_eq_inv_ext -nstream_eq_inv_ext #i - ltr_pat (Hf (𝟏)) >tr_pat_O1 >tr_pat_O1 #H destruct - ltr_pat (Hf (↑i)) >tr_pat_S1 >tr_pat_S1 #H - /3 width=2 by eq_inv_pplus_bi_dx, eq_inv_psucc_bi/ -] +(*** at_fwd_id *) +lemma tr_pat_des_id (f): + ∀p,i. @⧣❨i, 𝐭❨p⨮f❩❩ ≘ i → 𝟏 = p. +#f #p #i #H lapply (pr_pat_des_id … H) -H #H +elim (eq_inv_pr_push_cons … H) -H // qed-.