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=ab3b33ad5675415276e73e442d97020695a87799;hpb=5c92c318030a05c766b3f6070dbd23589cbdee04;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 ab3b33ad5..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 *****************************************) @@ -31,6 +31,17 @@ elim (cnv_fwd_cpm_SO … HT) #U #HTU /4 width=2 by cnv_cpms_nta, cpm_cpms, ex_intro/ qed-. +(* Basic_1: was: ty3_typecheck *) +lemma nta_typecheck (a) (h) (G) (L): + ∀T,U. ⦃G,L⦄ ⊢ T :[a,h] U → ∃T0. ⦃G,L⦄ ⊢ ⓝU.T :[a,h] T0. +/3 width=1 by cnv_cast, cnv_nta_sn/ qed-. + +(* Basic_1: was: ty3_correct *) +(* Basic_2A1: was: ntaa_fwd_correct *) +lemma nta_fwd_correct (a) (h) (G) (L): + ∀T,U. ⦃G,L⦄ ⊢ T :[a,h] U → ∃T0. ⦃G,L⦄ ⊢ U :[a,h] T0. +/3 width=2 by nta_fwd_cnv_dx, cnv_nta_sn/ qed-. + lemma nta_pure_cnv (h) (G) (L): ∀T,U. ⦃G,L⦄ ⊢ T :*[h] U → ∀V. ⦃G,L⦄ ⊢ ⓐV.U !*[h] → ⦃G,L⦄ ⊢ ⓐV.T :*[h] ⓐV.U. @@ -45,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]. @@ -70,17 +169,35 @@ 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_inv_appl_true … H1) #p #W #U #HV #HT #HVW #HTU +/5 width=11 by cnv_cpms_nta, cnv_cpms_conf_eq, cpcs_cprs_div, cpms_appl_dx, ex4_3_intro/ +qed-. + +(* Basic_2A1: uses: nta_fwd_pure1 *) +lemma nta_inv_pure_sn_cnv (h) (G) (L) (X2): + ∀V,T. ⦃G,L⦄ ⊢ ⓐV.T :*[h] 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] + | ∃∃U. ⦃G,L⦄ ⊢ T :*[h] U & ⦃G,L⦄ ⊢ ⓐV.U !*[h] & ⦃G,L⦄ ⊢ ⓐV.U ⬌*[h] X2 & ⦃G,L⦄ ⊢ X2 !*[h]. +#h #G #L #X2 #V #T #H +elim (cnv_inv_cast … H) -H #X1 #HX2 #H1 #HX21 #H +elim (cnv_inv_appl … H1) * [| #n ] #p #W0 #T0 #Hn #HV #HT #HW0 #HT0 +[ lapply (cnv_cpms_trans … HT … HT0) #H0 + elim (cnv_inv_bind … H0) -H0 #_ #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_step_dx … HT0 1 (ⓛ{p}W0.U0) ?) -HT0 [ /2 width=1 by cpm_bind/ ] #HT0 + lapply (cpms_appl_dx … V V … HT0) [ // ] #HTU0 + lapply (cnv_cpms_conf_eq … H1 … HTU0 … H) -H1 -H -HTU0 #HU0X1 + /4 width=8 by cnv_cpms_nta, cpcs_cprs_div, ex4_3_intro, or_introl/ +| elim (cnv_cpms_fwd_appl_sn_decompose … H1 … H) -H1 -H #X0 #_ #H #HX01 + elim (cpms_inv_plus … 1 n … HT0) #U #HTU #HUT0 + lapply (cnv_cpms_trans … HT … HTU) #HU + lapply (cnv_cpms_conf_eq … HT … HTU … H) -H #HUX0 + @or_intror @(ex4_intro … U … HX2) -HX2 + [ /2 width=1 by cnv_cpms_nta/ + | /4 width=7 by cnv_appl, lt_to_le/ + | /4 width=3 by cpcs_trans, cpcs_cprs_div, cpcs_flat/ + ] ] -lapply (cpms_appl_dx … V V … HTU) [1,3: // ] #HVTU -elim (cnv_cpms_conf … H1 … H2 … HVTU) -H1 -H2 -HVTU