X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=matita%2Fmatita%2Fcontribs%2Flambda_delta%2Fbasic_2%2Fequivalence%2Fcpcs_cpcs.ma;h=31a8d0b49c77e593a8b0662472d09da094874508;hb=5ea90cbbb01fe0bf3b77221d9e6c87002982621f;hp=b5ebbe8afba660586b74728eeffb927c20937503;hpb=78d4844bcccb3deb58a3179151c3045298782b18;p=helm.git diff --git a/matita/matita/contribs/lambda_delta/basic_2/equivalence/cpcs_cpcs.ma b/matita/matita/contribs/lambda_delta/basic_2/equivalence/cpcs_cpcs.ma index b5ebbe8af..31a8d0b49 100644 --- a/matita/matita/contribs/lambda_delta/basic_2/equivalence/cpcs_cpcs.ma +++ b/matita/matita/contribs/lambda_delta/basic_2/equivalence/cpcs_cpcs.ma @@ -65,19 +65,46 @@ lemma cpcs_inv_abst_shift: ∀L,W1,W2,T1,T2. L ⊢ ⓛW1.T1 ⬌* ⓛW2.T2 → lapply (cpcs_inv_abst … H Abst W) -H // qed. +lemma cpcs_inv_abst1: ∀L,W1,T1,T. L ⊢ ⓛW1.T1 ⬌* T → + ∃∃W2,T2. L ⊢ T ➡* ⓛW2.T2 & L ⊢ ⓛW1.T1 ➡* ⓛW2.T2. +#L #W1 #T1 #T #H +elim (cpcs_inv_cprs … H) -H #X #H1 #H2 +elim (cprs_inv_abst1 Abst W1 … H1) -H1 #W2 #T2 #HW12 #HT12 #H destruct +@(ex2_2_intro … H2) -H2 /2 width=2/ (**) (* explicit constructor, /3 width=6/ is slow *) +qed-. + +lemma cpcs_inv_abst2: ∀L,W1,T1,T. L ⊢ T ⬌* ⓛW1.T1 → + ∃∃W2,T2. L ⊢ T ➡* ⓛW2.T2 & L ⊢ ⓛW1.T1 ➡* ⓛW2.T2. +/3 width=1 by cpcs_inv_abst1, cpcs_sym/ qed-. + (* Basic_1: was: pc3_gen_lift *) lemma cpcs_inv_lift: ∀L,K,d,e. ⇩[d, e] L ≡ K → ∀T1,U1. ⇧[d, e] T1 ≡ U1 → ∀T2,U2. ⇧[d, e] T2 ≡ U2 → L ⊢ U1 ⬌* U2 → K ⊢ T1 ⬌* T2. #L #K #d #e #HLK #T1 #U1 #HTU1 #T2 #U2 #HTU2 #HU12 elim (cpcs_inv_cprs … HU12) -HU12 #U #HU1 #HU2 -elim (cprs_inv_lift … HLK … HTU1 … HU1) -U1 #T #HTU #HT1 -elim (cprs_inv_lift … HLK … HTU2 … HU2) -L -U2 #X #HXU +elim (cprs_inv_lift1 … HLK … HTU1 … HU1) -U1 #T #HTU #HT1 +elim (cprs_inv_lift1 … HLK … HTU2 … HU2) -L -U2 #X #HXU >(lift_inj … HXU … HTU) -X -U -d -e /2 width=3/ qed-. (* Advanced properties ******************************************************) +lemma cpr_cprs_conf: ∀L,T,T1,T2. L ⊢ T ➡* T1 → L ⊢ T ➡ T2 → L ⊢ T1 ⬌* T2. +#L #T #T1 #T2 #HT1 #HT2 +elim (cprs_strip … HT1 … HT2) /2 width=3 by cpr_cprs_div/ +qed-. + +lemma cprs_cpr_conf: ∀L,T,T1,T2. L ⊢ T ➡* T1 → L ⊢ T ➡ T2 → L ⊢ T2 ⬌* T1. +#L #T #T1 #T2 #HT1 #HT2 +elim (cprs_strip … HT1 … HT2) /2 width=3 by cprs_cpr_div/ +qed-. + +lemma cprs_conf: ∀L,T,T1,T2. L ⊢ T ➡* T1 → L ⊢ T ➡* T2 → L ⊢ T1 ⬌* T2. +#L #T #T1 #T2 #HT1 #HT2 +elim (cprs_conf … HT1 … HT2) /2 width=3/ +qed-. + (* Basic_1: was only: pc3_thin_dx *) lemma cpcs_flat: ∀L,V1,V2. L ⊢ V1 ⬌* V2 → ∀T1,T2. L ⊢ T1 ⬌* T2 → ∀I. L ⊢ ⓕ{I}V1. T1 ⬌* ⓕ{I}V2. T2. @@ -86,6 +113,10 @@ elim (cpcs_inv_cprs … HV12) -HV12 #V #HV1 #HV2 elim (cpcs_inv_cprs … HT12) -HT12 /3 width=5 by cprs_flat, cprs_div/ (**) (* /3 width=5/ is too slow *) qed. +lemma cpcs_flat_dx_tpr_rev: ∀L,V1,V2. V2 ➡ V1 → ∀T1,T2. L ⊢ T1 ⬌* T2 → + ∀I. L ⊢ ⓕ{I}V1. T1 ⬌* ⓕ{I}V2. T2. +/3 width=1/ qed. + lemma cpcs_abst: ∀L,V1,V2. L ⊢ V1 ⬌* V2 → ∀V,T1,T2. L.ⓛV ⊢ T1 ⬌* T2 → L ⊢ ⓛV1. T1 ⬌* ⓛV2. T2. #L #V1 #V2 #HV12 #V #T1 #T2 #HT12 @@ -108,6 +139,32 @@ lemma cpcs_abbr_sn: ∀L,V1,V2,T. L ⊢ V1 ⬌* V2 → L ⊢ ⓓV1. T ⬌* ⓓV2 elim (cpcs_inv_cprs … HV12) -HV12 /3 width=5 by cprs_div, cprs_abbr1/ (**) (* /3 width=5/ is a bit slow *) qed. +lemma cpcs_bind_sn: ∀I,L,V1,V2,T. L ⊢ V1 ⬌* V2 → L ⊢ ⓑ{I}V1. T ⬌* ⓑ{I}V2. T. +* /2 width=1/ /2 width=2/ qed. + +lemma cpcs_beta_dx: ∀L,V1,V2,W,T1,T2. + L ⊢ V1 ➡ V2 → L.ⓛW ⊢ T1 ⬌* T2 → L ⊢ ⓐV1.ⓛW.T1 ⬌* ⓓV2.T2. +#L #V1 #V2 #W #T1 #T2 #HV12 #HT12 +elim (cpcs_inv_cprs … HT12) -HT12 #T #HT1 #HT2 +lapply (cprs_beta_dx … HV12 HT1) -HV12 -HT1 #HT1 +lapply (cprs_lsubs_trans … HT2 (L.ⓓV2) ?) -HT2 /2 width=1/ #HT2 +@(cprs_div … HT1) /2 width=1/ +qed. + +lemma cpcs_beta_dx_tpr_rev: ∀L,V1,V2,W,T1,T2. + V1 ➡ V2 → L.ⓛW ⊢ T2 ⬌* T1 → + L ⊢ ⓓV2.T2 ⬌* ⓐV1.ⓛW.T1. +/4 width=1/ qed. + +(* Note: it does not hold replacing |L1| with |L2| *) +lemma cpcs_lsubs_trans: ∀L1,T1,T2. L1 ⊢ T1 ⬌* T2 → + ∀L2. L2 ≼ [0, |L1|] L1 → L2 ⊢ T1 ⬌* T2. +#L1 #T1 #T2 #HT12 +elim (cpcs_inv_cprs … HT12) -HT12 +/3 width=5 by cprs_div, cprs_lsubs_trans/ (**) (* /3 width=5/ is a bit slow *) +qed. + + (* Basic_1: was: pc3_lift *) lemma cpcs_lift: ∀L,K,d,e. ⇩[d, e] L ≡ K → ∀T1,U1. ⇧[d, e] T1 ≡ U1 → ∀T2,U2. ⇧[d, e] T2 ≡ U2 →