X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fground_2%2Frelocation%2Frtmap_after.ma;h=b2ec8605cd6dcabd3d60a18283b2236726ae46c0;hb=bd53c4e895203eb049e75434f638f26b5a161a2b;hp=09bab5e109f5d2665cd9377585216bf4ef7aff61;hpb=5275f55f5ec528edbb223834f3ec2cf1d3ce9b84;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_after.ma b/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_after.ma index 09bab5e10..b2ec8605c 100644 --- a/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_after.ma +++ b/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_after.ma @@ -19,24 +19,24 @@ include "ground_2/relocation/rtmap_istot.ma". coinductive after: relation3 rtmap rtmap rtmap ≝ | after_refl: ∀f1,f2,f,g1,g2,g. - after f1 f2 f → ↑f1 = g1 → ↑f2 = g2 → ↑f = g → after g1 g2 g + after f1 f2 f → ⫯f1 = g1 → ⫯f2 = g2 → ⫯f = g → after g1 g2 g | after_push: ∀f1,f2,f,g1,g2,g. - after f1 f2 f → ↑f1 = g1 → ⫯f2 = g2 → ⫯f = g → after g1 g2 g + after f1 f2 f → ⫯f1 = g1 → ↑f2 = g2 → ↑f = g → after g1 g2 g | after_next: ∀f1,f2,f,g1,g. - after f1 f2 f → ⫯f1 = g1 → ⫯f = g → after g1 f2 g + after f1 f2 f → ↑f1 = g1 → ↑f = g → after g1 f2 g . interpretation "relational composition (rtmap)" 'RAfter f1 f2 f = (after f1 f2 f). definition H_after_inj: predicate rtmap ≝ - λf1. 𝐓⦃f1⦄ → - ∀f,f21,f22. f1 ⊚ f21 ≡ f → f1 ⊚ f22 ≡ f → f21 ≗ f22. + λf1. 𝐓❪f1❫ → + ∀f,f21,f22. f1 ⊚ f21 ≘ f → f1 ⊚ f22 ≘ f → f21 ≡ f22. (* Basic inversion lemmas ***************************************************) -lemma after_inv_ppx: ∀g1,g2,g. g1 ⊚ g2 ≡ g → ∀f1,f2. ↑f1 = g1 → ↑f2 = g2 → - ∃∃f. f1 ⊚ f2 ≡ f & ↑f = g. +lemma after_inv_ppx: ∀g1,g2,g. g1 ⊚ g2 ≘ g → ∀f1,f2. ⫯f1 = g1 → ⫯f2 = g2 → + ∃∃f. f1 ⊚ f2 ≘ f & ⫯f = g. #g1 #g2 #g * -g1 -g2 -g #f1 #f2 #f #g1 [ #g2 #g #Hf #H1 #H2 #H #x1 #x2 #Hx1 #Hx2 destruct >(injective_push … Hx1) >(injective_push … Hx2) -x2 -x1 @@ -48,8 +48,8 @@ lemma after_inv_ppx: ∀g1,g2,g. g1 ⊚ g2 ≡ g → ∀f1,f2. ↑f1 = g1 → ] qed-. -lemma after_inv_pnx: ∀g1,g2,g. g1 ⊚ g2 ≡ g → ∀f1,f2. ↑f1 = g1 → ⫯f2 = g2 → - ∃∃f. f1 ⊚ f2 ≡ f & ⫯f = g. +lemma after_inv_pnx: ∀g1,g2,g. g1 ⊚ g2 ≘ g → ∀f1,f2. ⫯f1 = g1 → ↑f2 = g2 → + ∃∃f. f1 ⊚ f2 ≘ f & ↑f = g. #g1 #g2 #g * -g1 -g2 -g #f1 #f2 #f #g1 [ #g2 #g #_ #_ #H2 #_ #x1 #x2 #_ #Hx2 destruct elim (discr_next_push … Hx2) @@ -61,8 +61,8 @@ lemma after_inv_pnx: ∀g1,g2,g. g1 ⊚ g2 ≡ g → ∀f1,f2. ↑f1 = g1 → ] qed-. -lemma after_inv_nxx: ∀g1,f2,g. g1 ⊚ f2 ≡ g → ∀f1. ⫯f1 = g1 → - ∃∃f. f1 ⊚ f2 ≡ f & ⫯f = g. +lemma after_inv_nxx: ∀g1,f2,g. g1 ⊚ f2 ≘ g → ∀f1. ↑f1 = g1 → + ∃∃f. f1 ⊚ f2 ≘ f & ↑f = g. #g1 #f2 #g * -g1 -f2 -g #f1 #f2 #f #g1 [ #g2 #g #_ #H1 #_ #_ #x1 #Hx1 destruct elim (discr_next_push … Hx1) @@ -76,71 +76,71 @@ qed-. (* Advanced inversion lemmas ************************************************) -lemma after_inv_ppp: ∀g1,g2,g. g1 ⊚ g2 ≡ g → - ∀f1,f2,f. ↑f1 = g1 → ↑f2 = g2 → ↑f = g → f1 ⊚ f2 ≡ f. +lemma after_inv_ppp: ∀g1,g2,g. g1 ⊚ g2 ≘ g → + ∀f1,f2,f. ⫯f1 = g1 → ⫯f2 = g2 → ⫯f = g → f1 ⊚ f2 ≘ f. #g1 #g2 #g #Hg #f1 #f2 #f #H1 #H2 #H elim (after_inv_ppx … Hg … H1 H2) -g1 -g2 #x #Hf #Hx destruct <(injective_push … Hx) -f // qed-. -lemma after_inv_ppn: ∀g1,g2,g. g1 ⊚ g2 ≡ g → - ∀f1,f2,f. ↑f1 = g1 → ↑f2 = g2 → ⫯f = g → ⊥. +lemma after_inv_ppn: ∀g1,g2,g. g1 ⊚ g2 ≘ g → + ∀f1,f2,f. ⫯f1 = g1 → ⫯f2 = g2 → ↑f = g → ⊥. #g1 #g2 #g #Hg #f1 #f2 #f #H1 #H2 #H elim (after_inv_ppx … Hg … H1 H2) -g1 -g2 #x #Hf #Hx destruct elim (discr_push_next … Hx) qed-. -lemma after_inv_pnn: ∀g1,g2,g. g1 ⊚ g2 ≡ g → - ∀f1,f2,f. ↑f1 = g1 → ⫯f2 = g2 → ⫯f = g → f1 ⊚ f2 ≡ f. +lemma after_inv_pnn: ∀g1,g2,g. g1 ⊚ g2 ≘ g → + ∀f1,f2,f. ⫯f1 = g1 → ↑f2 = g2 → ↑f = g → f1 ⊚ f2 ≘ f. #g1 #g2 #g #Hg #f1 #f2 #f #H1 #H2 #H elim (after_inv_pnx … Hg … H1 H2) -g1 -g2 #x #Hf #Hx destruct <(injective_next … Hx) -f // qed-. -lemma after_inv_pnp: ∀g1,g2,g. g1 ⊚ g2 ≡ g → - ∀f1,f2,f. ↑f1 = g1 → ⫯f2 = g2 → ↑f = g → ⊥. +lemma after_inv_pnp: ∀g1,g2,g. g1 ⊚ g2 ≘ g → + ∀f1,f2,f. ⫯f1 = g1 → ↑f2 = g2 → ⫯f = g → ⊥. #g1 #g2 #g #Hg #f1 #f2 #f #H1 #H2 #H elim (after_inv_pnx … Hg … H1 H2) -g1 -g2 #x #Hf #Hx destruct elim (discr_next_push … Hx) qed-. -lemma after_inv_nxn: ∀g1,f2,g. g1 ⊚ f2 ≡ g → - ∀f1,f. ⫯f1 = g1 → ⫯f = g → f1 ⊚ f2 ≡ f. +lemma after_inv_nxn: ∀g1,f2,g. g1 ⊚ f2 ≘ g → + ∀f1,f. ↑f1 = g1 → ↑f = g → f1 ⊚ f2 ≘ f. #g1 #f2 #g #Hg #f1 #f #H1 #H elim (after_inv_nxx … Hg … H1) -g1 #x #Hf #Hx destruct <(injective_next … Hx) -f // qed-. -lemma after_inv_nxp: ∀g1,f2,g. g1 ⊚ f2 ≡ g → - ∀f1,f. ⫯f1 = g1 → ↑f = g → ⊥. +lemma after_inv_nxp: ∀g1,f2,g. g1 ⊚ f2 ≘ g → + ∀f1,f. ↑f1 = g1 → ⫯f = g → ⊥. #g1 #f2 #g #Hg #f1 #f #H1 #H elim (after_inv_nxx … Hg … H1) -g1 #x #Hf #Hx destruct elim (discr_next_push … Hx) qed-. -lemma after_inv_pxp: ∀g1,g2,g. g1 ⊚ g2 ≡ g → - ∀f1,f. ↑f1 = g1 → ↑f = g → - ∃∃f2. f1 ⊚ f2 ≡ f & ↑f2 = g2. +lemma after_inv_pxp: ∀g1,g2,g. g1 ⊚ g2 ≘ g → + ∀f1,f. ⫯f1 = g1 → ⫯f = g → + ∃∃f2. f1 ⊚ f2 ≘ f & ⫯f2 = g2. #g1 * * [2: #m2] #g2 #g #Hg #f1 #f #H1 #H [ elim (after_inv_pnp … Hg … H1 … H) -g1 -g -f1 -f // | lapply (after_inv_ppp … Hg … H1 … H) -g1 -g /2 width=3 by ex2_intro/ ] qed-. -lemma after_inv_pxn: ∀g1,g2,g. g1 ⊚ g2 ≡ g → - ∀f1,f. ↑f1 = g1 → ⫯f = g → - ∃∃f2. f1 ⊚ f2 ≡ f & ⫯f2 = g2. +lemma after_inv_pxn: ∀g1,g2,g. g1 ⊚ g2 ≘ g → + ∀f1,f. ⫯f1 = g1 → ↑f = g → + ∃∃f2. f1 ⊚ f2 ≘ f & ↑f2 = g2. #g1 * * [2: #m2] #g2 #g #Hg #f1 #f #H1 #H [ lapply (after_inv_pnn … Hg … H1 … H) -g1 -g /2 width=3 by ex2_intro/ | elim (after_inv_ppn … Hg … H1 … H) -g1 -g -f1 -f // ] qed-. -lemma after_inv_xxp: ∀g1,g2,g. g1 ⊚ g2 ≡ g → ∀f. ↑f = g → - ∃∃f1,f2. f1 ⊚ f2 ≡ f & ↑f1 = g1 & ↑f2 = g2. +lemma after_inv_xxp: ∀g1,g2,g. g1 ⊚ g2 ≘ g → ∀f. ⫯f = g → + ∃∃f1,f2. f1 ⊚ f2 ≘ f & ⫯f1 = g1 & ⫯f2 = g2. * * [2: #m1 ] #g1 #g2 #g #Hg #f #H [ elim (after_inv_nxp … Hg … H) -g2 -g -f // | elim (after_inv_pxp … Hg … H) -g /2 width=5 by ex3_2_intro/ ] qed-. -lemma after_inv_xxn: ∀g1,g2,g. g1 ⊚ g2 ≡ g → ∀f. ⫯f = g → - (∃∃f1,f2. f1 ⊚ f2 ≡ f & ↑f1 = g1 & ⫯f2 = g2) ∨ - ∃∃f1. f1 ⊚ g2 ≡ f & ⫯f1 = g1. +lemma after_inv_xxn: ∀g1,g2,g. g1 ⊚ g2 ≘ g → ∀f. ↑f = g → + (∃∃f1,f2. f1 ⊚ f2 ≘ f & ⫯f1 = g1 & ↑f2 = g2) ∨ + ∃∃f1. f1 ⊚ g2 ≘ f & ↑f1 = g1. * * [2: #m1 ] #g1 #g2 #g #Hg #f #H [ /4 width=5 by after_inv_nxn, or_intror, ex2_intro/ | elim (after_inv_pxn … Hg … H) -g @@ -148,9 +148,9 @@ lemma after_inv_xxn: ∀g1,g2,g. g1 ⊚ g2 ≡ g → ∀f. ⫯f = g → ] qed-. -lemma after_inv_pxx: ∀g1,g2,g. g1 ⊚ g2 ≡ g → ∀f1. ↑f1 = g1 → - (∃∃f2,f. f1 ⊚ f2 ≡ f & ↑f2 = g2 & ↑f = g) ∨ - (∃∃f2,f. f1 ⊚ f2 ≡ f & ⫯f2 = g2 & ⫯f = g). +lemma after_inv_pxx: ∀g1,g2,g. g1 ⊚ g2 ≘ g → ∀f1. ⫯f1 = g1 → + (∃∃f2,f. f1 ⊚ f2 ≘ f & ⫯f2 = g2 & ⫯f = g) ∨ + (∃∃f2,f. f1 ⊚ f2 ≘ f & ↑f2 = g2 & ↑f = g). #g1 * * [2: #m2 ] #g2 #g #Hg #f1 #H [ elim (after_inv_pnx … Hg … H) -g1 /3 width=5 by or_intror, ex3_2_intro/ @@ -161,20 +161,20 @@ qed-. (* Basic properties *********************************************************) -corec lemma after_eq_repl_back_2: ∀f1,f. eq_repl_back (λf2. f2 ⊚ f1 ≡ f). +corec lemma after_eq_repl_back2: ∀f1,f. eq_repl_back (λf2. f2 ⊚ f1 ≘ f). #f1 #f #f2 * -f2 -f1 -f #f21 #f1 #f #g21 [1,2: #g1 ] #g #Hf #H21 [1,2: #H1 ] #H #g22 #H0 [ cases (eq_inv_px … H0 … H21) -g21 /3 width=7 by after_refl/ | cases (eq_inv_px … H0 … H21) -g21 /3 width=7 by after_push/ -| cases (eq_inv_nx … H0 … H21) -g21 /3 width=5 by after_next/ +| cases (eq_inv_nx … H0 … H21) -g21 /3 width=5 by after_next/ ] qed-. -lemma after_eq_repl_fwd_2: ∀f1,f. eq_repl_fwd (λf2. f2 ⊚ f1 ≡ f). -#f1 #f @eq_repl_sym /2 width=3 by after_eq_repl_back_2/ +lemma after_eq_repl_fwd2: ∀f1,f. eq_repl_fwd (λf2. f2 ⊚ f1 ≘ f). +#f1 #f @eq_repl_sym /2 width=3 by after_eq_repl_back2/ qed-. -corec lemma after_eq_repl_back_1: ∀f2,f. eq_repl_back (λf1. f2 ⊚ f1 ≡ f). +corec lemma after_eq_repl_back1: ∀f2,f. eq_repl_back (λf1. f2 ⊚ f1 ≘ f). #f2 #f #f1 * -f2 -f1 -f #f2 #f11 #f #g2 [1,2: #g11 ] #g #Hf #H2 [1,2: #H11 ] #H #g2 #H0 [ cases (eq_inv_px … H0 … H11) -g11 /3 width=7 by after_refl/ @@ -183,28 +183,28 @@ corec lemma after_eq_repl_back_1: ∀f2,f. eq_repl_back (λf1. f2 ⊚ f1 ≡ f). ] qed-. -lemma after_eq_repl_fwd_1: ∀f2,f. eq_repl_fwd (λf1. f2 ⊚ f1 ≡ f). -#f2 #f @eq_repl_sym /2 width=3 by after_eq_repl_back_1/ +lemma after_eq_repl_fwd1: ∀f2,f. eq_repl_fwd (λf1. f2 ⊚ f1 ≘ f). +#f2 #f @eq_repl_sym /2 width=3 by after_eq_repl_back1/ qed-. -corec lemma after_eq_repl_back_0: ∀f1,f2. eq_repl_back (λf. f2 ⊚ f1 ≡ f). +corec lemma after_eq_repl_back0: ∀f1,f2. eq_repl_back (λf. f2 ⊚ f1 ≘ f). #f2 #f1 #f * -f2 -f1 -f #f2 #f1 #f01 #g2 [1,2: #g1 ] #g01 #Hf01 #H2 [1,2: #H1 ] #H01 #g02 #H0 [ cases (eq_inv_px … H0 … H01) -g01 /3 width=7 by after_refl/ | cases (eq_inv_nx … H0 … H01) -g01 /3 width=7 by after_push/ -| cases (eq_inv_nx … H0 … H01) -g01 /3 width=5 by after_next/ +| cases (eq_inv_nx … H0 … H01) -g01 /3 width=5 by after_next/ ] qed-. -lemma after_eq_repl_fwd_0: ∀f2,f1. eq_repl_fwd (λf. f2 ⊚ f1 ≡ f). -#f2 #f1 @eq_repl_sym /2 width=3 by after_eq_repl_back_0/ +lemma after_eq_repl_fwd0: ∀f2,f1. eq_repl_fwd (λf. f2 ⊚ f1 ≘ f). +#f2 #f1 @eq_repl_sym /2 width=3 by after_eq_repl_back0/ qed-. (* Main properties **********************************************************) -corec theorem after_trans1: ∀f0,f3,f4. f0 ⊚ f3 ≡ f4 → - ∀f1,f2. f1 ⊚ f2 ≡ f0 → - ∀f. f2 ⊚ f3 ≡ f → f1 ⊚ f ≡ f4. +corec theorem after_trans1: ∀f0,f3,f4. f0 ⊚ f3 ≘ f4 → + ∀f1,f2. f1 ⊚ f2 ≘ f0 → + ∀f. f2 ⊚ f3 ≘ f → f1 ⊚ f ≘ f4. #f0 #f3 #f4 * -f0 -f3 -f4 #f0 #f3 #f4 #g0 [1,2: #g3 ] #g4 [ #Hf4 #H0 #H3 #H4 #g1 #g2 #Hg0 #g #Hg cases (after_inv_xxp … Hg0 … H0) -g0 @@ -226,9 +226,9 @@ corec theorem after_trans1: ∀f0,f3,f4. f0 ⊚ f3 ≡ f4 → ] qed-. -corec theorem after_trans2: ∀f1,f0,f4. f1 ⊚ f0 ≡ f4 → - ∀f2, f3. f2 ⊚ f3 ≡ f0 → - ∀f. f1 ⊚ f2 ≡ f → f ⊚ f3 ≡ f4. +corec theorem after_trans2: ∀f1,f0,f4. f1 ⊚ f0 ≘ f4 → + ∀f2, f3. f2 ⊚ f3 ≘ f0 → + ∀f. f1 ⊚ f2 ≘ f → f ⊚ f3 ≘ f4. #f1 #f0 #f4 * -f1 -f0 -f4 #f1 #f0 #f4 #g1 [1,2: #g0 ] #g4 [ #Hf4 #H1 #H0 #H4 #g2 #g3 #Hg0 #g #Hg cases (after_inv_xxp … Hg0 … H0) -g0 @@ -252,7 +252,7 @@ qed-. (* Main inversion lemmas ****************************************************) -corec theorem after_mono: ∀f1,f2,x,y. f1 ⊚ f2 ≡ x → f1 ⊚ f2 ≡ y → x ≗ y. +corec theorem after_mono: ∀f1,f2,x,y. f1 ⊚ f2 ≘ x → f1 ⊚ f2 ≘ y → x ≡ y. #f1 #f2 #x #y * -f1 -f2 -x #f1 #f2 #x #g1 [1,2: #g2 ] #g #Hx #H1 [1,2: #H2 ] #H0x #Hy [ cases (after_inv_ppx … Hy … H1 H2) -g1 -g2 /3 width=8 by eq_push/ @@ -261,70 +261,72 @@ corec theorem after_mono: ∀f1,f2,x,y. f1 ⊚ f2 ≡ x → f1 ⊚ f2 ≡ y → ] qed-. -lemma after_mono_eq: ∀f1,f2,f. f1 ⊚ f2 ≡ f → ∀g1,g2,g. g1 ⊚ g2 ≡ g → - f1 ≗ g1 → f2 ≗ g2 → f ≗ g. -/4 width=4 by after_mono, after_eq_repl_back_1, after_eq_repl_back_2/ qed-. +lemma after_mono_eq: ∀f1,f2,f. f1 ⊚ f2 ≘ f → ∀g1,g2,g. g1 ⊚ g2 ≘ g → + f1 ≡ g1 → f2 ≡ g2 → f ≡ g. +/4 width=4 by after_mono, after_eq_repl_back1, after_eq_repl_back2/ qed-. (* Properties on tls ********************************************************) -lemma after_tls: ∀n,f1,f2,f. @⦃0, f1⦄ ≡ n → - f1 ⊚ f2 ≡ f → ⫱*[n]f1 ⊚ f2 ≡ ⫱*[n]f. +lemma after_tls: ∀n,f1,f2,f. @❪0, f1❫ ≘ n → + f1 ⊚ f2 ≘ f → ⫱*[n]f1 ⊚ f2 ≘ ⫱*[n]f. #n elim n -n // -#n #IH #f1 #f2 #f #Hf1 #Hf cases (at_inv_pxn … Hf1) -Hf1 [ |*: // ] -#g1 #Hg1 #H1 cases (after_inv_nxx … Hf … H1) -Hf /2 width=1 by/ +#n #IH #f1 #f2 #f #Hf1 #Hf +cases (at_inv_pxn … Hf1) -Hf1 [ |*: // ] #g1 #Hg1 #H1 +cases (after_inv_nxx … Hf … H1) -Hf #g #Hg #H0 destruct +