X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fbasic_2%2Funwind%2Fsstas.ma;h=93fe0a7e0ee89f20f9f6b86fbe1f21c0fea93e7d;hb=0dec595530e6da8ca16af84e40b59c998e6ed4af;hp=3928e49cc551fe2e13adeaecc8980bb9b95b972d;hpb=18bc3082b332504f60345245e716b62ae628e3a7;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/basic_2/unwind/sstas.ma b/matita/matita/contribs/lambdadelta/basic_2/unwind/sstas.ma index 3928e49cc..93fe0a7e0 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/unwind/sstas.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/unwind/sstas.ma @@ -16,69 +16,65 @@ include "basic_2/static/ssta.ma". (* ITERATED STRATIFIED STATIC TYPE ASSIGNMENT FOR TERMS *********************) -inductive sstas (h:sh) (g:sd h) (L:lenv): relation term ≝ -| sstas_refl: ∀T,U,l. ⦃h, L⦄ ⊢ T •[g, l] U → sstas h g L T T -| sstas_step: ∀T,U1,U2,l. ⦃h, L⦄ ⊢ T •[g, l+1] U1 → sstas h g L U1 U2 → - sstas h g L T U2. +(* Note: includes: stass_refl *) +definition sstas: ∀h. sd h → lenv → relation term ≝ + λh,g,L. star … (ssta_step h g L). interpretation "iterated stratified static type assignment (term)" 'StaticTypeStar h g L T U = (sstas h g L T U). (* Basic eliminators ********************************************************) -fact sstas_ind_alt_aux: ∀h,g,L,U2. ∀R:predicate term. - (∀T,l. ⦃h, L⦄ ⊢ U2 •[g , l] T → R U2) → - (∀T,U1,l. ⦃h, L⦄ ⊢ T •[g, l + 1] U1 → - ⦃h, L⦄ ⊢ U1 •* [g] U2 → R U1 → R T - ) → - ∀T,U. ⦃h, L⦄ ⊢ T •*[g] U → U = U2 → R T. -#h #g #L #U2 #R #H1 #H2 #T #U #H elim H -H -T -U /2 width=3/ /3 width=5/ +lemma sstas_ind: ∀h,g,L,T. ∀R:predicate term. + R T → ( + ∀U1,U2,l. ⦃h, L⦄ ⊢ T •* [g] U1 → ⦃h, L⦄ ⊢ U1 •[g, l + 1] U2 → + R U1 → R U2 + ) → + ∀U. ⦃h, L⦄ ⊢ T •*[g] U → R U. +#h #g #L #T #R #IH1 #IH2 #U #H elim H -U // +#U1 #U2 #H * /2 width=5/ qed-. -lemma sstas_ind_alt: ∀h,g,L,U2. ∀R:predicate term. - (∀T,l. ⦃h, L⦄ ⊢ U2 •[g , l] T → R U2) → - (∀T,U1,l. ⦃h, L⦄ ⊢ T •[g, l + 1] U1 → - ⦃h, L⦄ ⊢ U1 •* [g] U2 → R U1 → R T - ) → - ∀T. ⦃h, L⦄ ⊢ T •*[g] U2 → R T. -/3 width=9 by sstas_ind_alt_aux/ qed-. - -(* Basic inversion lemmas ***************************************************) - -fact sstas_inv_bind1_aux: ∀h,g,L,T,U. ⦃h, L⦄ ⊢ T •*[g] U → - ∀a,J,X,Y. T = ⓑ{a,J}Y.X → - ∃∃Z. ⦃h, L.ⓑ{J}Y⦄ ⊢ X •*[g] Z & U = ⓑ{a,J}Y.Z. -#h #g #L #T #U #H @(sstas_ind_alt … H) -T -[ #U0 #l #HU0 #a #J #X #Y #H destruct - elim (ssta_inv_bind1 … HU0) -HU0 #X0 #HX0 #H destruct /3 width=3/ -| #T0 #U0 #l #HTU0 #_ #IHU0 #a #J #X #Y #H destruct - elim (ssta_inv_bind1 … HTU0) -HTU0 #X0 #HX0 #H destruct - elim (IHU0 a J X0 Y …) -IHU0 // #X1 #HX01 #H destruct /3 width=4/ -] +lemma sstas_ind_dx: ∀h,g,L,U2. ∀R:predicate term. + R U2 → ( + ∀T,U1,l. ⦃h, L⦄ ⊢ T •[g, l + 1] U1 → ⦃h, L⦄ ⊢ U1 •* [g] U2 → + R U1 → R T + ) → + ∀T. ⦃h, L⦄ ⊢ T •*[g] U2 → R T. +#h #g #L #U2 #R #IH1 #IH2 #T #H @(star_ind_l … T H) -T // +#T #T0 * /2 width=5/ qed-. -lemma sstas_inv_bind1: ∀h,g,a,J,L,Y,X,U. ⦃h, L⦄ ⊢ ⓑ{a,J}Y.X •*[g] U → - ∃∃Z. ⦃h, L.ⓑ{J}Y⦄ ⊢ X •*[g] Z & U = ⓑ{a,J}Y.Z. -/2 width=3 by sstas_inv_bind1_aux/ qed-. +(* Basic properties *********************************************************) + +lemma sstas_refl: ∀h,g,L. reflexive … (sstas h g L). +// qed. + +lemma ssta_sstas: ∀h,g,L,T,U,l. ⦃h, L⦄ ⊢ T •[g, l+1] U → ⦃h, L⦄ ⊢ T •*[g] U. +/3 width=2 by R_to_star, ex_intro/ qed. (**) (* auto fails without trace *) + +lemma sstas_strap1: ∀h,g,L,T1,T2,U2,l. ⦃h, L⦄ ⊢ T1 •*[g] T2 → ⦃h, L⦄ ⊢ T2 •[g,l+1] U2 → + ⦃h, L⦄ ⊢ T1 •*[g] U2. +/3 width=4 by sstep, ex_intro/ (**) (* auto fails without trace *) +qed. -fact sstas_inv_appl1_aux: ∀h,g,L,T,U. ⦃h, L⦄ ⊢ T •*[g] U → ∀X,Y. T = ⓐY.X → - ∃∃Z. ⦃h, L⦄ ⊢ X •*[g] Z & U = ⓐY.Z. -#h #g #L #T #U #H @(sstas_ind_alt … H) -T -[ #U0 #l #HU0 #X #Y #H destruct - elim (ssta_inv_appl1 … HU0) -HU0 #X0 #HX0 #H destruct /3 width=3/ -| #T0 #U0 #l #HTU0 #_ #IHU0 #X #Y #H destruct - elim (ssta_inv_appl1 … HTU0) -HTU0 #X0 #HX0 #H destruct - elim (IHU0 X0 Y ?) -IHU0 // #X1 #HX01 #H destruct /3 width=4/ -] +lemma sstas_strap2: ∀h,g,L,T1,U1,U2,l. ⦃h, L⦄ ⊢ T1 •[g, l+1] U1 → ⦃h, L⦄ ⊢ U1 •*[g] U2 → + ⦃h, L⦄ ⊢ T1 •*[g] U2. +/3 width=3 by star_compl, ex_intro/ (**) (* auto fails without trace *) +qed. + +(* Basic inversion lemmas ***************************************************) + +lemma sstas_inv_bind1: ∀h,g,a,I,L,Y,X,U. ⦃h, L⦄ ⊢ ⓑ{a,I}Y.X •*[g] U → + ∃∃Z. ⦃h, L.ⓑ{I}Y⦄ ⊢ X •*[g] Z & U = ⓑ{a,I}Y.Z. +#h #g #a #I #L #Y #X #U #H @(sstas_ind … H) -U /2 width=3/ +#T #U #l #_ #HTU * #Z #HXZ #H destruct +elim (ssta_inv_bind1 … HTU) -HTU #Z0 #HZ0 #H destruct /3 width=4/ qed-. lemma sstas_inv_appl1: ∀h,g,L,Y,X,U. ⦃h, L⦄ ⊢ ⓐY.X •*[g] U → ∃∃Z. ⦃h, L⦄ ⊢ X •*[g] Z & U = ⓐY.Z. -/2 width=3 by sstas_inv_appl1_aux/ qed-. - -(* Basic forward lemmas *****************************************************) - -lemma sstas_fwd_correct: ∀h,g,L,T,U. ⦃h, L⦄ ⊢ T •*[g] U → - ∃∃l,W. ⦃h, L⦄ ⊢ U •[g, l] W. -#h #g #L #T #U #H @(sstas_ind_alt … H) -T // /2 width=3/ +#h #g #L #Y #X #U #H @(sstas_ind … H) -U /2 width=3/ +#T #U #l #_ #HTU * #Z #HXZ #H destruct +elim (ssta_inv_appl1 … HTU) -HTU #Z0 #HZ0 #H destruct /3 width=4/ qed-.