X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fground_2%2Frelocation%2Frtmap_coafter.ma;h=2d1d860f920d593b6985c5f427da321d73147e08;hb=528f8ea107f689d07d060e1d31ba32bf65b4e6ba;hp=5ac0c06f75173c8f70e35e0cd8194ef0143d3546;hpb=926796df5884453d8f0cf9f294d7776d469ef45b;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_coafter.ma b/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_coafter.ma index 5ac0c06f7..2d1d860f9 100644 --- a/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_coafter.ma +++ b/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_coafter.ma @@ -14,7 +14,7 @@ include "ground_2/notation/relations/rcoafter_3.ma". include "ground_2/relocation/rtmap_sor.ma". -include "ground_2/relocation/rtmap_istot.ma". +include "ground_2/relocation/rtmap_after.ma". (* RELOCATION MAP ***********************************************************) @@ -151,6 +151,14 @@ lemma coafter_inv_xxn: ∀g1,g2,g. g1 ~⊚ g2 ≡ g → ∀f. ⫯f = g → ] qed-. +lemma coafter_inv_xnn: ∀g1,g2,g. g1 ~⊚ g2 ≡ g → + ∀f2,f. ⫯f2 = g2 → ⫯f = g → + ∃∃f1. f1 ~⊚ f2 ≡ f & ↑f1 = g1. +#g1 #g2 #g #Hg #f2 #f #H2 destruct #H +elim (coafter_inv_xxn … Hg … H) -g +#z1 #z2 #Hf #H1 #H2 destruct /2 width=3 by ex2_intro/ +qed-. + lemma coafter_inv_xxp: ∀g1,g2,g. g1 ~⊚ g2 ≡ g → ∀f. ↑f = g → (∃∃f1,f2. f1 ~⊚ f2 ≡ f & ↑f1 = g1 & ↑f2 = g2) ∨ ∃∃f1. f1 ~⊚ g2 ≡ f & ⫯f1 = g1. @@ -213,56 +221,6 @@ lemma coafter_eq_repl_fwd0: ∀f2,f1. eq_repl_fwd (λf. f2 ~⊚ f1 ≡ f). #f2 #f1 @eq_repl_sym /2 width=3 by coafter_eq_repl_back0/ qed-. -(* Main properties **********************************************************) -(* -corec theorem coafter_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 (coafter_inv_xxp … Hg0 … H0) -g0 - #f1 #f2 #Hf0 #H1 #H2 - cases (coafter_inv_ppx … Hg … H2 H3) -g2 -g3 - #f #Hf #H /3 width=7 by coafter_refl/ -| #Hf4 #H0 #H3 #H4 #g1 #g2 #Hg0 #g #Hg - cases (coafter_inv_xxp … Hg0 … H0) -g0 - #f1 #f2 #Hf0 #H1 #H2 - cases (coafter_inv_pnx … Hg … H2 H3) -g2 -g3 - #f #Hf #H /3 width=7 by coafter_push/ -| #Hf4 #H0 #H4 #g1 #g2 #Hg0 #g #Hg - cases (coafter_inv_xxn … Hg0 … H0) -g0 * - [ #f1 #f2 #Hf0 #H1 #H2 - cases (coafter_inv_nxx … Hg … H2) -g2 - #f #Hf #H /3 width=7 by coafter_push/ - | #f1 #Hf0 #H1 /3 width=6 by coafter_next/ - ] -] -qed-. - -corec theorem coafter_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 (coafter_inv_xxp … Hg0 … H0) -g0 - #f2 #f3 #Hf0 #H2 #H3 - cases (coafter_inv_ppx … Hg … H1 H2) -g1 -g2 - #f #Hf #H /3 width=7 by coafter_refl/ -| #Hf4 #H1 #H0 #H4 #g2 #g3 #Hg0 #g #Hg - cases (coafter_inv_xxn … Hg0 … H0) -g0 * - [ #f2 #f3 #Hf0 #H2 #H3 - cases (coafter_inv_ppx … Hg … H1 H2) -g1 -g2 - #f #Hf #H /3 width=7 by coafter_push/ - | #f2 #Hf0 #H2 - cases (coafter_inv_pnx … Hg … H1 H2) -g1 -g2 - #f #Hf #H /3 width=6 by coafter_next/ - ] -| #Hf4 #H1 #H4 #f2 #f3 #Hf0 #g #Hg - cases (coafter_inv_nxx … Hg … H1) -g1 - #f #Hg #H /3 width=6 by coafter_next/ -] -qed-. -*) (* Main inversion lemmas ****************************************************) corec theorem coafter_mono: ∀f1,f2,x,y. f1 ~⊚ f2 ≡ x → f1 ~⊚ f2 ≡ y → x ≗ y. @@ -278,6 +236,28 @@ lemma coafter_mono_eq: ∀f1,f2,f. f1 ~⊚ f2 ≡ f → ∀g1,g2,g. g1 ~⊚ g2 f1 ≗ g1 → f2 ≗ g2 → f ≗ g. /4 width=4 by coafter_mono, coafter_eq_repl_back1, coafter_eq_repl_back2/ qed-. +(* Forward lemmas with pushs ************************************************) + +lemma coafter_fwd_pushs: ∀j,i,g2,f1,g. g2 ~⊚ ↑*[i]f1 ≡ g → @⦃i, g2⦄ ≡ j → + ∃f. ↑*[j] f = g. +#j elim j -j +[ #i #g2 #f1 #g #Hg #H + elim (at_inv_xxp … H) -H [|*: // ] #f2 #H1 #H2 destruct + /2 width=2 by ex_intro/ +| #j #IH * [| #i ] #g2 #f1 #g #Hg #H + [ elim (at_inv_pxn … H) -H [|*: // ] #f2 #Hij #H destruct + elim (coafter_inv_nxx … Hg) -Hg [|*: // ] #f #Hf #H destruct + elim (IH … Hf Hij) -f1 -f2 -IH /2 width=2 by ex_intro/ + | elim (at_inv_nxn … H) -H [1,4: * |*: // ] #f2 #Hij #H destruct + [ elim (coafter_inv_ppx … Hg) -Hg [|*: // ] #f #Hf #H destruct + elim (IH … Hf Hij) -f1 -f2 -i /2 width=2 by ex_intro/ + | elim (coafter_inv_nxx … Hg) -Hg [|*: // ] #f #Hf #H destruct + elim (IH … Hf Hij) -f1 -f2 -i /2 width=2 by ex_intro/ + ] + ] +] +qed-. + (* Inversion lemmas with tail ***********************************************) lemma coafter_inv_tl1: ∀g2,g1,g. g2 ~⊚ ⫱g1 ≡ g → @@ -296,17 +276,61 @@ lemma coafter_inv_tl0: ∀g2,g1,g. g2 ~⊚ g1 ≡ ⫱g → ] qed-. -(* Properties on tls ********************************************************) +(* Properties with iterated tail ********************************************) + +lemma coafter_tls: ∀j,i,f1,f2,f. @⦃i, f1⦄ ≡ j → + f1 ~⊚ f2 ≡ f → ⫱*[j]f1 ~⊚ ⫱*[i]f2 ≡ ⫱*[j]f. +#j elim j -j [ #i | #j #IH * [| #i ] ] #f1 #f2 #f #Hf1 #Hf +[ elim (at_inv_xxp … Hf1) -Hf1 [ |*: // ] #g1 #Hg1 #H1 destruct // +| elim (at_inv_pxn … Hf1) -Hf1 [ |*: // ] #g1 #Hg1 #H1 + elim (coafter_inv_nxx … Hf … H1) -Hf #g #Hg #H0 destruct + lapply (IH … Hg1 Hg) -IH -Hg1 -Hg // +| elim (at_inv_nxn … Hf1) -Hf1 [1,4: * |*: // ] #g1 #Hg1 #H1 + [ elim (coafter_inv_pxx … Hf … H1) -Hf * #g2 #g #Hg #H2 #H0 destruct + lapply (IH … Hg1 Hg) -IH -Hg1 -Hg #H // + | elim (coafter_inv_nxx … Hf … H1) -Hf #g #Hg #H0 destruct + lapply (IH … Hg1 Hg) -IH -Hg1 -Hg #H // + ] +] +qed. -lemma coafter_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 (coafter_inv_nxx … Hf … H1) -Hf /2 width=1 by/ +lemma coafter_tls_O: ∀n,f1,f2,f. @⦃0, f1⦄ ≡ n → + f1 ~⊚ f2 ≡ f → ⫱*[n]f1 ~⊚ f2 ≡ ⫱*[n]f. +/2 width=1 by coafter_tls/ qed. + +lemma coafter_tls_succ: ∀g2,g1,g. g2 ~⊚ g1 ≡ g → + ∀n. @⦃0, g2⦄ ≡ n → ⫱*[⫯n]g2 ~⊚ ⫱g1 ≡ ⫱*[⫯n]g. +#g2 #g1 #g #Hg #n #Hg2 +lapply (coafter_tls … Hg2 … Hg) -Hg #Hg +lapply (at_pxx_tls … Hg2) -Hg2 #H +elim (at_inv_pxp … H) -H [ |*: // ] #f2 #H2 +elim (coafter_inv_pxx … Hg … H2) -Hg * #f1 #f #Hf #H1 #H0 destruct +