(**************************************************************************) (* ___ *) (* ||M|| *) (* ||A|| A project by Andrea Asperti *) (* ||T|| *) (* ||I|| Developers: *) (* ||T|| The HELM team. *) (* ||A|| http://helm.cs.unibo.it *) (* \ / *) (* \ / This file is distributed under the terms of the *) (* v GNU General Public License Version 2 *) (* *) (**************************************************************************) include "basic_2/equivalence/lsubss_ssta.ma". include "basic_2/dynamic/snv_cpcs.ma". (* STRATIFIED NATIVE VALIDITY FOR TERMS *************************************) (* Properties on context-free parallel reduction for local environments *****) fact ssta_ltpr_tpr_aux: ∀h,g,L0,T0. (∀L1,T1. h ⊢ ⦃L0, T0⦄ >[g] ⦃L1, T1⦄ → IH_snv_ssta h g L1 T1) → (∀L1,T1. h ⊢ ⦃L0, T0⦄ >[g] ⦃L1, T1⦄ → IH_snv_ltpr_tpr h g L1 T1) → (∀L1,T1. h ⊢ ⦃L0, T0⦄ >[g] ⦃L1, T1⦄ → IH_ssta_ltpr_tpr h g L1 T1) → ∀L1,T1. L0 = L1 → T0 = T1 → IH_ssta_ltpr_tpr h g L1 T1. #h #g #L0 #T0 #IH3 #IH2 #IH1 #L1 * * [|||| *] [ #k #_ #_ #_ #X2 #l #H2 #L2 #HL12 #X3 #H3 -IH3 -IH2 -IH1 elim (ssta_inv_sort1 … H2) -H2 #Hkl #H destruct >(tpr_inv_atom1 … H3) -X3 /4 width=6/ | #i #HL0 #HT0 #H1 #X2 #l #H2 #L2 #HL12 #X3 #H3 destruct -IH3 -IH2 elim (snv_inv_lref … H1) -H1 #I0 #K0 #V0 #H #HV1 elim (ssta_inv_lref1 … H2) -H2 * #K1 >(tpr_inv_atom1 … H3) -X3 [ #V1 #W1 #HLK1 #HVW1 #HWU1 lapply (ldrop_mono … H … HLK1) -H #H destruct lapply (ldrop_pair2_fwd_fw … HLK1 (#i)) #HKV1 elim (ltpr_ldrop_conf … HLK1 … HL12) -HLK1 -HL12 #X #H #HLK2 elim (ltpr_inv_pair1 … H) -H #K2 #V2 #HK12 #HV12 #H destruct elim (IH1 … HVW1 … HK12 … HV12) -IH1 -HVW1 -HV12 // [2: /2 width=1/ ] -V1 #W2 #HVW2 #HW12 lapply (ldrop_fwd_ldrop2 … HLK2) #H2 elim (lift_total W2 0 (i+1)) #U2 #HWU2 lapply (cpcs_lift … H2 … HWU1 … HWU2 HW12) -H2 -W1 /3 width=6/ | #V1 #W1 #l0 #HLK1 #HVW1 #HVU1 #H destruct lapply (ldrop_mono … H … HLK1) -H #H destruct lapply (ldrop_pair2_fwd_fw … HLK1 (#i)) #HKV1 elim (ltpr_ldrop_conf … HLK1 … HL12) -HLK1 #X #H #HLK2 elim (ltpr_inv_pair1 … H) -H #K2 #V2 #HK12 #HV12 #H destruct elim (IH1 … HVW1 … HK12 … HV12) -IH1 -HVW1 -HK12 // [2: /2 width=1/ ] -HV1 -HKV1 #W2 #HVW2 #_ -W1 elim (lift_total V2 0 (i+1)) #U2 #HVU2 lapply (tpr_lift … HV12 … HVU1 … HVU2) -V1 /4 width=6/ ] | #p #_ #HT0 #H1 destruct -IH3 -IH2 -IH1 elim (snv_inv_gref … H1) | #a #I #V1 #T1 #HL0 #HT0 #H1 #X2 #l #H2 #L2 #HL12 #X3 #H3 destruct -IH3 -IH2 elim (snv_inv_bind … H1) -H1 #_ #HT1 elim (ssta_inv_bind1 … H2) -H2 #U1 #HTU1 #H destruct elim (tpr_inv_bind1 … H3) -H3 * [ #V2 #T0 #T2 #HV12 #HT10 #HT02 #H destruct lapply (tps_lsubr_trans … HT02 (L2.ⓑ{I}V2) ?) -HT02 [ /2 width=1/ ] #HT02 elim (ssta_ltpr_cpr_aux … HT1 … HTU1 (L2.ⓑ{I}V2) … T2) -HT1 -HTU1 [2: /3 width=5 by cpr_intro, tps_tpss/ |3: /2 width=1/ |4: /3 width=1/ ] -IH1 -T0 -HL12 #U2 #HTU2 #HU12 lapply (cpcs_bind2 … V1 … HU12 … a) -HU12 [ /2 width=1/ ] -HV12 /3 width=3/ | #T2 #HT12 #HT2 #H1 #H2 destruct elim (IH1 … HTU1 (L2.ⓓV1) … T2) -IH1 -HTU1 // [2,3: /2 width=1/ ] -T1 -HL12 #U2 #HTU2 #HU12 lapply (cpcs_bind1 … HU12 … V1 … true) // -HU12 #HU12 elim (ssta_inv_lift1 … HTU2 … HT2) -T2 [3: /2 width=1/ |2: skip ] #U #HXU #HU2 lapply (cpcs_cpr_strap1 … HU12 U ?) -HU12 [ /3 width=3/ ] -U2 /2 width=3/ ] | #V1 #T1 #HL0 #HT0 #H1 #X2 #l #H2 #L2 #HL12 #X3 #H3 destruct elim (snv_inv_appl … H1) -H1 #a #W1 #W10 #U10 #l0 #HV1 #HT1 #HVW1 #HW10 #HTU10 elim (ssta_inv_appl1 … H2) -H2 #U1 #HTU1 #H destruct elim (tpr_inv_appl1 … H3) -H3 * [ #V2 #T2 #HV12 #HT12 #H destruct -a -l0 -W1 -W10 -U10 -HV1 -IH3 -IH2 elim (IH1 … HTU1 … HL12 … HT12) -IH1 -HTU1 -HL12 // [2: /2 width=1/ ] -T1 #U2 #HTU2 #HU12 lapply (cpcs_flat … V1 V2 … HU12) -HU12 [ /2 width=1/ ] -HV12 /3 width=3/ | #b #V2 #W #T2 #T20 #HV12 #HT20 #H1 #H2 destruct elim (snv_inv_bind … HT1) -HT1 #HW #HT2 elim (ssta_inv_bind1 … HTU1) -HTU1 #U2 #HTU2 #H destruct elim (dxprs_inv_abst1 … HTU10) -HTU10 #W0 #U0 #HW0 #_ #H destruct lapply (cprs_div … HW10 … HW0) -W0 #HW1W elim (ssta_fwd_correct … HVW1)