X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fbasic_2%2Fdynamic%2Fnta_preserve.ma;h=daf753fb366872d53b58eee1c8769676f5554780;hb=a0b7db9844126ebcdf4b5dbb586514854cef5d93;hp=464e8603a20da1e494b64f9025511679a79fbbc4;hpb=c27d792e734c91a9b80cf8456e2c755aae24e994;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/nta_preserve.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/nta_preserve.ma index 464e8603a..daf753fb3 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/nta_preserve.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/nta_preserve.ma @@ -12,8 +12,8 @@ (* *) (**************************************************************************) -include "basic_2/rt_equivalence/cpcs_cprs.ma". -include "basic_2/dynamic/cnv_preserve.ma". +include "basic_2/rt_equivalence/cpcs_cpcs.ma". +include "basic_2/dynamic/cnv_preserve_cpcs.ma". include "basic_2/dynamic/nta.ma". (* NATIVE TYPE ASSIGNMENT FOR TERMS *****************************************) @@ -56,8 +56,96 @@ elim (cpms_inv_abst_sn … H) -H #X3 #X4 #HX13 #HX24 #H destruct #H destruct qed. +(* Basic_1: uses: ty3_sred_wcpr0_pr0 *) +lemma nta_cpr_conf_lpr (a) (h) (G): + ∀L1,T1,U. ⦃G,L1⦄ ⊢ T1 :[a,h] U → ∀T2. ⦃G,L1⦄ ⊢ T1 ➡[h] T2 → + ∀L2. ⦃G,L1⦄ ⊢ ➡[h] L2 → ⦃G,L2⦄ ⊢ T2 :[a,h] U. +#a #h #G #L1 #T1 #U #H #T2 #HT12 #L2 #HL12 +/3 width=6 by cnv_cpm_trans_lpr, cpm_cast/ +qed-. + +(* Basic_1: uses: ty3_sred_pr2 ty3_sred_pr0 *) +lemma nta_cpr_conf (a) (h) (G) (L): + ∀T1,U. ⦃G,L⦄ ⊢ T1 :[a,h] U → + ∀T2. ⦃G,L⦄ ⊢ T1 ➡[h] T2 → ⦃G,L⦄ ⊢ T2 :[a,h] U. +#a #h #G #L #T1 #U #H #T2 #HT12 +/3 width=6 by cnv_cpm_trans, cpm_cast/ +qed-. + +(* Note: this is the preservation property *) +(* Basic_1: uses: ty3_sred_pr3 ty3_sred_pr1 *) +lemma nta_cprs_conf (a) (h) (G) (L): + ∀T1,U. ⦃G,L⦄ ⊢ T1 :[a,h] U → + ∀T2. ⦃G,L⦄ ⊢ T1 ➡*[h] T2 → ⦃G,L⦄ ⊢ T2 :[a,h] U. +#a #h #G #L #T1 #U #H #T2 #HT12 +/3 width=6 by cnv_cpms_trans, cpms_cast/ +qed-. + +(* Basic_1: uses: ty3_cred_pr2 *) +lemma nta_lpr_conf (a) (h) (G): + ∀L1,T,U. ⦃G,L1⦄ ⊢ T :[a,h] U → + ∀L2. ⦃G,L1⦄ ⊢ ➡[h] L2 → ⦃G,L2⦄ ⊢ T :[a,h] U. +#a #h #G #L1 #T #U #HTU #L2 #HL12 +/2 width=3 by cnv_lpr_trans/ +qed-. + +(* Basic_1: uses: ty3_cred_pr3 *) +lemma nta_lprs_conf (a) (h) (G): + ∀L1,T,U. ⦃G,L1⦄ ⊢ T :[a,h] U → + ∀L2. ⦃G,L1⦄ ⊢ ➡*[h] L2 → ⦃G,L2⦄ ⊢ T :[a,h] U. +#a #h #G #L1 #T #U #HTU #L2 #HL12 +/2 width=3 by cnv_lprs_trans/ +qed-. + (* Inversion lemmas based on preservation ***********************************) +lemma nta_inv_ldef_sn (a) (h) (G) (K) (V): + ∀X2. ⦃G,K.ⓓV⦄ ⊢ #0 :[a,h] X2 → + ∃∃W,U. ⦃G,K⦄ ⊢ V :[a,h] W & ⬆*[1] W ≘ U & ⦃G,K.ⓓV⦄ ⊢ U ⬌*[h] X2 & ⦃G,K.ⓓV⦄ ⊢ X2 ![a,h]. +#a #h #G #Y #X #X2 #H +elim (cnv_inv_cast … H) -H #X1 #HX2 #H1 #HX21 #H2 +elim (cnv_inv_zero … H1) -H1 #Z #K #V #HV #H destruct +elim (cpms_inv_delta_sn … H2) -H2 * +[ #_ #H destruct +| #W #HVW #HWX1 + /3 width=5 by cnv_cpms_nta, cpcs_cprs_sn, ex4_2_intro/ +] +qed-. + +lemma nta_inv_lref_sn (a) (h) (G) (L): + ∀X2,i. ⦃G,L⦄ ⊢ #↑i :[a,h] X2 → + ∃∃I,K,T2,U2. ⦃G,K⦄ ⊢ #i :[a,h] T2 & ⬆*[1] T2 ≘ U2 & ⦃G,K.ⓘ{I}⦄ ⊢ U2 ⬌*[h] X2 & ⦃G,K.ⓘ{I}⦄ ⊢ X2 ![a,h] & L = K.ⓘ{I}. +#a #h #G #L #X2 #i #H +elim (cnv_inv_cast … H) -H #X1 #HX2 #H1 #HX21 #H2 +elim (cnv_inv_lref … H1) -H1 #I #K #Hi #H destruct +elim (cpms_inv_lref_sn … H2) -H2 * +[ #_ #H destruct +| #X #HX #HX1 + /3 width=9 by cnv_cpms_nta, cpcs_cprs_sn, ex5_4_intro/ +] +qed-. + +lemma nta_inv_lref_sn_drops_cnv (a) (h) (G) (L): + ∀X2, i. ⦃G,L⦄ ⊢ #i :[a,h] X2 → + ∨∨ ∃∃K,V,W,U. ⬇*[i] L ≘ K.ⓓV & ⦃G,K⦄ ⊢ V :[a,h] W & ⬆*[↑i] W ≘ U & ⦃G,L⦄ ⊢ U ⬌*[h] X2 & ⦃G,L⦄ ⊢ X2 ![a,h] + | ∃∃K,W,U. ⬇*[i] L ≘ K. ⓛW & ⦃G,K⦄ ⊢ W ![a,h] & ⬆*[↑i] W ≘ U & ⦃G,L⦄ ⊢ U ⬌*[h] X2 & ⦃G,L⦄ ⊢ X2 ![a,h]. +#a #h #G #L #X2 #i #H +elim (cnv_inv_cast … H) -H #X1 #HX2 #H1 #HX21 #H2 +elim (cnv_inv_lref_drops … H1) -H1 #I #K #V #HLK #HV +elim (cpms_inv_lref1_drops … H2) -H2 * +[ #_ #H destruct +| #Y #X #W #H #HVW #HUX1 + lapply (drops_mono … H … HLK) -H #H destruct + /4 width=8 by cnv_cpms_nta, cpcs_cprs_sn, ex5_4_intro, or_introl/ +| #n #Y #X #U #H #HVU #HUX1 #H0 destruct + lapply (drops_mono … H … HLK) -H #H destruct + elim (lifts_total V (𝐔❴↑i❵)) #W #HVW + lapply (cpms_lifts_bi … HVU (Ⓣ) … L … HVW … HUX1) -U + [ /2 width=2 by drops_isuni_fwd_drop2/ ] #HWX1 + /4 width=9 by cprs_div, ex5_3_intro, or_intror/ +] +qed-. + lemma nta_inv_bind_sn_cnv (a) (h) (p) (I) (G) (K) (X2): ∀V,T. ⦃G,K⦄ ⊢ ⓑ{p,I}V.T :[a,h] X2 → ∃∃U. ⦃G,K⦄ ⊢ V ![a,h] & ⦃G,K.ⓑ{I}V⦄ ⊢ T :[a,h] U & ⦃G,K⦄ ⊢ ⓑ{p,I}V.U ⬌*[h] X2 & ⦃G,K⦄ ⊢ X2 ![a,h]. @@ -81,44 +169,37 @@ lemma nta_inv_appl_sn (h) (G) (L) (X2): ∃∃p,W,U. ⦃G,L⦄ ⊢ V :[h] W & ⦃G,L⦄ ⊢ T :[h] ⓛ{p}W.U & ⦃G,L⦄ ⊢ ⓐV.ⓛ{p}W.U ⬌*[h] X2 & ⦃G,L⦄ ⊢ X2 ![h]. #h #G #L #X2 #V #T #H elim (cnv_inv_cast … H) -H #X #HX2 #H1 #HX2 #H2 -elim (cnv_inv_appl … H1) * [ | #n ] #p #W #U #Hn #HV #HT #HVW #HTU -[ lapply (cnv_cpms_trans … HT … HTU) #H - elim (cnv_inv_bind … H) -H #_ #HU - elim (cnv_fwd_cpm_SO … HU) #U0 #HU0 -HU - lapply (cpms_step_dx … HTU 1 (ⓛ{p}W.U0) ?) -HTU [ /2 width=1 by cpm_bind/ ] #HTU -| lapply (le_n_O_to_eq n ?) [ /3 width=1 by le_S_S_to_le/ ] -Hn #H destruct -] -lapply (cpms_appl_dx … V V … HTU) [1,3: // ] #HVTU -elim (cnv_cpms_conf … H1 … H2 … HVTU) -H1 -H2 -HVTU