From: Ferruccio Guidi Date: Sat, 28 Jun 2014 18:23:22 +0000 (+0000) Subject: - ldrop is now drop as in basic_1 X-Git-Tag: make_still_working~891 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=52e675f555f559c047d5449db7fc89a51b977d35;p=helm.git - ldrop is now drop as in basic_1 - notation change for tstc and leq --- diff --git a/matita/matita/contribs/lambdadelta/apps_2/functional/rtm_step.ma b/matita/matita/contribs/lambdadelta/apps_2/functional/rtm_step.ma index e2d859b74..ed77ca726 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/functional/rtm_step.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/functional/rtm_step.ma @@ -18,7 +18,7 @@ include "apps_2/functional/rtm.ma". (* transitions *) inductive rtm_step: relation rtm ≝ -| rtm_ldrop : ∀G,u,E,I,t,D,V,S,i. +| rtm_drop : ∀G,u,E,I,t,D,V,S,i. rtm_step (mk_rtm G u (E. ④{I} {t, D, V}) S (#(i + 1))) (mk_rtm G u E S (#i)) | rtm_ldelta: ∀G,u,E,t,D,V,S. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/acp.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/acp.ma index 22efc2d11..59f59606b 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/acp.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/acp.ma @@ -13,7 +13,7 @@ (**************************************************************************) include "basic_2/grammar/genv.ma". -include "basic_2/multiple/ldrops.ma". +include "basic_2/multiple/drops.ma". (* ABSTRACT COMPUTATION PROPERTIES ******************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/acp_aaa.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/acp_aaa.ma index 7a232f0fa..0c8ed725b 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/acp_aaa.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/acp_aaa.ma @@ -13,10 +13,10 @@ (**************************************************************************) include "basic_2/multiple/lifts_lifts.ma". -include "basic_2/multiple/ldrops_ldrops.ma". +include "basic_2/multiple/drops_drops.ma". include "basic_2/static/aaa_lifts.ma". include "basic_2/static/aaa_aaa.ma". -include "basic_2/computation/lsubc_ldrops.ma". +include "basic_2/computation/lsubc_drops.ma". (* ABSTRACT COMPUTATION PROPERTIES ******************************************) @@ -36,19 +36,19 @@ theorem aacr_aaa_csubc_lifts: ∀RR,RS,RP. | #I #G #L1 #K1 #V1 #B #i #HLK1 #HKV1B #IHB #L0 #des #HL01 #X #H #L2 #HL20 lapply (aacr_acr … H1RP H2RP B) #HB elim (lifts_inv_lref1 … H) -H #i1 #Hi1 #H destruct - lapply (ldrop_fwd_drop2 … HLK1) #HK1b - elim (ldrops_ldrop_trans … HL01 … HLK1) #X #des1 #i0 #HL0 #H #Hi0 #Hdes1 + lapply (drop_fwd_drop2 … HLK1) #HK1b + elim (drops_drop_trans … HL01 … HLK1) #X #des1 #i0 #HL0 #H #Hi0 #Hdes1 >(at_mono … Hi1 … Hi0) -i1 - elim (ldrops_inv_skip2 … Hdes1 … H) -des1 #K0 #V0 #des0 #Hdes0 #HK01 #HV10 #H destruct - elim (lsubc_ldrop_O1_trans … HL20 … HL0) -HL0 #X #HLK2 #H + elim (drops_inv_skip2 … Hdes1 … H) -des1 #K0 #V0 #des0 #Hdes0 #HK01 #HV10 #H destruct + elim (lsubc_drop_O1_trans … HL20 … HL0) -HL0 #X #HLK2 #H elim (lsubc_inv_pair2 … H) -H * [ #K2 #HK20 #H destruct elim (lift_total V0 0 (i0 +1)) #V #HV0 elim (lifts_lift_trans … Hi0 … Hdes0 … HV10 … HV0) -HV10 #V2 #HV12 #HV2 - @(s5 … HB … (◊) … HV0 HLK2) /3 width=7 by ldrops_cons, lifts_cons/ (* Note: uses IHB HL20 V2 HV0 *) + @(s5 … HB … (◊) … HV0 HLK2) /3 width=7 by drops_cons, lifts_cons/ (* Note: uses IHB HL20 V2 HV0 *) | -HLK1 -IHB -HL01 -HL20 -HK1b -Hi0 -Hdes0 #K2 #V2 #A2 #HKV2A #H1KV0A #H2KV0A #_ #H1 #H2 destruct - lapply (ldrop_fwd_drop2 … HLK2) #HLK2b + lapply (drop_fwd_drop2 … HLK2) #HLK2b lapply (aaa_lifts … HK01 … HV10 HKV1B) -HKV1B -HK01 -HV10 #HKV0B lapply (aaa_mono … H2KV0A … HKV0B) #H destruct -H2KV0A -HKV0B elim (lift_total V0 0 (i0 +1)) #V3 #HV03 @@ -61,18 +61,18 @@ theorem aacr_aaa_csubc_lifts: ∀RR,RS,RP. lapply (aacr_acr … H1RP H2RP A) #HA lapply (aacr_acr … H1RP H2RP B) #HB lapply (s1 … HB) -HB #HB - @(s6 … HA … (◊) (◊)) /3 width=5 by lsubc_pair, ldrops_skip, liftv_nil/ + @(s6 … HA … (◊) (◊)) /3 width=5 by lsubc_pair, drops_skip, liftv_nil/ | #a #G #L #W #T #B #A #HLWB #_ #IHB #IHA #L0 #des #HL0 #X #H #L2 #HL02 elim (lifts_inv_bind1 … H) -H #W0 #T0 #HW0 #HT0 #H destruct @(aacr_abst … H1RP H2RP) [ /2 width=5 by/ ] #L3 #V3 #W3 #T3 #des3 #HL32 #HW03 #HT03 #H1B #H2B - elim (ldrops_lsubc_trans … H1RP H2RP … HL32 … HL02) -L2 #L2 #HL32 #HL20 - lapply (aaa_lifts … L2 W3 … (des @@ des3) … HLWB) -HLWB /2 width=4 by ldrops_trans, lifts_trans/ #HLW2B + elim (drops_lsubc_trans … H1RP H2RP … HL32 … HL02) -L2 #L2 #HL32 #HL20 + lapply (aaa_lifts … L2 W3 … (des @@ des3) … HLWB) -HLWB /2 width=4 by drops_trans, lifts_trans/ #HLW2B @(IHA (L2. ⓛW3) … (des + 1 @@ des3 + 1)) -IHA - /3 width=5 by lsubc_abbr, ldrops_trans, ldrops_skip, lifts_trans/ + /3 width=5 by lsubc_abbr, drops_trans, drops_skip, lifts_trans/ | #G #L #V #T #B #A #_ #_ #IHB #IHA #L0 #des #HL0 #X #H #L2 #HL20 elim (lifts_inv_flat1 … H) -H #V0 #T0 #HV0 #HT0 #H destruct - /3 width=10 by ldrops_nil, lifts_nil/ + /3 width=10 by drops_nil, lifts_nil/ | #G #L #V #T #A #_ #_ #IH1A #IH2A #L0 #des #HL0 #X #H #L2 #HL20 elim (lifts_inv_flat1 … H) -H #V0 #T0 #HV0 #HT0 #H destruct lapply (aacr_acr … H1RP H2RP A) #HA @@ -83,7 +83,7 @@ qed. (* Basic_1: was: sc3_arity *) lemma aacr_aaa: ∀RR,RS,RP. acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) → ∀G,L,T,A. ⦃G, L⦄ ⊢ T ⁝ A → ⦃G, L, T⦄ ϵ[RP] 〚A〛. -/2 width=8 by ldrops_nil, lifts_nil, aacr_aaa_csubc_lifts/ qed. +/2 width=8 by drops_nil, lifts_nil, aacr_aaa_csubc_lifts/ qed. lemma acp_aaa: ∀RR,RS,RP. acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) → ∀G,L,T,A. ⦃G, L⦄ ⊢ T ⁝ A → RP G L T. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/acp_cr.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/acp_cr.ma index 8bf08dc6f..71a02ce87 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/acp_cr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/acp_cr.ma @@ -16,7 +16,7 @@ include "basic_2/notation/relations/ineint_5.ma". include "basic_2/grammar/aarity.ma". include "basic_2/multiple/gr2_gr2.ma". include "basic_2/multiple/lifts_lift_vector.ma". -include "basic_2/multiple/ldrops_ldrop.ma". +include "basic_2/multiple/drops_drop.ma". include "basic_2/computation/acp.ma". (* ABSTRACT COMPUTATION PROPERTIES ******************************************) @@ -115,7 +115,7 @@ lemma aacr_acr: ∀RR,RS,RP. acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) ∀A. acr RR RS RP (aacr RP A). #RR #RS #RP #H1RP #H2RP #A elim A -A normalize // #B #A #IHB #IHA @mk_acr normalize -[ /3 width=7 by ldrops_cons, lifts_cons/ +[ /3 width=7 by drops_cons, lifts_cons/ | #G #L #T #H elim (cp1 … H1RP G L) #k #HK lapply (H ? (⋆k) ? (⟠) ? ? ?) -H @@ -141,9 +141,9 @@ lemma aacr_acr: ∀RR,RS,RP. acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) | #I #G #L #K #Vs #V1 #V2 #i #HA #HV12 #HLK #L0 #V0 #X #des #HB #HL0 #H elim (lifts_inv_applv1 … H) -H #V0s #Y #HV0s #HY #H destruct elim (lifts_inv_lref1 … HY) -HY #i0 #Hi0 #H destruct - elim (ldrops_ldrop_trans … HL0 … HLK) #X #des0 #i1 #HL02 #H #Hi1 #Hdes0 + elim (drops_drop_trans … HL0 … HLK) #X #des0 #i1 #HL02 #H #Hi1 #Hdes0 >(at_mono … Hi1 … Hi0) in HL02; -i1 #HL02 - elim (ldrops_inv_skip2 … Hdes0 … H) -H -des0 #L2 #W1 #des0 #Hdes0 #HLK #HVW1 #H destruct + elim (drops_inv_skip2 … Hdes0 … H) -H -des0 #L2 #W1 #des0 #Hdes0 #HLK #HVW1 #H destruct elim (lift_total W1 0 (i0 + 1)) #W2 #HW12 elim (lifts_lift_trans … Hdes0 … HVW1 … HW12) // -Hdes0 -Hi0 #V3 #HV13 #HVW2 >(lift_mono … HV13 … HV12) in HVW2; -V3 #HVW2 @@ -154,8 +154,8 @@ lemma aacr_acr: ∀RR,RS,RP. acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) elim (lift_total V10 0 1) #V20 #HV120 elim (liftv_total 0 1 V10s) #V20s #HV120s @(s6 … IHA … (V10 @ V10s) (V20 @ V20s)) /3 width=7 by rp_lifts, liftv_cons/ - @(HA … (des + 1)) /2 width=2 by ldrops_skip/ - [ @(s0 … IHB … HB … HV120) /2 width=2 by ldrop_drop/ + @(HA … (des + 1)) /2 width=2 by drops_skip/ + [ @(s0 … IHB … HB … HV120) /2 width=2 by drop_drop/ | @lifts_applv // elim (liftsv_liftv_trans_le … HV10s … HV120s) -V10s #V10s #HV10s #HV120s >(liftv_mono … HV12s … HV10s) -V1s // diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/cprs_cprs.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/cprs_cprs.ma index 8b073c157..3f2754bd5 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/cprs_cprs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/cprs_cprs.ma @@ -108,7 +108,7 @@ lemma lpr_cpr_trans: ∀G. s_r_transitive … (cpr G) (λ_. lpr G). #G #L2 #T1 #T2 #HT12 elim HT12 -G -L2 -T1 -T2 [ /2 width=3 by/ | #G #L2 #K2 #V0 #V2 #W2 #i #HLK2 #_ #HVW2 #IHV02 #L1 #HL12 - elim (lpr_ldrop_trans_O1 … HL12 … HLK2) -L2 #X #HLK1 #H + elim (lpr_drop_trans_O1 … HL12 … HLK2) -L2 #X #HLK1 #H elim (lpr_inv_pair2 … H) -H #K1 #V1 #HK12 #HV10 #H destruct /4 width=6 by cprs_strap2, cprs_delta/ |3,7: /4 width=1 by lpr_pair, cprs_bind, cprs_beta/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/cprs_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/cprs_lift.ma index b883ad18e..0a7775096 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/cprs_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/cprs_lift.ma @@ -25,7 +25,7 @@ lemma cprs_delta: ∀G,L,K,V,V2,i. ∀W2. ⇧[0, i + 1] V2 ≡ W2 → ⦃G, L⦄ ⊢ #i ➡* W2. #G #L #K #V #V2 #i #HLK #H elim H -V2 [ /3 width=6 by cpr_cprs, cpr_delta/ ] #V1 #V2 #_ #HV12 #IHV1 #W2 #HVW2 -lapply (ldrop_fwd_drop2 … HLK) -HLK #HLK +lapply (drop_fwd_drop2 … HLK) -HLK #HLK elim (lift_total V1 0 (i+1)) /4 width=12 by cpr_lift, cprs_strap1/ qed. @@ -42,7 +42,7 @@ lemma cprs_inv_lref1: ∀G,L,T2,i. ⦃G, L⦄ ⊢ #i ➡* T2 → elim (cpr_inv_lref1 … HT2) -HT2 /2 width=1 by or_introl/ * /4 width=6 by cpr_cprs, ex3_3_intro, or_intror/ | * #K #V1 #T1 #HLK #HVT1 #HT1 - lapply (ldrop_fwd_drop2 … HLK) #H0LK + lapply (drop_fwd_drop2 … HLK) #H0LK elim (cpr_inv_lift1 … HT2 … H0LK … HT1) -H0LK -T /4 width=6 by cprs_strap1, ex3_3_intro, or_intror/ ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_cpxs.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_cpxs.ma index b6431c294..a19c92545 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_cpxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_cpxs.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/reduction/lpx_ldrop.ma". +include "basic_2/reduction/lpx_drop.ma". include "basic_2/computation/cpxs_lift.ma". (* CONTEXT-SENSITIVE EXTENDED PARALLEL COMPUTATION ON TERMS *****************) @@ -98,7 +98,7 @@ lemma lpx_cpx_trans: ∀h,g,G. s_r_transitive … (cpx h g G) (λ_.lpx h g G). [ /2 width=3 by/ | /3 width=2 by cpx_cpxs, cpx_st/ | #I #G #L2 #K2 #V0 #V2 #W2 #i #HLK2 #_ #HVW2 #IHV02 #L1 #HL12 - elim (lpx_ldrop_trans_O1 … HL12 … HLK2) -L2 #X #HLK1 #H + elim (lpx_drop_trans_O1 … HL12 … HLK2) -L2 #X #HLK1 #H elim (lpx_inv_pair2 … H) -H #K1 #V1 #HK12 #HV10 #H destruct /4 width=7 by cpxs_delta, cpxs_strap2/ |4,9: /4 width=1 by cpxs_beta, cpxs_bind, lpx_pair/ @@ -132,7 +132,7 @@ lemma fqu_cpxs_trans_neq: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, #h #g #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #V1 #V2 #HV12 #_ elim (lift_total V2 0 1) #U2 #HVU2 @(ex3_intro … U2) - [1,3: /3 width=7 by fqu_drop, cpxs_delta, ldrop_pair, ldrop_drop/ + [1,3: /3 width=7 by fqu_drop, cpxs_delta, drop_pair, drop_drop/ | #H destruct /2 width=7 by lift_inv_lref2_be/ ] | #I #G #L #V1 #T #V2 #HV12 #H @(ex3_intro … (②{I}V2.T)) diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_lift.ma index 519bc587e..6bf2413fb 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_lift.ma @@ -37,7 +37,7 @@ lemma cpxs_delta: ∀h,g,I,G,L,K,V,V2,i. ∀W2. ⇧[0, i+1] V2 ≡ W2 → ⦃G, L⦄ ⊢ #i ➡*[h, g] W2. #h #g #I #G #L #K #V #V2 #i #HLK #H elim H -V2 [ /3 width=9 by cpx_cpxs, cpx_delta/ -| #V1 lapply (ldrop_fwd_drop2 … HLK) -HLK +| #V1 lapply (drop_fwd_drop2 … HLK) -HLK elim (lift_total V1 0 (i+1)) /4 width=12 by cpx_lift, cpxs_strap1/ ] qed. @@ -54,7 +54,7 @@ lemma cpxs_inv_lref1: ∀h,g,G,L,T2,i. ⦃G, L⦄ ⊢ #i ➡*[h, g] T2 → elim (cpx_inv_lref1 … HT2) -HT2 /2 width=1 by or_introl/ * /4 width=7 by cpx_cpxs, ex3_4_intro, or_intror/ | * #I #K #V1 #T1 #HLK #HVT1 #HT1 - lapply (ldrop_fwd_drop2 … HLK) #H0LK + lapply (drop_fwd_drop2 … HLK) #H0LK elim (cpx_inv_lift1 … HT2 … H0LK … HT1) -H0LK -T /4 width=7 by cpxs_strap1, ex3_4_intro, or_intror/ ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_tstc.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_tstc.ma index c0a202ae5..6f7bf6038 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_tstc.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_tstc.ma @@ -19,13 +19,13 @@ include "basic_2/computation/lpxs_cpxs.ma". (* Forward lemmas involving same top term constructor ***********************) -lemma cpxs_fwd_cnx: ∀h,g,G,L,T. ⦃G, L⦄ ⊢ ➡[h, g] 𝐍⦃T⦄ → ∀U. ⦃G, L⦄ ⊢ T ➡*[h, g] U → T ≃ U. +lemma cpxs_fwd_cnx: ∀h,g,G,L,T. ⦃G, L⦄ ⊢ ➡[h, g] 𝐍⦃T⦄ → ∀U. ⦃G, L⦄ ⊢ T ➡*[h, g] U → T ≂ U. #h #g #G #L #T #HT #U #H >(cpxs_inv_cnx1 … H HT) -G -L -T // qed-. lemma cpxs_fwd_sort: ∀h,g,G,L,U,k. ⦃G, L⦄ ⊢ ⋆k ➡*[h, g] U → - ⋆k ≃ U ∨ ⦃G, L⦄ ⊢ ⋆(next h k) ➡*[h, g] U. + ⋆k ≂ U ∨ ⦃G, L⦄ ⊢ ⋆(next h k) ➡*[h, g] U. #h #g #G #L #U #k #H elim (cpxs_inv_sort1 … H) -H #n #l generalize in match k; -k @(nat_ind_plus … n) -n [ #k #_ #H -l destruct /2 width=1 by or_introl/ @@ -42,7 +42,7 @@ qed-. (* Basic_1: was just: pr3_iso_beta *) lemma cpxs_fwd_beta: ∀h,g,a,G,L,V,W,T,U. ⦃G, L⦄ ⊢ ⓐV.ⓛ{a}W.T ➡*[h, g] U → - ⓐV.ⓛ{a}W.T ≃ U ∨ ⦃G, L⦄ ⊢ ⓓ{a}ⓝW.V.T ➡*[h, g] U. + ⓐV.ⓛ{a}W.T ≂ U ∨ ⦃G, L⦄ ⊢ ⓓ{a}ⓝW.V.T ➡*[h, g] U. #h #g #a #G #L #V #W #T #U #H elim (cpxs_inv_appl1 … H) -H * [ #V0 #T0 #_ #_ #H destruct /2 width=1 by tstc_pair, or_introl/ @@ -59,16 +59,16 @@ qed-. lemma cpxs_fwd_delta: ∀h,g,I,G,L,K,V1,i. ⇩[i] L ≡ K.ⓑ{I}V1 → ∀V2. ⇧[0, i + 1] V1 ≡ V2 → ∀U. ⦃G, L⦄ ⊢ #i ➡*[h, g] U → - #i ≃ U ∨ ⦃G, L⦄ ⊢ V2 ➡*[h, g] U. + #i ≂ U ∨ ⦃G, L⦄ ⊢ V2 ➡*[h, g] U. #h #g #I #G #L #K #V1 #i #HLK #V2 #HV12 #U #H elim (cpxs_inv_lref1 … H) -H /2 width=1 by or_introl/ * #I0 #K0 #V0 #U0 #HLK0 #HVU0 #HU0 -lapply (ldrop_mono … HLK0 … HLK) -HLK0 #H destruct -/4 width=10 by cpxs_lift, ldrop_fwd_drop2, or_intror/ +lapply (drop_mono … HLK0 … HLK) -HLK0 #H destruct +/4 width=10 by cpxs_lift, drop_fwd_drop2, or_intror/ qed-. lemma cpxs_fwd_theta: ∀h,g,a,G,L,V1,V,T,U. ⦃G, L⦄ ⊢ ⓐV1.ⓓ{a}V.T ➡*[h, g] U → - ∀V2. ⇧[0, 1] V1 ≡ V2 → ⓐV1.ⓓ{a}V.T ≃ U ∨ + ∀V2. ⇧[0, 1] V1 ≡ V2 → ⓐV1.ⓓ{a}V.T ≂ U ∨ ⦃G, L⦄ ⊢ ⓓ{a}V.ⓐV2.T ➡*[h, g] U. #h #g #a #G #L #V1 #V #T #U #H #V2 #HV12 elim (cpxs_inv_appl1 … H) -H * @@ -88,10 +88,10 @@ elim (cpxs_inv_appl1 … H) -H * elim (cpxs_inv_abbr1 … HT0) -HT0 * [ #V5 #T5 #HV5 #HT5 #H destruct lapply (cpxs_lift … HV13 (L.ⓓV) … HV12 … HV34) -V1 -V3 - /3 width=2 by cpxs_flat, cpxs_bind, ldrop_drop/ + /3 width=2 by cpxs_flat, cpxs_bind, drop_drop/ | #X #HT1 #H #H0 destruct elim (lift_inv_bind1 … H) -H #V5 #T5 #HV05 #HT05 #H destruct - lapply (cpxs_lift … HV13 (L.ⓓV0) … HV12 … HV34) -V3 /2 width=2 by ldrop_drop/ #HV24 + lapply (cpxs_lift … HV13 (L.ⓓV0) … HV12 … HV34) -V3 /2 width=2 by drop_drop/ #HV24 @(cpxs_trans … (+ⓓV.ⓐV2.ⓓ{b}V5.T5)) [ /3 width=1 by cpxs_flat_dx, cpxs_bind_dx/ ] -T @(cpxs_strap2 … (ⓐV1.ⓓ{b}V0.T0)) [ /4 width=7 by cpx_zeta, lift_bind, lift_flat/ ] -V -V5 -T5 @(cpxs_strap2 … (ⓓ{b}V0.ⓐV2.T0)) /3 width=3 by cpxs_pair_sn, cpxs_bind_dx, cpr_cpx, cpr_theta/ @@ -100,7 +100,7 @@ elim (cpxs_inv_appl1 … H) -H * qed-. lemma cpxs_fwd_cast: ∀h,g,G,L,W,T,U. ⦃G, L⦄ ⊢ ⓝW.T ➡*[h, g] U → - ∨∨ ⓝW. T ≃ U | ⦃G, L⦄ ⊢ T ➡*[h, g] U | ⦃G, L⦄ ⊢ W ➡*[h, g] U. + ∨∨ ⓝW. T ≂ U | ⦃G, L⦄ ⊢ T ➡*[h, g] U | ⦃G, L⦄ ⊢ W ➡*[h, g] U. #h #g #G #L #W #T #U #H elim (cpxs_inv_cast1 … H) -H /2 width=1 by or3_intro1, or3_intro2/ * #W0 #T0 #_ #_ #H destruct /2 width=1 by tstc_pair, or3_intro0/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_tstc_vector.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_tstc_vector.ma index 55ea0dff9..08d284d97 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_tstc_vector.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/cpxs_tstc_vector.ma @@ -22,7 +22,7 @@ include "basic_2/computation/cpxs_tstc.ma". (* Basic_1: was just: nf2_iso_appls_lref *) lemma cpxs_fwd_cnx_vector: ∀h,g,G,L,T. 𝐒⦃T⦄ → ⦃G, L⦄ ⊢ ➡[h, g] 𝐍⦃T⦄ → - ∀Vs,U. ⦃G, L⦄ ⊢ ⒶVs.T ➡*[h, g] U → ⒶVs.T ≃ U. + ∀Vs,U. ⦃G, L⦄ ⊢ ⒶVs.T ➡*[h, g] U → ⒶVs.T ≂ U. #h #g #G #L #T #H1T #H2T #Vs elim Vs -Vs [ @(cpxs_fwd_cnx … H2T) ] (**) (* /2 width=3 by cpxs_fwd_cnx/ does not work *) #V #Vs #IHVs #U #H elim (cpxs_inv_appl1 … H) -H * @@ -37,7 +37,7 @@ elim (cpxs_inv_appl1 … H) -H * qed-. lemma cpxs_fwd_sort_vector: ∀h,g,G,L,k,Vs,U. ⦃G, L⦄ ⊢ ⒶVs.⋆k ➡*[h, g] U → - ⒶVs.⋆k ≃ U ∨ ⦃G, L⦄ ⊢ ⒶVs.⋆(next h k) ➡*[h, g] U. + ⒶVs.⋆k ≂ U ∨ ⦃G, L⦄ ⊢ ⒶVs.⋆(next h k) ➡*[h, g] U. #h #g #G #L #k #Vs elim Vs -Vs /2 width=1 by cpxs_fwd_sort/ #V #Vs #IHVs #U #H elim (cpxs_inv_appl1 … H) -H * @@ -62,7 +62,7 @@ qed-. (* Basic_1: was just: pr3_iso_appls_beta *) lemma cpxs_fwd_beta_vector: ∀h,g,a,G,L,Vs,V,W,T,U. ⦃G, L⦄ ⊢ ⒶVs.ⓐV.ⓛ{a}W.T ➡*[h, g] U → - ⒶVs. ⓐV. ⓛ{a}W. T ≃ U ∨ ⦃G, L⦄ ⊢ ⒶVs.ⓓ{a}ⓝW.V.T ➡*[h, g] U. + ⒶVs. ⓐV. ⓛ{a}W. T ≂ U ∨ ⦃G, L⦄ ⊢ ⒶVs.ⓓ{a}ⓝW.V.T ➡*[h, g] U. #h #g #a #G #L #Vs elim Vs -Vs /2 width=1 by cpxs_fwd_beta/ #V0 #Vs #IHVs #V #W #T #U #H elim (cpxs_inv_appl1 … H) -H * @@ -87,7 +87,7 @@ qed-. lemma cpxs_fwd_delta_vector: ∀h,g,I,G,L,K,V1,i. ⇩[i] L ≡ K.ⓑ{I}V1 → ∀V2. ⇧[0, i + 1] V1 ≡ V2 → ∀Vs,U. ⦃G, L⦄ ⊢ ⒶVs.#i ➡*[h, g] U → - ⒶVs.#i ≃ U ∨ ⦃G, L⦄ ⊢ ⒶVs.V2 ➡*[h, g] U. + ⒶVs.#i ≂ U ∨ ⦃G, L⦄ ⊢ ⒶVs.V2 ➡*[h, g] U. #h #g #I #G #L #K #V1 #i #HLK #V2 #HV12 #Vs elim Vs -Vs /2 width=5 by cpxs_fwd_delta/ #V #Vs #IHVs #U #H -K -V1 elim (cpxs_inv_appl1 … H) -H * @@ -112,7 +112,7 @@ qed-. (* Basic_1: was just: pr3_iso_appls_abbr *) lemma cpxs_fwd_theta_vector: ∀h,g,G,L,V1s,V2s. ⇧[0, 1] V1s ≡ V2s → ∀a,V,T,U. ⦃G, L⦄ ⊢ ⒶV1s.ⓓ{a}V.T ➡*[h, g] U → - ⒶV1s. ⓓ{a}V. T ≃ U ∨ ⦃G, L⦄ ⊢ ⓓ{a}V.ⒶV2s.T ➡*[h, g] U. + ⒶV1s. ⓓ{a}V. T ≂ U ∨ ⦃G, L⦄ ⊢ ⓓ{a}V.ⒶV2s.T ➡*[h, g] U. #h #g #G #L #V1s #V2s * -V1s -V2s /3 width=1 by or_intror/ #V1s #V2s #V1a #V2a #HV12a #HV12s #a generalize in match HV12a; -HV12a @@ -145,11 +145,11 @@ elim (cpxs_inv_appl1 … H) -H * @(cpxs_trans … HU) -U elim (cpxs_inv_abbr1 … HT0) -HT0 * [ #V1 #T1 #HV1 #HT1 #H destruct - lapply (cpxs_lift … HV10a (L.ⓓV) (Ⓣ) … HV12a … HV0a) -V1a -V0a [ /2 width=1 by ldrop_drop/ ] #HV2a + lapply (cpxs_lift … HV10a (L.ⓓV) (Ⓣ) … HV12a … HV0a) -V1a -V0a [ /2 width=1 by drop_drop/ ] #HV2a @(cpxs_trans … (ⓓ{a}V.ⓐV2a.T1)) /3 width=1 by cpxs_bind, cpxs_pair_sn, cpxs_flat_dx, cpxs_bind_dx/ | #X #HT1 #H #H0 destruct elim (lift_inv_bind1 … H) -H #V1 #T1 #HW01 #HT01 #H destruct - lapply (cpxs_lift … HV10a (L.ⓓV0) (Ⓣ) … HV12a … HV0a) -V0a [ /2 width=1 by ldrop_drop/ ] #HV2a + lapply (cpxs_lift … HV10a (L.ⓓV0) (Ⓣ) … HV12a … HV0a) -V0a [ /2 width=1 by drop_drop/ ] #HV2a @(cpxs_trans … (+ⓓV.ⓐV2a.ⓓ{b}V1.T1)) [ /3 width=1 by cpxs_flat_dx, cpxs_bind_dx/ ] -T -V2b -V2s @(cpxs_strap2 … (ⓐV1a.ⓓ{b}V0.T0)) [ /4 width=7 by cpx_zeta, lift_bind, lift_flat/ ] -V -V1 -T1 @(cpxs_strap2 … (ⓓ{b}V0.ⓐV2a.T0)) /3 width=3 by cpxs_pair_sn, cpxs_bind_dx, cpr_cpx, cpr_theta/ @@ -160,7 +160,7 @@ qed-. (* Basic_1: was just: pr3_iso_appls_cast *) lemma cpxs_fwd_cast_vector: ∀h,g,G,L,Vs,W,T,U. ⦃G, L⦄ ⊢ ⒶVs.ⓝW.T ➡*[h, g] U → - ∨∨ ⒶVs. ⓝW. T ≃ U + ∨∨ ⒶVs. ⓝW. T ≂ U | ⦃G, L⦄ ⊢ ⒶVs.T ➡*[h, g] U | ⦃G, L⦄ ⊢ ⒶVs.W ➡*[h, g] U. #h #g #G #L #Vs elim Vs -Vs /2 width=1 by cpxs_fwd_cast/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/csx_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/csx_lift.ma index 2d74a929e..53ef87282 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/csx_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/csx_lift.ma @@ -48,7 +48,7 @@ lemma csx_inv_lref_bind: ∀h,g,I,G,L,K,V,i. ⇩[i] L ≡ K.ⓑ{I}V → ⦃G, L⦄ ⊢ ⬊*[h, g] #i → ⦃G, K⦄ ⊢ ⬊*[h, g] V. #h #g #I #G #L #K #V #i #HLK #Hi elim (lift_total V 0 (i+1)) -/4 width=9 by csx_inv_lift, csx_cpx_trans, cpx_delta, ldrop_fwd_drop2/ +/4 width=9 by csx_inv_lift, csx_cpx_trans, cpx_delta, drop_fwd_drop2/ qed-. (* Advanced properties ******************************************************) @@ -60,8 +60,8 @@ lemma csx_lref_bind: ∀h,g,I,G,L,K,V,i. ⇩[i] L ≡ K.ⓑ{I}V → ⦃G, K⦄ elim (cpx_inv_lref1 … H) -H [ #H destruct elim Hi // | -Hi * #I0 #K0 #V0 #V1 #HLK0 #HV01 #HV1 - lapply (ldrop_mono … HLK0 … HLK) -HLK #H destruct - /3 width=8 by csx_lift, csx_cpx_trans, ldrop_fwd_drop2/ + lapply (drop_mono … HLK0 … HLK) -HLK #H destruct + /3 width=8 by csx_lift, csx_cpx_trans, drop_fwd_drop2/ ] qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/csx_lpx.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/csx_lpx.ma index f8bf3c475..f3f78ccb5 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/csx_lpx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/csx_lpx.ma @@ -51,7 +51,7 @@ elim (cpx_inv_abbr1 … H1) -H1 * | -IHV -HLV1 * #H destruct /3 width=1 by cpx_cpxs/ ] | -IHV -IHT -H2 - /3 width=8 by csx_cpx_trans, csx_inv_lift, ldrop_drop/ + /3 width=8 by csx_cpx_trans, csx_inv_lift, drop_drop/ ] qed. @@ -96,17 +96,17 @@ elim (cpx_inv_appl1 … HL) -HL * | * #_ #H elim H // ] | -H -HVT #H - lapply (cpx_lift … HLV10 (L.ⓓV) (Ⓣ) … HV12 … HV04) -HLV10 -HV12 /2 width=1 by ldrop_drop/ #HV24 + lapply (cpx_lift … HLV10 (L.ⓓV) (Ⓣ) … HV12 … HV04) -HLV10 -HV12 /2 width=1 by drop_drop/ #HV24 @(IHVT … H … HV04) -IHVT /4 width=1 by cpx_cpxs, cpx_bind, cpx_flat/ ] | -H -IHVT #T0 #HLT0 #HT0 #H0 destruct lapply (csx_cpx_trans … HVT (ⓐV2.T0) ?) /2 width=1 by cpx_flat/ -T #HVT0 lapply (csx_inv_lift … L … (Ⓣ) … 1 HVT0 ? ? ?) -HVT0 - /3 width=5 by csx_cpx_trans, cpx_pair_sn, ldrop_drop, lift_flat/ + /3 width=5 by csx_cpx_trans, cpx_pair_sn, drop_drop, lift_flat/ ] | -HV -HV12 -HVT -IHVT -H #b #V0 #W0 #W1 #T0 #T1 #_ #_ #_ #H destruct | -IHVT -H #b #V0 #V3 #W0 #W1 #T0 #T1 #HLV10 #HV03 #HLW01 #HLT01 #H1 #H2 destruct - lapply (cpx_lift … HLV10 (L. ⓓW0) … HV12 … HV03) -HLV10 -HV12 -HV03 /2 width=2 by ldrop_drop/ #HLV23 + lapply (cpx_lift … HLV10 (L. ⓓW0) … HV12 … HV03) -HLV10 -HV12 -HV03 /2 width=2 by drop_drop/ #HLV23 @csx_abbr /2 width=3 by csx_cpx_trans/ -HV @(csx_lpx_conf … (L.ⓓW0)) /2 width=1 by lpx_pair/ -W1 /4 width=5 by csx_cpxs_trans, cpx_cpxs, cpx_flat/ @@ -119,7 +119,7 @@ lemma csx_appl_theta: ∀h,g,a,V1,V2. ⇧[0, 1] V1 ≡ V2 → (* Basic_1: was just: sn3_appl_appl *) lemma csx_appl_simple_tstc: ∀h,g,G,L,V. ⦃G, L⦄ ⊢ ⬊*[h, g] V → ∀T1. ⦃G, L⦄ ⊢ ⬊*[h, g] T1 → - (∀T2. ⦃G, L⦄ ⊢ T1 ➡*[h, g] T2 → (T1 ≃ T2 → ⊥) → ⦃G, L⦄ ⊢ ⬊*[h, g] ⓐV.T2) → + (∀T2. ⦃G, L⦄ ⊢ T1 ➡*[h, g] T2 → (T1 ≂ T2 → ⊥) → ⦃G, L⦄ ⊢ ⬊*[h, g] ⓐV.T2) → 𝐒⦃T1⦄ → ⦃G, L⦄ ⊢ ⬊*[h, g] ⓐV.T1. #h #g #G #L #V #H @(csx_ind … H) -V #V #_ #IHV #T1 #H @(csx_ind … H) -T1 #T1 #H1T1 #IHT1 #H2T1 #H3T1 @csx_intro #X #HL #H diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/csx_tstc_vector.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/csx_tstc_vector.ma index 5ce3e142a..982a915cc 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/csx_tstc_vector.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/csx_tstc_vector.ma @@ -67,7 +67,7 @@ lemma csx_applv_delta: ∀h,g,I,G,L,K,V1,i. ⇩[i] L ≡ K.ⓑ{I}V1 → ∀V2. ⇧[0, i + 1] V1 ≡ V2 → ∀Vs. ⦃G, L⦄ ⊢ ⬊*[h, g] (ⒶVs.V2) → ⦃G, L⦄ ⊢ ⬊*[h, g] (ⒶVs.#i). #h #g #I #G #L #K #V1 #i #HLK #V2 #HV12 #Vs elim Vs -Vs -[ /4 width=12 by csx_inv_lift, csx_lref_bind, ldrop_fwd_drop2/ +[ /4 width=12 by csx_inv_lift, csx_lref_bind, drop_fwd_drop2/ | #V #Vs #IHV #H1T lapply (csx_fwd_pair_sn … H1T) #HV lapply (csx_fwd_flat_dx … H1T) #H2T diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lcosx.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lcosx.ma index a1e27d0b1..79e147a75 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lcosx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lcosx.ma @@ -34,14 +34,14 @@ lemma lcosx_O: ∀h,g,G,L. G ⊢ ~⬊*[h, g, 0] L. #h #g #G #L elim L /2 width=1 by lcosx_skip/ qed. -lemma lcosx_ldrop_trans_lt: ∀h,g,G,L,d. G ⊢ ~⬊*[h, g, d] L → +lemma lcosx_drop_trans_lt: ∀h,g,G,L,d. G ⊢ ~⬊*[h, g, d] L → ∀I,K,V,i. ⇩[i] L ≡ K.ⓑ{I}V → i < d → G ⊢ ~⬊*[h, g, ⫰(d-i)] K ∧ G ⊢ ⬊*[h, g, V, ⫰(d-i)] K. #h #g #G #L #d #H elim H -L -d -[ #d #J #K #V #i #H elim (ldrop_inv_atom1 … H) -H #H destruct +[ #d #J #K #V #i #H elim (drop_inv_atom1 … H) -H #H destruct | #I #L #T #_ #_ #J #K #V #i #_ #H elim (ylt_yle_false … H) -H // | #I #L #T #d #HT #HL #IHL #J #K #V #i #H #Hid - elim (ldrop_inv_O1_pair1 … H) -H * #Hi #HLK destruct + elim (drop_inv_O1_pair1 … H) -H * #Hi #HLK destruct [ >ypred_succ /2 width=1 by conj/ | lapply (ylt_pred … Hid ?) -Hid /2 width=1 by ylt_inj/ >ypred_succ #Hid elim (IHL … HLK ?) -IHL -HLK yminus_SO2 // diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lcosx_cpx.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lcosx_cpx.ma index e78ae1b4f..8583b9dea 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lcosx_cpx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lcosx_cpx.ma @@ -13,7 +13,7 @@ (**************************************************************************) include "ground_2/ynat/ynat_max.ma". -include "basic_2/computation/lsx_ldrop.ma". +include "basic_2/computation/lsx_drop.ma". include "basic_2/computation/lsx_lpx.ma". include "basic_2/computation/lsx_lpxs.ma". include "basic_2/computation/lcosx.ma". @@ -29,10 +29,10 @@ lemma lsx_cpx_trans_lcosx: ∀h,g,G,L,T1,T2. ⦃G, L⦄ ⊢ T1 ➡[h, g] T2 → [ #I #G #L #K #V1 #V2 #W2 #i #HLK #_ #HVW2 #IHV12 #d #HL #H elim (ylt_split i d) #Hdi [ -H | -HL ] [ <(ymax_pre_sn d (⫯i)) /2 width=1 by ylt_fwd_le_succ/ - elim (lcosx_ldrop_trans_lt … HL … HLK) // -HL -Hdi - lapply (ldrop_fwd_drop2 … HLK) -HLK /3 width=7 by lsx_lift_ge/ + elim (lcosx_drop_trans_lt … HL … HLK) // -HL -Hdi + lapply (drop_fwd_drop2 … HLK) -HLK /3 width=7 by lsx_lift_ge/ | lapply (lsx_fwd_lref_be … H … HLK) // -H -Hdi - lapply (ldrop_fwd_drop2 … HLK) -HLK + lapply (drop_fwd_drop2 … HLK) -HLK /4 width=10 by lsx_ge, lsx_lift_le/ ] | #a #I #G #L #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #d #HL #H @@ -43,7 +43,7 @@ lemma lsx_cpx_trans_lcosx: ∀h,g,G,L,T1,T2. ⦃G, L⦄ ⊢ T1 ➡[h, g] T2 → elim (lsx_inv_flat … H) -H /3 width=1 by lsx_flat/ | #G #L #V #U1 #U2 #T2 #_ #HTU2 #IHU12 #d #HL #H elim (lsx_inv_bind … H) -H - /4 width=9 by lcosx_pair, lsx_inv_lift_ge, ldrop_drop/ + /4 width=9 by lcosx_pair, lsx_inv_lift_ge, drop_drop/ | #G #L #V #T1 #T2 #_ #IHT12 #d #HL #H elim (lsx_inv_flat … H) -H /2 width=1 by/ | #G #L #V1 #V2 #T #_ #IHV12 #d #HL #H @@ -57,7 +57,7 @@ lemma lsx_cpx_trans_lcosx: ∀h,g,G,L,T1,T2. ⦃G, L⦄ ⊢ T1 ➡[h, g] T2 → elim (lsx_inv_flat … H) -H #HV1 #H elim (lsx_inv_bind … H) -H #HW1 #HT1 @lsx_bind /2 width=1 by/ (**) (* explicit constructor *) - @lsx_flat [ /3 width=7 by lsx_lift_ge, ldrop_drop/ ] + @lsx_flat [ /3 width=7 by lsx_lift_ge, drop_drop/ ] @(lsx_leq_conf … (L.ⓓW1)) /3 width=1 by lcosx_pair, leq_succ/ ] qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_cprs.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_cprs.ma index 1bcb46d37..46c7d1250 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_cprs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_cprs.ma @@ -131,7 +131,7 @@ lemma cprs_inv_abbr1: ∀a,G,L,V1,T1,U2. ⦃G, L⦄ ⊢ ⓓ{a}V1.T1 ➡* U2 → ] | #U1 #HTU1 #HU01 elim (lift_total U2 0 1) #U #HU2 lapply (cpr_lift … HU02 (L.ⓓV1) … HU01 … HU2) -U0 - /4 width=3 by cprs_strap1, ldrop_drop, ex3_intro, or_intror/ + /4 width=3 by cprs_strap1, drop_drop, ex3_intro, or_intror/ ] qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_drop.ma new file mode 100644 index 000000000..139017f20 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_drop.ma @@ -0,0 +1,29 @@ +(**************************************************************************) +(* ___ *) +(* ||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/reduction/lpr_drop.ma". +include "basic_2/computation/lprs.ma". + +(* SN PARALLEL COMPUTATION ON LOCAL ENVIRONMENTS ****************************) + +(* Properies on local environment slicing ***********************************) + +lemma lprs_drop_conf: ∀G. dropable_sn (lprs G). +/3 width=3 by dropable_sn_TC, lpr_drop_conf/ qed-. + +lemma drop_lprs_trans: ∀G. dedropable_sn (lprs G). +/3 width=3 by dedropable_sn_TC, drop_lpr_trans/ qed-. + +lemma lprs_drop_trans_O1: ∀G. dropable_dx (lprs G). +/3 width=3 by dropable_dx_TC, lpr_drop_trans_O1/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_ldrop.ma deleted file mode 100644 index f03d3f0e8..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lprs_ldrop.ma +++ /dev/null @@ -1,29 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/reduction/lpr_ldrop.ma". -include "basic_2/computation/lprs.ma". - -(* SN PARALLEL COMPUTATION ON LOCAL ENVIRONMENTS ****************************) - -(* Properies on local environment slicing ***********************************) - -lemma lprs_ldrop_conf: ∀G. dropable_sn (lprs G). -/3 width=3 by dropable_sn_TC, lpr_ldrop_conf/ qed-. - -lemma ldrop_lprs_trans: ∀G. dedropable_sn (lprs G). -/3 width=3 by dedropable_sn_TC, ldrop_lpr_trans/ qed-. - -lemma lprs_ldrop_trans_O1: ∀G. dropable_dx (lprs G). -/3 width=3 by dropable_dx_TC, lpr_ldrop_trans_O1/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_cpxs.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_cpxs.ma index d6e614042..147bef745 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_cpxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_cpxs.ma @@ -91,7 +91,7 @@ lemma cpxs_inv_abbr1: ∀h,g,a,G,L,V1,T1,U2. ⦃G, L⦄ ⊢ ⓓ{a}V1.T1 ➡*[h, ] | #U1 #HTU1 #HU01 elim (lift_total U2 0 1) #U #HU2 - /6 width=12 by cpxs_strap1, cpx_lift, ldrop_drop, ex3_intro, or_intror/ + /6 width=12 by cpxs_strap1, cpx_lift, drop_drop, ex3_intro, or_intror/ ] qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_drop.ma new file mode 100644 index 000000000..1b760d856 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_drop.ma @@ -0,0 +1,29 @@ +(**************************************************************************) +(* ___ *) +(* ||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/reduction/lpx_drop.ma". +include "basic_2/computation/lpxs.ma". + +(* SN EXTENDED PARALLEL COMPUTATION ON LOCAL ENVIRONMENTS *******************) + +(* Properies on local environment slicing ***********************************) + +lemma lpxs_drop_conf: ∀h,g,G. dropable_sn (lpxs h g G). +/3 width=3 by dropable_sn_TC, lpx_drop_conf/ qed-. + +lemma drop_lpxs_trans: ∀h,g,G. dedropable_sn (lpxs h g G). +/3 width=3 by dedropable_sn_TC, drop_lpx_trans/ qed-. + +lemma lpxs_drop_trans_O1: ∀h,g,G. dropable_dx (lpxs h g G). +/3 width=3 by dropable_dx_TC, lpx_drop_trans_O1/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_ldrop.ma deleted file mode 100644 index d8c489017..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_ldrop.ma +++ /dev/null @@ -1,29 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/reduction/lpx_ldrop.ma". -include "basic_2/computation/lpxs.ma". - -(* SN EXTENDED PARALLEL COMPUTATION ON LOCAL ENVIRONMENTS *******************) - -(* Properies on local environment slicing ***********************************) - -lemma lpxs_ldrop_conf: ∀h,g,G. dropable_sn (lpxs h g G). -/3 width=3 by dropable_sn_TC, lpx_ldrop_conf/ qed-. - -lemma ldrop_lpxs_trans: ∀h,g,G. dedropable_sn (lpxs h g G). -/3 width=3 by dedropable_sn_TC, ldrop_lpx_trans/ qed-. - -lemma lpxs_ldrop_trans_O1: ∀h,g,G. dropable_dx (lpxs h g G). -/3 width=3 by dropable_dx_TC, lpx_ldrop_trans_O1/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_lleq.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_lleq.ma index 9a5b0cc91..42e34097a 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_lleq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lpxs_lleq.ma @@ -14,7 +14,7 @@ include "basic_2/reduction/lpx_lleq.ma". include "basic_2/computation/cpxs_leq.ma". -include "basic_2/computation/lpxs_ldrop.ma". +include "basic_2/computation/lpxs_drop.ma". include "basic_2/computation/lpxs_cpxs.ma". (* SN EXTENDED PARALLEL COMPUTATION FOR LOCAL ENVIRONMENTS ******************) @@ -37,7 +37,7 @@ lemma lpxs_lleq_fqu_trans: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, [ #I #G1 #L1 #V1 #X #H1 #H2 elim (lpxs_inv_pair2 … H1) -H1 #K0 #V0 #H1KL1 #_ #H destruct elim (lleq_inv_lref_ge_dx … H2 ? I L1 V1) -H2 // - #K1 #H #H2KL1 lapply (ldrop_inv_O2 … H) -H #H destruct + #K1 #H #H2KL1 lapply (drop_inv_O2 … H) -H #H destruct /2 width=4 by fqu_lref_O, ex3_intro/ | * [ #a ] #I #G1 #L1 #V1 #T1 #K1 #HLK1 #H [ elim (lleq_inv_bind … H) @@ -48,12 +48,12 @@ lemma lpxs_lleq_fqu_trans: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, | #I #G1 #L1 #V1 #T1 #K1 #HLK1 #H elim (lleq_inv_flat … H) -H /2 width=4 by fqu_flat_dx, ex3_intro/ | #G1 #L1 #L #T1 #U1 #e #HL1 #HTU1 #K1 #H1KL1 #H2KL1 - elim (ldrop_O1_le (Ⓕ) (e+1) K1) + elim (drop_O1_le (Ⓕ) (e+1) K1) [ #K #HK1 lapply (lleq_inv_lift_le … H2KL1 … HK1 HL1 … HTU1 ?) -H2KL1 // - #H2KL elim (lpxs_ldrop_trans_O1 … H1KL1 … HL1) -L1 - #K0 #HK10 #H1KL lapply (ldrop_mono … HK10 … HK1) -HK10 #H destruct + #H2KL elim (lpxs_drop_trans_O1 … H1KL1 … HL1) -L1 + #K0 #HK10 #H1KL lapply (drop_mono … HK10 … HK1) -HK10 #H destruct /3 width=4 by fqu_drop, ex3_intro/ - | lapply (ldrop_fwd_length_le2 … HL1) -L -T1 -g + | lapply (drop_fwd_length_le2 … HL1) -L -T1 -g lapply (lleq_fwd_length … H2KL1) // ] ] @@ -93,9 +93,9 @@ elim (fqus_inv_gen … H) -H ] qed-. -fact leq_lpxs_trans_lleq_aux: ∀h,g,G,L1,L0,d,e. L1 ≃[d, e] L0 → e = ∞ → +fact leq_lpxs_trans_lleq_aux: ∀h,g,G,L1,L0,d,e. L1 ⩬[d, e] L0 → e = ∞ → ∀L2. ⦃G, L0⦄ ⊢ ➡*[h, g] L2 → - ∃∃L. L ≃[d, e] L2 & ⦃G, L1⦄ ⊢ ➡*[h, g] L & + ∃∃L. L ⩬[d, e] L2 & ⦃G, L1⦄ ⊢ ➡*[h, g] L & (∀T. L0 ≡[T, d] L2 ↔ L1 ≡[T, d] L). #h #g #G #L1 #L0 #d #e #H elim H -L1 -L0 -d -e [ #d #e #_ #L2 #H >(lpxs_inv_atom1 … H) -H @@ -117,8 +117,8 @@ fact leq_lpxs_trans_lleq_aux: ∀h,g,G,L1,L0,d,e. L1 ≃[d, e] L0 → e = ∞ ] qed-. -lemma leq_lpxs_trans_lleq: ∀h,g,G,L1,L0,d. L1 ≃[d, ∞] L0 → +lemma leq_lpxs_trans_lleq: ∀h,g,G,L1,L0,d. L1 ⩬[d, ∞] L0 → ∀L2. ⦃G, L0⦄ ⊢ ➡*[h, g] L2 → - ∃∃L. L ≃[d, ∞] L2 & ⦃G, L1⦄ ⊢ ➡*[h, g] L & + ∃∃L. L ⩬[d, ∞] L2 & ⦃G, L1⦄ ⊢ ➡*[h, g] L & (∀T. L0 ≡[T, d] L2 ↔ L1 ≡[T, d] L). /2 width=1 by leq_lpxs_trans_lleq_aux/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_drop.ma new file mode 100644 index 000000000..6aa0c0117 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_drop.ma @@ -0,0 +1,72 @@ +(**************************************************************************) +(* ___ *) +(* ||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/static/aaa_lift.ma". +include "basic_2/computation/lsubc.ma". + +(* LOCAL ENVIRONMENT REFINEMENT FOR ABSTRACT CANDIDATES OF REDUCIBILITY *****) + +(* Properties concerning basic local environment slicing ********************) + +(* Basic_1: was: csubc_drop_conf_O *) +(* Note: the constant 0 can not be generalized *) +lemma lsubc_drop_O1_trans: ∀RP,G,L1,L2. G ⊢ L1 ⫃[RP] L2 → ∀K2,s,e. ⇩[s, 0, e] L2 ≡ K2 → + ∃∃K1. ⇩[s, 0, e] L1 ≡ K1 & G ⊢ K1 ⫃[RP] K2. +#RP #G #L1 #L2 #H elim H -L1 -L2 +[ #X #s #e #H elim (drop_inv_atom1 … H) -H /4 width=3 by drop_atom, ex2_intro/ +| #I #L1 #L2 #V #_ #IHL12 #X #s #e #H + elim (drop_inv_O1_pair1 … H) -H * #He #H destruct + [ elim (IHL12 L2 s 0) -IHL12 // #X #H <(drop_inv_O2 … H) -H + /3 width=3 by lsubc_pair, drop_pair, ex2_intro/ + | elim (IHL12 … H) -L2 /3 width=3 by drop_drop_lt, ex2_intro/ + ] +| #L1 #L2 #V #W #A #HV #H1W #H2W #_ #IHL12 #X #s #e #H + elim (drop_inv_O1_pair1 … H) -H * #He #H destruct + [ elim (IHL12 L2 s 0) -IHL12 // #X #H <(drop_inv_O2 … H) -H + /3 width=8 by lsubc_abbr, drop_pair, ex2_intro/ + | elim (IHL12 … H) -L2 /3 width=3 by drop_drop_lt, ex2_intro/ + ] +] +qed-. + +(* Basic_1: was: csubc_drop_conf_rev *) +lemma drop_lsubc_trans: ∀RR,RS,RP. + acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) → + ∀G,L1,K1,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ∀K2. G ⊢ K1 ⫃[RP] K2 → + ∃∃L2. G ⊢ L1 ⫃[RP] L2 & ⇩[Ⓕ, d, e] L2 ≡ K2. +#RR #RS #RP #Hacp #Hacr #G #L1 #K1 #d #e #H elim H -L1 -K1 -d -e +[ #d #e #He #X #H elim (lsubc_inv_atom1 … H) -H + >He /2 width=3 by ex2_intro/ +| #L1 #I #V1 #X #H + elim (lsubc_inv_pair1 … H) -H * + [ #K1 #HLK1 #H destruct /3 width=3 by lsubc_pair, drop_pair, ex2_intro/ + | #K1 #V #W1 #A #HV1 #H1W1 #H2W1 #HLK1 #H1 #H2 #H3 destruct + /3 width=4 by lsubc_abbr, drop_pair, ex2_intro/ + ] +| #I #L1 #K1 #V1 #e #_ #IHLK1 #K2 #HK12 + elim (IHLK1 … HK12) -K1 /3 width=5 by lsubc_pair, drop_drop, ex2_intro/ +| #I #L1 #K1 #V1 #V2 #d #e #HLK1 #HV21 #IHLK1 #X #H + elim (lsubc_inv_pair1 … H) -H * + [ #K2 #HK12 #H destruct + elim (IHLK1 … HK12) -K1 /3 width=5 by lsubc_pair, drop_skip, ex2_intro/ + | #K2 #V #W2 #A #HV2 #H1W2 #H2W2 #HK12 #H1 #H2 #H3 destruct + elim (lift_inv_flat1 … HV21) -HV21 #W3 #V3 #HW23 #HV3 #H destruct + elim (IHLK1 … HK12) #K #HL1K #HK2 + lapply (aacr_acr … Hacp Hacr A) -Hacp -Hacr #HA + lapply (s0 … HA … HV2 … HLK1 HV3) -HV2 + lapply (s0 … HA … H1W2 … HLK1 HW23) -H1W2 + /4 width=11 by lsubc_abbr, aaa_lift, drop_skip, ex2_intro/ + ] +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_drops.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_drops.ma new file mode 100644 index 000000000..90a7aa041 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_drops.ma @@ -0,0 +1,32 @@ +(**************************************************************************) +(* ___ *) +(* ||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/computation/lsubc_drop.ma". + +(* LOCAL ENVIRONMENT REFINEMENT FOR ABSTRACT CANDIDATES OF REDUCIBILITY *****) + +(* Properties concerning generic local environment slicing ******************) + +(* Basic_1: was: csubc_drop1_conf_rev *) +lemma drops_lsubc_trans: ∀RR,RS,RP. + acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) → + ∀G,L1,K1,des. ⇩*[Ⓕ, des] L1 ≡ K1 → ∀K2. G ⊢ K1 ⫃[RP] K2 → + ∃∃L2. G ⊢ L1 ⫃[RP] L2 & ⇩*[Ⓕ, des] L2 ≡ K2. +#RR #RS #RP #Hacp #Hacr #G #L1 #K1 #des #H elim H -L1 -K1 -des +[ /2 width=3 by drops_nil, ex2_intro/ +| #L1 #L #K1 #des #d #e #_ #HLK1 #IHL #K2 #HK12 + elim (drop_lsubc_trans … Hacp Hacr … HLK1 … HK12) -Hacp -Hacr -K1 #K #HLK #HK2 + elim (IHL … HLK) -IHL -HLK /3 width=5 by drops_cons, ex2_intro/ +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_ldrop.ma deleted file mode 100644 index 8680fe4f1..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_ldrop.ma +++ /dev/null @@ -1,72 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/static/aaa_lift.ma". -include "basic_2/computation/lsubc.ma". - -(* LOCAL ENVIRONMENT REFINEMENT FOR ABSTRACT CANDIDATES OF REDUCIBILITY *****) - -(* Properties concerning basic local environment slicing ********************) - -(* Basic_1: was: csubc_drop_conf_O *) -(* Note: the constant 0 can not be generalized *) -lemma lsubc_ldrop_O1_trans: ∀RP,G,L1,L2. G ⊢ L1 ⫃[RP] L2 → ∀K2,s,e. ⇩[s, 0, e] L2 ≡ K2 → - ∃∃K1. ⇩[s, 0, e] L1 ≡ K1 & G ⊢ K1 ⫃[RP] K2. -#RP #G #L1 #L2 #H elim H -L1 -L2 -[ #X #s #e #H elim (ldrop_inv_atom1 … H) -H /4 width=3 by ldrop_atom, ex2_intro/ -| #I #L1 #L2 #V #_ #IHL12 #X #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #H destruct - [ elim (IHL12 L2 s 0) -IHL12 // #X #H <(ldrop_inv_O2 … H) -H - /3 width=3 by lsubc_pair, ldrop_pair, ex2_intro/ - | elim (IHL12 … H) -L2 /3 width=3 by ldrop_drop_lt, ex2_intro/ - ] -| #L1 #L2 #V #W #A #HV #H1W #H2W #_ #IHL12 #X #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #H destruct - [ elim (IHL12 L2 s 0) -IHL12 // #X #H <(ldrop_inv_O2 … H) -H - /3 width=8 by lsubc_abbr, ldrop_pair, ex2_intro/ - | elim (IHL12 … H) -L2 /3 width=3 by ldrop_drop_lt, ex2_intro/ - ] -] -qed-. - -(* Basic_1: was: csubc_drop_conf_rev *) -lemma ldrop_lsubc_trans: ∀RR,RS,RP. - acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) → - ∀G,L1,K1,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ∀K2. G ⊢ K1 ⫃[RP] K2 → - ∃∃L2. G ⊢ L1 ⫃[RP] L2 & ⇩[Ⓕ, d, e] L2 ≡ K2. -#RR #RS #RP #Hacp #Hacr #G #L1 #K1 #d #e #H elim H -L1 -K1 -d -e -[ #d #e #He #X #H elim (lsubc_inv_atom1 … H) -H - >He /2 width=3 by ex2_intro/ -| #L1 #I #V1 #X #H - elim (lsubc_inv_pair1 … H) -H * - [ #K1 #HLK1 #H destruct /3 width=3 by lsubc_pair, ldrop_pair, ex2_intro/ - | #K1 #V #W1 #A #HV1 #H1W1 #H2W1 #HLK1 #H1 #H2 #H3 destruct - /3 width=4 by lsubc_abbr, ldrop_pair, ex2_intro/ - ] -| #I #L1 #K1 #V1 #e #_ #IHLK1 #K2 #HK12 - elim (IHLK1 … HK12) -K1 /3 width=5 by lsubc_pair, ldrop_drop, ex2_intro/ -| #I #L1 #K1 #V1 #V2 #d #e #HLK1 #HV21 #IHLK1 #X #H - elim (lsubc_inv_pair1 … H) -H * - [ #K2 #HK12 #H destruct - elim (IHLK1 … HK12) -K1 /3 width=5 by lsubc_pair, ldrop_skip, ex2_intro/ - | #K2 #V #W2 #A #HV2 #H1W2 #H2W2 #HK12 #H1 #H2 #H3 destruct - elim (lift_inv_flat1 … HV21) -HV21 #W3 #V3 #HW23 #HV3 #H destruct - elim (IHLK1 … HK12) #K #HL1K #HK2 - lapply (aacr_acr … Hacp Hacr A) -Hacp -Hacr #HA - lapply (s0 … HA … HV2 … HLK1 HV3) -HV2 - lapply (s0 … HA … H1W2 … HLK1 HW23) -H1W2 - /4 width=11 by lsubc_abbr, aaa_lift, ldrop_skip, ex2_intro/ - ] -] -qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_ldrops.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_ldrops.ma deleted file mode 100644 index 7f2fd1ccc..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lsubc_ldrops.ma +++ /dev/null @@ -1,32 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/computation/lsubc_ldrop.ma". - -(* LOCAL ENVIRONMENT REFINEMENT FOR ABSTRACT CANDIDATES OF REDUCIBILITY *****) - -(* Properties concerning generic local environment slicing ******************) - -(* Basic_1: was: csubc_drop1_conf_rev *) -lemma ldrops_lsubc_trans: ∀RR,RS,RP. - acp RR RS RP → acr RR RS RP (λG,L,T. RP G L T) → - ∀G,L1,K1,des. ⇩*[Ⓕ, des] L1 ≡ K1 → ∀K2. G ⊢ K1 ⫃[RP] K2 → - ∃∃L2. G ⊢ L1 ⫃[RP] L2 & ⇩*[Ⓕ, des] L2 ≡ K2. -#RR #RS #RP #Hacp #Hacr #G #L1 #K1 #des #H elim H -L1 -K1 -des -[ /2 width=3 by ldrops_nil, ex2_intro/ -| #L1 #L #K1 #des #d #e #_ #HLK1 #IHL #K2 #HK12 - elim (ldrop_lsubc_trans … Hacp Hacr … HLK1 … HK12) -Hacp -Hacr -K1 #K #HLK #HK2 - elim (IHL … HLK) -IHL -HLK /3 width=5 by ldrops_cons, ex2_intro/ -] -qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_csx.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_csx.ma index 843bea88b..7cb1fb56a 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_csx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_csx.ma @@ -25,7 +25,7 @@ lemma lsx_lref_be_lpxs: ∀h,g,I,G,K1,V,i,d. d ≤ yinj i → ⦃G, K1⦄ ⊢ #h #g #I #G #K1 #V #i #d #Hdi #H @(csx_ind_alt … H) -V #V0 #_ #IHV0 #K2 #H @(lsx_ind … H) -K2 #K0 #HK0 #IHK0 #HK10 #L0 #HLK0 @lsx_intro -#L2 #HL02 #HnL02 elim (lpx_ldrop_conf … HLK0 … HL02) -HL02 +#L2 #HL02 #HnL02 elim (lpx_drop_conf … HLK0 … HL02) -HL02 #Y #H #HLK2 elim (lpx_inv_pair1 … H) -H #K2 #V2 #HK02 #HV02 #H destruct elim (eq_term_dec V0 V2) #HnV02 destruct [ -IHV0 -HV02 -HK0 | -IHK0 -HnL02 -HLK0 ] @@ -48,7 +48,7 @@ theorem csx_lsx: ∀h,g,G,L,T. ⦃G, L⦄ ⊢ ⬊*[h, g] T → ∀d. G ⊢ ⬊*[ [ #i #HG #HL #HT #H #d destruct elim (lt_or_ge i (|L|)) /2 width=1 by lsx_lref_free/ elim (ylt_split i d) /2 width=1 by lsx_lref_skip/ - #Hdi #Hi elim (ldrop_O1_lt (Ⓕ) … Hi) -Hi + #Hdi #Hi elim (drop_O1_lt (Ⓕ) … Hi) -Hi #I #K #V #HLK lapply (csx_inv_lref_bind … HLK … H) -H /4 width=6 by lsx_lref_be, fqup_lref/ | #a #I #V #T #HG #HL #HT #H #d destruct diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_drop.ma new file mode 100644 index 000000000..d1fddee68 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_drop.ma @@ -0,0 +1,96 @@ +(**************************************************************************) +(* ___ *) +(* ||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/multiple/lleq_drop.ma". +include "basic_2/reduction/lpx_drop.ma". +include "basic_2/computation/lsx.ma". + +(* SN EXTENDED STRONGLY NORMALIZING LOCAL ENVIRONMENTS **********************) + +(* Advanced properties ******************************************************) + +lemma lsx_lref_free: ∀h,g,G,L,d,i. |L| ≤ i → G ⊢ ⬊*[h, g, #i, d] L. +#h #g #G #L1 #d #i #HL1 @lsx_intro +#L2 #HL12 #H elim H -H +/4 width=6 by lpx_fwd_length, lleq_free, le_repl_sn_conf_aux/ +qed. + +lemma lsx_lref_skip: ∀h,g,G,L,d,i. yinj i < d → G ⊢ ⬊*[h, g, #i, d] L. +#h #g #G #L1 #d #i #HL1 @lsx_intro +#L2 #HL12 #H elim H -H +/3 width=4 by lpx_fwd_length, lleq_skip/ +qed. + +(* Advanced forward lemmas **************************************************) + +lemma lsx_fwd_lref_be: ∀h,g,I,G,L,d,i. d ≤ yinj i → G ⊢ ⬊*[h, g, #i, d] L → + ∀K,V. ⇩[i] L ≡ K.ⓑ{I}V → G ⊢ ⬊*[h, g, V, 0] K. +#h #g #I #G #L #d #i #Hdi #H @(lsx_ind … H) -L +#L1 #_ #IHL1 #K1 #V #HLK1 @lsx_intro +#K2 #HK12 #HnK12 lapply (drop_fwd_drop2 … HLK1) +#H2LK1 elim (drop_lpx_trans … H2LK1 … HK12) -H2LK1 -HK12 +#L2 #HL12 #H2LK2 #H elim (leq_drop_conf_be … H … HLK1) -H /2 width=1 by ylt_inj/ +#Y #_ #HLK2 lapply (drop_fwd_drop2 … HLK2) +#HY lapply (drop_mono … HY … H2LK2) -HY -H2LK2 #H destruct +/4 width=10 by lleq_inv_lref_ge/ +qed-. + +(* Properties on relocation *************************************************) + +lemma lsx_lift_le: ∀h,g,G,K,T,U,dt,d,e. dt ≤ yinj d → + ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, T, dt] K → + ∀L. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, U, dt] L. +#h #g #G #K #T #U #dt #d #e #Hdtd #HTU #H @(lsx_ind … H) -K +#K1 #_ #IHK1 #L1 #HLK1 @lsx_intro +#L2 #HL12 #HnU elim (lpx_drop_conf … HLK1 … HL12) -HL12 +/4 width=10 by lleq_lift_le/ +qed-. + +lemma lsx_lift_ge: ∀h,g,G,K,T,U,dt,d,e. yinj d ≤ dt → + ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, T, dt] K → + ∀L. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, U, dt + e] L. +#h #g #G #K #T #U #dt #d #e #Hddt #HTU #H @(lsx_ind … H) -K +#K1 #_ #IHK1 #L1 #HLK1 @lsx_intro +#L2 #HL12 #HnU elim (lpx_drop_conf … HLK1 … HL12) -HL12 +/4 width=9 by lleq_lift_ge/ +qed-. + +(* Inversion lemmas on relocation *******************************************) + +lemma lsx_inv_lift_le: ∀h,g,G,L,T,U,dt,d,e. dt ≤ yinj d → + ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, U, dt] L → + ∀K. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, T, dt] K. +#h #g #G #L #T #U #dt #d #e #Hdtd #HTU #H @(lsx_ind … H) -L +#L1 #_ #IHL1 #K1 #HLK1 @lsx_intro +#K2 #HK12 #HnT elim (drop_lpx_trans … HLK1 … HK12) -HK12 +/4 width=10 by lleq_inv_lift_le/ +qed-. + +lemma lsx_inv_lift_be: ∀h,g,G,L,T,U,dt,d,e. yinj d ≤ dt → dt ≤ d + e → + ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, U, dt] L → + ∀K. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, T, d] K. +#h #g #G #L #T #U #dt #d #e #Hddt #Hdtde #HTU #H @(lsx_ind … H) -L +#L1 #_ #IHL1 #K1 #HLK1 @lsx_intro +#K2 #HK12 #HnT elim (drop_lpx_trans … HLK1 … HK12) -HK12 +/4 width=11 by lleq_inv_lift_be/ +qed-. + +lemma lsx_inv_lift_ge: ∀h,g,G,L,T,U,dt,d,e. yinj d + yinj e ≤ dt → + ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, U, dt] L → + ∀K. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, T, dt-e] K. +#h #g #G #L #T #U #dt #d #e #Hdedt #HTU #H @(lsx_ind … H) -L +#L1 #_ #IHL1 #K1 #HLK1 @lsx_intro +#K2 #HK12 #HnT elim (drop_lpx_trans … HLK1 … HK12) -HK12 +/4 width=9 by lleq_inv_lift_ge/ +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_ldrop.ma deleted file mode 100644 index 476680a16..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_ldrop.ma +++ /dev/null @@ -1,96 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/multiple/lleq_ldrop.ma". -include "basic_2/reduction/lpx_ldrop.ma". -include "basic_2/computation/lsx.ma". - -(* SN EXTENDED STRONGLY NORMALIZING LOCAL ENVIRONMENTS **********************) - -(* Advanced properties ******************************************************) - -lemma lsx_lref_free: ∀h,g,G,L,d,i. |L| ≤ i → G ⊢ ⬊*[h, g, #i, d] L. -#h #g #G #L1 #d #i #HL1 @lsx_intro -#L2 #HL12 #H elim H -H -/4 width=6 by lpx_fwd_length, lleq_free, le_repl_sn_conf_aux/ -qed. - -lemma lsx_lref_skip: ∀h,g,G,L,d,i. yinj i < d → G ⊢ ⬊*[h, g, #i, d] L. -#h #g #G #L1 #d #i #HL1 @lsx_intro -#L2 #HL12 #H elim H -H -/3 width=4 by lpx_fwd_length, lleq_skip/ -qed. - -(* Advanced forward lemmas **************************************************) - -lemma lsx_fwd_lref_be: ∀h,g,I,G,L,d,i. d ≤ yinj i → G ⊢ ⬊*[h, g, #i, d] L → - ∀K,V. ⇩[i] L ≡ K.ⓑ{I}V → G ⊢ ⬊*[h, g, V, 0] K. -#h #g #I #G #L #d #i #Hdi #H @(lsx_ind … H) -L -#L1 #_ #IHL1 #K1 #V #HLK1 @lsx_intro -#K2 #HK12 #HnK12 lapply (ldrop_fwd_drop2 … HLK1) -#H2LK1 elim (ldrop_lpx_trans … H2LK1 … HK12) -H2LK1 -HK12 -#L2 #HL12 #H2LK2 #H elim (leq_ldrop_conf_be … H … HLK1) -H /2 width=1 by ylt_inj/ -#Y #_ #HLK2 lapply (ldrop_fwd_drop2 … HLK2) -#HY lapply (ldrop_mono … HY … H2LK2) -HY -H2LK2 #H destruct -/4 width=10 by lleq_inv_lref_ge/ -qed-. - -(* Properties on relocation *************************************************) - -lemma lsx_lift_le: ∀h,g,G,K,T,U,dt,d,e. dt ≤ yinj d → - ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, T, dt] K → - ∀L. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, U, dt] L. -#h #g #G #K #T #U #dt #d #e #Hdtd #HTU #H @(lsx_ind … H) -K -#K1 #_ #IHK1 #L1 #HLK1 @lsx_intro -#L2 #HL12 #HnU elim (lpx_ldrop_conf … HLK1 … HL12) -HL12 -/4 width=10 by lleq_lift_le/ -qed-. - -lemma lsx_lift_ge: ∀h,g,G,K,T,U,dt,d,e. yinj d ≤ dt → - ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, T, dt] K → - ∀L. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, U, dt + e] L. -#h #g #G #K #T #U #dt #d #e #Hddt #HTU #H @(lsx_ind … H) -K -#K1 #_ #IHK1 #L1 #HLK1 @lsx_intro -#L2 #HL12 #HnU elim (lpx_ldrop_conf … HLK1 … HL12) -HL12 -/4 width=9 by lleq_lift_ge/ -qed-. - -(* Inversion lemmas on relocation *******************************************) - -lemma lsx_inv_lift_le: ∀h,g,G,L,T,U,dt,d,e. dt ≤ yinj d → - ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, U, dt] L → - ∀K. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, T, dt] K. -#h #g #G #L #T #U #dt #d #e #Hdtd #HTU #H @(lsx_ind … H) -L -#L1 #_ #IHL1 #K1 #HLK1 @lsx_intro -#K2 #HK12 #HnT elim (ldrop_lpx_trans … HLK1 … HK12) -HK12 -/4 width=10 by lleq_inv_lift_le/ -qed-. - -lemma lsx_inv_lift_be: ∀h,g,G,L,T,U,dt,d,e. yinj d ≤ dt → dt ≤ d + e → - ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, U, dt] L → - ∀K. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, T, d] K. -#h #g #G #L #T #U #dt #d #e #Hddt #Hdtde #HTU #H @(lsx_ind … H) -L -#L1 #_ #IHL1 #K1 #HLK1 @lsx_intro -#K2 #HK12 #HnT elim (ldrop_lpx_trans … HLK1 … HK12) -HK12 -/4 width=11 by lleq_inv_lift_be/ -qed-. - -lemma lsx_inv_lift_ge: ∀h,g,G,L,T,U,dt,d,e. yinj d + yinj e ≤ dt → - ⇧[d, e] T ≡ U → G ⊢ ⬊*[h, g, U, dt] L → - ∀K. ⇩[Ⓕ, d, e] L ≡ K → G ⊢ ⬊*[h, g, T, dt-e] K. -#h #g #G #L #T #U #dt #d #e #Hdedt #HTU #H @(lsx_ind … H) -L -#L1 #_ #IHL1 #K1 #HLK1 @lsx_intro -#K2 #HK12 #HnT elim (ldrop_lpx_trans … HLK1 … HK12) -HK12 -/4 width=9 by lleq_inv_lift_ge/ -qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_lpx.ma b/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_lpx.ma index c4b2e04d5..034024b72 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_lpx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/computation/lsx_lpx.ma @@ -35,7 +35,7 @@ elim (lleq_dec T L1 L2 d) /3 width=4 by lsx_lleq_trans/ qed-. lemma lsx_leq_conf: ∀h,g,G,L1,T,d. G ⊢ ⬊*[h, g, T, d] L1 → - ∀L2. L1 ≃[d, ∞] L2 → G ⊢ ⬊*[h, g, T, d] L2. + ∀L2. L1 ⩬[d, ∞] L2 → G ⊢ ⬊*[h, g, T, d] L2. #h #g #G #L1 #T #d #H @(lsx_ind … H) -L1 #L1 #_ #IHL1 #L2 #HL12 @lsx_intro #L3 #HL23 #HnL23 elim (leq_lpx_trans_lleq … HL12 … HL23) -HL12 -HL23 diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv.ma index 7d1faa892..fa2cf6557 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv.ma @@ -120,47 +120,47 @@ lemma lsubsv_cprs_trans: ∀h,g,G,L1,L2. G ⊢ L1 ¡⫃[h, g] L2 → qed-. (* Note: the constant 0 cannot be generalized *) -lemma lsubsv_ldrop_O1_conf: ∀h,g,G,L1,L2. G ⊢ L1 ¡⫃[h, g] L2 → - ∀K1,s,e. ⇩[s, 0, e] L1 ≡ K1 → - ∃∃K2. G ⊢ K1 ¡⫃[h, g] K2 & ⇩[s, 0, e] L2 ≡ K2. +lemma lsubsv_drop_O1_conf: ∀h,g,G,L1,L2. G ⊢ L1 ¡⫃[h, g] L2 → + ∀K1,s,e. ⇩[s, 0, e] L1 ≡ K1 → + ∃∃K2. G ⊢ K1 ¡⫃[h, g] K2 & ⇩[s, 0, e] L2 ≡ K2. #h #g #G #L1 #L2 #H elim H -L1 -L2 [ /2 width=3 by ex2_intro/ | #I #L1 #L2 #V #_ #IHL12 #K1 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK1 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK1 [ destruct elim (IHL12 L1 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsubsv_pair, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK1) -L1 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsubsv_pair, drop_pair, ex2_intro/ + | elim (IHL12 … HLK1) -L1 /3 width=3 by drop_drop_lt, ex2_intro/ ] | #L1 #L2 #W #V #l #H1W #HV #HVW #H2W #H1l #H2l #_ #IHL12 #K1 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK1 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK1 [ destruct elim (IHL12 L1 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=4 by lsubsv_abbr, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK1) -L1 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=4 by lsubsv_abbr, drop_pair, ex2_intro/ + | elim (IHL12 … HLK1) -L1 /3 width=3 by drop_drop_lt, ex2_intro/ ] ] qed-. (* Note: the constant 0 cannot be generalized *) -lemma lsubsv_ldrop_O1_trans: ∀h,g,G,L1,L2. G ⊢ L1 ¡⫃[h, g] L2 → - ∀K2,s, e. ⇩[s, 0, e] L2 ≡ K2 → - ∃∃K1. G ⊢ K1 ¡⫃[h, g] K2 & ⇩[s, 0, e] L1 ≡ K1. +lemma lsubsv_drop_O1_trans: ∀h,g,G,L1,L2. G ⊢ L1 ¡⫃[h, g] L2 → + ∀K2,s, e. ⇩[s, 0, e] L2 ≡ K2 → + ∃∃K1. G ⊢ K1 ¡⫃[h, g] K2 & ⇩[s, 0, e] L1 ≡ K1. #h #g #G #L1 #L2 #H elim H -L1 -L2 [ /2 width=3 by ex2_intro/ | #I #L1 #L2 #V #_ #IHL12 #K2 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK2 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK2 [ destruct elim (IHL12 L2 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsubsv_pair, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK2) -L2 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsubsv_pair, drop_pair, ex2_intro/ + | elim (IHL12 … HLK2) -L2 /3 width=3 by drop_drop_lt, ex2_intro/ ] | #L1 #L2 #W #V #l #H1W #HV #HVW #H2W #H1l #H2l #_ #IHL12 #K2 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK2 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK2 [ destruct elim (IHL12 L2 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=4 by lsubsv_abbr, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK2) -L2 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=4 by lsubsv_abbr, drop_pair, ex2_intro/ + | elim (IHL12 … HLK2) -L2 /3 width=3 by drop_drop_lt, ex2_intro/ ] ] qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv_lstas.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv_lstas.ma index fe3432732..f0aa8c63f 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv_lstas.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv_lstas.ma @@ -30,28 +30,28 @@ lemma lsubsv_lstas_trans: ∀h,g,G,L2,T,U2,l1. ⦃G, L2⦄ ⊢ T •*[h, l1] U2 [1,2: /2 width=3 by ex2_intro/ | #G #L2 #K2 #X #Y #U #i #l1 #HLK2 #_ #HYU #IHXY #l2 #Hl12 #Hl2 #L1 #HL12 elim (da_inv_lref … Hl2) -Hl2 * #K0 #V0 [| #l0 ] #HK0 #HV0 - lapply (ldrop_mono … HK0 … HLK2) -HK0 #H destruct - elim (lsubsv_ldrop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 + lapply (drop_mono … HK0 … HLK2) -HK0 #H destruct + elim (lsubsv_drop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 elim (lsubsv_inv_pair2 … H) -H * #K1 [ | -HYU -IHXY -HLK1 ] [ #HK12 #H destruct elim (IHXY … Hl12 HV0 … HK12) -K2 -l2 #T #HXT #HTY - lapply (ldrop_fwd_drop2 … HLK1) #H + lapply (drop_fwd_drop2 … HLK1) #H elim (lift_total T 0 (i+1)) /3 width=12 by lstas_ldef, cpcs_lift, ex2_intro/ | #V #l0 #_ #_ #_ #_ #_ #_ #_ #H destruct ] | #G #L2 #K2 #X #Y #Y0 #U #i #l1 #HLK2 #HXY0 #_ #HYU #IHXY #l2 #Hl12 #Hl2 #L1 #HL12 elim (da_inv_lref … Hl2) -Hl2 * #K0 #V0 [| #l0 ] #HK0 #HV0 [| #H1 ] - lapply (ldrop_mono … HK0 … HLK2) -HK0 #H2 destruct + lapply (drop_mono … HK0 … HLK2) -HK0 #H2 destruct lapply (le_plus_to_le_r … Hl12) -Hl12 #Hl12 - elim (lsubsv_ldrop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 + elim (lsubsv_drop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 elim (lsubsv_inv_pair2 … H) -H * #K1 [ #HK12 #H destruct lapply (lsubsv_fwd_lsubd … HK12) #H lapply (lsubd_da_trans … HV0 … H) -H #H elim (da_inv_sta … H) -H elim (IHXY … Hl12 HV0 … HK12) -K2 -Hl12 #Y1 - lapply (ldrop_fwd_drop2 … HLK1) + lapply (drop_fwd_drop2 … HLK1) elim (lift_total Y1 0 (i+1)) /3 width=12 by lstas_ldec, cpcs_lift, ex2_intro/ | #V #l #_ #_ #HVX #_ #HV #HX #HK12 #_ #H destruct @@ -61,7 +61,7 @@ lemma lsubsv_lstas_trans: ∀h,g,G,L2,T,U2,l1. ⦃G, L2⦄ ⊢ T •*[h, l1] U2 elim (lstas_total … HVW (l1+1)) -W #W #HVW lapply (HVX … Hl12 HVW HXY0) -HVX -Hl12 -HXY0 #HWY0 lapply (cpcs_trans … HWY0 … HY0) -Y0 - lapply (ldrop_fwd_drop2 … HLK1) + lapply (drop_fwd_drop2 … HLK1) elim (lift_total W 0 (i+1)) /4 width=12 by lstas_ldef, lstas_cast, cpcs_lift, ex2_intro/ ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv_snv.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv_snv.ma index 887107b80..0a6d05204 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv_snv.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/lsubsv_snv.ma @@ -25,7 +25,7 @@ lemma lsubsv_snv_trans: ∀h,g,G,L2,T. ⦃G, L2⦄ ⊢ T ¡[h, g] → ∀L1. G ⊢ L1 ¡⫃[h, g] L2 → ⦃G, L1⦄ ⊢ T ¡[h, g]. #h #g #G #L2 #T #H elim H -G -L2 -T // [ #I #G #L2 #K2 #V #i #HLK2 #_ #IHV #L1 #HL12 - elim (lsubsv_ldrop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 + elim (lsubsv_drop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 elim (lsubsv_inv_pair2 … H) -H * #K1 [ #HK12 #H destruct /3 width=5 by snv_lref/ | #W #l #H1V #H1W #HWV #_ #HWl #_ #_ #H1 #H2 destruct -IHV diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_da_lpr.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_da_lpr.ma index d7f639251..a9a07c983 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_da_lpr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_da_lpr.ma @@ -33,19 +33,19 @@ fact da_cpr_lpr_aux: ∀h,g,G0,L0,T0. | #i #HG0 #HL0 #HT0 #H1 #l #H2 #X3 #H3 #L2 #HL12 destruct -IH3 -IH2 elim (snv_inv_lref … H1) -H1 #I0 #K0 #X0 #H #HX0 elim (da_inv_lref … H2) -H2 * #K1 [ #V1 | #W1 #l1 ] #HLK1 [ #HV1 | #HW1 #H ] destruct - lapply (ldrop_mono … H … HLK1) -H #H destruct + lapply (drop_mono … H … HLK1) -H #H destruct elim (cpr_inv_lref1 … H3) -H3 [1,3: #H destruct lapply (fqup_lref … G1 … HLK1) - elim (lpr_ldrop_conf … HLK1 … HL12) -HLK1 -HL12 #X #H #HLK2 + elim (lpr_drop_conf … HLK1 … HL12) -HLK1 -HL12 #X #H #HLK2 elim (lpr_inv_pair1 … H) -H #K2 #V2 #HK12 #HV12 #H destruct /4 width=10 by da_ldef, da_ldec, fqup_fpbg/ |2,4: * #K0 #V0 #W0 #H #HVW0 #HW0 - lapply (ldrop_mono … H … HLK1) -H #H destruct + lapply (drop_mono … H … HLK1) -H #H destruct lapply (fqup_lref … G1 … HLK1) - elim (lpr_ldrop_conf … HLK1 … HL12) -HLK1 -HL12 #X #H #HLK2 + elim (lpr_drop_conf … HLK1 … HL12) -HLK1 -HL12 #X #H #HLK2 elim (lpr_inv_pair1 … H) -H #K2 #V2 #HK12 #_ #H destruct - lapply (ldrop_fwd_drop2 … HLK2) -V2 + lapply (drop_fwd_drop2 … HLK2) -V2 /4 width=8 by da_lift, fqup_fpbg/ ] | #p #_ #_ #HT0 #H1 destruct -IH3 -IH2 -IH1 @@ -57,7 +57,7 @@ fact da_cpr_lpr_aux: ∀h,g,G0,L0,T0. [ #V2 #T2 #HV12 #HT12 #H destruct /4 width=9 by da_bind, fqup_fpbg, lpr_pair/ | #T2 #HT12 #HT2 #H1 #H2 destruct - /4 width=11 by da_inv_lift, fqup_fpbg, lpr_pair, ldrop_drop/ + /4 width=11 by da_inv_lift, fqup_fpbg, lpr_pair, drop_drop/ ] | #V1 #T1 #HG0 #HL0 #HT0 #H1 #l #H2 #X3 #H3 #L2 #HL12 destruct elim (snv_inv_appl … H1) -H1 #b0 #W1 #W0 #T0 #l0 #HV1 #HT1 #Hl0 #HVW1 #HW10 #HT10 diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lift.ma index fc7613458..7ddb258b4 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lift.ma @@ -27,15 +27,15 @@ lemma snv_lift: ∀h,g,G,K,T. ⦃G, K⦄ ⊢ T ¡[h, g] → ∀L,s,d,e. ⇩[s, d >(lift_inv_sort1 … H) -X -K -d -e // | #I #G #K #K0 #V #i #HK0 #_ #IHV #L #s #d #e #HLK #X #H elim (lift_inv_lref1 … H) * #Hid #H destruct - [ elim (ldrop_trans_le … HLK … HK0) -K /2 width=2 by lt_to_le/ #X #HL0 #H - elim (ldrop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #L0 #W #HLK0 #HVW #H destruct + [ elim (drop_trans_le … HLK … HK0) -K /2 width=2 by lt_to_le/ #X #HL0 #H + elim (drop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #L0 #W #HLK0 #HVW #H destruct /3 width=9 by snv_lref/ - | lapply (ldrop_trans_ge … HLK … HK0 ?) -K - /3 width=9 by snv_lref, ldrop_inv_gen/ + | lapply (drop_trans_ge … HLK … HK0 ?) -K + /3 width=9 by snv_lref, drop_inv_gen/ ] | #a #I #G #K #V #T #_ #_ #IHV #IHT #L #s #d #e #HLK #X #H elim (lift_inv_bind1 … H) -H #W #U #HVW #HTU #H destruct - /4 width=5 by snv_bind, ldrop_skip/ + /4 width=5 by snv_bind, drop_skip/ | #a #G #K #V #V0 #V1 #T #T1 #l #_ #_ #Hl #HV0 #HV01 #HT1 #IHV #IHT #L #s #d #e #HLK #X #H elim (lift_inv_flat1 … H) -H #W #U #HVW #HTU #H destruct elim (lift_total V0 d e) #W0 #HVW0 @@ -58,14 +58,14 @@ lemma snv_inv_lift: ∀h,g,G,L,U. ⦃G, L⦄ ⊢ U ¡[h, g] → ∀K,s,d,e. ⇩[ >(lift_inv_sort2 … H) -X -L -d -e // | #I #G #L #L0 #W #i #HL0 #_ #IHW #K #s #d #e #HLK #X #H elim (lift_inv_lref2 … H) * #Hid #H destruct - [ elim (ldrop_conf_le … HLK … HL0) -L /2 width=2 by lt_to_le/ #X #HK0 #H - elim (ldrop_inv_skip1 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K0 #V #HLK0 #HVW #H destruct + [ elim (drop_conf_le … HLK … HL0) -L /2 width=2 by lt_to_le/ #X #HK0 #H + elim (drop_inv_skip1 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K0 #V #HLK0 #HVW #H destruct /3 width=12 by snv_lref/ - | lapply (ldrop_conf_ge … HLK … HL0 ?) -L /3 width=9 by snv_lref/ + | lapply (drop_conf_ge … HLK … HL0 ?) -L /3 width=9 by snv_lref/ ] | #a #I #G #L #W #U #_ #_ #IHW #IHU #K #s #d #e #HLK #X #H elim (lift_inv_bind2 … H) -H #V #T #HVW #HTU #H destruct - /4 width=5 by snv_bind, ldrop_skip/ + /4 width=5 by snv_bind, drop_skip/ | #a #G #L #W #W0 #W1 #U #U1 #l #_ #_ #Hl #HW0 #HW01 #HU1 #IHW #IHU #K #s #d #e #HLK #X #H elim (lift_inv_flat2 … H) -H #V #T #HVW #HTU #H destruct lapply (da_inv_lift … Hl … HLK … HVW) -Hl #Hl @@ -91,7 +91,7 @@ lemma snv_fqu_conf: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2 #h #g #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ #I1 #G1 #L1 #V1 #H elim (snv_inv_lref … H) -H #I2 #L2 #V2 #H #HV2 - lapply (ldrop_inv_O2 … H) -H #H destruct // + lapply (drop_inv_O2 … H) -H #H destruct // |2: * |5,6: /3 width=8 by snv_inv_lift/ ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lpr.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lpr.ma index 41d02ab40..5e0d2bf56 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lpr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lpr.ma @@ -31,14 +31,14 @@ fact snv_cpr_lpr_aux: ∀h,g,G0,L0,T0. >(cpr_inv_sort1 … H2) -X // | #i #HG0 #HL0 #HT0 #H1 #X #H2 #L2 #HL12 destruct -IH4 -IH3 -IH2 elim (snv_inv_lref … H1) -H1 #I #K1 #V1 #HLK1 #HV1 - elim (lpr_ldrop_conf … HLK1 … HL12) -HL12 #X #H #HLK2 + elim (lpr_drop_conf … HLK1 … HL12) -HL12 #X #H #HLK2 elim (lpr_inv_pair1 … H) -H #K2 #V2 #HK12 #HV12 #H destruct lapply (fqup_lref … G1 … HLK1) #HKL elim (cpr_inv_lref1 … H2) -H2 [ #H destruct -HLK1 /4 width=10 by fqup_fpbg, snv_lref/ | * #K0 #V0 #W0 #H #HVW0 #W0 -HV12 - lapply (ldrop_mono … H … HLK1) -HLK1 -H #H destruct - lapply (ldrop_fwd_drop2 … HLK2) -HLK2 /4 width=8 by fqup_fpbg, snv_lift/ + lapply (drop_mono … H … HLK1) -HLK1 -H #H destruct + lapply (drop_fwd_drop2 … HLK2) -HLK2 /4 width=8 by fqup_fpbg, snv_lift/ ] | #p #HG0 #HL0 #HT0 #H1 #X #H2 #L2 #HL12 destruct -IH4 -IH3 -IH2 -IH1 elim (snv_inv_gref … H1) @@ -47,7 +47,7 @@ fact snv_cpr_lpr_aux: ∀h,g,G0,L0,T0. elim (cpr_inv_bind1 … H2) -H2 * [ #V2 #T2 #HV12 #HT12 #H destruct /4 width=8 by fqup_fpbg, snv_bind, lpr_pair/ | #T2 #HT12 #HXT2 #H1 #H2 destruct -HV1 - /4 width=10 by fqup_fpbg, snv_inv_lift, lpr_pair, ldrop_drop/ + /4 width=10 by fqup_fpbg, snv_inv_lift, lpr_pair, drop_drop/ ] | #V1 #T1 #HG0 #HL0 #HT0 #H1 #X #H2 #L2 #HL12 destruct elim (snv_inv_appl … H1) -H1 #a #W10 #W1 #U1 #l0 #HV1 #HT1 #Hl0 #HVW1 #HW10 #HTU1 @@ -103,17 +103,17 @@ fact snv_cpr_lpr_aux: ∀h,g,G0,L0,T0. elim (sta_cpr_lpr_aux … IH3 … HVW1 … HV10 … HL12) /2 width=2 by fqup_fpbg/ -IH3 -HVW1 #X #H1 #H2 lapply (cpcs_canc_sn … H2 HW10) -W10 #H2 elim (lift_total X 0 1) #W20 #H3 - lapply (sta_lift … H1 (L2.ⓓW2) … HV02 … H3) /2 width=2 by ldrop_drop/ -H1 #HVW20 - lapply (cpcs_lift … (L2.ⓓW2) … H3 … HW13 H2) /2 width=2 by ldrop_drop/ -HW13 -H3 -H2 #HW320 + lapply (sta_lift … H1 (L2.ⓓW2) … HV02 … H3) /2 width=2 by drop_drop/ -H1 #HVW20 + lapply (cpcs_lift … (L2.ⓓW2) … H3 … HW13 H2) /2 width=2 by drop_drop/ -HW13 -H3 -H2 #HW320 lapply (cpcs_cprs_strap1 … HW320 … HW1) -W3 #HW20 elim (cpcs_inv_cprs … HW20) -HW20 #W3 #HW203 #HW3 lapply (cpds_cprs_trans … (ⓛ{a}W3.U2) HTU2 ?) /2 width=1 by cprs_bind/ -HW3 -HTU2 #HTU2 lapply (IH2 … Hl0 … HV10 … HL12) /2 width=1 by fqup_fpbg/ -IH2 -Hl0 #Hl0 - lapply (da_lift … Hl0 (L2.ⓓW2) … HV02) /2 width=2 by ldrop_drop/ -Hl0 #Hl0 + lapply (da_lift … Hl0 (L2.ⓓW2) … HV02) /2 width=2 by drop_drop/ -Hl0 #Hl0 lapply (IH1 … HW02 … HL12) /2 width=1 by fqup_fpbg/ -HW0 #HW2 lapply (IH1 … HV10 … HL12) /2 width=1 by fqup_fpbg/ -HV1 -HV10 #HV0 lapply (IH1 … HT02 (L2.ⓓW2) ?) /2 width=1 by fqup_fpbg, lpr_pair/ -L1 #HT2 - lapply (snv_lift … HV0 (L2.ⓓW2) … HV02) /3 width=7 by snv_bind, snv_appl, ldrop_drop/ + lapply (snv_lift … HV0 (L2.ⓓW2) … HV02) /3 width=7 by snv_bind, snv_appl, drop_drop/ ] | #W1 #T1 #HG0 #HL0 #HT0 #H1 #X #H2 #L2 #HL12 destruct -IH4 elim (snv_inv_cast … H1) -H1 #U1 #l0 #HW1 #HT1 #Hl0 #HTU1 #HUW1 diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lstas.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lstas.ma index 53641051d..de2cf0d7a 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lstas.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lstas.ma @@ -32,12 +32,12 @@ fact snv_lstas_aux: ∀h,g,G0,L0,T0. [ lapply (lstas_inv_O … H2) -H2 #H destruct // ] elim (snv_inv_lref … H1) -H1 #I0 #K0 #X0 #HLK0 #HX0 elim (da_inv_lref … Hl1) -Hl1 * #K1 [ #V1 | #W1 #l ] #HLK1 [ #Hl1 | #Hl #H ] - lapply (ldrop_mono … HLK0 … HLK1) -HLK0 #H0 destruct + lapply (drop_mono … HLK0 … HLK1) -HLK0 #H0 destruct elim (lstas_inv_lref1 … H2) -H2 * #K0 #Y0 #X0 [2,4: #Y1 ] #HLK0 [1,2: #HY01 ] #HYX0 #HX0 - lapply (ldrop_mono … HLK0 … HLK1) -HLK0 #H destruct + lapply (drop_mono … HLK0 … HLK1) -HLK0 #H destruct [ lapply (le_plus_to_le_r … Hl21) -Hl21 #Hl21 ] lapply (fqup_lref … G1 … HLK1) #H - lapply (ldrop_fwd_drop2 … HLK1) -HLK1 /4 width=8 by fqup_fpbg, snv_lift/ + lapply (drop_fwd_drop2 … HLK1) -HLK1 /4 width=8 by fqup_fpbg, snv_lift/ | #p #HG0 #HL0 #HT0 #H1 #l1 #l2 #Hl21 #Hl1 #X #H2 destruct -IH4 -IH3 -IH2 -IH1 elim (snv_inv_gref … H1) | #a #I #V1 #T1 #HG0 #HL0 #HT0 #H1 #l1 #l2 #Hl21 #Hl1 #X #H2 destruct -IH4 -IH3 -IH2 diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lstas_lpr.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lstas_lpr.ma index 616becd30..5615c0fdf 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lstas_lpr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/snv_lstas_lpr.ma @@ -35,18 +35,18 @@ fact lstas_cpr_lpr_aux: ∀h,g,G0,L0,T0. [ lapply (lstas_inv_O … H2) -H2 #H destruct -IH1 -H1 -l1 /4 width=5 by lpr_cpcs_conf, cpr_cpcs_dx, ex2_intro/ ] elim (snv_inv_lref … H1) -H1 #I0 #K0 #X0 #HK0 #HX0 elim (da_inv_lref … Hl1) -Hl1 * #K1 [ #V1 | #W1 #l0 ] #HLK1 [ #HVl1 | #HWl1 #H destruct ] - lapply (ldrop_mono … HK0 … HLK1) -HK0 #H destruct + lapply (drop_mono … HK0 … HLK1) -HK0 #H destruct elim (lstas_inv_lref1 … H2) -H2 * #K0 #V0 #W0 [2,4: #X0 ] #HK0 [1,2: #_ -X0 ] #HVW0 #HX2 - lapply (ldrop_mono … HK0 … HLK1) -HK0 #H destruct + lapply (drop_mono … HK0 … HLK1) -HK0 #H destruct [ lapply (le_plus_to_le_r … Hl21) -Hl21 #Hl21 ] lapply (fqup_lref … G1 … HLK1) #HKV1 - elim (lpr_ldrop_conf … HLK1 … HL12) -HL12 #X #H #HLK2 + elim (lpr_drop_conf … HLK1 … HL12) -HL12 #X #H #HLK2 elim (lpr_inv_pair1 … H) -H #K2 [ #W2 | #V2 ] #HK12 [ #HW12 | #HV12 ] #H destruct - lapply (ldrop_fwd_drop2 … HLK2) #H2 + lapply (drop_fwd_drop2 … HLK2) #H2 elim (cpr_inv_lref1 … H3) -H3 [1,3: #H destruct -HLK1 |2,4: * #K0 #V0 #X0 #H #HVX0 #HX0 - lapply (ldrop_mono … H … HLK1) -H -HLK1 #H destruct + lapply (drop_mono … H … HLK1) -H -HLK1 #H destruct ] [ lapply (IH2 … HWl1 … HW12 … HK12) /2 width=1 by fqup_fpbg/ -IH2 #H elim (da_inv_sta … H) -H @@ -73,7 +73,7 @@ fact lstas_cpr_lpr_aux: ∀h,g,G0,L0,T0. | #T3 #HT13 #HXT3 #H1 #H2 destruct elim (IH1 … Hl1 … HTU1 … HT13 (L2.ⓓV1)) -IH1 -Hl1 -HTU1 -HT13 /2 width=1 by fqup_fpbg, lpr_pair/ -T1 -HL12 #U3 #HTU3 #HU13 elim (lstas_inv_lift1 … HTU3 L2 … HXT3) -T3 - /5 width=8 by cpcs_cpr_strap1, cpcs_bind1, cpr_zeta, ldrop_drop, ex2_intro/ + /5 width=8 by cpcs_cpr_strap1, cpcs_bind1, cpr_zeta, drop_drop, ex2_intro/ ] | #V1 #T1 #HG0 #HL0 #HT0 #H1 #l1 #l2 #Hl21 #Hl1 #X2 #H2 #X3 #H3 #L2 #HL12 destruct elim (snv_inv_appl … H1) -H1 #a #W1 #W10 #U10 #l0 #HV1 #HT1 #Hl0 #HVW1 #HW10 #HTU10 diff --git a/matita/matita/contribs/lambdadelta/basic_2/grammar/leq.ma b/matita/matita/contribs/lambdadelta/basic_2/grammar/leq.ma index f7f23760d..a898abdb5 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/grammar/leq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/grammar/leq.ma @@ -13,7 +13,7 @@ (**************************************************************************) include "ground_2/ynat/ynat_lt.ma". -include "basic_2/notation/relations/iso_4.ma". +include "basic_2/notation/relations/midiso_4.ma". include "basic_2/grammar/lenv_length.ma". (* EQUIVALENCE FOR LOCAL ENVIRONMENTS ***************************************) @@ -25,31 +25,31 @@ inductive leq: relation4 ynat ynat lenv lenv ≝ | leq_pair: ∀I,L1,L2,V,e. leq 0 e L1 L2 → leq 0 (⫯e) (L1.ⓑ{I}V) (L2.ⓑ{I}V) | leq_succ: ∀I1,I2,L1,L2,V1,V2,d,e. - leq d e L1 L2 → leq (⫯d) e (L1. ⓑ{I1}V1) (L2. ⓑ{I2} V2) + leq d e L1 L2 → leq (⫯d) e (L1.ⓑ{I1}V1) (L2.ⓑ{I2}V2) . interpretation "equivalence (local environment)" - 'Iso d e L1 L2 = (leq d e L1 L2). + 'MidIso d e L1 L2 = (leq d e L1 L2). (* Basic properties *********************************************************) -lemma leq_pair_lt: ∀I,L1,L2,V,e. L1 ≃[0, ⫰e] L2 → 0 < e → - L1.ⓑ{I}V ≃[0, e] L2.ⓑ{I}V. +lemma leq_pair_lt: ∀I,L1,L2,V,e. L1 ⩬[0, ⫰e] L2 → 0 < e → + L1.ⓑ{I}V ⩬[0, e] L2.ⓑ{I}V. #I #L1 #L2 #V #e #HL12 #He <(ylt_inv_O1 … He) /2 width=1 by leq_pair/ qed. -lemma leq_succ_lt: ∀I1,I2,L1,L2,V1,V2,d,e. L1 ≃[⫰d, e] L2 → 0 < d → - L1.ⓑ{I1}V1 ≃[d, e] L2. ⓑ{I2}V2. +lemma leq_succ_lt: ∀I1,I2,L1,L2,V1,V2,d,e. L1 ⩬[⫰d, e] L2 → 0 < d → + L1.ⓑ{I1}V1 ⩬[d, e] L2. ⓑ{I2}V2. #I1 #I2 #L1 #L2 #V1 #V2 #d #e #HL12 #Hd <(ylt_inv_O1 … Hd) /2 width=1 by leq_succ/ qed. -lemma leq_pair_O_Y: ∀L1,L2. L1 ≃[0, ∞] L2 → - ∀I,V. L1.ⓑ{I}V ≃[0, ∞] L2.ⓑ{I}V. +lemma leq_pair_O_Y: ∀L1,L2. L1 ⩬[0, ∞] L2 → + ∀I,V. L1.ⓑ{I}V ⩬[0, ∞] L2.ⓑ{I}V. #L1 #L2 #HL12 #I #V lapply (leq_pair I … V … HL12) -HL12 // qed. -lemma leq_refl: ∀L,d,e. L ≃[d, e] L. +lemma leq_refl: ∀L,d,e. L ⩬[d, e] L. #L elim L -L // #L #I #V #IHL #d elim (ynat_cases … d) [| * #x ] #Hd destruct /2 width=1 by leq_succ/ @@ -57,7 +57,7 @@ lemma leq_refl: ∀L,d,e. L ≃[d, e] L. #He destruct /2 width=1 by leq_zero, leq_pair/ qed. -lemma leq_O2: ∀L1,L2,d. |L1| = |L2| → L1 ≃[d, yinj 0] L2. +lemma leq_O2: ∀L1,L2,d. |L1| = |L2| → L1 ⩬[d, yinj 0] L2. #L1 elim L1 -L1 [| #L1 #I1 #V1 #IHL1 ] * // [1,3: #L2 #I2 #V2 ] #d normalize [1,3: ypred_succ /3 width=1 by leq_pair/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc.ma b/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc.ma index defc91ed9..a861d18a6 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc.ma @@ -12,97 +12,97 @@ (* *) (**************************************************************************) -include "basic_2/notation/relations/iso_2.ma". +include "basic_2/notation/relations/topiso_2.ma". include "basic_2/grammar/term_simple.ma". (* SAME TOP TERM CONSTRUCTOR ************************************************) inductive tstc: relation term ≝ | tstc_atom: ∀I. tstc (⓪{I}) (⓪{I}) - | tstc_pair: ∀I,V1,V2,T1,T2. tstc (②{I} V1. T1) (②{I} V2. T2) + | tstc_pair: ∀I,V1,V2,T1,T2. tstc (②{I}V1.T1) (②{I}V2.T2) . -interpretation "same top constructor (term)" 'Iso T1 T2 = (tstc T1 T2). +interpretation "same top constructor (term)" 'TopIso T1 T2 = (tstc T1 T2). (* Basic inversion lemmas ***************************************************) -fact tstc_inv_atom1_aux: ∀T1,T2. T1 ≃ T2 → ∀I. T1 = ⓪{I} → T2 = ⓪{I}. +fact tstc_inv_atom1_aux: ∀T1,T2. T1 ≂ T2 → ∀I. T1 = ⓪{I} → T2 = ⓪{I}. #T1 #T2 * -T1 -T2 // #J #V1 #V2 #T1 #T2 #I #H destruct -qed. +qed-. (* Basic_1: was: iso_gen_sort iso_gen_lref *) -lemma tstc_inv_atom1: ∀I,T2. ⓪{I} ≃ T2 → T2 = ⓪{I}. -/2 width=3/ qed-. +lemma tstc_inv_atom1: ∀I,T2. ⓪{I} ≂ T2 → T2 = ⓪{I}. +/2 width=3 by tstc_inv_atom1_aux/ qed-. -fact tstc_inv_pair1_aux: ∀T1,T2. T1 ≃ T2 → ∀I,W1,U1. T1 = ②{I}W1.U1 → +fact tstc_inv_pair1_aux: ∀T1,T2. T1 ≂ T2 → ∀I,W1,U1. T1 = ②{I}W1.U1 → ∃∃W2,U2. T2 = ②{I}W2. U2. #T1 #T2 * -T1 -T2 [ #J #I #W1 #U1 #H destruct -| #J #V1 #V2 #T1 #T2 #I #W1 #U1 #H destruct /2 width=3/ +| #J #V1 #V2 #T1 #T2 #I #W1 #U1 #H destruct /2 width=3 by ex1_2_intro/ ] -qed. +qed-. (* Basic_1: was: iso_gen_head *) -lemma tstc_inv_pair1: ∀I,W1,U1,T2. ②{I}W1.U1 ≃ T2 → +lemma tstc_inv_pair1: ∀I,W1,U1,T2. ②{I}W1.U1 ≂ T2 → ∃∃W2,U2. T2 = ②{I}W2. U2. -/2 width=5/ qed-. +/2 width=5 by tstc_inv_pair1_aux/ qed-. -fact tstc_inv_atom2_aux: ∀T1,T2. T1 ≃ T2 → ∀I. T2 = ⓪{I} → T1 = ⓪{I}. +fact tstc_inv_atom2_aux: ∀T1,T2. T1 ≂ T2 → ∀I. T2 = ⓪{I} → T1 = ⓪{I}. #T1 #T2 * -T1 -T2 // #J #V1 #V2 #T1 #T2 #I #H destruct -qed. +qed-. -lemma tstc_inv_atom2: ∀I,T1. T1 ≃ ⓪{I} → T1 = ⓪{I}. -/2 width=3/ qed-. +lemma tstc_inv_atom2: ∀I,T1. T1 ≂ ⓪{I} → T1 = ⓪{I}. +/2 width=3 by tstc_inv_atom2_aux/ qed-. -fact tstc_inv_pair2_aux: ∀T1,T2. T1 ≃ T2 → ∀I,W2,U2. T2 = ②{I}W2.U2 → - ∃∃W1,U1. T1 = ②{I}W1. U1. +fact tstc_inv_pair2_aux: ∀T1,T2. T1 ≂ T2 → ∀I,W2,U2. T2 = ②{I}W2.U2 → + ∃∃W1,U1. T1 = ②{I}W1.U1. #T1 #T2 * -T1 -T2 [ #J #I #W2 #U2 #H destruct -| #J #V1 #V2 #T1 #T2 #I #W2 #U2 #H destruct /2 width=3/ +| #J #V1 #V2 #T1 #T2 #I #W2 #U2 #H destruct /2 width=3 by ex1_2_intro/ ] -qed. +qed-. -lemma tstc_inv_pair2: ∀I,T1,W2,U2. T1 ≃ ②{I}W2.U2 → - ∃∃W1,U1. T1 = ②{I}W1. U1. -/2 width=5/ qed-. +lemma tstc_inv_pair2: ∀I,T1,W2,U2. T1 ≂ ②{I}W2.U2 → + ∃∃W1,U1. T1 = ②{I}W1.U1. +/2 width=5 by tstc_inv_pair2_aux/ qed-. (* Basic properties *********************************************************) (* Basic_1: was: iso_refl *) -lemma tstc_refl: ∀T. T ≃ T. +lemma tstc_refl: reflexive … tstc. #T elim T -T // qed. -lemma tstc_sym: ∀T1,T2. T1 ≃ T2 → T2 ≃ T1. +lemma tstc_sym: symmetric … tstc. #T1 #T2 #H elim H -T1 -T2 // -qed. +qed-. -lemma tstc_dec: ∀T1,T2. Decidable (T1 ≃ T2). +lemma tstc_dec: ∀T1,T2. Decidable (T1 ≂ T2). * #I1 [2: #V1 #T1 ] * #I2 [2,4: #V2 #T2 ] [ elim (eq_item2_dec I1 I2) #HI12 - [ destruct /2 width=1/ + [ destruct /2 width=1 by tstc_pair, or_introl/ | @or_intror #H - elim (tstc_inv_pair1 … H) -H #V #T #H destruct /2 width=1/ + elim (tstc_inv_pair1 … H) -H #V #T #H destruct /2 width=1 by/ ] | @or_intror #H lapply (tstc_inv_atom1 … H) -H #H destruct | @or_intror #H lapply (tstc_inv_atom2 … H) -H #H destruct | elim (eq_item0_dec I1 I2) #HI12 - [ destruct /2 width=1/ + [ destruct /2 width=1 by or_introl/ | @or_intror #H - lapply (tstc_inv_atom2 … H) -H #H destruct /2 width=1/ + lapply (tstc_inv_atom2 … H) -H #H destruct /2 width=1 by/ ] ] qed. -lemma simple_tstc_repl_dx: ∀T1,T2. T1 ≃ T2 → 𝐒⦃T1⦄ → 𝐒⦃T2⦄. +lemma simple_tstc_repl_dx: ∀T1,T2. T1 ≂ T2 → 𝐒⦃T1⦄ → 𝐒⦃T2⦄. #T1 #T2 * -T1 -T2 // #I #V1 #V2 #T1 #T2 #H elim (simple_inv_pair … H) -H #J #H destruct // -qed. (**) (* remove from index *) +qed-. -lemma simple_tstc_repl_sn: ∀T1,T2. T1 ≃ T2 → 𝐒⦃T2⦄ → 𝐒⦃T1⦄. -/3 width=3/ qed-. +lemma simple_tstc_repl_sn: ∀T1,T2. T1 ≂ T2 → 𝐒⦃T2⦄ → 𝐒⦃T1⦄. +/3 width=3 by simple_tstc_repl_dx, tstc_sym/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc_tstc.ma b/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc_tstc.ma index df6fe3729..83a17a679 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc_tstc.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc_tstc.ma @@ -19,14 +19,14 @@ include "basic_2/grammar/tstc.ma". (* Main properties **********************************************************) (* Basic_1: was: iso_trans *) -theorem tstc_trans: ∀T1,T. T1 ≃ T → ∀T2. T ≃ T2 → T1 ≃ T2. +theorem tstc_trans: Transitive … tstc. #T1 #T * -T1 -T // #I #V1 #V #T1 #T #X #H elim (tstc_inv_pair1 … H) -H #V2 #T2 #H destruct // -qed. +qed-. -theorem tstc_canc_sn: ∀T,T1. T ≃ T1 → ∀T2. T ≃ T2 → T1 ≃ T2. -/3 width=3/ qed. +theorem tstc_canc_sn: ∀T,T1. T ≂ T1 → ∀T2. T ≂ T2 → T1 ≂ T2. +/3 width=3 by tstc_trans, tstc_sym/ qed-. -theorem tstc_canc_dx: ∀T1,T. T1 ≃ T → ∀T2. T2 ≃ T → T1 ≃ T2. -/3 width=3/ qed. +theorem tstc_canc_dx: ∀T1,T. T1 ≂ T → ∀T2. T2 ≂ T → T1 ≂ T2. +/3 width=3 by tstc_trans, tstc_sym/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc_vector.ma b/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc_vector.ma index 1e35292ef..997a5c179 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc_vector.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/grammar/tstc_vector.ma @@ -20,14 +20,12 @@ include "basic_2/grammar/tstc.ma". (* Advanced inversion lemmas ************************************************) (* Basic_1: was only: iso_flats_lref_bind_false iso_flats_flat_bind_false *) -lemma tstc_inv_bind_appls_simple: ∀a,I,Vs,V2,T1,T2. ⒶVs.T1 ≃ ⓑ{a,I} V2. T2 → +lemma tstc_inv_bind_appls_simple: ∀a,I,Vs,V2,T1,T2. ⒶVs.T1 ≂ ⓑ{a,I} V2. T2 → 𝐒⦃T1⦄ → ⊥. #a #I #Vs #V2 #T1 #T2 #H elim (tstc_inv_pair2 … H) -H #V0 #T0 elim Vs -Vs normalize -[ #H destruct #H - @(simple_inv_bind … H) +[ #H destruct #H /2 width=5 by simple_inv_bind/ | #V #Vs #_ #H destruct ] -qed. - +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_alt.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_alt.ma index d97bb7d37..10a198cb2 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_alt.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_alt.ma @@ -41,7 +41,7 @@ lemma lsuby_cpysa_trans: ∀G,d,e. lsub_trans … (cpysa d e G) (lsuby d e). #G #d #e #L1 #T1 #T2 #H elim H -G -L1 -T1 -T2 -d -e [ // | #I #G #L1 #K1 #V1 #V2 #W2 #i #d #e #Hdi #Hide #HLK1 #_ #HVW2 #IHV12 #L2 #HL12 - elim (lsuby_ldrop_trans_be … HL12 … HLK1) -HL12 -HLK1 /3 width=7 by cpysa_subst/ + elim (lsuby_drop_trans_be … HL12 … HLK1) -HL12 -HLK1 /3 width=7 by cpysa_subst/ | /4 width=1 by lsuby_succ, cpysa_bind/ | /3 width=1 by cpysa_flat/ ] @@ -58,7 +58,7 @@ lemma cpysa_cpy_trans: ∀G,L,T1,T,d,e. ⦃G, L⦄ ⊢ T1 ▶▶*[d, e] T → [ #I #G #L #d #e #X #H elim (cpy_inv_atom1 … H) -H // * /2 width=7 by cpysa_subst/ | #I #G #L #K #V1 #V2 #W2 #i #d #e #Hdi #Hide #HLK #_ #HVW2 #IHV12 #T2 #H - lapply (ldrop_fwd_drop2 … HLK) #H0LK + lapply (drop_fwd_drop2 … HLK) #H0LK lapply (cpy_weak … H 0 (d+e) ? ?) -H // #H elim (cpy_inv_lift1_be … H … H0LK … HVW2) -H -H0LK -HVW2 /3 width=7 by cpysa_subst, ylt_fwd_le_succ/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_cpys.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_cpys.ma index 1af1c2db0..dc646a4ca 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_cpys.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_cpys.ma @@ -103,7 +103,7 @@ theorem cpys_antisym_eq: ∀G,L1,T1,T2,d,e. ⦃G, L1⦄ ⊢ T1 ▶*[d, e] T2 → lapply (cpys_weak … HW2 0 (i+1) ? ?) -HW2 // [ >yplus_O1 >yplus_O1 /3 width=1 by ylt_fwd_le, ylt_inj/ ] -Hi #HW2 >(cpys_inv_lift1_eq … HW2) -HW2 // - | elim (ldrop_O1_le (Ⓕ) … Hi) -Hi #K2 #HLK2 + | elim (drop_O1_le (Ⓕ) … Hi) -Hi #K2 #HLK2 elim (cpys_inv_lift1_ge_up … HW2 … HLK2 … HVW2 ? ? ?) -HW2 -HLK2 -HVW2 /2 width=1 by ylt_fwd_le_succ, yle_succ_dx/ -Hdi -Hide #X #_ #H elim (lift_inv_lref2_be … H) -H // diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_lift.ma index e2dc401e3..3e0204b82 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/cpys_lift.ma @@ -28,7 +28,7 @@ lemma cpys_subst: ∀I,G,L,K,V,U1,i,d,e. | #U #U1 #_ #HU1 #IHU #U2 #HU12 elim (lift_total U 0 (i+1)) #U0 #HU0 lapply (IHU … HU0) -IHU #H - lapply (ldrop_fwd_drop2 … HLK) -HLK #HLK + lapply (drop_fwd_drop2 … HLK) -HLK #HLK lapply (cpy_lift_ge … HU1 … HLK HU0 HU12 ?) -HU1 -HLK -HU0 -HU12 // #HU02 lapply (cpy_weak … HU02 d e ? ?) -HU02 [2,3: /2 width=3 by cpys_strap1, yle_succ_dx/ ] @@ -59,7 +59,7 @@ lemma cpys_inv_atom1: ∀I,G,L,T2,d,e. ⦃G, L⦄ ⊢ ⓪{I} ▶*[d, e] T2 → [ #H destruct elim (cpy_inv_atom1 … HT2) -HT2 [ /2 width=1 by or_introl/ | * /3 width=11 by ex6_5_intro, or_intror/ ] | * #J #K #V1 #V #i #Hdi #Hide #HLK #HV1 #HVT #HI - lapply (ldrop_fwd_drop2 … HLK) #H + lapply (drop_fwd_drop2 … HLK) #H elim (cpy_inv_lift1_ge_up … HT2 … H … HVT) -HT2 -H -HVT [2,3,4: /2 width=1 by ylt_fwd_le_succ, yle_succ_dx/ ] /4 width=11 by cpys_strap1, ex6_5_intro, or_intror/ @@ -85,7 +85,7 @@ lemma cpys_inv_lref1_Y2: ∀G,L,T2,i,d. ⦃G, L⦄ ⊢ #i ▶*[d, ∞] T2 → * >yminus_Y_inj /3 width=7 by or_intror, ex4_4_intro/ qed-. -lemma cpys_inv_lref1_ldrop: ∀G,L,T2,i,d,e. ⦃G, L⦄ ⊢ #i ▶*[d, e] T2 → +lemma cpys_inv_lref1_drop: ∀G,L,T2,i,d,e. ⦃G, L⦄ ⊢ #i ▶*[d, e] T2 → ∀I,K,V1. ⇩[i] L ≡ K.ⓑ{I}V1 → ∀V2. ⇧[O, i+1] V2 ≡ T2 → ∧∧ ⦃G, K⦄ ⊢ V1 ▶*[0, ⫰(d+e-i)] V2 @@ -95,7 +95,7 @@ lemma cpys_inv_lref1_ldrop: ∀G,L,T2,i,d,e. ⦃G, L⦄ ⊢ #i ▶*[d, e] T2 → [ #H destruct elim (lift_inv_lref2_be … HVT2) -HVT2 -HLK // | * #Z #Y #X1 #X2 #Hdi #Hide #HLY #HX12 #HXT2 lapply (lift_inj … HXT2 … HVT2) -T2 #H destruct - lapply (ldrop_mono … HLY … HLK) -L #H destruct + lapply (drop_mono … HLY … HLK) -L #H destruct /2 width=1 by and3_intro/ ] qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/drops.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/drops.ma new file mode 100644 index 000000000..ff9574ab6 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/drops.ma @@ -0,0 +1,96 @@ +(**************************************************************************) +(* ___ *) +(* ||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/notation/relations/rdropstar_3.ma". +include "basic_2/notation/relations/rdropstar_4.ma". +include "basic_2/substitution/drop.ma". +include "basic_2/multiple/gr2_minus.ma". +include "basic_2/multiple/lifts.ma". + +(* ITERATED LOCAL ENVIRONMENT SLICING ***************************************) + +inductive drops (s:bool): list2 nat nat → relation lenv ≝ +| drops_nil : ∀L. drops s (⟠) L L +| drops_cons: ∀L1,L,L2,des,d,e. + drops s des L1 L → ⇩[s, d, e] L ≡ L2 → drops s ({d, e} @ des) L1 L2 +. + +interpretation "iterated slicing (local environment) abstract" + 'RDropStar s des T1 T2 = (drops s des T1 T2). +(* +interpretation "iterated slicing (local environment) general" + 'RDropStar des T1 T2 = (drops true des T1 T2). +*) + +(* Basic inversion lemmas ***************************************************) + +fact drops_inv_nil_aux: ∀L1,L2,s,des. ⇩*[s, des] L1 ≡ L2 → des = ⟠ → L1 = L2. +#L1 #L2 #s #des * -L1 -L2 -des // +#L1 #L #L2 #d #e #des #_ #_ #H destruct +qed-. + +(* Basic_1: was: drop1_gen_pnil *) +lemma drops_inv_nil: ∀L1,L2,s. ⇩*[s, ⟠] L1 ≡ L2 → L1 = L2. +/2 width=4 by drops_inv_nil_aux/ qed-. + +fact drops_inv_cons_aux: ∀L1,L2,s,des. ⇩*[s, des] L1 ≡ L2 → + ∀d,e,tl. des = {d, e} @ tl → + ∃∃L. ⇩*[s, tl] L1 ≡ L & ⇩[s, d, e] L ≡ L2. +#L1 #L2 #s #des * -L1 -L2 -des +[ #L #d #e #tl #H destruct +| #L1 #L #L2 #des #d #e #HT1 #HT2 #hd #he #tl #H destruct + /2 width=3 by ex2_intro/ +] +qed-. + +(* Basic_1: was: drop1_gen_pcons *) +lemma drops_inv_cons: ∀L1,L2,s,d,e,des. ⇩*[s, {d, e} @ des] L1 ≡ L2 → + ∃∃L. ⇩*[s, des] L1 ≡ L & ⇩[s, d, e] L ≡ L2. +/2 width=3 by drops_inv_cons_aux/ qed-. + +lemma drops_inv_skip2: ∀I,s,des,des2,i. des ▭ i ≡ des2 → + ∀L1,K2,V2. ⇩*[s, des2] L1 ≡ K2. ⓑ{I} V2 → + ∃∃K1,V1,des1. des + 1 ▭ i + 1 ≡ des1 + 1 & + ⇩*[s, des1] K1 ≡ K2 & + ⇧*[des1] V2 ≡ V1 & + L1 = K1. ⓑ{I} V1. +#I #s #des #des2 #i #H elim H -des -des2 -i +[ #i #L1 #K2 #V2 #H + >(drops_inv_nil … H) -L1 /2 width=7 by lifts_nil, minuss_nil, ex4_3_intro, drops_nil/ +| #des #des2 #d #e #i #Hid #_ #IHdes2 #L1 #K2 #V2 #H + elim (drops_inv_cons … H) -H #L #HL1 #H + elim (drop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ #K #V >minus_plus #HK2 #HV2 #H destruct + elim (IHdes2 … HL1) -IHdes2 -HL1 #K1 #V1 #des1 #Hdes1 #HK1 #HV1 #X destruct + @(ex4_3_intro … K1 V1 … ) // [3,4: /2 width=7 by lifts_cons, drops_cons/ | skip ] + normalize >plus_minus /3 width=1 by minuss_lt, lt_minus_to_plus/ (**) (* explicit constructors *) +| #des #des2 #d #e #i #Hid #_ #IHdes2 #L1 #K2 #V2 #H + elim (IHdes2 … H) -IHdes2 -H #K1 #V1 #des1 #Hdes1 #HK1 #HV1 #X destruct + /4 width=7 by minuss_ge, ex4_3_intro, le_S_S/ +] +qed-. + +(* Basic properties *********************************************************) + +(* Basic_1: was: drop1_skip_bind *) +lemma drops_skip: ∀L1,L2,s,des. ⇩*[s, des] L1 ≡ L2 → ∀V1,V2. ⇧*[des] V2 ≡ V1 → + ∀I. ⇩*[s, des + 1] L1.ⓑ{I}V1 ≡ L2.ⓑ{I}V2. +#L1 #L2 #s #des #H elim H -L1 -L2 -des +[ #L #V1 #V2 #HV12 #I + >(lifts_inv_nil … HV12) -HV12 // +| #L1 #L #L2 #des #d #e #_ #HL2 #IHL #V1 #V2 #H #I + elim (lifts_inv_cons … H) -H /3 width=5 by drop_skip, drops_cons/ +]. +qed. + +(* Basic_1: removed theorems 1: drop1_getl_trans *) diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/drops_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/drops_drop.ma new file mode 100644 index 000000000..207228887 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/drops_drop.ma @@ -0,0 +1,35 @@ +(**************************************************************************) +(* ___ *) +(* ||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/substitution/drop_drop.ma". +include "basic_2/multiple/drops.ma". + +(* ITERATED LOCAL ENVIRONMENT SLICING ***************************************) + +(* Properties concerning basic local environment slicing ********************) + +lemma drops_drop_trans: ∀L1,L,des. ⇩*[Ⓕ, des] L1 ≡ L → ∀L2,i. ⇩[i] L ≡ L2 → + ∃∃L0,des0,i0. ⇩[i0] L1 ≡ L0 & ⇩*[Ⓕ, des0] L0 ≡ L2 & + @⦃i, des⦄ ≡ i0 & des ▭ i ≡ des0. +#L1 #L #des #H elim H -L1 -L -des +[ /2 width=7 by drops_nil, minuss_nil, at_nil, ex4_3_intro/ +| #L1 #L0 #L #des #d #e #_ #HL0 #IHL0 #L2 #i #HL2 + elim (lt_or_ge i d) #Hid + [ elim (drop_trans_le … HL0 … HL2) -L /2 width=2 by lt_to_le/ + #L #HL0 #HL2 elim (IHL0 … HL0) -L0 /3 width=7 by drops_cons, minuss_lt, at_lt, ex4_3_intro/ + | lapply (drop_trans_ge … HL0 … HL2 ?) -L // #HL02 + elim (IHL0 … HL02) -L0 /3 width=7 by minuss_ge, at_ge, ex4_3_intro/ + ] +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/drops_drops.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/drops_drops.ma new file mode 100644 index 000000000..c4751028a --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/drops_drops.ma @@ -0,0 +1,25 @@ +(**************************************************************************) +(* ___ *) +(* ||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/multiple/drops_drop.ma". + +(* ITERATED LOCAL ENVIRONMENT SLICING ***************************************) + +(* Main properties **********************************************************) + +(* Basic_1: was: drop1_trans *) +theorem drops_trans: ∀L,L2,s,des2. ⇩*[s, des2] L ≡ L2 → ∀L1,des1. ⇩*[s, des1] L1 ≡ L → + ⇩*[s, des2 @@ des1] L1 ≡ L2. +#L #L2 #s #des2 #H elim H -L -L2 -des2 /3 width=3 by drops_cons/ +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/fqup.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/fqup.ma index 6a4bb37e2..086505fdf 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/fqup.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/fqup.ma @@ -37,16 +37,16 @@ lemma fqup_strap2: ∀G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1, L1, T1⦄ ⊐+ ⦃G2, L2, T2⦄. /2 width=5 by tri_TC_strap/ qed. -lemma fqup_ldrop: ∀G1,G2,L1,K1,K2,T1,T2,U1,e. ⇩[e] L1 ≡ K1 → ⇧[0, e] T1 ≡ U1 → +lemma fqup_drop: ∀G1,G2,L1,K1,K2,T1,T2,U1,e. ⇩[e] L1 ≡ K1 → ⇧[0, e] T1 ≡ U1 → ⦃G1, K1, T1⦄ ⊐+ ⦃G2, K2, T2⦄ → ⦃G1, L1, U1⦄ ⊐+ ⦃G2, K2, T2⦄. #G1 #G2 #L1 #K1 #K2 #T1 #T2 #U1 #e #HLK1 #HTU1 #HT12 elim (eq_or_gt … e) #H destruct -[ >(ldrop_inv_O2 … HLK1) -L1 <(lift_inv_O2 … HTU1) -U1 // +[ >(drop_inv_O2 … HLK1) -L1 <(lift_inv_O2 … HTU1) -U1 // | /3 width=5 by fqup_strap2, fqu_drop_lt/ ] qed-. lemma fqup_lref: ∀I,G,L,K,V,i. ⇩[i] L ≡ K.ⓑ{I}V → ⦃G, L, #i⦄ ⊐+ ⦃G, K, V⦄. -/3 width=6 by fqu_lref_O, fqu_fqup, lift_lref_ge, fqup_ldrop/ qed. +/3 width=6 by fqu_lref_O, fqu_fqup, lift_lref_ge, fqup_drop/ qed. lemma fqup_pair_sn: ∀I,G,L,V,T. ⦃G, L, ②{I}V.T⦄ ⊐+ ⦃G, L, V⦄. /2 width=1 by fqu_pair_sn, fqu_fqup/ qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/fqus.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/fqus.ma index 5fe07bd4a..6c990cace 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/fqus.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/fqus.ma @@ -55,7 +55,7 @@ lemma fqus_strap2: ∀G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G, L, ⦃G1, L1, T1⦄ ⊐* ⦃G2, L2, T2⦄. /2 width=5 by tri_TC_strap/ qed-. -lemma fqus_ldrop: ∀G1,G2,K1,K2,T1,T2. ⦃G1, K1, T1⦄ ⊐* ⦃G2, K2, T2⦄ → +lemma fqus_drop: ∀G1,G2,K1,K2,T1,T2. ⦃G1, K1, T1⦄ ⊐* ⦃G2, K2, T2⦄ → ∀L1,U1,e. ⇩[e] L1 ≡ K1 → ⇧[0, e] T1 ≡ U1 → ⦃G1, L1, U1⦄ ⊐* ⦃G2, K2, T2⦄. #G1 #G2 #K1 #K2 #T1 #T2 #H @(fqus_ind … H) -G2 -K2 -T2 diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/frees.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/frees.ma index f5e8f1c88..b803a05b6 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/frees.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/frees.ma @@ -15,7 +15,7 @@ include "ground_2/ynat/ynat_plus.ma". include "basic_2/notation/relations/freestar_4.ma". include "basic_2/substitution/lift_neg.ma". -include "basic_2/substitution/ldrop.ma". +include "basic_2/substitution/drop.ma". (* CONTEXT-SENSITIVE FREE VARIABLES *****************************************) @@ -61,7 +61,7 @@ qed-. lemma frees_inv_lref_free: ∀L,d,j,i. L ⊢ i ϵ 𝐅*[d]⦃#j⦄ → |L| ≤ j → j = i. #L #d #j #i #H #Hj elim (frees_inv_lref … H) -H // -* #I #K #W #_ #_ #HLK lapply (ldrop_fwd_length_lt2 … HLK) -I +* #I #K #W #_ #_ #HLK lapply (drop_fwd_length_lt2 … HLK) -I #H elim (lt_refl_false j) /2 width=3 by lt_to_le_to_lt/ qed-. @@ -91,7 +91,7 @@ lemma frees_inv_bind: ∀a,I,L,W,U,d,i. L ⊢ i ϵ 𝐅*[d]⦃ⓑ{a,I}W.U⦄ → | * #I #K #W #j #Hdj #Hji #HnX #HLK #HW elim (nlift_inv_bind … HnX) -HnX [ /4 width=9 by frees_be, or_introl/ | #HnT @or_intror @(frees_be … HnT) -HnT - [4,5,6: /2 width=1 by ldrop_drop, yle_succ, lt_minus_to_plus/ + [4,5,6: /2 width=1 by drop_drop, yle_succ, lt_minus_to_plus/ |7: >minus_plus_plus_l // |*: skip ] @@ -132,7 +132,7 @@ lemma frees_bind_dx: ∀a,I,L,W,U,d,i. L.ⓑ{I}W ⊢ i+1 ϵ 𝐅*[⫯d]⦃U⦄ elim (yle_inv_succ1 … Hdj) -Hdj (plus_minus_m_m j 1) in HnU; // (minus_plus_m_m (|K2|) 1) >H0 -H0 /2 width=1 by monotonic_le_minus_l2/ @@ -37,9 +37,9 @@ fact frees_inv_append_aux: ∀L,U,d,i. L ⊢ i ϵ 𝐅*[d]⦃U⦄ → ∀L1,L2. i ≤ |L2| → L2 ⊢ i ϵ 𝐅*[d]⦃U⦄. #L #U #d #i #H elim H -L -U -d -i /3 width=2 by frees_eq/ #Z #L #Y #U #X #d #i #j #Hdj #Hji #HnU #HLY #_ #IHW #L1 #L2 #H #Hi destruct -elim (ldrop_O1_lt (Ⓕ) L2 j) [2: -Z -Y -L1 -X -U -d /2 width=3 by lt_to_le_to_lt/ ] -#I #K2 #W #HLK2 lapply (ldrop_fwd_length_minus2 … HLK2) normalize #H0 -lapply (ldrop_O1_inv_append1_le … HLY … HLK2) -HLY +elim (drop_O1_lt (Ⓕ) L2 j) [2: -Z -Y -L1 -X -U -d /2 width=3 by lt_to_le_to_lt/ ] +#I #K2 #W #HLK2 lapply (drop_fwd_length_minus2 … HLK2) normalize #H0 +lapply (drop_O1_inv_append1_le … HLY … HLK2) -HLY [ -Z -I -Y -K2 -L1 -X -U -W -d /3 width=3 by lt_to_le, lt_to_le_to_lt/ | normalize #H destruct @(frees_be … HnU HLK2) -HnU -HLK2 // @IHW -IHW // diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/frees_leq.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/frees_leq.ma index bb387ad10..c8cf8f0c2 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/frees_leq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/frees_leq.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_leq.ma". +include "basic_2/substitution/drop_leq.ma". include "basic_2/multiple/frees.ma". (* CONTEXT-SENSITIVE FREE VARIABLES *****************************************) @@ -20,13 +20,13 @@ include "basic_2/multiple/frees.ma". (* Properties on equivalence for local environments *************************) lemma leq_frees_trans: ∀L2,U,d,i. L2 ⊢ i ϵ 𝐅*[d]⦃U⦄ → - ∀L1. L1 ≃[d, ∞] L2 → L1 ⊢ i ϵ 𝐅*[d]⦃U⦄. + ∀L1. L1 ⩬[d, ∞] L2 → L1 ⊢ i ϵ 𝐅*[d]⦃U⦄. #L2 #U #d #i #H elim H -L2 -U -d -i /3 width=2 by frees_eq/ #I2 #L2 #K2 #U #W2 #d #i #j #Hdj #Hji #HnU #HLK2 #_ #IHW2 #L1 #HL12 -elim (leq_ldrop_trans_be … HL12 … HLK2) -L2 // >yminus_Y_inj #K1 #HK12 #HLK1 +elim (leq_drop_trans_be … HL12 … HLK2) -L2 // >yminus_Y_inj #K1 #HK12 #HLK1 lapply (leq_inv_O_Y … HK12) -HK12 #H destruct /3 width=9 by frees_be/ qed-. lemma frees_leq_conf: ∀L1,U,d,i. L1 ⊢ i ϵ 𝐅*[d]⦃U⦄ → - ∀L2. L1 ≃[d, ∞] L2 → L2 ⊢ i ϵ 𝐅*[d]⦃U⦄. + ∀L2. L1 ⩬[d, ∞] L2 → L2 ⊢ i ϵ 𝐅*[d]⦃U⦄. /3 width=3 by leq_sym, leq_frees_trans/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/frees_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/frees_lift.ma index 8b295524d..1b66bd0b7 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/frees_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/frees_lift.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_ldrop.ma". +include "basic_2/substitution/drop_drop.ma". include "basic_2/multiple/frees.ma". (* CONTEXT-SENSITIVE FREE VARIABLES *****************************************) @@ -31,10 +31,10 @@ lemma frees_dec: ∀L,U,d,i. Decidable (frees d L U i). [ -n @or_intror #H elim (lt_refl_false i) lapply (frees_inv_lref_skip … H ?) -L // | elim (lt_or_ge j (|L|)) #Hj - [ elim (ldrop_O1_lt (Ⓕ) L j) // -Hj #I #K #W #HLK destruct - elim (IH K W … 0 (i-j-1)) -IH [1,3: /3 width=5 by frees_lref_be, ldrop_fwd_rfw, or_introl/ ] #HnW + [ elim (drop_O1_lt (Ⓕ) L j) // -Hj #I #K #W #HLK destruct + elim (IH K W … 0 (i-j-1)) -IH [1,3: /3 width=5 by frees_lref_be, drop_fwd_rfw, or_introl/ ] #HnW @or_intror #H elim (frees_inv_lref_lt … H) // #Z #Y #X #_ #HLY -d - lapply (ldrop_mono … HLY … HLK) -L #H destruct /2 width=1 by/ + lapply (drop_mono … HLY … HLK) -L #H destruct /2 width=1 by/ | -n @or_intror #H elim (lt_refl_false i) lapply (frees_inv_lref_free … H ?) -d // ] @@ -60,7 +60,7 @@ lapply (yle_inv_inj … Hdj) -Hdj #Hdj elim (le_to_or_lt_eq … Hdj) -Hdj [ -I0 -K0 -W0 /3 width=9 by frees_be, yle_inj/ | -Hji -HnU #H destruct - lapply (ldrop_mono … HLK0 … HLK) #H destruct -I + lapply (drop_mono … HLK0 … HLK) #H destruct -I elim HnW0 -L -U -HnW0 // ] qed. @@ -83,7 +83,7 @@ lemma frees_lift_ge: ∀K,T,d,i. K ⊢ i ϵ𝐅*[d]⦃T⦄ → @frees_eq #X #HXU elim (lift_div_le … HTU … HXU) -U /2 width=2 by/ | #I #K #K0 #T #V #d #i #j #Hdj #Hji #HnT #HK0 #HV #IHV #L #s #d0 #e0 #HLK #U #HTU #Hd0i elim (lt_or_ge j d0) #H1 - [ elim (ldrop_trans_lt … HLK … HK0) // -K #L0 #W #HL0 #HLK0 #HVW + [ elim (drop_trans_lt … HLK … HK0) // -K #L0 #W #HL0 #HLK0 #HVW @(frees_be … HL0) -HL0 -HV /3 width=3 by lt_plus_to_minus_r, lt_to_le_to_lt/ [ #X #HXU >(plus_minus_m_m d0 1) in HTU; /2 width=2 by ltn_to_ltO/ #HTU @@ -91,8 +91,8 @@ lemma frees_lift_ge: ∀K,T,d,i. K ⊢ i ϵ𝐅*[d]⦃T⦄ → | >minus_plus commutative_plus -HLK0 #HLK0 + | lapply (drop_trans_ge … HLK … HK0 ?) // -K #HLK0 + lapply (drop_inv_gen … HLK0) >commutative_plus -HLK0 #HLK0 @(frees_be … HLK0) -HLK0 -IHV /2 width=1 by yle_plus_dx1_trans, lt_minus_to_plus/ #X #HXU elim (lift_div_le … HTU … HXU) -U /2 width=2 by/ @@ -110,7 +110,7 @@ lemma frees_inv_lift_be: ∀L,U,d,i. L ⊢ i ϵ 𝐅*[d]⦃U⦄ → elim (lift_split … HTU i e0) -HTU /2 width=2 by/ | #I #L #K0 #U #W #d #i #j #Hdi #Hij #HnU #HLK0 #_ #IHW #K #s #d0 #e0 #HLK #T #HTU #Hd0i #Hide0 elim (lt_or_ge j d0) #H1 - [ elim (ldrop_conf_lt … HLK … HLK0) -L // #L0 #V #H #HKL0 #HVW + [ elim (drop_conf_lt … HLK … HLK0) -L // #L0 #V #H #HKL0 #HVW @(IHW … HKL0 … HVW) [ /2 width=1 by monotonic_le_minus_l2/ | >minus_plus >minus_plus >plus_minus /2 width=1 by monotonic_le_minus_l/ @@ -130,7 +130,7 @@ lemma frees_inv_lift_ge: ∀L,U,d,i. L ⊢ i ϵ 𝐅*[d]⦃U⦄ → elim (lift_trans_le … HXT … HTU) -T // commutative_plus /3 width=1 by le_minus_to_plus, monotonic_pred/ ] - | lapply (ldrop_conf_ge … HLK … HLK0 ?) // -L #HK0 + | lapply (drop_conf_ge … HLK … HLK0 ?) // -L #HK0 elim (le_inv_plus_l … H2) -H2 #H2 #He0j @(frees_be … HK0) [ /2 width=1 by monotonic_yle_minus_dx/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops.ma deleted file mode 100644 index 1e6627ff9..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops.ma +++ /dev/null @@ -1,96 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/notation/relations/rdropstar_3.ma". -include "basic_2/notation/relations/rdropstar_4.ma". -include "basic_2/substitution/ldrop.ma". -include "basic_2/multiple/gr2_minus.ma". -include "basic_2/multiple/lifts.ma". - -(* ITERATED LOCAL ENVIRONMENT SLICING ***************************************) - -inductive ldrops (s:bool): list2 nat nat → relation lenv ≝ -| ldrops_nil : ∀L. ldrops s (⟠) L L -| ldrops_cons: ∀L1,L,L2,des,d,e. - ldrops s des L1 L → ⇩[s, d, e] L ≡ L2 → ldrops s ({d, e} @ des) L1 L2 -. - -interpretation "iterated slicing (local environment) abstract" - 'RDropStar s des T1 T2 = (ldrops s des T1 T2). -(* -interpretation "iterated slicing (local environment) general" - 'RDropStar des T1 T2 = (ldrops true des T1 T2). -*) - -(* Basic inversion lemmas ***************************************************) - -fact ldrops_inv_nil_aux: ∀L1,L2,s,des. ⇩*[s, des] L1 ≡ L2 → des = ⟠ → L1 = L2. -#L1 #L2 #s #des * -L1 -L2 -des // -#L1 #L #L2 #d #e #des #_ #_ #H destruct -qed-. - -(* Basic_1: was: drop1_gen_pnil *) -lemma ldrops_inv_nil: ∀L1,L2,s. ⇩*[s, ⟠] L1 ≡ L2 → L1 = L2. -/2 width=4 by ldrops_inv_nil_aux/ qed-. - -fact ldrops_inv_cons_aux: ∀L1,L2,s,des. ⇩*[s, des] L1 ≡ L2 → - ∀d,e,tl. des = {d, e} @ tl → - ∃∃L. ⇩*[s, tl] L1 ≡ L & ⇩[s, d, e] L ≡ L2. -#L1 #L2 #s #des * -L1 -L2 -des -[ #L #d #e #tl #H destruct -| #L1 #L #L2 #des #d #e #HT1 #HT2 #hd #he #tl #H destruct - /2 width=3 by ex2_intro/ -] -qed-. - -(* Basic_1: was: drop1_gen_pcons *) -lemma ldrops_inv_cons: ∀L1,L2,s,d,e,des. ⇩*[s, {d, e} @ des] L1 ≡ L2 → - ∃∃L. ⇩*[s, des] L1 ≡ L & ⇩[s, d, e] L ≡ L2. -/2 width=3 by ldrops_inv_cons_aux/ qed-. - -lemma ldrops_inv_skip2: ∀I,s,des,des2,i. des ▭ i ≡ des2 → - ∀L1,K2,V2. ⇩*[s, des2] L1 ≡ K2. ⓑ{I} V2 → - ∃∃K1,V1,des1. des + 1 ▭ i + 1 ≡ des1 + 1 & - ⇩*[s, des1] K1 ≡ K2 & - ⇧*[des1] V2 ≡ V1 & - L1 = K1. ⓑ{I} V1. -#I #s #des #des2 #i #H elim H -des -des2 -i -[ #i #L1 #K2 #V2 #H - >(ldrops_inv_nil … H) -L1 /2 width=7 by lifts_nil, minuss_nil, ex4_3_intro, ldrops_nil/ -| #des #des2 #d #e #i #Hid #_ #IHdes2 #L1 #K2 #V2 #H - elim (ldrops_inv_cons … H) -H #L #HL1 #H - elim (ldrop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ #K #V >minus_plus #HK2 #HV2 #H destruct - elim (IHdes2 … HL1) -IHdes2 -HL1 #K1 #V1 #des1 #Hdes1 #HK1 #HV1 #X destruct - @(ex4_3_intro … K1 V1 … ) // [3,4: /2 width=7 by lifts_cons, ldrops_cons/ | skip ] - normalize >plus_minus /3 width=1 by minuss_lt, lt_minus_to_plus/ (**) (* explicit constructors *) -| #des #des2 #d #e #i #Hid #_ #IHdes2 #L1 #K2 #V2 #H - elim (IHdes2 … H) -IHdes2 -H #K1 #V1 #des1 #Hdes1 #HK1 #HV1 #X destruct - /4 width=7 by minuss_ge, ex4_3_intro, le_S_S/ -] -qed-. - -(* Basic properties *********************************************************) - -(* Basic_1: was: drop1_skip_bind *) -lemma ldrops_skip: ∀L1,L2,s,des. ⇩*[s, des] L1 ≡ L2 → ∀V1,V2. ⇧*[des] V2 ≡ V1 → - ∀I. ⇩*[s, des + 1] L1.ⓑ{I}V1 ≡ L2.ⓑ{I}V2. -#L1 #L2 #s #des #H elim H -L1 -L2 -des -[ #L #V1 #V2 #HV12 #I - >(lifts_inv_nil … HV12) -HV12 // -| #L1 #L #L2 #des #d #e #_ #HL2 #IHL #V1 #V2 #H #I - elim (lifts_inv_cons … H) -H /3 width=5 by ldrop_skip, ldrops_cons/ -]. -qed. - -(* Basic_1: removed theorems 1: drop1_getl_trans *) diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops_ldrop.ma deleted file mode 100644 index cbbfd6788..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops_ldrop.ma +++ /dev/null @@ -1,36 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/substitution/ldrop_ldrop.ma". -include "basic_2/multiple/ldrops.ma". - -(* ITERATED LOCAL ENVIRONMENT SLICING ***************************************) - -(* Properties concerning basic local environment slicing ********************) - -lemma ldrops_ldrop_trans: ∀L1,L,des. ⇩*[Ⓕ, des] L1 ≡ L → ∀L2,i. ⇩[i] L ≡ L2 → - ∃∃L0,des0,i0. ⇩[i0] L1 ≡ L0 & ⇩*[Ⓕ, des0] L0 ≡ L2 & - @⦃i, des⦄ ≡ i0 & des ▭ i ≡ des0. -#L1 #L #des #H elim H -L1 -L -des -[ /2 width=7 by ldrops_nil, minuss_nil, at_nil, ex4_3_intro/ -| #L1 #L0 #L #des #d #e #_ #HL0 #IHL0 #L2 #i #HL2 - elim (lt_or_ge i d) #Hid - [ elim (ldrop_trans_le … HL0 … HL2) -L /2 width=2 by lt_to_le/ - #L #HL0 #HL2 elim (IHL0 … HL0) -L0 /3 width=7 by ldrops_cons, minuss_lt, at_lt, ex4_3_intro/ - | lapply (ldrop_trans_ge … HL0 … HL2 ?) -L // #HL02 - elim (IHL0 … HL02) -L0 /3 width=7 by minuss_ge, at_ge, ex4_3_intro/ - ] -] -qed-. - diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops_ldrops.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops_ldrops.ma deleted file mode 100644 index b51728ca9..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/ldrops_ldrops.ma +++ /dev/null @@ -1,25 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/multiple/ldrops_ldrop.ma". - -(* ITERATED LOCAL ENVIRONMENT SLICING ***************************************) - -(* Main properties **********************************************************) - -(* Basic_1: was: drop1_trans *) -theorem ldrops_trans: ∀L,L2,s,des2. ⇩*[s, des2] L ≡ L2 → ∀L1,des1. ⇩*[s, des1] L1 ≡ L → - ⇩*[s, des2 @@ des1] L1 ≡ L2. -#L #L2 #s #des2 #H elim H -L -L2 -des2 /3 width=3 by ldrops_cons/ -qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq.ma index ea34316fe..9f94ae0da 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq.ma @@ -78,13 +78,13 @@ lemma lleq_fwd_lref: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → * /3 width=7 by or3_intro2, ex4_4_intro/ qed-. -lemma lleq_fwd_ldrop_sn: ∀L1,L2,T,d. L1 ≡[d, T] L2 → ∀K1,i. ⇩[i] L1 ≡ K1 → +lemma lleq_fwd_drop_sn: ∀L1,L2,T,d. L1 ≡[d, T] L2 → ∀K1,i. ⇩[i] L1 ≡ K1 → ∃K2. ⇩[i] L2 ≡ K2. -/2 width=7 by llpx_sn_fwd_ldrop_sn/ qed-. +/2 width=7 by llpx_sn_fwd_drop_sn/ qed-. -lemma lleq_fwd_ldrop_dx: ∀L1,L2,T,d. L1 ≡[d, T] L2 → ∀K2,i. ⇩[i] L2 ≡ K2 → +lemma lleq_fwd_drop_dx: ∀L1,L2,T,d. L1 ≡[d, T] L2 → ∀K2,i. ⇩[i] L2 ≡ K2 → ∃K1. ⇩[i] L1 ≡ K1. -/2 width=7 by llpx_sn_fwd_ldrop_dx/ qed-. +/2 width=7 by llpx_sn_fwd_drop_dx/ qed-. lemma lleq_fwd_bind_sn: ∀a,I,L1,L2,V,T,d. L1 ≡[ⓑ{a,I}V.T, d] L2 → L1 ≡[V, d] L2. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_drop.ma new file mode 100644 index 000000000..6dc43267a --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_drop.ma @@ -0,0 +1,150 @@ +(**************************************************************************) +(* ___ *) +(* ||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/multiple/llpx_sn_drop.ma". +include "basic_2/multiple/lleq.ma". + +(* LAZY EQUIVALENCE FOR LOCAL ENVIRONMENTS **********************************) + +(* Advanced properties ******************************************************) + +lemma lleq_bind_repl_O: ∀I,L1,L2,V,T. L1.ⓑ{I}V ≡[T, 0] L2.ⓑ{I}V → + ∀J,W. L1 ≡[W, 0] L2 → L1.ⓑ{J}W ≡[T, 0] L2.ⓑ{J}W. +/2 width=7 by llpx_sn_bind_repl_O/ qed-. + +lemma lleq_dec: ∀T,L1,L2,d. Decidable (L1 ≡[T, d] L2). +/3 width=1 by llpx_sn_dec, eq_term_dec/ qed-. + +lemma lleq_llpx_sn_trans: ∀R. lleq_transitive R → + ∀L1,L2,T,d. L1 ≡[T, d] L2 → + ∀L. llpx_sn R d T L2 L → llpx_sn R d T L1 L. +#R #HR #L1 #L2 #T #d #H @(lleq_ind … H) -L1 -L2 -T -d +[1,2,5: /4 width=6 by llpx_sn_fwd_length, llpx_sn_gref, llpx_sn_skip, llpx_sn_sort, trans_eq/ +|4: /4 width=6 by llpx_sn_fwd_length, llpx_sn_free, le_repl_sn_conf_aux, trans_eq/ +| #I #L1 #L2 #K1 #K2 #V #d #i #Hdi #HLK1 #HLK2 #HK12 #IHK12 #L #H elim (llpx_sn_inv_lref_ge_sn … H … HLK2) -H -HLK2 + /3 width=11 by llpx_sn_lref/ +| #a #I #L1 #L2 #V #T #d #_ #_ #IHV #IHT #L #H elim (llpx_sn_inv_bind … H) -H + /3 width=1 by llpx_sn_bind/ +| #I #L1 #L2 #V #T #d #_ #_ #IHV #IHT #L #H elim (llpx_sn_inv_flat … H) -H + /3 width=1 by llpx_sn_flat/ +] +qed-. + +lemma lleq_llpx_sn_conf: ∀R. lleq_transitive R → + ∀L1,L2,T,d. L1 ≡[T, d] L2 → + ∀L. llpx_sn R d T L1 L → llpx_sn R d T L2 L. +/3 width=3 by lleq_llpx_sn_trans, lleq_sym/ qed-. + +(* Advanced inversion lemmas ************************************************) + +lemma lleq_inv_lref_ge_dx: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → d ≤ i → + ∀I,K2,V. ⇩[i] L2 ≡ K2.ⓑ{I}V → + ∃∃K1. ⇩[i] L1 ≡ K1.ⓑ{I}V & K1 ≡[V, 0] K2. +#L1 #L2 #d #i #H #Hdi #I #K2 #V #HLK2 elim (llpx_sn_inv_lref_ge_dx … H … HLK2) -L2 +/2 width=3 by ex2_intro/ +qed-. + +lemma lleq_inv_lref_ge_sn: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → d ≤ i → + ∀I,K1,V. ⇩[i] L1 ≡ K1.ⓑ{I}V → + ∃∃K2. ⇩[i] L2 ≡ K2.ⓑ{I}V & K1 ≡[V, 0] K2. +#L1 #L2 #d #i #H #Hdi #I1 #K1 #V #HLK1 elim (llpx_sn_inv_lref_ge_sn … H … HLK1) -L1 +/2 width=3 by ex2_intro/ +qed-. + +lemma lleq_inv_lref_ge_bi: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → d ≤ i → + ∀I1,I2,K1,K2,V1,V2. + ⇩[i] L1 ≡ K1.ⓑ{I1}V1 → ⇩[i] L2 ≡ K2.ⓑ{I2}V2 → + ∧∧ I1 = I2 & K1 ≡[V1, 0] K2 & V1 = V2. +/2 width=8 by llpx_sn_inv_lref_ge_bi/ qed-. + +lemma lleq_inv_lref_ge: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → d ≤ i → + ∀I,K1,K2,V. ⇩[i] L1 ≡ K1.ⓑ{I}V → ⇩[i] L2 ≡ K2.ⓑ{I}V → + K1 ≡[V, 0] K2. +#L1 #L2 #d #i #HL12 #Hdi #I #K1 #K2 #V #HLK1 #HLK2 +elim (lleq_inv_lref_ge_bi … HL12 … HLK1 HLK2) // +qed-. + +lemma lleq_inv_S: ∀L1,L2,T,d. L1 ≡[T, d+1] L2 → + ∀I,K1,K2,V. ⇩[d] L1 ≡ K1.ⓑ{I}V → ⇩[d] L2 ≡ K2.ⓑ{I}V → + K1 ≡[V, 0] K2 → L1 ≡[T, d] L2. +/2 width=9 by llpx_sn_inv_S/ qed-. + +lemma lleq_inv_bind_O: ∀a,I,L1,L2,V,T. L1 ≡[ⓑ{a,I}V.T, 0] L2 → + L1 ≡[V, 0] L2 ∧ L1.ⓑ{I}V ≡[T, 0] L2.ⓑ{I}V. +/2 width=2 by llpx_sn_inv_bind_O/ qed-. + +(* Advanced forward lemmas **************************************************) + +lemma lleq_fwd_lref_dx: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → + ∀I,K2,V. ⇩[i] L2 ≡ K2.ⓑ{I}V → + i < d ∨ + ∃∃K1. ⇩[i] L1 ≡ K1.ⓑ{I}V & K1 ≡[V, 0] K2 & d ≤ i. +#L1 #L2 #d #i #H #I #K2 #V #HLK2 elim (llpx_sn_fwd_lref_dx … H … HLK2) -L2 +[ | * ] /3 width=3 by ex3_intro, or_intror, or_introl/ +qed-. + +lemma lleq_fwd_lref_sn: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → + ∀I,K1,V. ⇩[i] L1 ≡ K1.ⓑ{I}V → + i < d ∨ + ∃∃K2. ⇩[i] L2 ≡ K2.ⓑ{I}V & K1 ≡[V, 0] K2 & d ≤ i. +#L1 #L2 #d #i #H #I #K1 #V #HLK1 elim (llpx_sn_fwd_lref_sn … H … HLK1) -L1 +[ | * ] /3 width=3 by ex3_intro, or_intror, or_introl/ +qed-. + +lemma lleq_fwd_bind_O_dx: ∀a,I,L1,L2,V,T. L1 ≡[ⓑ{a,I}V.T, 0] L2 → + L1.ⓑ{I}V ≡[T, 0] L2.ⓑ{I}V. +/2 width=2 by llpx_sn_fwd_bind_O_dx/ qed-. + +(* Properties on relocation *************************************************) + +lemma lleq_lift_le: ∀K1,K2,T,dt. K1 ≡[T, dt] K2 → + ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀U. ⇧[d, e] T ≡ U → dt ≤ d → L1 ≡[U, dt] L2. +/3 width=10 by llpx_sn_lift_le, lift_mono/ qed-. + +lemma lleq_lift_ge: ∀K1,K2,T,dt. K1 ≡[T, dt] K2 → + ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀U. ⇧[d, e] T ≡ U → d ≤ dt → L1 ≡[U, dt+e] L2. +/2 width=9 by llpx_sn_lift_ge/ qed-. + +(* Inversion lemmas on relocation *******************************************) + +lemma lleq_inv_lift_le: ∀L1,L2,U,dt. L1 ≡[U, dt] L2 → + ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀T. ⇧[d, e] T ≡ U → dt ≤ d → K1 ≡[T, dt] K2. +/3 width=10 by llpx_sn_inv_lift_le, ex2_intro/ qed-. + +lemma lleq_inv_lift_be: ∀L1,L2,U,dt. L1 ≡[U, dt] L2 → + ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀T. ⇧[d, e] T ≡ U → d ≤ dt → dt ≤ yinj d + e → K1 ≡[T, d] K2. +/2 width=11 by llpx_sn_inv_lift_be/ qed-. + +lemma lleq_inv_lift_ge: ∀L1,L2,U,dt. L1 ≡[U, dt] L2 → + ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀T. ⇧[d, e] T ≡ U → yinj d + e ≤ dt → K1 ≡[T, dt-e] K2. +/2 width=9 by llpx_sn_inv_lift_ge/ qed-. + +(* Inversion lemmas on negated lazy quivalence for local environments *******) + +lemma nlleq_inv_bind: ∀a,I,L1,L2,V,T,d. (L1 ≡[ⓑ{a,I}V.T, d] L2 → ⊥) → + (L1 ≡[V, d] L2 → ⊥) ∨ (L1.ⓑ{I}V ≡[T, ⫯d] L2.ⓑ{I}V → ⊥). +/3 width=2 by nllpx_sn_inv_bind, eq_term_dec/ qed-. + +lemma nlleq_inv_flat: ∀I,L1,L2,V,T,d. (L1 ≡[ⓕ{I}V.T, d] L2 → ⊥) → + (L1 ≡[V, d] L2 → ⊥) ∨ (L1 ≡[T, d] L2 → ⊥). +/3 width=2 by nllpx_sn_inv_flat, eq_term_dec/ qed-. + +lemma nlleq_inv_bind_O: ∀a,I,L1,L2,V,T. (L1 ≡[ⓑ{a,I}V.T, 0] L2 → ⊥) → + (L1 ≡[V, 0] L2 → ⊥) ∨ (L1.ⓑ{I}V ≡[T, 0] L2.ⓑ{I}V → ⊥). +/3 width=2 by nllpx_sn_inv_bind_O, eq_term_dec/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_fqus.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_fqus.ma index 87fd1e7f8..eea2d3486 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_fqus.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_fqus.ma @@ -13,7 +13,7 @@ (**************************************************************************) include "basic_2/multiple/fqus_alt.ma". -include "basic_2/multiple/lleq_ldrop.ma". +include "basic_2/multiple/lleq_drop.ma". (* LAZY EQUIVALENCE FOR LOCAL ENVIRONMENTS **********************************) @@ -24,7 +24,7 @@ lemma lleq_fqu_trans: ∀G1,G2,L2,K2,T,U. ⦃G1, L2, T⦄ ⊐ ⦃G2, K2, U⦄ ∃∃K1. ⦃G1, L1, T⦄ ⊐ ⦃G2, K1, U⦄ & K1 ≡[U, 0] K2. #G1 #G2 #L2 #K2 #T #U #H elim H -G1 -G2 -L2 -K2 -T -U [ #I #G #L2 #V #L1 #H elim (lleq_inv_lref_ge_dx … H … I L2 V) -H // - #K1 #H1 #H2 lapply (ldrop_inv_O2 … H1) -H1 + #K1 #H1 #H2 lapply (drop_inv_O2 … H1) -H1 #H destruct /2 width=3 by fqu_lref_O, ex2_intro/ | * [ #a ] #I #G #L2 #V #T #L1 #H [ elim (lleq_inv_bind … H) @@ -36,9 +36,9 @@ lemma lleq_fqu_trans: ∀G1,G2,L2,K2,T,U. ⦃G1, L2, T⦄ ⊐ ⦃G2, K2, U⦄ | #I #G #L2 #V #T #L1 #H elim (lleq_inv_flat … H) -H /2 width=3 by fqu_flat_dx, ex2_intro/ | #G #L2 #K2 #T #U #e #HLK2 #HTU #L1 #HL12 - elim (ldrop_O1_le (Ⓕ) (e+1) L1) + elim (drop_O1_le (Ⓕ) (e+1) L1) [ /3 width=12 by fqu_drop, lleq_inv_lift_le, ex2_intro/ - | lapply (ldrop_fwd_length_le2 … HLK2) -K2 + | lapply (drop_fwd_length_le2 … HLK2) -K2 lapply (lleq_fwd_length … HL12) -T -U // ] ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_ldrop.ma deleted file mode 100644 index a50e25bd8..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_ldrop.ma +++ /dev/null @@ -1,150 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/multiple/llpx_sn_ldrop.ma". -include "basic_2/multiple/lleq.ma". - -(* LAZY EQUIVALENCE FOR LOCAL ENVIRONMENTS **********************************) - -(* Advanced properties ******************************************************) - -lemma lleq_bind_repl_O: ∀I,L1,L2,V,T. L1.ⓑ{I}V ≡[T, 0] L2.ⓑ{I}V → - ∀J,W. L1 ≡[W, 0] L2 → L1.ⓑ{J}W ≡[T, 0] L2.ⓑ{J}W. -/2 width=7 by llpx_sn_bind_repl_O/ qed-. - -lemma lleq_dec: ∀T,L1,L2,d. Decidable (L1 ≡[T, d] L2). -/3 width=1 by llpx_sn_dec, eq_term_dec/ qed-. - -lemma lleq_llpx_sn_trans: ∀R. lleq_transitive R → - ∀L1,L2,T,d. L1 ≡[T, d] L2 → - ∀L. llpx_sn R d T L2 L → llpx_sn R d T L1 L. -#R #HR #L1 #L2 #T #d #H @(lleq_ind … H) -L1 -L2 -T -d -[1,2,5: /4 width=6 by llpx_sn_fwd_length, llpx_sn_gref, llpx_sn_skip, llpx_sn_sort, trans_eq/ -|4: /4 width=6 by llpx_sn_fwd_length, llpx_sn_free, le_repl_sn_conf_aux, trans_eq/ -| #I #L1 #L2 #K1 #K2 #V #d #i #Hdi #HLK1 #HLK2 #HK12 #IHK12 #L #H elim (llpx_sn_inv_lref_ge_sn … H … HLK2) -H -HLK2 - /3 width=11 by llpx_sn_lref/ -| #a #I #L1 #L2 #V #T #d #_ #_ #IHV #IHT #L #H elim (llpx_sn_inv_bind … H) -H - /3 width=1 by llpx_sn_bind/ -| #I #L1 #L2 #V #T #d #_ #_ #IHV #IHT #L #H elim (llpx_sn_inv_flat … H) -H - /3 width=1 by llpx_sn_flat/ -] -qed-. - -lemma lleq_llpx_sn_conf: ∀R. lleq_transitive R → - ∀L1,L2,T,d. L1 ≡[T, d] L2 → - ∀L. llpx_sn R d T L1 L → llpx_sn R d T L2 L. -/3 width=3 by lleq_llpx_sn_trans, lleq_sym/ qed-. - -(* Advanced inversion lemmas ************************************************) - -lemma lleq_inv_lref_ge_dx: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → d ≤ i → - ∀I,K2,V. ⇩[i] L2 ≡ K2.ⓑ{I}V → - ∃∃K1. ⇩[i] L1 ≡ K1.ⓑ{I}V & K1 ≡[V, 0] K2. -#L1 #L2 #d #i #H #Hdi #I #K2 #V #HLK2 elim (llpx_sn_inv_lref_ge_dx … H … HLK2) -L2 -/2 width=3 by ex2_intro/ -qed-. - -lemma lleq_inv_lref_ge_sn: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → d ≤ i → - ∀I,K1,V. ⇩[i] L1 ≡ K1.ⓑ{I}V → - ∃∃K2. ⇩[i] L2 ≡ K2.ⓑ{I}V & K1 ≡[V, 0] K2. -#L1 #L2 #d #i #H #Hdi #I1 #K1 #V #HLK1 elim (llpx_sn_inv_lref_ge_sn … H … HLK1) -L1 -/2 width=3 by ex2_intro/ -qed-. - -lemma lleq_inv_lref_ge_bi: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → d ≤ i → - ∀I1,I2,K1,K2,V1,V2. - ⇩[i] L1 ≡ K1.ⓑ{I1}V1 → ⇩[i] L2 ≡ K2.ⓑ{I2}V2 → - ∧∧ I1 = I2 & K1 ≡[V1, 0] K2 & V1 = V2. -/2 width=8 by llpx_sn_inv_lref_ge_bi/ qed-. - -lemma lleq_inv_lref_ge: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → d ≤ i → - ∀I,K1,K2,V. ⇩[i] L1 ≡ K1.ⓑ{I}V → ⇩[i] L2 ≡ K2.ⓑ{I}V → - K1 ≡[V, 0] K2. -#L1 #L2 #d #i #HL12 #Hdi #I #K1 #K2 #V #HLK1 #HLK2 -elim (lleq_inv_lref_ge_bi … HL12 … HLK1 HLK2) // -qed-. - -lemma lleq_inv_S: ∀L1,L2,T,d. L1 ≡[T, d+1] L2 → - ∀I,K1,K2,V. ⇩[d] L1 ≡ K1.ⓑ{I}V → ⇩[d] L2 ≡ K2.ⓑ{I}V → - K1 ≡[V, 0] K2 → L1 ≡[T, d] L2. -/2 width=9 by llpx_sn_inv_S/ qed-. - -lemma lleq_inv_bind_O: ∀a,I,L1,L2,V,T. L1 ≡[ⓑ{a,I}V.T, 0] L2 → - L1 ≡[V, 0] L2 ∧ L1.ⓑ{I}V ≡[T, 0] L2.ⓑ{I}V. -/2 width=2 by llpx_sn_inv_bind_O/ qed-. - -(* Advanced forward lemmas **************************************************) - -lemma lleq_fwd_lref_dx: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → - ∀I,K2,V. ⇩[i] L2 ≡ K2.ⓑ{I}V → - i < d ∨ - ∃∃K1. ⇩[i] L1 ≡ K1.ⓑ{I}V & K1 ≡[V, 0] K2 & d ≤ i. -#L1 #L2 #d #i #H #I #K2 #V #HLK2 elim (llpx_sn_fwd_lref_dx … H … HLK2) -L2 -[ | * ] /3 width=3 by ex3_intro, or_intror, or_introl/ -qed-. - -lemma lleq_fwd_lref_sn: ∀L1,L2,d,i. L1 ≡[#i, d] L2 → - ∀I,K1,V. ⇩[i] L1 ≡ K1.ⓑ{I}V → - i < d ∨ - ∃∃K2. ⇩[i] L2 ≡ K2.ⓑ{I}V & K1 ≡[V, 0] K2 & d ≤ i. -#L1 #L2 #d #i #H #I #K1 #V #HLK1 elim (llpx_sn_fwd_lref_sn … H … HLK1) -L1 -[ | * ] /3 width=3 by ex3_intro, or_intror, or_introl/ -qed-. - -lemma lleq_fwd_bind_O_dx: ∀a,I,L1,L2,V,T. L1 ≡[ⓑ{a,I}V.T, 0] L2 → - L1.ⓑ{I}V ≡[T, 0] L2.ⓑ{I}V. -/2 width=2 by llpx_sn_fwd_bind_O_dx/ qed-. - -(* Properties on relocation *************************************************) - -lemma lleq_lift_le: ∀K1,K2,T,dt. K1 ≡[T, dt] K2 → - ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀U. ⇧[d, e] T ≡ U → dt ≤ d → L1 ≡[U, dt] L2. -/3 width=10 by llpx_sn_lift_le, lift_mono/ qed-. - -lemma lleq_lift_ge: ∀K1,K2,T,dt. K1 ≡[T, dt] K2 → - ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀U. ⇧[d, e] T ≡ U → d ≤ dt → L1 ≡[U, dt+e] L2. -/2 width=9 by llpx_sn_lift_ge/ qed-. - -(* Inversion lemmas on relocation *******************************************) - -lemma lleq_inv_lift_le: ∀L1,L2,U,dt. L1 ≡[U, dt] L2 → - ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀T. ⇧[d, e] T ≡ U → dt ≤ d → K1 ≡[T, dt] K2. -/3 width=10 by llpx_sn_inv_lift_le, ex2_intro/ qed-. - -lemma lleq_inv_lift_be: ∀L1,L2,U,dt. L1 ≡[U, dt] L2 → - ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀T. ⇧[d, e] T ≡ U → d ≤ dt → dt ≤ yinj d + e → K1 ≡[T, d] K2. -/2 width=11 by llpx_sn_inv_lift_be/ qed-. - -lemma lleq_inv_lift_ge: ∀L1,L2,U,dt. L1 ≡[U, dt] L2 → - ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀T. ⇧[d, e] T ≡ U → yinj d + e ≤ dt → K1 ≡[T, dt-e] K2. -/2 width=9 by llpx_sn_inv_lift_ge/ qed-. - -(* Inversion lemmas on negated lazy quivalence for local environments *******) - -lemma nlleq_inv_bind: ∀a,I,L1,L2,V,T,d. (L1 ≡[ⓑ{a,I}V.T, d] L2 → ⊥) → - (L1 ≡[V, d] L2 → ⊥) ∨ (L1.ⓑ{I}V ≡[T, ⫯d] L2.ⓑ{I}V → ⊥). -/3 width=2 by nllpx_sn_inv_bind, eq_term_dec/ qed-. - -lemma nlleq_inv_flat: ∀I,L1,L2,V,T,d. (L1 ≡[ⓕ{I}V.T, d] L2 → ⊥) → - (L1 ≡[V, d] L2 → ⊥) ∨ (L1 ≡[T, d] L2 → ⊥). -/3 width=2 by nllpx_sn_inv_flat, eq_term_dec/ qed-. - -lemma nlleq_inv_bind_O: ∀a,I,L1,L2,V,T. (L1 ≡[ⓑ{a,I}V.T, 0] L2 → ⊥) → - (L1 ≡[V, 0] L2 → ⊥) ∨ (L1.ⓑ{I}V ≡[T, 0] L2.ⓑ{I}V → ⊥). -/3 width=2 by nllpx_sn_inv_bind_O, eq_term_dec/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_leq.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_leq.ma index ea04da02c..e23a1521f 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_leq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_leq.ma @@ -20,15 +20,15 @@ include "basic_2/multiple/lleq.ma". (* Properties on equivalence for local environments *************************) lemma leq_lleq_trans: ∀L2,L,T,d. L2 ≡[T, d] L → - ∀L1. L1 ≃[d, ∞] L2 → L1 ≡[T, d] L. + ∀L1. L1 ⩬[d, ∞] L2 → L1 ≡[T, d] L. /2 width=3 by leq_llpx_sn_trans/ qed-. lemma lleq_leq_trans: ∀L,L1,T,d. L ≡[T, d] L1 → - ∀L2. L1 ≃[d, ∞] L2 → L ≡[T, d] L2. + ∀L2. L1 ⩬[d, ∞] L2 → L ≡[T, d] L2. /2 width=3 by llpx_sn_leq_trans/ qed-. -lemma lleq_leq_repl: ∀L1,L2,T,d. L1 ≡[T, d] L2 → ∀K1. K1 ≃[d, ∞] L1 → - ∀K2. L2 ≃[d, ∞] K2 → K1 ≡[T, d] K2. +lemma lleq_leq_repl: ∀L1,L2,T,d. L1 ≡[T, d] L2 → ∀K1. K1 ⩬[d, ∞] L1 → + ∀K2. L2 ⩬[d, ∞] K2 → K1 ≡[T, d] K2. /2 width=5 by llpx_sn_leq_repl/ qed-. lemma lleq_bind_repl_SO: ∀I1,I2,L1,L2,V1,V2,T. L1.ⓑ{I1}V1 ≡[T, 0] L2.ⓑ{I2}V2 → diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_lleq.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_lleq.ma index 8d49cb591..0458e1da8 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_lleq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_lleq.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/multiple/lleq_ldrop.ma". +include "basic_2/multiple/lleq_drop.ma". (* Main properties **********************************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_llor.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_llor.ma index 253cb294a..51c033350 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_llor.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/lleq_llor.ma @@ -27,8 +27,8 @@ lapply (llpx_sn_frees_trans … H1R H2R … H1) -H1R -H2R #HR elim (llpx_sn_llpx_sn_alt … H1) -H1 #HL12 #IH1 elim H2 -H2 #_ #HL1 #IH2 @lleq_intro_alt // #I2 #I #K2 #K #V2 #V #i #Hi #HnT #HLK2 #HLK -lapply (ldrop_fwd_length_lt2 … HLK) #HiL -elim (ldrop_O1_lt (Ⓕ) L1 i) // -HiL #I1 #K1 #V1 #HLK1 +lapply (drop_fwd_length_lt2 … HLK) #HiL +elim (drop_O1_lt (Ⓕ) L1 i) // -HiL #I1 #K1 #V1 #HLK1 elim (IH1 … HLK1 HLK2) -IH1 /2 width=1 by/ #H #_ destruct elim (IH2 … HLK1 HLK2 HLK) -IH2 -HLK1 -HLK2 -HLK * /2 width=1 by conj/ #H [ elim (ylt_yle_false … H) -H // diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llor.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llor.ma index 7832b4898..fc950fdb1 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/llor.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/llor.ma @@ -36,5 +36,5 @@ interpretation lemma llor_atom: ∀T,d. ⋆ ⩖[T, d] ⋆ ≡ ⋆. #T #d @and3_intro // #I1 #I2 #I #K1 #K2 #K #V1 #V2 #V #i #HLK1 -elim (ldrop_inv_atom1 … HLK1) -HLK1 #H destruct +elim (drop_inv_atom1 … HLK1) -HLK1 #H destruct qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_alt.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_alt.ma index 430df9936..0b634cbf9 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_alt.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_alt.ma @@ -25,23 +25,23 @@ lemma llor_tail_frees: ∀L1,L2,L,U,d. L1 ⩖[U, d] L2 ≡ L → d ≤ yinj (|L1 #L1 #L2 #L #U #d * #HL12 #HL1 #IH #Hd #I1 #W1 #HU #I2 #W2 @and3_intro [1,2: >ltail_length /2 width=1 by le_S_S/ ] #J1 #J2 #J #K1 #K2 #K #V1 #V2 #V #i #HLK1 #HLK2 #HLK -lapply (ldrop_fwd_length_lt2 … HLK1) >ltail_length #H +lapply (drop_fwd_length_lt2 … HLK1) >ltail_length #H lapply (lt_plus_SO_to_le … H) -H #H elim (le_to_or_lt_eq … H) -H #H -[ elim (ldrop_O1_lt (Ⓕ) … H) #Z1 #Y1 #X1 #HLY1 - elim (ldrop_O1_lt (Ⓕ) L2 i) // #Z2 #Y2 #X2 #HLY2 - elim (ldrop_O1_lt (Ⓕ) L i) // #Z #Y #X #HLY - lapply (ldrop_O1_inv_append1_le … HLK1 … HLY1) /2 width=1 by lt_to_le/ -HLK1 normalize #H destruct - lapply (ldrop_O1_inv_append1_le … HLK2 … HLY2) /2 width=1 by lt_to_le/ -HLK2 normalize #H destruct - lapply (ldrop_O1_inv_append1_le … HLK … HLY) /2 width=1 by lt_to_le/ -HLK normalize #H destruct +[ elim (drop_O1_lt (Ⓕ) … H) #Z1 #Y1 #X1 #HLY1 + elim (drop_O1_lt (Ⓕ) L2 i) // #Z2 #Y2 #X2 #HLY2 + elim (drop_O1_lt (Ⓕ) L i) // #Z #Y #X #HLY + lapply (drop_O1_inv_append1_le … HLK1 … HLY1) /2 width=1 by lt_to_le/ -HLK1 normalize #H destruct + lapply (drop_O1_inv_append1_le … HLK2 … HLY2) /2 width=1 by lt_to_le/ -HLK2 normalize #H destruct + lapply (drop_O1_inv_append1_le … HLK … HLY) /2 width=1 by lt_to_le/ -HLK normalize #H destruct elim (IH … HLY1 HLY2 HLY) -IH -HLY1 -HLY2 -HLY * [ /3 width=1 by and3_intro, or3_intro0/ | /6 width=2 by frees_inv_append, lt_to_le, or3_intro1, and3_intro/ | /5 width=1 by frees_append, lt_to_le, or3_intro2, and4_intro/ ] | -IH -HLK1 destruct - lapply (ldrop_O1_inv_append1_le … HLK2 … (⋆) ?) // -HLK2 normalize #H destruct - lapply (ldrop_O1_inv_append1_le … HLK … (⋆) ?) // -HLK normalize #H destruct + lapply (drop_O1_inv_append1_le … HLK2 … (⋆) ?) // -HLK2 normalize #H destruct + lapply (drop_O1_inv_append1_le … HLK … (⋆) ?) // -HLK normalize #H destruct /3 width=1 by or3_intro2, and4_intro/ ] qed. @@ -52,23 +52,23 @@ lemma llor_tail_cofrees: ∀L1,L2,L,U,d. L1 ⩖[U, d] L2 ≡ L → #L1 #L2 #L #U #d * #HL12 #HL1 #IH #I1 #W1 #HU #I2 #W2 @and3_intro [1,2: >ltail_length /2 width=1 by le_S_S/ ] #J1 #J2 #J #K1 #K2 #K #V1 #V2 #V #i #HLK1 #HLK2 #HLK -lapply (ldrop_fwd_length_lt2 … HLK1) >ltail_length #H +lapply (drop_fwd_length_lt2 … HLK1) >ltail_length #H lapply (lt_plus_SO_to_le … H) -H #H elim (le_to_or_lt_eq … H) -H #H -[ elim (ldrop_O1_lt (Ⓕ) … H) #Z1 #Y1 #X1 #HLY1 - elim (ldrop_O1_lt (Ⓕ) L2 i) // #Z2 #Y2 #X2 #HLY2 - elim (ldrop_O1_lt (Ⓕ) L i) // #Z #Y #X #HLY - lapply (ldrop_O1_inv_append1_le … HLK1 … HLY1) /2 width=1 by lt_to_le/ -HLK1 normalize #H destruct - lapply (ldrop_O1_inv_append1_le … HLK2 … HLY2) /2 width=1 by lt_to_le/ -HLK2 normalize #H destruct - lapply (ldrop_O1_inv_append1_le … HLK … HLY) /2 width=1 by lt_to_le/ -HLK normalize #H destruct +[ elim (drop_O1_lt (Ⓕ) … H) #Z1 #Y1 #X1 #HLY1 + elim (drop_O1_lt (Ⓕ) L2 i) // #Z2 #Y2 #X2 #HLY2 + elim (drop_O1_lt (Ⓕ) L i) // #Z #Y #X #HLY + lapply (drop_O1_inv_append1_le … HLK1 … HLY1) /2 width=1 by lt_to_le/ -HLK1 normalize #H destruct + lapply (drop_O1_inv_append1_le … HLK2 … HLY2) /2 width=1 by lt_to_le/ -HLK2 normalize #H destruct + lapply (drop_O1_inv_append1_le … HLK … HLY) /2 width=1 by lt_to_le/ -HLK normalize #H destruct elim (IH … HLY1 HLY2 HLY) -IH -HLY1 -HLY2 -HLY * [ /3 width=1 by and3_intro, or3_intro0/ | /6 width=2 by frees_inv_append, lt_to_le, or3_intro1, and3_intro/ | /5 width=1 by frees_append, lt_to_le, or3_intro2, and4_intro/ ] | -IH -HLK2 destruct - lapply (ldrop_O1_inv_append1_le … HLK1 … (⋆) ?) // -HLK1 normalize #H destruct - lapply (ldrop_O1_inv_append1_le … HLK … (⋆) ?) // -HLK normalize #H destruct + lapply (drop_O1_inv_append1_le … HLK1 … (⋆) ?) // -HLK1 normalize #H destruct + lapply (drop_O1_inv_append1_le … HLK … (⋆) ?) // -HLK normalize #H destruct /4 width=1 by or3_intro1, and3_intro/ ] qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_drop.ma new file mode 100644 index 000000000..d839edcc7 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_drop.ma @@ -0,0 +1,45 @@ +(**************************************************************************) +(* ___ *) +(* ||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/multiple/frees_lift.ma". +include "basic_2/multiple/llor_alt.ma". + +(* POINTWISE UNION FOR LOCAL ENVIRONMENTS ***********************************) + +(* Advanced properties ******************************************************) + +lemma llor_skip: ∀L1,L2,U,d. |L1| = |L2| → yinj (|L1|) ≤ d → L1 ⩖[U, d] L2 ≡ L1. +#L1 #L2 #U #d #HL12 #Hd @and3_intro // -HL12 +#I1 #I2 #I #K1 #K2 #K #W1 #W2 #W #i #HLK1 #_ #HLK -L2 -K2 +lapply (drop_mono … HLK … HLK1) -HLK #H destruct +lapply (drop_fwd_length_lt2 … HLK1) -K1 +/5 width=3 by ylt_yle_trans, ylt_inj, or3_intro0, and3_intro/ +qed. + +(* Note: lemma 1400 concludes the "big tree" theorem *) +lemma llor_total: ∀L1,L2,T,d. |L1| = |L2| → ∃L. L1 ⩖[T, d] L2 ≡ L. +#L1 @(lenv_ind_alt … L1) -L1 +[ #L2 #T #d #H >(length_inv_zero_sn … H) -L2 /2 width=2 by ex_intro/ +| #I1 #L1 #V1 #IHL1 #Y #T #d >ltail_length #H + elim (length_inv_pos_sn_ltail … H) -H #I2 #L2 #V2 #HL12 #H destruct + elim (ylt_split d (|ⓑ{I1}V1.L1|)) + [ elim (frees_dec (ⓑ{I1}V1.L1) T d (|L1|)) #HnU + elim (IHL1 L2 T d) // -IHL1 -HL12 + [ #L #HL12 >ltail_length /4 width=2 by llor_tail_frees, ylt_fwd_succ2, ex_intro/ + | /4 width=2 by llor_tail_cofrees, ex_intro/ + ] + | -IHL1 /4 width=3 by llor_skip, plus_to_minus, ex_intro/ + ] +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_ldrop.ma deleted file mode 100644 index ef23ce149..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/llor_ldrop.ma +++ /dev/null @@ -1,45 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/multiple/frees_lift.ma". -include "basic_2/multiple/llor_alt.ma". - -(* POINTWISE UNION FOR LOCAL ENVIRONMENTS ***********************************) - -(* Advanced properties ******************************************************) - -lemma llor_skip: ∀L1,L2,U,d. |L1| = |L2| → yinj (|L1|) ≤ d → L1 ⩖[U, d] L2 ≡ L1. -#L1 #L2 #U #d #HL12 #Hd @and3_intro // -HL12 -#I1 #I2 #I #K1 #K2 #K #W1 #W2 #W #i #HLK1 #_ #HLK -L2 -K2 -lapply (ldrop_mono … HLK … HLK1) -HLK #H destruct -lapply (ldrop_fwd_length_lt2 … HLK1) -K1 -/5 width=3 by ylt_yle_trans, ylt_inj, or3_intro0, and3_intro/ -qed. - -(* Note: lemma 1400 concludes the "big tree" theorem *) -lemma llor_total: ∀L1,L2,T,d. |L1| = |L2| → ∃L. L1 ⩖[T, d] L2 ≡ L. -#L1 @(lenv_ind_alt … L1) -L1 -[ #L2 #T #d #H >(length_inv_zero_sn … H) -L2 /2 width=2 by ex_intro/ -| #I1 #L1 #V1 #IHL1 #Y #T #d >ltail_length #H - elim (length_inv_pos_sn_ltail … H) -H #I2 #L2 #V2 #HL12 #H destruct - elim (ylt_split d (|ⓑ{I1}V1.L1|)) - [ elim (frees_dec (ⓑ{I1}V1.L1) T d (|L1|)) #HnU - elim (IHL1 L2 T d) // -IHL1 -HL12 - [ #L #HL12 >ltail_length /4 width=2 by llor_tail_frees, ylt_fwd_succ2, ex_intro/ - | /4 width=2 by llor_tail_cofrees, ex_intro/ - ] - | -IHL1 /4 width=3 by llor_skip, plus_to_minus, ex_intro/ - ] -] -qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn.ma index 006abfec3..692039c11 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn.ma @@ -13,7 +13,7 @@ (**************************************************************************) include "ground_2/ynat/ynat_plus.ma". -include "basic_2/substitution/ldrop.ma". +include "basic_2/substitution/drop.ma". (* LAZY SN POINTWISE EXTENSION OF A CONTEXT-SENSITIVE REALTION FOR TERMS ****) @@ -75,21 +75,21 @@ lemma llpx_sn_inv_flat: ∀R,I,L1,L2,V,T,d. llpx_sn R d (ⓕ{I}V.T) L1 L2 → lemma llpx_sn_fwd_length: ∀R,L1,L2,T,d. llpx_sn R d T L1 L2 → |L1| = |L2|. #R #L1 #L2 #T #d #H elim H -L1 -L2 -T -d // #I #L1 #L2 #K1 #K2 #V1 #V2 #d #i #_ #HLK1 #HLK2 #_ #_ #HK12 -lapply (ldrop_fwd_length … HLK1) -HLK1 -lapply (ldrop_fwd_length … HLK2) -HLK2 +lapply (drop_fwd_length … HLK1) -HLK1 +lapply (drop_fwd_length … HLK2) -HLK2 normalize // qed-. -lemma llpx_sn_fwd_ldrop_sn: ∀R,L1,L2,T,d. llpx_sn R d T L1 L2 → +lemma llpx_sn_fwd_drop_sn: ∀R,L1,L2,T,d. llpx_sn R d T L1 L2 → ∀K1,i. ⇩[i] L1 ≡ K1 → ∃K2. ⇩[i] L2 ≡ K2. #R #L1 #L2 #T #d #H #K1 #i #HLK1 lapply (llpx_sn_fwd_length … H) -H -#HL12 lapply (ldrop_fwd_length_le2 … HLK1) -HLK1 /2 width=1 by ldrop_O1_le/ +#HL12 lapply (drop_fwd_length_le2 … HLK1) -HLK1 /2 width=1 by drop_O1_le/ qed-. -lemma llpx_sn_fwd_ldrop_dx: ∀R,L1,L2,T,d. llpx_sn R d T L1 L2 → +lemma llpx_sn_fwd_drop_dx: ∀R,L1,L2,T,d. llpx_sn R d T L1 L2 → ∀K2,i. ⇩[i] L2 ≡ K2 → ∃K1. ⇩[i] L1 ≡ K1. #R #L1 #L2 #T #d #H #K2 #i #HLK2 lapply (llpx_sn_fwd_length … H) -H -#HL12 lapply (ldrop_fwd_length_le2 … HLK2) -HLK2 /2 width=1 by ldrop_O1_le/ +#HL12 lapply (drop_fwd_length_le2 … HLK2) -HLK2 /2 width=1 by drop_O1_le/ qed-. fact llpx_sn_fwd_lref_aux: ∀R,L1,L2,X,d. llpx_sn R d X L1 L2 → ∀i. X = #i → @@ -152,7 +152,7 @@ lemma llpx_sn_refl: ∀R. (∀L. reflexive … (R L)) → ∀T,L,d. llpx_sn R d #n #IH #L * * /3 width=1 by llpx_sn_sort, llpx_sn_gref, llpx_sn_bind, llpx_sn_flat/ #i #Hn elim (lt_or_ge i (|L|)) /2 width=1 by llpx_sn_free/ #HiL #d elim (ylt_split i d) /2 width=1 by llpx_sn_skip/ -elim (ldrop_O1_lt … HiL) -HiL destruct /4 width=9 by llpx_sn_lref, ldrop_fwd_rfw/ +elim (drop_O1_lt … HiL) -HiL destruct /4 width=9 by llpx_sn_lref, drop_fwd_rfw/ qed-. lemma llpx_sn_Y: ∀R,T,L1,L2. |L1| = |L2| → llpx_sn R (∞) T L1 L2. @@ -174,7 +174,7 @@ lemma llpx_sn_ge_up: ∀R,L1,L2,U,dt. llpx_sn R dt U L1 L2 → ∀T,d,e. ⇧[d, | #I #L1 #L2 #K1 #K2 #W1 #W2 #dt #i #Hdti #HLK1 #HLK2 #HW1 #HW12 #_ #X #d #e #H #_ elim (lift_inv_lref2 … H) -H * #Hid #H destruct [ lapply (llpx_sn_fwd_length … HW1) -HW1 #HK12 - lapply (ldrop_fwd_length … HLK1) lapply (ldrop_fwd_length … HLK2) + lapply (drop_fwd_length … HLK1) lapply (drop_fwd_length … HLK2) normalize in ⊢ (%→%→?); -I -W1 -W2 -dt /3 width=1 by llpx_sn_skip, ylt_inj/ | /4 width=9 by llpx_sn_lref, yle_inj, le_plus_b/ ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_alt.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_alt.ma index 247d4207d..126b73321 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_alt.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_alt.ma @@ -34,12 +34,12 @@ theorem llpx_sn_llpx_sn_alt: ∀R,T,L1,L2,d. llpx_sn R d T L1 L2 → llpx_sn_alt #I1 #I2 #K1 #K2 #V1 #V2 #i #Hdi #H #HLK1 #HLK2 elim (frees_inv … H) -H [ -n #HnU elim (IHU … HnU HLK1 HLK2) -IHU -HnU -HLK1 -HLK2 /2 width=1 by conj/ | * #J1 #K10 #W10 #j #Hdj #Hji #HnU #HLK10 #HnW10 destruct - lapply (ldrop_fwd_drop2 … HLK10) #H - lapply (ldrop_conf_ge … H … HLK1 ?) -H /2 width=1 by lt_to_le/ (minus_plus_m_m j (i+1)) in ⊢ (%→?); >commutative_plus (lift_inv_sort1 … H) -X + lapply (drop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d + /2 width=1 by llpx_sn_sort/ +| #K1 #K2 #d0 #i #HK12 #Hid0 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H + * #Hdi #H destruct + [ lapply (drop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d + /2 width=1 by llpx_sn_skip/ + | elim (ylt_yle_false … Hid0) -L1 -L2 -K1 -K2 -e -Hid0 + /3 width=3 by yle_trans, yle_inj/ + ] +| #I #K1 #K2 #K11 #K22 #V1 #V2 #d0 #i #Hid0 #HK11 #HK22 #HK12 #HV12 #IHK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H + * #Hdi #H destruct [ -HK12 | -IHK12 ] + [ elim (drop_trans_lt … HLK1 … HK11) // -K1 + elim (drop_trans_lt … HLK2 … HK22) // -Hdi -K2 + /3 width=18 by llpx_sn_lref/ + | lapply (drop_trans_ge_comm … HLK1 … HK11 ?) // -K1 + lapply (drop_trans_ge_comm … HLK2 … HK22 ?) // -Hdi -Hd0 -K2 + /3 width=9 by llpx_sn_lref, yle_plus_dx1_trans/ + ] +| #K1 #K2 #d0 #i #HK1 #HK2 #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H + * #Hid #H destruct + lapply (drop_fwd_length_eq2 … HLK1 HLK2 HK12) -HK12 + [ /3 width=7 by llpx_sn_free, drop_fwd_be/ + | lapply (drop_fwd_length … HLK1) -HLK1 #HLK1 + lapply (drop_fwd_length … HLK2) -HLK2 #HLK2 + @llpx_sn_free [ >HLK1 | >HLK2 ] -Hid -HLK1 -HLK2 /2 width=1 by monotonic_le_plus_r/ (**) (* explicit constructor *) + ] +| #K1 #K2 #d0 #p #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_gref1 … H) -X + lapply (drop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d -e + /2 width=1 by llpx_sn_gref/ +| #a #I #K1 #K2 #V #T #d0 #_ #_ #IHV #IHT #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_bind1 … H) -H + #W #U #HVW #HTU #H destruct /4 width=6 by llpx_sn_bind, drop_skip, yle_succ/ +| #I #K1 #K2 #V #T #d0 #_ #_ #IHV #IHT #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_flat1 … H) -H + #W #U #HVW #HTU #H destruct /3 width=6 by llpx_sn_flat/ +] +qed-. + +lemma llpx_sn_lift_ge: ∀R,K1,K2,T,d0. llpx_sn R d0 T K1 K2 → + ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀U. ⇧[d, e] T ≡ U → d ≤ d0 → llpx_sn R (d0+e) U L1 L2. +#R #K1 #K2 #T #d0 #H elim H -K1 -K2 -T -d0 +[ #K1 #K2 #d0 #k #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_sort1 … H) -X + lapply (drop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d + /2 width=1 by llpx_sn_sort/ +| #K1 #K2 #d0 #i #HK12 #Hid0 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #_ elim (lift_inv_lref1 … H) -H + * #_ #H destruct + lapply (drop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 + [ /3 width=3 by llpx_sn_skip, ylt_plus_dx2_trans/ + | /3 width=3 by llpx_sn_skip, monotonic_ylt_plus_dx/ + ] +| #I #K1 #K2 #K11 #K22 #V1 #V2 #d0 #i #Hid0 #HK11 #HK22 #HK12 #HV12 #_ #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H + * #Hid #H destruct + [ elim (ylt_yle_false … Hid0) -I -L1 -L2 -K1 -K2 -K11 -K22 -V1 -V2 -e -Hid0 + /3 width=3 by ylt_yle_trans, ylt_inj/ + | lapply (drop_trans_ge_comm … HLK1 … HK11 ?) // -K1 + lapply (drop_trans_ge_comm … HLK2 … HK22 ?) // -Hid -Hd0 -K2 + /3 width=9 by llpx_sn_lref, monotonic_yle_plus_dx/ + ] +| #K1 #K2 #d0 #i #HK1 #HK2 #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H + * #Hid #H destruct + lapply (drop_fwd_length_eq2 … HLK1 HLK2 HK12) -HK12 + [ /3 width=7 by llpx_sn_free, drop_fwd_be/ + | lapply (drop_fwd_length … HLK1) -HLK1 #HLK1 + lapply (drop_fwd_length … HLK2) -HLK2 #HLK2 + @llpx_sn_free [ >HLK1 | >HLK2 ] -Hid -HLK1 -HLK2 /2 width=1 by monotonic_le_plus_r/ (**) (* explicit constructor *) + ] +| #K1 #K2 #d0 #p #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_gref1 … H) -X + lapply (drop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d + /2 width=1 by llpx_sn_gref/ +| #a #I #K1 #K2 #V #T #d0 #_ #_ #IHV #IHT #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_bind1 … H) -H + #W #U #HVW #HTU #H destruct /4 width=5 by llpx_sn_bind, drop_skip, yle_succ/ +| #I #K1 #K2 #V #T #d0 #_ #_ #IHV #IHT #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_flat1 … H) -H + #W #U #HVW #HTU #H destruct /3 width=5 by llpx_sn_flat/ +] +qed-. + +(* Inversion lemmas on relocation *******************************************) + +lemma llpx_sn_inv_lift_le: ∀R. l_deliftable_sn R → + ∀L1,L2,U,d0. llpx_sn R d0 U L1 L2 → + ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀T. ⇧[d, e] T ≡ U → d0 ≤ d → llpx_sn R d0 T K1 K2. +#R #HR #L1 #L2 #U #d0 #H elim H -L1 -L2 -U -d0 +[ #L1 #L2 #d0 #k #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_sort2 … H) -X + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d -e + /2 width=1 by llpx_sn_sort/ +| #L1 #L2 #d0 #i #HL12 #Hid0 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ elim (lift_inv_lref2 … H) -H + * #_ #H destruct + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 + [ /2 width=1 by llpx_sn_skip/ + | /3 width=3 by llpx_sn_skip, yle_ylt_trans/ + ] +| #I #L1 #L2 #K11 #K22 #W1 #W2 #d0 #i #Hid0 #HLK11 #HLK22 #HK12 #HW12 #IHK12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref2 … H) -H + * #Hid #H destruct [ -HK12 | -IHK12 ] + [ elim (drop_conf_lt … HLK1 … HLK11) // -L1 #L1 #V1 #HKL1 #HKL11 #HVW1 + elim (drop_conf_lt … HLK2 … HLK22) // -Hid -L2 #L2 #V2 #HKL2 #HKL22 #HVW2 + elim (HR … HW12 … HKL11 … HVW1) -HR #V0 #HV0 #HV12 + lapply (lift_inj … HV0 … HVW2) -HV0 -HVW2 #H destruct + /3 width=10 by llpx_sn_lref/ + | lapply (drop_conf_ge … HLK1 … HLK11 ?) // -L1 + lapply (drop_conf_ge … HLK2 … HLK22 ?) // -L2 -Hid0 + elim (le_inv_plus_l … Hid) -Hid /4 width=9 by llpx_sn_lref, yle_trans, yle_inj/ (**) (* slow *) + ] +| #L1 #L2 #d0 #i #HL1 #HL2 #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref2 … H) -H + * #_ #H destruct + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) + [ lapply (drop_fwd_length_le4 … HLK1) -HLK1 + lapply (drop_fwd_length_le4 … HLK2) -HLK2 + #HKL2 #HKL1 #HK12 @llpx_sn_free // /2 width=3 by transitive_le/ (**) (* full auto too slow *) + | lapply (drop_fwd_length … HLK1) -HLK1 #H >H in HL1; -H + lapply (drop_fwd_length … HLK2) -HLK2 #H >H in HL2; -H + /3 width=1 by llpx_sn_free, le_plus_to_minus_r/ + ] +| #L1 #L2 #d0 #p #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_gref2 … H) -X + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d -e + /2 width=1 by llpx_sn_gref/ +| #a #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_bind2 … H) -H + #V #T #HVW #HTU #H destruct /4 width=6 by llpx_sn_bind, drop_skip, yle_succ/ +| #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_flat2 … H) -H + #V #T #HVW #HTU #H destruct /3 width=6 by llpx_sn_flat/ +] +qed-. + +lemma llpx_sn_inv_lift_be: ∀R,L1,L2,U,d0. llpx_sn R d0 U L1 L2 → + ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀T. ⇧[d, e] T ≡ U → d ≤ d0 → d0 ≤ yinj d + e → llpx_sn R d T K1 K2. +#R #L1 #L2 #U #d0 #H elim H -L1 -L2 -U -d0 +[ #L1 #L2 #d0 #k #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ #_ >(lift_inv_sort2 … H) -X + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d0 -e + /2 width=1 by llpx_sn_sort/ +| #L1 #L2 #d0 #i #HL12 #Hid0 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_lref2 … H) -H + * #Hid #H destruct + [ lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 + -Hid0 /3 width=1 by llpx_sn_skip, ylt_inj/ + | elim (ylt_yle_false … Hid0) -L1 -L2 -Hd0 -Hid0 + /3 width=3 by yle_trans, yle_inj/ (**) (* slow *) + ] +| #I #L1 #L2 #K11 #K22 #W1 #W2 #d0 #i #Hid0 #HLK11 #HLK22 #HK12 #HW12 #_ #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_lref2 … H) -H + * #Hid #H destruct + [ elim (ylt_yle_false … Hid0) -I -L1 -L2 -K11 -K22 -W1 -W2 -Hd0e -Hid0 + /3 width=3 by ylt_yle_trans, ylt_inj/ + | lapply (drop_conf_ge … HLK1 … HLK11 ?) // -L1 + lapply (drop_conf_ge … HLK2 … HLK22 ?) // -L2 -Hid0 -Hd0 -Hd0e + elim (le_inv_plus_l … Hid) -Hid /3 width=9 by llpx_sn_lref, yle_inj/ + ] +| #L1 #L2 #d0 #i #HL1 #HL2 #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_lref2 … H) -H + * #_ #H destruct + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) + [ lapply (drop_fwd_length_le4 … HLK1) -HLK1 + lapply (drop_fwd_length_le4 … HLK2) -HLK2 + #HKL2 #HKL1 #HK12 @llpx_sn_free // /2 width=3 by transitive_le/ (**) (* full auto too slow *) + | lapply (drop_fwd_length … HLK1) -HLK1 #H >H in HL1; -H + lapply (drop_fwd_length … HLK2) -HLK2 #H >H in HL2; -H + /3 width=1 by llpx_sn_free, le_plus_to_minus_r/ + ] +| #L1 #L2 #d0 #p #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ #_ >(lift_inv_gref2 … H) -X + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d0 -e + /2 width=1 by llpx_sn_gref/ +| #a #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_bind2 … H) -H + >commutative_plus #V #T #HVW #HTU #H destruct + @llpx_sn_bind [ /2 width=5 by/ ] -IHW (**) (* explicit constructor *) + @(IHU … HTU) -IHU -HTU /2 width=1 by drop_skip, yle_succ/ +| #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_flat2 … H) -H + #V #T #HVW #HTU #H destruct /3 width=6 by llpx_sn_flat/ +] +qed-. + +lemma llpx_sn_inv_lift_ge: ∀R,L1,L2,U,d0. llpx_sn R d0 U L1 L2 → + ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → + ∀T. ⇧[d, e] T ≡ U → yinj d + e ≤ d0 → llpx_sn R (d0-e) T K1 K2. +#R #L1 #L2 #U #d0 #H elim H -L1 -L2 -U -d0 +[ #L1 #L2 #d0 #k #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_sort2 … H) -X + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d + /2 width=1 by llpx_sn_sort/ +| #L1 #L2 #d0 #i #HL12 #Hid0 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hded0 elim (lift_inv_lref2 … H) -H + * #Hid #H destruct [ -Hid0 | -Hded0 ] + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 + [ /4 width=3 by llpx_sn_skip, yle_plus1_to_minus_inj2, ylt_yle_trans, ylt_inj/ + | elim (le_inv_plus_l … Hid) -Hid #_ + /4 width=1 by llpx_sn_skip, monotonic_ylt_minus_dx, yle_inj/ + ] +| #I #L1 #L2 #K11 #K22 #W1 #W2 #d0 #i #Hid0 #HLK11 #HLK22 #HK12 #HW12 #_ #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hded0 elim (lift_inv_lref2 … H) -H + * #Hid #H destruct + [ elim (ylt_yle_false … Hid0) -I -L1 -L2 -K11 -K22 -W1 -W2 -Hid0 + /3 width=3 by yle_fwd_plus_sn1, ylt_yle_trans, ylt_inj/ + | lapply (drop_conf_ge … HLK1 … HLK11 ?) // -L1 + lapply (drop_conf_ge … HLK2 … HLK22 ?) // -L2 -Hded0 -Hid + /3 width=9 by llpx_sn_lref, monotonic_yle_minus_dx/ + ] +| #L1 #L2 #d0 #i #HL1 #HL2 #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hded0 elim (lift_inv_lref2 … H) -H + * #_ #H destruct + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) + [ lapply (drop_fwd_length_le4 … HLK1) -HLK1 + lapply (drop_fwd_length_le4 … HLK2) -HLK2 + #HKL2 #HKL1 #HK12 @llpx_sn_free // /2 width=3 by transitive_le/ (**) (* full auto too slow *) + | lapply (drop_fwd_length … HLK1) -HLK1 #H >H in HL1; -H + lapply (drop_fwd_length … HLK2) -HLK2 #H >H in HL2; -H + /3 width=1 by llpx_sn_free, le_plus_to_minus_r/ + ] +| #L1 #L2 #d0 #p #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_gref2 … H) -X + lapply (drop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d + /2 width=1 by llpx_sn_gref/ +| #a #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hded0 elim (lift_inv_bind2 … H) -H + #V #T #HVW #HTU #H destruct + @llpx_sn_bind [ /2 width=5 by/ ] -IHW (**) (* explicit constructor *) + (lift_inv_sort1 … H) -X - lapply (ldrop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d - /2 width=1 by llpx_sn_sort/ -| #K1 #K2 #d0 #i #HK12 #Hid0 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H - * #Hdi #H destruct - [ lapply (ldrop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d - /2 width=1 by llpx_sn_skip/ - | elim (ylt_yle_false … Hid0) -L1 -L2 -K1 -K2 -e -Hid0 - /3 width=3 by yle_trans, yle_inj/ - ] -| #I #K1 #K2 #K11 #K22 #V1 #V2 #d0 #i #Hid0 #HK11 #HK22 #HK12 #HV12 #IHK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H - * #Hdi #H destruct [ -HK12 | -IHK12 ] - [ elim (ldrop_trans_lt … HLK1 … HK11) // -K1 - elim (ldrop_trans_lt … HLK2 … HK22) // -Hdi -K2 - /3 width=18 by llpx_sn_lref/ - | lapply (ldrop_trans_ge_comm … HLK1 … HK11 ?) // -K1 - lapply (ldrop_trans_ge_comm … HLK2 … HK22 ?) // -Hdi -Hd0 -K2 - /3 width=9 by llpx_sn_lref, yle_plus_dx1_trans/ - ] -| #K1 #K2 #d0 #i #HK1 #HK2 #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H - * #Hid #H destruct - lapply (ldrop_fwd_length_eq2 … HLK1 HLK2 HK12) -HK12 - [ /3 width=7 by llpx_sn_free, ldrop_fwd_be/ - | lapply (ldrop_fwd_length … HLK1) -HLK1 #HLK1 - lapply (ldrop_fwd_length … HLK2) -HLK2 #HLK2 - @llpx_sn_free [ >HLK1 | >HLK2 ] -Hid -HLK1 -HLK2 /2 width=1 by monotonic_le_plus_r/ (**) (* explicit constructor *) - ] -| #K1 #K2 #d0 #p #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_gref1 … H) -X - lapply (ldrop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d -e - /2 width=1 by llpx_sn_gref/ -| #a #I #K1 #K2 #V #T #d0 #_ #_ #IHV #IHT #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_bind1 … H) -H - #W #U #HVW #HTU #H destruct /4 width=6 by llpx_sn_bind, ldrop_skip, yle_succ/ -| #I #K1 #K2 #V #T #d0 #_ #_ #IHV #IHT #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_flat1 … H) -H - #W #U #HVW #HTU #H destruct /3 width=6 by llpx_sn_flat/ -] -qed-. - -lemma llpx_sn_lift_ge: ∀R,K1,K2,T,d0. llpx_sn R d0 T K1 K2 → - ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀U. ⇧[d, e] T ≡ U → d ≤ d0 → llpx_sn R (d0+e) U L1 L2. -#R #K1 #K2 #T #d0 #H elim H -K1 -K2 -T -d0 -[ #K1 #K2 #d0 #k #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_sort1 … H) -X - lapply (ldrop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d - /2 width=1 by llpx_sn_sort/ -| #K1 #K2 #d0 #i #HK12 #Hid0 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #_ elim (lift_inv_lref1 … H) -H - * #_ #H destruct - lapply (ldrop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 - [ /3 width=3 by llpx_sn_skip, ylt_plus_dx2_trans/ - | /3 width=3 by llpx_sn_skip, monotonic_ylt_plus_dx/ - ] -| #I #K1 #K2 #K11 #K22 #V1 #V2 #d0 #i #Hid0 #HK11 #HK22 #HK12 #HV12 #_ #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H - * #Hid #H destruct - [ elim (ylt_yle_false … Hid0) -I -L1 -L2 -K1 -K2 -K11 -K22 -V1 -V2 -e -Hid0 - /3 width=3 by ylt_yle_trans, ylt_inj/ - | lapply (ldrop_trans_ge_comm … HLK1 … HK11 ?) // -K1 - lapply (ldrop_trans_ge_comm … HLK2 … HK22 ?) // -Hid -Hd0 -K2 - /3 width=9 by llpx_sn_lref, monotonic_yle_plus_dx/ - ] -| #K1 #K2 #d0 #i #HK1 #HK2 #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref1 … H) -H - * #Hid #H destruct - lapply (ldrop_fwd_length_eq2 … HLK1 HLK2 HK12) -HK12 - [ /3 width=7 by llpx_sn_free, ldrop_fwd_be/ - | lapply (ldrop_fwd_length … HLK1) -HLK1 #HLK1 - lapply (ldrop_fwd_length … HLK2) -HLK2 #HLK2 - @llpx_sn_free [ >HLK1 | >HLK2 ] -Hid -HLK1 -HLK2 /2 width=1 by monotonic_le_plus_r/ (**) (* explicit constructor *) - ] -| #K1 #K2 #d0 #p #HK12 #L1 #L2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_gref1 … H) -X - lapply (ldrop_fwd_length_eq2 … HLK1 HLK2 HK12) -K1 -K2 -d - /2 width=1 by llpx_sn_gref/ -| #a #I #K1 #K2 #V #T #d0 #_ #_ #IHV #IHT #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_bind1 … H) -H - #W #U #HVW #HTU #H destruct /4 width=5 by llpx_sn_bind, ldrop_skip, yle_succ/ -| #I #K1 #K2 #V #T #d0 #_ #_ #IHV #IHT #L1 #L2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_flat1 … H) -H - #W #U #HVW #HTU #H destruct /3 width=5 by llpx_sn_flat/ -] -qed-. - -(* Inversion lemmas on relocation *******************************************) - -lemma llpx_sn_inv_lift_le: ∀R. l_deliftable_sn R → - ∀L1,L2,U,d0. llpx_sn R d0 U L1 L2 → - ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀T. ⇧[d, e] T ≡ U → d0 ≤ d → llpx_sn R d0 T K1 K2. -#R #HR #L1 #L2 #U #d0 #H elim H -L1 -L2 -U -d0 -[ #L1 #L2 #d0 #k #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_sort2 … H) -X - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d -e - /2 width=1 by llpx_sn_sort/ -| #L1 #L2 #d0 #i #HL12 #Hid0 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ elim (lift_inv_lref2 … H) -H - * #_ #H destruct - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 - [ /2 width=1 by llpx_sn_skip/ - | /3 width=3 by llpx_sn_skip, yle_ylt_trans/ - ] -| #I #L1 #L2 #K11 #K22 #W1 #W2 #d0 #i #Hid0 #HLK11 #HLK22 #HK12 #HW12 #IHK12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref2 … H) -H - * #Hid #H destruct [ -HK12 | -IHK12 ] - [ elim (ldrop_conf_lt … HLK1 … HLK11) // -L1 #L1 #V1 #HKL1 #HKL11 #HVW1 - elim (ldrop_conf_lt … HLK2 … HLK22) // -Hid -L2 #L2 #V2 #HKL2 #HKL22 #HVW2 - elim (HR … HW12 … HKL11 … HVW1) -HR #V0 #HV0 #HV12 - lapply (lift_inj … HV0 … HVW2) -HV0 -HVW2 #H destruct - /3 width=10 by llpx_sn_lref/ - | lapply (ldrop_conf_ge … HLK1 … HLK11 ?) // -L1 - lapply (ldrop_conf_ge … HLK2 … HLK22 ?) // -L2 -Hid0 - elim (le_inv_plus_l … Hid) -Hid /4 width=9 by llpx_sn_lref, yle_trans, yle_inj/ (**) (* slow *) - ] -| #L1 #L2 #d0 #i #HL1 #HL2 #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_lref2 … H) -H - * #_ #H destruct - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) - [ lapply (ldrop_fwd_length_le4 … HLK1) -HLK1 - lapply (ldrop_fwd_length_le4 … HLK2) -HLK2 - #HKL2 #HKL1 #HK12 @llpx_sn_free // /2 width=3 by transitive_le/ (**) (* full auto too slow *) - | lapply (ldrop_fwd_length … HLK1) -HLK1 #H >H in HL1; -H - lapply (ldrop_fwd_length … HLK2) -HLK2 #H >H in HL2; -H - /3 width=1 by llpx_sn_free, le_plus_to_minus_r/ - ] -| #L1 #L2 #d0 #p #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_gref2 … H) -X - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d -e - /2 width=1 by llpx_sn_gref/ -| #a #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_bind2 … H) -H - #V #T #HVW #HTU #H destruct /4 width=6 by llpx_sn_bind, ldrop_skip, yle_succ/ -| #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 elim (lift_inv_flat2 … H) -H - #V #T #HVW #HTU #H destruct /3 width=6 by llpx_sn_flat/ -] -qed-. - -lemma llpx_sn_inv_lift_be: ∀R,L1,L2,U,d0. llpx_sn R d0 U L1 L2 → - ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀T. ⇧[d, e] T ≡ U → d ≤ d0 → d0 ≤ yinj d + e → llpx_sn R d T K1 K2. -#R #L1 #L2 #U #d0 #H elim H -L1 -L2 -U -d0 -[ #L1 #L2 #d0 #k #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ #_ >(lift_inv_sort2 … H) -X - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d0 -e - /2 width=1 by llpx_sn_sort/ -| #L1 #L2 #d0 #i #HL12 #Hid0 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_lref2 … H) -H - * #Hid #H destruct - [ lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 - -Hid0 /3 width=1 by llpx_sn_skip, ylt_inj/ - | elim (ylt_yle_false … Hid0) -L1 -L2 -Hd0 -Hid0 - /3 width=3 by yle_trans, yle_inj/ (**) (* slow *) - ] -| #I #L1 #L2 #K11 #K22 #W1 #W2 #d0 #i #Hid0 #HLK11 #HLK22 #HK12 #HW12 #_ #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_lref2 … H) -H - * #Hid #H destruct - [ elim (ylt_yle_false … Hid0) -I -L1 -L2 -K11 -K22 -W1 -W2 -Hd0e -Hid0 - /3 width=3 by ylt_yle_trans, ylt_inj/ - | lapply (ldrop_conf_ge … HLK1 … HLK11 ?) // -L1 - lapply (ldrop_conf_ge … HLK2 … HLK22 ?) // -L2 -Hid0 -Hd0 -Hd0e - elim (le_inv_plus_l … Hid) -Hid /3 width=9 by llpx_sn_lref, yle_inj/ - ] -| #L1 #L2 #d0 #i #HL1 #HL2 #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_lref2 … H) -H - * #_ #H destruct - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) - [ lapply (ldrop_fwd_length_le4 … HLK1) -HLK1 - lapply (ldrop_fwd_length_le4 … HLK2) -HLK2 - #HKL2 #HKL1 #HK12 @llpx_sn_free // /2 width=3 by transitive_le/ (**) (* full auto too slow *) - | lapply (ldrop_fwd_length … HLK1) -HLK1 #H >H in HL1; -H - lapply (ldrop_fwd_length … HLK2) -HLK2 #H >H in HL2; -H - /3 width=1 by llpx_sn_free, le_plus_to_minus_r/ - ] -| #L1 #L2 #d0 #p #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ #_ >(lift_inv_gref2 … H) -X - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d0 -e - /2 width=1 by llpx_sn_gref/ -| #a #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_bind2 … H) -H - >commutative_plus #V #T #HVW #HTU #H destruct - @llpx_sn_bind [ /2 width=5 by/ ] -IHW (**) (* explicit constructor *) - @(IHU … HTU) -IHU -HTU /2 width=1 by ldrop_skip, yle_succ/ -| #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hd0 #Hd0e elim (lift_inv_flat2 … H) -H - #V #T #HVW #HTU #H destruct /3 width=6 by llpx_sn_flat/ -] -qed-. - -lemma llpx_sn_inv_lift_ge: ∀R,L1,L2,U,d0. llpx_sn R d0 U L1 L2 → - ∀K1,K2,d,e. ⇩[Ⓕ, d, e] L1 ≡ K1 → ⇩[Ⓕ, d, e] L2 ≡ K2 → - ∀T. ⇧[d, e] T ≡ U → yinj d + e ≤ d0 → llpx_sn R (d0-e) T K1 K2. -#R #L1 #L2 #U #d0 #H elim H -L1 -L2 -U -d0 -[ #L1 #L2 #d0 #k #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_sort2 … H) -X - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d - /2 width=1 by llpx_sn_sort/ -| #L1 #L2 #d0 #i #HL12 #Hid0 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hded0 elim (lift_inv_lref2 … H) -H - * #Hid #H destruct [ -Hid0 | -Hded0 ] - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 - [ /4 width=3 by llpx_sn_skip, yle_plus1_to_minus_inj2, ylt_yle_trans, ylt_inj/ - | elim (le_inv_plus_l … Hid) -Hid #_ - /4 width=1 by llpx_sn_skip, monotonic_ylt_minus_dx, yle_inj/ - ] -| #I #L1 #L2 #K11 #K22 #W1 #W2 #d0 #i #Hid0 #HLK11 #HLK22 #HK12 #HW12 #_ #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hded0 elim (lift_inv_lref2 … H) -H - * #Hid #H destruct - [ elim (ylt_yle_false … Hid0) -I -L1 -L2 -K11 -K22 -W1 -W2 -Hid0 - /3 width=3 by yle_fwd_plus_sn1, ylt_yle_trans, ylt_inj/ - | lapply (ldrop_conf_ge … HLK1 … HLK11 ?) // -L1 - lapply (ldrop_conf_ge … HLK2 … HLK22 ?) // -L2 -Hded0 -Hid - /3 width=9 by llpx_sn_lref, monotonic_yle_minus_dx/ - ] -| #L1 #L2 #d0 #i #HL1 #HL2 #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hded0 elim (lift_inv_lref2 … H) -H - * #_ #H destruct - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) - [ lapply (ldrop_fwd_length_le4 … HLK1) -HLK1 - lapply (ldrop_fwd_length_le4 … HLK2) -HLK2 - #HKL2 #HKL1 #HK12 @llpx_sn_free // /2 width=3 by transitive_le/ (**) (* full auto too slow *) - | lapply (ldrop_fwd_length … HLK1) -HLK1 #H >H in HL1; -H - lapply (ldrop_fwd_length … HLK2) -HLK2 #H >H in HL2; -H - /3 width=1 by llpx_sn_free, le_plus_to_minus_r/ - ] -| #L1 #L2 #d0 #p #HL12 #K1 #K2 #d #e #HLK1 #HLK2 #X #H #_ >(lift_inv_gref2 … H) -X - lapply (ldrop_fwd_length_eq1 … HLK1 HLK2 HL12) -L1 -L2 -d - /2 width=1 by llpx_sn_gref/ -| #a #I #L1 #L2 #W #U #d0 #_ #_ #IHW #IHU #K1 #K2 #d #e #HLK1 #HLK2 #X #H #Hded0 elim (lift_inv_bind2 … H) -H - #V #T #HVW #HTU #H destruct - @llpx_sn_bind [ /2 width=5 by/ ] -IHW (**) (* explicit constructor *) - yminus_Y_inj #K1 #HK12 #HLK1 + elim (leq_drop_trans_be … HL12 … HLK2) -L2 // >yminus_Y_inj #K1 #HK12 #HLK1 lapply (leq_inv_O_Y … HK12) -HK12 #H destruct /2 width=9 by llpx_sn_lref/ | /4 width=5 by llpx_sn_free, leq_fwd_length, le_repl_sn_trans_aux, trans_eq/ | /4 width=1 by llpx_sn_bind, leq_succ/ @@ -32,19 +32,19 @@ lemma leq_llpx_sn_trans: ∀R,L2,L,T,d. llpx_sn R d T L2 L → qed-. lemma llpx_sn_leq_trans: ∀R,L,L1,T,d. llpx_sn R d T L L1 → - ∀L2. L1 ≃[d, ∞] L2 → llpx_sn R d T L L2. + ∀L2. L1 ⩬[d, ∞] L2 → llpx_sn R d T L L2. #R #L #L1 #T #d #H elim H -L -L1 -T -d /4 width=5 by llpx_sn_flat, llpx_sn_gref, llpx_sn_skip, llpx_sn_sort, leq_fwd_length, trans_eq/ [ #I #L #L1 #K #K1 #V #V1 #d #i #Hdi #HLK #HLK1 #HK1 #HV1 #_ #L2 #HL12 - elim (leq_ldrop_conf_be … HL12 … HLK1) -L1 // >yminus_Y_inj #K2 #HK12 #HLK2 + elim (leq_drop_conf_be … HL12 … HLK1) -L1 // >yminus_Y_inj #K2 #HK12 #HLK2 lapply (leq_inv_O_Y … HK12) -HK12 #H destruct /2 width=9 by llpx_sn_lref/ | /4 width=5 by llpx_sn_free, leq_fwd_length, le_repl_sn_conf_aux, trans_eq/ | /4 width=1 by llpx_sn_bind, leq_succ/ ] qed-. -lemma llpx_sn_leq_repl: ∀R,L1,L2,T,d. llpx_sn R d T L1 L2 → ∀K1. K1 ≃[d, ∞] L1 → - ∀K2. L2 ≃[d, ∞] K2 → llpx_sn R d T K1 K2. +lemma llpx_sn_leq_repl: ∀R,L1,L2,T,d. llpx_sn R d T L1 L2 → ∀K1. K1 ⩬[d, ∞] L1 → + ∀K2. L2 ⩬[d, ∞] K2 → llpx_sn R d T K1 K2. /3 width=4 by llpx_sn_leq_trans, leq_llpx_sn_trans/ qed-. lemma llpx_sn_bind_repl_SO: ∀R,I1,I2,L1,L2,V1,V2,T. llpx_sn R 0 T (L1.ⓑ{I1}V1) (L2.ⓑ{I2}V2) → diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_llor.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_llor.ma index 6f27ec9b0..bc65d2002 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_llor.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_llor.ma @@ -27,8 +27,8 @@ lemma llpx_sn_llor_fwd_sn: ∀R. (∀L. reflexive … (R L)) → elim (llpx_sn_llpx_sn_alt … H1) -H1 #HL12 #IH1 elim H2 -H2 #_ #HL1 #IH2 @lpx_sn_intro_alt // #I1 #I #K1 #K #V1 #V #i #HLK1 #HLK -lapply (ldrop_fwd_length_lt2 … HLK) #HiL -elim (ldrop_O1_lt (Ⓕ) L2 i) // -HiL -HL1 -HL12 #I2 #K2 #V2 #HLK2 +lapply (drop_fwd_length_lt2 … HLK) #HiL +elim (drop_O1_lt (Ⓕ) L2 i) // -HiL -HL1 -HL12 #I2 #K2 #V2 #HLK2 elim (IH2 … HLK1 HLK2 HLK) -IH2 -HLK * /2 width=1 by conj/ #HnT #H1 #H2 elim (IH1 … HnT … HLK1 HLK2) -IH1 -HnT -HLK1 -HLK2 /2 width=1 by conj/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_lpx_sn.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_lpx_sn.ma index 5b1a94f95..9ce6a75d9 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_lpx_sn.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_lpx_sn.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/lpx_sn_ldrop.ma". +include "basic_2/substitution/lpx_sn_drop.ma". include "basic_2/multiple/llpx_sn.ma". (* LAZY SN POINTWISE EXTENSION OF A CONTEXT-SENSITIVE REALTION FOR TERMS ****) @@ -28,9 +28,9 @@ lemma lpx_sn_llpx_sn: ∀R. (∀L. reflexive … (R L)) → [2: -IH /4 width=4 by lpx_sn_fwd_length, llpx_sn_free, le_repl_sn_conf_aux/ ] #Hi #Hn #L2 #d elim (ylt_split i d) [ -n /3 width=2 by llpx_sn_skip, lpx_sn_fwd_length/ ] - #Hdi #HL12 elim (ldrop_O1_lt (Ⓕ) L1 i) // - #I #K1 #V1 #HLK1 elim (lpx_sn_ldrop_conf … HL12 … HLK1) -HL12 - /4 width=9 by llpx_sn_lref, ldrop_fwd_rfw/ + #Hdi #HL12 elim (drop_O1_lt (Ⓕ) L1 i) // + #I #K1 #V1 #HLK1 elim (lpx_sn_drop_conf … HL12 … HLK1) -HL12 + /4 width=9 by llpx_sn_lref, drop_fwd_rfw/ | -HR -IH /4 width=2 by lpx_sn_fwd_length, llpx_sn_gref/ | /4 width=1 by llpx_sn_bind, lpx_sn_pair/ | -HR /3 width=1 by llpx_sn_flat/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_tc.ma b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_tc.ma index b308db740..13fc14e82 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_tc.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/multiple/llpx_sn_tc.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/multiple/llpx_sn_ldrop.ma". +include "basic_2/multiple/llpx_sn_drop.ma". (* LAZY SN POINTWISE EXTENSION OF A CONTEXT-SENSITIVE REALTION FOR TERMS ****) diff --git a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/iso_2.ma b/matita/matita/contribs/lambdadelta/basic_2/notation/relations/iso_2.ma deleted file mode 100644 index 872a06ac3..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/iso_2.ma +++ /dev/null @@ -1,19 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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 *) -(* *) -(**************************************************************************) - -(* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) - -notation "hvbox( T1 ≃ break term 46 T2 )" - non associative with precedence 45 - for @{ 'Iso $T1 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/iso_4.ma b/matita/matita/contribs/lambdadelta/basic_2/notation/relations/iso_4.ma deleted file mode 100644 index 8a3617c1b..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/iso_4.ma +++ /dev/null @@ -1,19 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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 *) -(* *) -(**************************************************************************) - -(* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) - -notation "hvbox( L1 ≃ break [ term 46 d , break term 46 e ] break term 46 L2 )" - non associative with precedence 45 - for @{ 'Iso $d $e $L1 $L2 }. diff --git a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/midiso_4.ma b/matita/matita/contribs/lambdadelta/basic_2/notation/relations/midiso_4.ma new file mode 100644 index 000000000..ea603e8b2 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/notation/relations/midiso_4.ma @@ -0,0 +1,19 @@ +(**************************************************************************) +(* ___ *) +(* ||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 *) +(* *) +(**************************************************************************) + +(* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) + +notation "hvbox( L1 ⩬ break [ term 46 d , break term 46 e ] break term 46 L2 )" + non associative with precedence 45 + for @{ 'MidIso $d $e $L1 $L2 }. diff --git a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/topiso_2.ma b/matita/matita/contribs/lambdadelta/basic_2/notation/relations/topiso_2.ma new file mode 100644 index 000000000..059b4372b --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/notation/relations/topiso_2.ma @@ -0,0 +1,19 @@ +(**************************************************************************) +(* ___ *) +(* ||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 *) +(* *) +(**************************************************************************) + +(* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) + +notation "hvbox( T1 ≂ break term 46 T2 )" + non associative with precedence 45 + for @{ 'TopIso $T1 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/cix_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/cix_lift.ma index 7a3d5e68b..59d408dee 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/cix_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/cix_lift.ma @@ -21,7 +21,7 @@ include "basic_2/reduction/cix.ma". lemma cix_lref: ∀h,g,G,L,i. ⇩[i] L ≡ ⋆ → ⦃G, L⦄ ⊢ ➡[h, g] 𝐈⦃#i⦄. #h #g #G #L #i #HL #H elim (crx_inv_lref … H) -h #I #K #V #HLK -lapply (ldrop_mono … HLK … HL) -L -i #H destruct +lapply (drop_mono … HLK … HL) -L -i #H destruct qed. (* Properties on relocation *************************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/cnr.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/cnr.ma index d68be1680..1a6ce5d31 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/cnr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/cnr.ma @@ -84,13 +84,13 @@ qed. lemma cnr_lref_free: ∀G,L,i. |L| ≤ i → ⦃G, L⦄ ⊢ ➡ 𝐍⦃#i⦄. #G #L #i #Hi #X #H elim (cpr_inv_lref1 … H) -H // * -#K #V1 #V2 #HLK lapply (ldrop_fwd_length_lt2 … HLK) -HLK +#K #V1 #V2 #HLK lapply (drop_fwd_length_lt2 … HLK) -HLK #H elim (lt_refl_false i) /2 width=3 by lt_to_le_to_lt/ qed. (* Basic_1: was only: nf2_csort_lref *) lemma cnr_lref_atom: ∀G,L,i. ⇩[i] L ≡ ⋆ → ⦃G, L⦄ ⊢ ➡ 𝐍⦃#i⦄. -#G #L #i #HL @cnr_lref_free >(ldrop_fwd_length … HL) -HL // +#G #L #i #HL @cnr_lref_free >(drop_fwd_length … HL) -HL // qed. (* Basic_1: was: nf2_abst *) diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/cnr_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/cnr_lift.ma index 83def4723..001f2017f 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/cnr_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/cnr_lift.ma @@ -24,7 +24,7 @@ lemma cnr_lref_abst: ∀G,L,K,V,i. ⇩[i] L ≡ K. ⓛV → ⦃G, L⦄ ⊢ ➡ #G #L #K #V #i #HLK #X #H elim (cpr_inv_lref1 … H) -H // * #K0 #V1 #V2 #HLK0 #_ #_ -lapply (ldrop_mono … HLK … HLK0) -L #H destruct +lapply (drop_mono … HLK … HLK0) -L #H destruct qed. (* Relocation properties ****************************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/cnx.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/cnx.ma index a464e95be..2402ccf0b 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/cnx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/cnx.ma @@ -108,12 +108,12 @@ qed. lemma cnx_lref_free: ∀h,g,G,L,i. |L| ≤ i → ⦃G, L⦄ ⊢ ➡[h, g] 𝐍⦃#i⦄. #h #g #G #L #i #Hi #X #H elim (cpx_inv_lref1 … H) -H // * -#I #K #V1 #V2 #HLK lapply (ldrop_fwd_length_lt2 … HLK) -HLK +#I #K #V1 #V2 #HLK lapply (drop_fwd_length_lt2 … HLK) -HLK #H elim (lt_refl_false i) /2 width=3 by lt_to_le_to_lt/ qed. lemma cnx_lref_atom: ∀h,g,G,L,i. ⇩[i] L ≡ ⋆ → ⦃G, L⦄ ⊢ ➡[h, g] 𝐍⦃#i⦄. -#h #g #G #L #i #HL @cnx_lref_free >(ldrop_fwd_length … HL) -HL // +#h #g #G #L #i #HL @cnx_lref_free >(drop_fwd_length … HL) -HL // qed. lemma cnx_abst: ∀h,g,a,G,L,W,T. ⦃G, L⦄ ⊢ ➡[h, g] 𝐍⦃W⦄ → ⦃G, L.ⓛW⦄ ⊢ ➡[h, g] 𝐍⦃T⦄ → diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/cpr.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/cpr.ma index bbb13d14e..ad4fcb313 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/cpr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/cpr.ma @@ -52,7 +52,7 @@ lemma lsubr_cpr_trans: ∀G. lsub_trans … (cpr G) lsubr. #G #L1 #T1 #T2 #H elim H -G -L1 -T1 -T2 [ // | #G #L1 #K1 #V1 #V2 #W2 #i #HLK1 #_ #HVW2 #IHV12 #L2 #HL12 - elim (lsubr_fwd_ldrop2_abbr … HL12 … HLK1) -L1 * + elim (lsubr_fwd_drop2_abbr … HL12 … HLK1) -L1 * /3 width=6 by cpr_delta/ |3,7: /4 width=1 by lsubr_bind, cpr_bind, cpr_beta/ |4,6: /3 width=1 by cpr_flat, cpr_eps/ @@ -87,7 +87,7 @@ lemma cpr_delift: ∀G,K,V,T1,L,d. ⇩[d] L ≡ (K.ⓓV) → elim (lift_split … HVW i i) /3 width=6 by cpr_delta, ex2_2_intro/ | * [ #a ] #I #W1 #U1 #IHW1 #IHU1 #L #d #HLK elim (IHW1 … HLK) -IHW1 #W2 #W #HW12 #HW2 - [ elim (IHU1 (L. ⓑ{I}W1) (d+1)) -IHU1 /3 width=9 by ldrop_drop, cpr_bind, lift_bind, ex2_2_intro/ + [ elim (IHU1 (L. ⓑ{I}W1) (d+1)) -IHU1 /3 width=9 by drop_drop, cpr_bind, lift_bind, ex2_2_intro/ | elim (IHU1 … HLK) -IHU1 -HLK /3 width=8 by cpr_flat, lift_flat, ex2_2_intro/ ] ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/cpr_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/cpr_lift.ma index 72cb5ad83..33e019d2d 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/cpr_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/cpr_lift.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_ldrop.ma". +include "basic_2/substitution/drop_drop.ma". include "basic_2/reduction/cpr.ma". (* CONTEXT-SENSITIVE PARALLEL REDUCTION FOR TERMS ***************************) @@ -27,34 +27,34 @@ lemma cpr_lift: ∀G. l_liftable (cpr G). | #G #K #KV #V #V2 #W2 #i #HKV #HV2 #HVW2 #IHV2 #L #s #d #e #HLK #U1 #H #U2 #HWU2 elim (lift_inv_lref1 … H) * #Hid #H destruct [ elim (lift_trans_ge … HVW2 … HWU2) -W2 // plus_plus_comm_23 #HVU2 - lapply (ldrop_trans_ge_comm … HLK … HKV ?) -K // -Hid /3 width=6 by cpr_delta, ldrop_inv_gen/ + lapply (drop_trans_ge_comm … HLK … HKV ?) -K // -Hid /3 width=6 by cpr_delta, drop_inv_gen/ ] | #a #I #G #K #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #L #s #d #e #HLK #U1 #H1 #U2 #H2 elim (lift_inv_bind1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 destruct - elim (lift_inv_bind1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct /4 width=6 by cpr_bind, ldrop_skip/ + elim (lift_inv_bind1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct /4 width=6 by cpr_bind, drop_skip/ | #I #G #K #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #L #s #d #e #HLK #U1 #H1 #U2 #H2 elim (lift_inv_flat1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 destruct elim (lift_inv_flat1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct /3 width=6 by cpr_flat/ | #G #K #V #T1 #T #T2 #_ #HT2 #IHT1 #L #s #d #e #HLK #U1 #H #U2 #HTU2 elim (lift_inv_bind1 … H) -H #VV1 #TT1 #HVV1 #HTT1 #H destruct - elim (lift_conf_O1 … HTU2 … HT2) -T2 /4 width=6 by cpr_zeta, ldrop_skip/ + elim (lift_conf_O1 … HTU2 … HT2) -T2 /4 width=6 by cpr_zeta, drop_skip/ | #G #K #V #T1 #T2 #_ #IHT12 #L #s #d #e #HLK #U1 #H #U2 #HTU2 elim (lift_inv_flat1 … H) -H #VV1 #TT1 #HVV1 #HTT1 #H destruct /3 width=6 by cpr_eps/ | #a #G #K #V1 #V2 #W1 #W2 #T1 #T2 #_ #_ #_ #IHV12 #IHW12 #IHT12 #L #s #d #e #HLK #X1 #HX1 #X2 #HX2 elim (lift_inv_flat1 … HX1) -HX1 #V0 #X #HV10 #HX #HX1 destruct elim (lift_inv_bind1 … HX) -HX #W0 #T0 #HW0 #HT10 #HX destruct elim (lift_inv_bind1 … HX2) -HX2 #X #T3 #HX #HT23 #HX2 destruct - elim (lift_inv_flat1 … HX) -HX #W3 #V3 #HW23 #HV23 #HX destruct /4 width=6 by cpr_beta, ldrop_skip/ + elim (lift_inv_flat1 … HX) -HX #W3 #V3 #HW23 #HV23 #HX destruct /4 width=6 by cpr_beta, drop_skip/ | #a #G #K #V1 #V #V2 #W1 #W2 #T1 #T2 #_ #HV2 #_ #_ #IHV1 #IHW12 #IHT12 #L #s #d #e #HLK #X1 #HX1 #X2 #HX2 elim (lift_inv_flat1 … HX1) -HX1 #V0 #X #HV10 #HX #HX1 destruct elim (lift_inv_bind1 … HX) -HX #W0 #T0 #HW0 #HT10 #HX destruct elim (lift_inv_bind1 … HX2) -HX2 #W3 #X #HW23 #HX #HX2 destruct elim (lift_inv_flat1 … HX) -HX #V3 #T3 #HV3 #HT23 #HX destruct - elim (lift_trans_ge … HV2 … HV3) -V2 /4 width=6 by cpr_theta, ldrop_skip/ + elim (lift_trans_ge … HV2 … HV3) -V2 /4 width=6 by cpr_theta, drop_skip/ ] qed. @@ -68,11 +68,11 @@ lemma cpr_inv_lift1: ∀G. l_deliftable_sn (cpr G). ] | #G #L #LV #V #V2 #W2 #i #HLV #HV2 #HVW2 #IHV2 #K #s #d #e #HLK #T1 #H elim (lift_inv_lref2 … H) -H * #Hid #H destruct - [ elim (ldrop_conf_lt … HLK … HLV) -L // #L #U #HKL #HLV #HUV + [ elim (drop_conf_lt … HLK … HLV) -L // #L #U #HKL #HLV #HUV elim (IHV2 … HLV … HUV) -V #U2 #HUV2 #HU2 elim (lift_trans_le … HUV2 … HVW2) -V2 // >minus_plus plus_minus // plus_plus_comm_23 #HVU2 - lapply (ldrop_trans_ge_comm … HLK … HKV ?) -K /3 width=7 by cpx_delta, ldrop_inv_gen/ + lapply (drop_trans_ge_comm … HLK … HKV ?) -K /3 width=7 by cpx_delta, drop_inv_gen/ ] | #a #I #G #K #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #L #s #d #e #HLK #U1 #H1 #U2 #H2 elim (lift_inv_bind1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 destruct - elim (lift_inv_bind1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct /4 width=6 by cpx_bind, ldrop_skip/ + elim (lift_inv_bind1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct /4 width=6 by cpx_bind, drop_skip/ | #I #G #K #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #L #s #d #e #HLK #U1 #H1 #U2 #H2 elim (lift_inv_flat1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 destruct elim (lift_inv_flat1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct /3 width=6 by cpx_flat/ | #G #K #V #T1 #T #T2 #_ #HT2 #IHT1 #L #s #d #e #HLK #U1 #H #U2 #HTU2 elim (lift_inv_bind1 … H) -H #VV1 #TT1 #HVV1 #HTT1 #H destruct - elim (lift_conf_O1 … HTU2 … HT2) -T2 /4 width=6 by cpx_zeta, ldrop_skip/ + elim (lift_conf_O1 … HTU2 … HT2) -T2 /4 width=6 by cpx_zeta, drop_skip/ | #G #K #V #T1 #T2 #_ #IHT12 #L #s #d #e #HLK #U1 #H #U2 #HTU2 elim (lift_inv_flat1 … H) -H #VV1 #TT1 #HVV1 #HTT1 #H destruct /3 width=6 by cpx_eps/ | #G #K #V1 #V2 #T #_ #IHV12 #L #s #d #e #HLK #U1 #H #U2 #HVU2 @@ -73,13 +73,13 @@ lemma cpx_lift: ∀h,g,G. l_liftable (cpx h g G). elim (lift_inv_flat1 … HX1) -HX1 #V0 #X #HV10 #HX #HX1 destruct elim (lift_inv_bind1 … HX) -HX #W0 #T0 #HW0 #HT10 #HX destruct elim (lift_inv_bind1 … HX2) -HX2 #X #T3 #HX #HT23 #HX2 destruct - elim (lift_inv_flat1 … HX) -HX #W3 #V3 #HW23 #HV23 #HX destruct /4 width=6 by cpx_beta, ldrop_skip/ + elim (lift_inv_flat1 … HX) -HX #W3 #V3 #HW23 #HV23 #HX destruct /4 width=6 by cpx_beta, drop_skip/ | #a #G #K #V1 #V #V2 #W1 #W2 #T1 #T2 #_ #HV2 #_ #_ #IHV1 #IHW12 #IHT12 #L #s #d #e #HLK #X1 #HX1 #X2 #HX2 elim (lift_inv_flat1 … HX1) -HX1 #V0 #X #HV10 #HX #HX1 destruct elim (lift_inv_bind1 … HX) -HX #W0 #T0 #HW0 #HT10 #HX destruct elim (lift_inv_bind1 … HX2) -HX2 #W3 #X #HW23 #HX #HX2 destruct elim (lift_inv_flat1 … HX) -HX #V3 #T3 #HV3 #HT23 #HX destruct - elim (lift_trans_ge … HV2 … HV3) -V2 /4 width=6 by cpx_theta, ldrop_skip/ + elim (lift_trans_ge … HV2 … HV3) -V2 /4 width=6 by cpx_theta, drop_skip/ ] qed. @@ -94,18 +94,18 @@ lemma cpx_inv_lift1: ∀h,g,G. l_deliftable_sn (cpx h g G). lapply (lift_inv_sort2 … H) -H #H destruct /3 width=3 by cpx_st, lift_sort, ex2_intro/ | #I #G #L #LV #V #V2 #W2 #i #HLV #HV2 #HVW2 #IHV2 #K #s #d #e #HLK #T1 #H elim (lift_inv_lref2 … H) -H * #Hid #H destruct - [ elim (ldrop_conf_lt … HLK … HLV) -L // #L #U #HKL #HLV #HUV + [ elim (drop_conf_lt … HLK … HLV) -L // #L #U #HKL #HLV #HUV elim (IHV2 … HLV … HUV) -V #U2 #HUV2 #HU2 elim (lift_trans_le … HUV2 … HVW2) -V2 // >minus_plus plus_minus // (lift_inv_sort1 … H) -X /2 width=2 by crx_sort/ | #I #K #K0 #V #i #HK0 #L #s #d #e #HLK #X #H elim (lift_inv_lref1 … H) -H * #Hid #H destruct - [ elim (ldrop_trans_lt … HLK … HK0) -K /2 width=4 by crx_delta/ - | lapply (ldrop_trans_ge … HLK … HK0 ?) -K /3 width=5 by crx_delta, ldrop_inv_gen/ + [ elim (drop_trans_lt … HLK … HK0) -K /2 width=4 by crx_delta/ + | lapply (drop_trans_ge … HLK … HK0 ?) -K /3 width=5 by crx_delta, drop_inv_gen/ ] | #K #V #T #_ #IHV #L #s #d #e #HLK #X #H elim (lift_inv_flat1 … H) -H #W #U #HVW #_ #H destruct /3 width=5 by crx_appl_sn/ @@ -38,7 +38,7 @@ lemma crx_lift: ∀h,g,G,K,T. ⦃G, K⦄ ⊢ ➡[h, g] 𝐑⦃T⦄ → ∀L,s,d, | #a #I #K #V #T #HI #_ #IHV #L #s #d #e #HLK #X #H elim (lift_inv_bind1 … H) -H #W #U #HVW #_ #H destruct /3 width=5 by crx_ib2_sn/ | #a #I #K #V #T #HI #_ #IHT #L #s #d #e #HLK #X #H - elim (lift_inv_bind1 … H) -H #W #U #HVW #HTU #H destruct /4 width=5 by crx_ib2_dx, ldrop_skip/ + elim (lift_inv_bind1 … H) -H #W #U #HVW #HTU #H destruct /4 width=5 by crx_ib2_dx, drop_skip/ | #a #K #V #V0 #T #L #s #d #e #_ #X #H elim (lift_inv_flat1 … H) -H #W #X0 #_ #H0 #H destruct elim (lift_inv_bind1 … H0) -H0 #W0 #U #_ #_ #H0 destruct /2 width=1 by crx_beta/ @@ -55,8 +55,8 @@ lemma crx_inv_lift: ∀h,g,G,L,U. ⦃G, L⦄ ⊢ ➡[h, g] 𝐑⦃U⦄ → ∀K, >(lift_inv_sort2 … H) -X /2 width=2 by crx_sort/ | #I #L #L0 #W #i #HK0 #K #s #d #e #HLK #X #H elim (lift_inv_lref2 … H) -H * #Hid #H destruct - [ elim (ldrop_conf_lt … HLK … HK0) -L /2 width=4 by crx_delta/ - | lapply (ldrop_conf_ge … HLK … HK0 ?) -L /2 width=4 by crx_delta/ + [ elim (drop_conf_lt … HLK … HK0) -L /2 width=4 by crx_delta/ + | lapply (drop_conf_ge … HLK … HK0 ?) -L /2 width=4 by crx_delta/ ] | #L #W #U #_ #IHW #K #s #d #e #HLK #X #H elim (lift_inv_flat2 … H) -H #V #T #HVW #_ #H destruct /3 width=5 by crx_appl_sn/ @@ -67,7 +67,7 @@ lemma crx_inv_lift: ∀h,g,G,L,U. ⦃G, L⦄ ⊢ ➡[h, g] 𝐑⦃U⦄ → ∀K, | #a #I #L #W #U #HI #_ #IHW #K #s #d #e #HLK #X #H elim (lift_inv_bind2 … H) -H #V #T #HVW #_ #H destruct /3 width=5 by crx_ib2_sn/ | #a #I #L #W #U #HI #_ #IHU #K #s #d #e #HLK #X #H - elim (lift_inv_bind2 … H) -H #V #T #HVW #HTU #H destruct /4 width=5 by crx_ib2_dx, ldrop_skip/ + elim (lift_inv_bind2 … H) -H #V #T #HVW #HTU #H destruct /4 width=5 by crx_ib2_dx, drop_skip/ | #a #L #W #W0 #U #K #s #d #e #_ #X #H elim (lift_inv_flat2 … H) -H #V #X0 #_ #H0 #H destruct elim (lift_inv_bind2 … H0) -H0 #V0 #T #_ #_ #H0 destruct /2 width=1 by crx_beta/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_drop.ma new file mode 100644 index 000000000..744d2adaf --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_drop.ma @@ -0,0 +1,96 @@ +(**************************************************************************) +(* ___ *) +(* ||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/substitution/lpx_sn_drop.ma". +include "basic_2/substitution/fquq_alt.ma". +include "basic_2/reduction/cpr_lift.ma". +include "basic_2/reduction/lpr.ma". + +(* SN PARALLEL REDUCTION FOR LOCAL ENVIRONMENTS *****************************) + +(* Properies on local environment slicing ***********************************) + +(* Basic_1: includes: wcpr0_drop *) +lemma lpr_drop_conf: ∀G. dropable_sn (lpr G). +/3 width=6 by lpx_sn_deliftable_dropable, cpr_inv_lift1/ qed-. + +(* Basic_1: includes: wcpr0_drop_back *) +lemma drop_lpr_trans: ∀G. dedropable_sn (lpr G). +/3 width=10 by lpx_sn_liftable_dedropable, cpr_lift/ qed-. + +lemma lpr_drop_trans_O1: ∀G. dropable_dx (lpr G). +/2 width=3 by lpx_sn_dropable/ qed-. + +(* Properties on context-sensitive parallel reduction for terms *************) + +lemma fqu_cpr_trans_dx: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ → + ∀U2. ⦃G2, L2⦄ ⊢ T2 ➡ U2 → + ∃∃L,U1. ⦃G1, L1⦄ ⊢ ➡ L & ⦃G1, L⦄ ⊢ T1 ➡ U1 & ⦃G1, L, U1⦄ ⊐ ⦃G2, L2, U2⦄. +#G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 +/3 width=5 by fqu_lref_O, fqu_pair_sn, fqu_bind_dx, fqu_flat_dx, lpr_pair, cpr_pair_sn, cpr_atom, cpr_bind, cpr_flat, ex3_2_intro/ +#G #L #K #U #T #e #HLK #HUT #U2 #HU2 +elim (lift_total U2 0 (e+1)) #T2 #HUT2 +lapply (cpr_lift … HU2 … HLK … HUT … HUT2) -HU2 -HUT /3 width=9 by fqu_drop, ex3_2_intro/ +qed-. + +lemma fquq_cpr_trans_dx: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G2, L2, T2⦄ → + ∀U2. ⦃G2, L2⦄ ⊢ T2 ➡ U2 → + ∃∃L,U1. ⦃G1, L1⦄ ⊢ ➡ L & ⦃G1, L⦄ ⊢ T1 ➡ U1 & ⦃G1, L, U1⦄ ⊐⸮ ⦃G2, L2, U2⦄. +#G1 #G2 #L1 #L2 #T1 #T2 #H #U2 #HTU2 elim (fquq_inv_gen … H) -H +[ #HT12 elim (fqu_cpr_trans_dx … HT12 … HTU2) /3 width=5 by fqu_fquq, ex3_2_intro/ +| * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ +] +qed-. + +lemma fqu_cpr_trans_sn: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ → + ∀U2. ⦃G2, L2⦄ ⊢ T2 ➡ U2 → + ∃∃L,U1. ⦃G1, L1⦄ ⊢ ➡ L & ⦃G1, L1⦄ ⊢ T1 ➡ U1 & ⦃G1, L, U1⦄ ⊐ ⦃G2, L2, U2⦄. +#G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 +/3 width=5 by fqu_lref_O, fqu_pair_sn, fqu_bind_dx, fqu_flat_dx, lpr_pair, cpr_pair_sn, cpr_atom, cpr_bind, cpr_flat, ex3_2_intro/ +#G #L #K #U #T #e #HLK #HUT #U2 #HU2 +elim (lift_total U2 0 (e+1)) #T2 #HUT2 +lapply (cpr_lift … HU2 … HLK … HUT … HUT2) -HU2 -HUT /3 width=9 by fqu_drop, ex3_2_intro/ +qed-. + +lemma fquq_cpr_trans_sn: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G2, L2, T2⦄ → + ∀U2. ⦃G2, L2⦄ ⊢ T2 ➡ U2 → + ∃∃L,U1. ⦃G1, L1⦄ ⊢ ➡ L & ⦃G1, L1⦄ ⊢ T1 ➡ U1 & ⦃G1, L, U1⦄ ⊐⸮ ⦃G2, L2, U2⦄. +#G1 #G2 #L1 #L2 #T1 #T2 #H #U2 #HTU2 elim (fquq_inv_gen … H) -H +[ #HT12 elim (fqu_cpr_trans_sn … HT12 … HTU2) /3 width=5 by fqu_fquq, ex3_2_intro/ +| * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ +] +qed-. + +lemma fqu_lpr_trans: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ → + ∀K2. ⦃G2, L2⦄ ⊢ ➡ K2 → + ∃∃K1,T. ⦃G1, L1⦄ ⊢ ➡ K1 & ⦃G1, L1⦄ ⊢ T1 ➡ T & ⦃G1, K1, T⦄ ⊐ ⦃G2, K2, T2⦄. +#G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 +/3 width=5 by fqu_lref_O, fqu_pair_sn, fqu_flat_dx, lpr_pair, ex3_2_intro/ +[ #a #I #G2 #L2 #V2 #T2 #X #H elim (lpr_inv_pair1 … H) -H + #K2 #W2 #HLK2 #HVW2 #H destruct + /3 width=5 by fqu_fquq, cpr_pair_sn, fqu_bind_dx, ex3_2_intro/ +| #G #L1 #K1 #T1 #U1 #e #HLK1 #HTU1 #K2 #HK12 + elim (drop_lpr_trans … HLK1 … HK12) -HK12 + /3 width=7 by fqu_drop, ex3_2_intro/ +] +qed-. + +lemma fquq_lpr_trans: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G2, L2, T2⦄ → + ∀K2. ⦃G2, L2⦄ ⊢ ➡ K2 → + ∃∃K1,T. ⦃G1, L1⦄ ⊢ ➡ K1 & ⦃G1, L1⦄ ⊢ T1 ➡ T & ⦃G1, K1, T⦄ ⊐⸮ ⦃G2, K2, T2⦄. +#G1 #G2 #L1 #L2 #T1 #T2 #H #K2 #HLK2 elim (fquq_inv_gen … H) -H +[ #HT12 elim (fqu_lpr_trans … HT12 … HLK2) /3 width=5 by fqu_fquq, ex3_2_intro/ +| * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_ldrop.ma deleted file mode 100644 index d9b78dbf8..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_ldrop.ma +++ /dev/null @@ -1,96 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/substitution/lpx_sn_ldrop.ma". -include "basic_2/substitution/fquq_alt.ma". -include "basic_2/reduction/cpr_lift.ma". -include "basic_2/reduction/lpr.ma". - -(* SN PARALLEL REDUCTION FOR LOCAL ENVIRONMENTS *****************************) - -(* Properies on local environment slicing ***********************************) - -(* Basic_1: includes: wcpr0_drop *) -lemma lpr_ldrop_conf: ∀G. dropable_sn (lpr G). -/3 width=6 by lpx_sn_deliftable_dropable, cpr_inv_lift1/ qed-. - -(* Basic_1: includes: wcpr0_drop_back *) -lemma ldrop_lpr_trans: ∀G. dedropable_sn (lpr G). -/3 width=10 by lpx_sn_liftable_dedropable, cpr_lift/ qed-. - -lemma lpr_ldrop_trans_O1: ∀G. dropable_dx (lpr G). -/2 width=3 by lpx_sn_dropable/ qed-. - -(* Properties on context-sensitive parallel reduction for terms *************) - -lemma fqu_cpr_trans_dx: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ → - ∀U2. ⦃G2, L2⦄ ⊢ T2 ➡ U2 → - ∃∃L,U1. ⦃G1, L1⦄ ⊢ ➡ L & ⦃G1, L⦄ ⊢ T1 ➡ U1 & ⦃G1, L, U1⦄ ⊐ ⦃G2, L2, U2⦄. -#G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 -/3 width=5 by fqu_lref_O, fqu_pair_sn, fqu_bind_dx, fqu_flat_dx, lpr_pair, cpr_pair_sn, cpr_atom, cpr_bind, cpr_flat, ex3_2_intro/ -#G #L #K #U #T #e #HLK #HUT #U2 #HU2 -elim (lift_total U2 0 (e+1)) #T2 #HUT2 -lapply (cpr_lift … HU2 … HLK … HUT … HUT2) -HU2 -HUT /3 width=9 by fqu_drop, ex3_2_intro/ -qed-. - -lemma fquq_cpr_trans_dx: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G2, L2, T2⦄ → - ∀U2. ⦃G2, L2⦄ ⊢ T2 ➡ U2 → - ∃∃L,U1. ⦃G1, L1⦄ ⊢ ➡ L & ⦃G1, L⦄ ⊢ T1 ➡ U1 & ⦃G1, L, U1⦄ ⊐⸮ ⦃G2, L2, U2⦄. -#G1 #G2 #L1 #L2 #T1 #T2 #H #U2 #HTU2 elim (fquq_inv_gen … H) -H -[ #HT12 elim (fqu_cpr_trans_dx … HT12 … HTU2) /3 width=5 by fqu_fquq, ex3_2_intro/ -| * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ -] -qed-. - -lemma fqu_cpr_trans_sn: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ → - ∀U2. ⦃G2, L2⦄ ⊢ T2 ➡ U2 → - ∃∃L,U1. ⦃G1, L1⦄ ⊢ ➡ L & ⦃G1, L1⦄ ⊢ T1 ➡ U1 & ⦃G1, L, U1⦄ ⊐ ⦃G2, L2, U2⦄. -#G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 -/3 width=5 by fqu_lref_O, fqu_pair_sn, fqu_bind_dx, fqu_flat_dx, lpr_pair, cpr_pair_sn, cpr_atom, cpr_bind, cpr_flat, ex3_2_intro/ -#G #L #K #U #T #e #HLK #HUT #U2 #HU2 -elim (lift_total U2 0 (e+1)) #T2 #HUT2 -lapply (cpr_lift … HU2 … HLK … HUT … HUT2) -HU2 -HUT /3 width=9 by fqu_drop, ex3_2_intro/ -qed-. - -lemma fquq_cpr_trans_sn: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G2, L2, T2⦄ → - ∀U2. ⦃G2, L2⦄ ⊢ T2 ➡ U2 → - ∃∃L,U1. ⦃G1, L1⦄ ⊢ ➡ L & ⦃G1, L1⦄ ⊢ T1 ➡ U1 & ⦃G1, L, U1⦄ ⊐⸮ ⦃G2, L2, U2⦄. -#G1 #G2 #L1 #L2 #T1 #T2 #H #U2 #HTU2 elim (fquq_inv_gen … H) -H -[ #HT12 elim (fqu_cpr_trans_sn … HT12 … HTU2) /3 width=5 by fqu_fquq, ex3_2_intro/ -| * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ -] -qed-. - -lemma fqu_lpr_trans: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ → - ∀K2. ⦃G2, L2⦄ ⊢ ➡ K2 → - ∃∃K1,T. ⦃G1, L1⦄ ⊢ ➡ K1 & ⦃G1, L1⦄ ⊢ T1 ➡ T & ⦃G1, K1, T⦄ ⊐ ⦃G2, K2, T2⦄. -#G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 -/3 width=5 by fqu_lref_O, fqu_pair_sn, fqu_flat_dx, lpr_pair, ex3_2_intro/ -[ #a #I #G2 #L2 #V2 #T2 #X #H elim (lpr_inv_pair1 … H) -H - #K2 #W2 #HLK2 #HVW2 #H destruct - /3 width=5 by fqu_fquq, cpr_pair_sn, fqu_bind_dx, ex3_2_intro/ -| #G #L1 #K1 #T1 #U1 #e #HLK1 #HTU1 #K2 #HK12 - elim (ldrop_lpr_trans … HLK1 … HK12) -HK12 - /3 width=7 by fqu_drop, ex3_2_intro/ -] -qed-. - -lemma fquq_lpr_trans: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G2, L2, T2⦄ → - ∀K2. ⦃G2, L2⦄ ⊢ ➡ K2 → - ∃∃K1,T. ⦃G1, L1⦄ ⊢ ➡ K1 & ⦃G1, L1⦄ ⊢ T1 ➡ T & ⦃G1, K1, T⦄ ⊐⸮ ⦃G2, K2, T2⦄. -#G1 #G2 #L1 #L2 #T1 #T2 #H #K2 #HLK2 elim (fquq_inv_gen … H) -H -[ #HT12 elim (fqu_lpr_trans … HT12 … HLK2) /3 width=5 by fqu_fquq, ex3_2_intro/ -| * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ -] -qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_lpr.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_lpr.ma index 1e4335511..723ed5c59 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_lpr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpr_lpr.ma @@ -14,7 +14,7 @@ include "basic_2/substitution/lpx_sn_lpx_sn.ma". include "basic_2/multiple/fqup.ma". -include "basic_2/reduction/lpr_ldrop.ma". +include "basic_2/reduction/lpr_drop.ma". (* SN PARALLEL REDUCTION FOR LOCAL ENVIRONMENTS *****************************) @@ -36,11 +36,11 @@ fact cpr_conf_lpr_atom_delta: ∀L1. ⦃G, L0⦄ ⊢ ➡ L1 → ∀L2. ⦃G, L0⦄ ⊢ ➡ L2 → ∃∃T. ⦃G, L1⦄ ⊢ #i ➡ T & ⦃G, L2⦄ ⊢ T2 ➡ T. #G #L0 #i #IH #K0 #V0 #HLK0 #V2 #HV02 #T2 #HVT2 #L1 #HL01 #L2 #HL02 -elim (lpr_ldrop_conf … HLK0 … HL01) -HL01 #X1 #H1 #HLK1 +elim (lpr_drop_conf … HLK0 … HL01) -HL01 #X1 #H1 #HLK1 elim (lpr_inv_pair1 … H1) -H1 #K1 #V1 #HK01 #HV01 #H destruct -elim (lpr_ldrop_conf … HLK0 … HL02) -HL02 #X2 #H2 #HLK2 +elim (lpr_drop_conf … HLK0 … HL02) -HL02 #X2 #H2 #HLK2 elim (lpr_inv_pair1 … H2) -H2 #K2 #W2 #HK02 #_ #H destruct -lapply (ldrop_fwd_drop2 … HLK2) -W2 #HLK2 +lapply (drop_fwd_drop2 … HLK2) -W2 #HLK2 lapply (fqup_lref … G … HLK0) -HLK0 #HLK0 elim (IH … HLK0 … HV01 … HV02 … HK01 … HK02) -L0 -K0 -V0 #V #HV1 #HV2 elim (lift_total V 0 (i+1)) @@ -63,13 +63,13 @@ fact cpr_conf_lpr_delta_delta: ∃∃T. ⦃G, L1⦄ ⊢ T1 ➡ T & ⦃G, L2⦄ ⊢ T2 ➡ T. #G #L0 #i #IH #K0 #V0 #HLK0 #V1 #HV01 #T1 #HVT1 #KX #VX #H #V2 #HV02 #T2 #HVT2 #L1 #HL01 #L2 #HL02 -lapply (ldrop_mono … H … HLK0) -H #H destruct -elim (lpr_ldrop_conf … HLK0 … HL01) -HL01 #X1 #H1 #HLK1 +lapply (drop_mono … H … HLK0) -H #H destruct +elim (lpr_drop_conf … HLK0 … HL01) -HL01 #X1 #H1 #HLK1 elim (lpr_inv_pair1 … H1) -H1 #K1 #W1 #HK01 #_ #H destruct -lapply (ldrop_fwd_drop2 … HLK1) -W1 #HLK1 -elim (lpr_ldrop_conf … HLK0 … HL02) -HL02 #X2 #H2 #HLK2 +lapply (drop_fwd_drop2 … HLK1) -W1 #HLK1 +elim (lpr_drop_conf … HLK0 … HL02) -HL02 #X2 #H2 #HLK2 elim (lpr_inv_pair1 … H2) -H2 #K2 #W2 #HK02 #_ #H destruct -lapply (ldrop_fwd_drop2 … HLK2) -W2 #HLK2 +lapply (drop_fwd_drop2 … HLK2) -W2 #HLK2 lapply (fqup_lref … G … HLK0) -HLK0 #HLK0 elim (IH … HLK0 … HV01 … HV02 … HK01 … HK02) -L0 -K0 -V0 #V #HV1 #HV2 elim (lift_total V 0 (i+1)) /3 width=12 by cpr_lift, ex2_intro/ @@ -107,7 +107,7 @@ fact cpr_conf_lpr_bind_zeta: #G #L0 #V0 #T0 #IH #V1 #HV01 #T1 #HT01 #T2 #HT02 #X2 #HXT2 #L1 #HL01 #L2 #HL02 elim (IH … HT01 … HT02 (L1.ⓓV1) … (L2.ⓓV1)) -IH -HT01 -HT02 /2 width=1 by lpr_pair/ -L0 -V0 -T0 #T #HT1 #HT2 -elim (cpr_inv_lift1 … HT2 L2 … HXT2) -T2 /3 width=3 by cpr_zeta, ldrop_drop, ex2_intro/ +elim (cpr_inv_lift1 … HT2 L2 … HXT2) -T2 /3 width=3 by cpr_zeta, drop_drop, ex2_intro/ qed-. fact cpr_conf_lpr_zeta_zeta: @@ -124,8 +124,8 @@ fact cpr_conf_lpr_zeta_zeta: #G #L0 #V0 #T0 #IH #T1 #HT01 #X1 #HXT1 #T2 #HT02 #X2 #HXT2 #L1 #HL01 #L2 #HL02 elim (IH … HT01 … HT02 (L1.ⓓV0) … (L2.ⓓV0)) -IH -HT01 -HT02 /2 width=1 by lpr_pair/ -L0 -T0 #T #HT1 #HT2 -elim (cpr_inv_lift1 … HT1 L1 … HXT1) -T1 /2 width=2 by ldrop_drop/ #T1 #HT1 #HXT1 -elim (cpr_inv_lift1 … HT2 L2 … HXT2) -T2 /2 width=2 by ldrop_drop/ #T2 #HT2 #HXT2 +elim (cpr_inv_lift1 … HT1 L1 … HXT1) -T1 /2 width=2 by drop_drop/ #T1 #HT1 #HXT1 +elim (cpr_inv_lift1 … HT2 L2 … HXT2) -T2 /2 width=2 by drop_drop/ #T2 #HT2 #HXT2 lapply (lift_inj … HT2 … HT1) -T #H destruct /2 width=3 by ex2_intro/ qed-. @@ -217,7 +217,7 @@ fact cpr_conf_lpr_flat_theta: #V2 #HV02 #U2 #HVU2 #W2 #HW02 #T2 #HT02 #L1 #HL01 #L2 #HL02 elim (IH … HV01 … HV02 … HL01 … HL02) -HV01 -HV02 /2 width=1 by/ #V #HV1 #HV2 elim (lift_total V 0 1) #U #HVU -lapply (cpr_lift … HV2 (L2.ⓓW2) … HVU2 … HVU) -HVU2 /2 width=2 by ldrop_drop/ #HU2 +lapply (cpr_lift … HV2 (L2.ⓓW2) … HVU2 … HVU) -HVU2 /2 width=2 by drop_drop/ #HU2 elim (cpr_inv_abbr1 … H) -H * [ #W1 #T1 #HW01 #HT01 #H destruct elim (IH … HW01 … HW02 … HL01 … HL02) /2 width=1 by/ @@ -226,7 +226,7 @@ elim (cpr_inv_abbr1 … H) -H * | #T1 #HT01 #HXT1 #H destruct elim (IH … HT01 … HT02 (L1.ⓓW2) … (L2.ⓓW2)) /2 width=1 by lpr_pair/ -L0 -V0 -W0 -T0 #T #HT1 #HT2 elim (cpr_inv_lift1 … HT1 L1 … HXT1) -HXT1 - /4 width=9 by cpr_flat, cpr_zeta, ldrop_drop, lift_flat, ex2_intro/ + /4 width=9 by cpr_flat, cpr_zeta, drop_drop, lift_flat, ex2_intro/ ] qed-. @@ -271,8 +271,8 @@ elim (IH … HV01 … HV02 … HL01 … HL02) -HV01 -HV02 /2 width=1 by/ #V #HV1 elim (IH … HW01 … HW02 … HL01 … HL02) /2 width=1 by/ elim (IH … HT01 … HT02 (L1.ⓓW1) … (L2.ⓓW2)) /2 width=1 by lpr_pair/ -L0 -V0 -W0 -T0 elim (lift_total V 0 1) #U #HVU -lapply (cpr_lift … HV1 (L1.ⓓW1) … HVU1 … HVU) -HVU1 /2 width=2 by ldrop_drop/ -lapply (cpr_lift … HV2 (L2.ⓓW2) … HVU2 … HVU) -HVU2 /2 width=2 by ldrop_drop/ +lapply (cpr_lift … HV1 (L1.ⓓW1) … HVU1 … HVU) -HVU1 /2 width=2 by drop_drop/ +lapply (cpr_lift … HV2 (L2.ⓓW2) … HVU2 … HVU) -HVU2 /2 width=2 by drop_drop/ /4 width=7 by cpr_bind, cpr_flat, ex2_intro/ (**) (* full auto not tried *) qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_aaa.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_aaa.ma index e25a5902d..e08817066 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_aaa.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_aaa.ma @@ -14,7 +14,7 @@ include "basic_2/static/aaa_lift.ma". include "basic_2/static/lsuba_aaa.ma". -include "basic_2/reduction/lpx_ldrop.ma". +include "basic_2/reduction/lpx_drop.ma". (* SN EXTENDED PARALLEL REDUCTION FOR LOCAL ENVIRONMENTS ********************) @@ -30,20 +30,20 @@ lemma cpx_lpx_aaa_conf: ∀h,g,G,L1,T1,A. ⦃G, L1⦄ ⊢ T1 ⁝ A → | #I #G #L1 #K1 #V1 #B #i #HLK1 #_ #IHV1 #X #H #L2 #HL12 elim (cpx_inv_lref1 … H) -H [ #H destruct - elim (lpx_ldrop_conf … HLK1 … HL12) -L1 #X #H #HLK2 + elim (lpx_drop_conf … HLK1 … HL12) -L1 #X #H #HLK2 elim (lpx_inv_pair1 … H) -H #K2 #V2 #HK12 #HV12 #H destruct /3 width=6 by aaa_lref/ | * #J #Y #Z #V2 #H #HV12 #HV2 - lapply (ldrop_mono … H … HLK1) -H #H destruct - elim (lpx_ldrop_conf … HLK1 … HL12) -L1 #Z #H #HLK2 + lapply (drop_mono … H … HLK1) -H #H destruct + elim (lpx_drop_conf … HLK1 … HL12) -L1 #Z #H #HLK2 elim (lpx_inv_pair1 … H) -H #K2 #V0 #HK12 #_ #H destruct - /3 width=8 by aaa_lift, ldrop_fwd_drop2/ + /3 width=8 by aaa_lift, drop_fwd_drop2/ ] | #a #G #L1 #V1 #T1 #B #A #_ #_ #IHV1 #IHT1 #X #H #L2 #HL12 elim (cpx_inv_abbr1 … H) -H * [ #V2 #T2 #HV12 #HT12 #H destruct /4 width=2 by lpx_pair, aaa_abbr/ | #T2 #HT12 #HT2 #H destruct -IHV1 - /4 width=8 by lpx_pair, aaa_inv_lift, ldrop_drop/ + /4 width=8 by lpx_pair, aaa_inv_lift, drop_drop/ ] | #a #G #L1 #V1 #T1 #B #A #_ #_ #IHV1 #IHT1 #X #H #L2 #HL12 elim (cpx_inv_abst1 … H) -H #V2 #T2 #HV12 #HT12 #H destruct @@ -57,7 +57,7 @@ lemma cpx_lpx_aaa_conf: ∀h,g,G,L1,T1,A. ⦃G, L1⦄ ⊢ T1 ⁝ A → elim (aaa_inv_abst … H) -H #B0 #A0 #HW1 #HU2 #H destruct /5 width=6 by lsuba_aaa_trans, lsuba_abbr, aaa_abbr, aaa_cast/ | #b #V #V2 #W1 #W2 #U1 #U2 #HV1 #HV2 #HW12 #HU12 #H1 #H2 destruct - lapply (aaa_lift G L2 … B … (L2.ⓓW2) … HV2) -HV2 /2 width=2 by ldrop_drop/ #HV2 + lapply (aaa_lift G L2 … B … (L2.ⓓW2) … HV2) -HV2 /2 width=2 by drop_drop/ #HV2 lapply (IHT1 (ⓓ{b}W2.U2) … HL12) -IHT1 /2 width=1 by cpx_bind/ -L1 #H elim (aaa_inv_abbr … H) -H /3 width=3 by aaa_abbr, aaa_appl/ ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_drop.ma new file mode 100644 index 000000000..28e3f0e6a --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_drop.ma @@ -0,0 +1,78 @@ +(**************************************************************************) +(* ___ *) +(* ||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/substitution/lpx_sn_drop.ma". +include "basic_2/reduction/cpx_lift.ma". +include "basic_2/reduction/lpx.ma". + +(* SN EXTENDED PARALLEL REDUCTION FOR LOCAL ENVIRONMENTS ********************) + +(* Properies on local environment slicing ***********************************) + +lemma lpx_drop_conf: ∀h,g,G. dropable_sn (lpx h g G). +/3 width=6 by lpx_sn_deliftable_dropable, cpx_inv_lift1/ qed-. + +lemma drop_lpx_trans: ∀h,g,G. dedropable_sn (lpx h g G). +/3 width=10 by lpx_sn_liftable_dedropable, cpx_lift/ qed-. + +lemma lpx_drop_trans_O1: ∀h,g,G. dropable_dx (lpx h g G). +/2 width=3 by lpx_sn_dropable/ qed-. + +(* Properties on supclosure *************************************************) + +lemma fqu_lpx_trans: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ → + ∀K2. ⦃G2, L2⦄ ⊢ ➡[h, g] K2 → + ∃∃K1,T. ⦃G1, L1⦄ ⊢ ➡[h, g] K1 & ⦃G1, L1⦄ ⊢ T1 ➡[h, g] T & ⦃G1, K1, T⦄ ⊐ ⦃G2, K2, T2⦄. +#h #g #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 +/3 width=5 by fqu_lref_O, fqu_pair_sn, fqu_flat_dx, lpx_pair, ex3_2_intro/ +[ #a #I #G2 #L2 #V2 #T2 #X #H elim (lpx_inv_pair1 … H) -H + #K2 #W2 #HLK2 #HVW2 #H destruct + /3 width=5 by fqu_fquq, cpx_pair_sn, fqu_bind_dx, ex3_2_intro/ +| #G #L1 #K1 #T1 #U1 #e #HLK1 #HTU1 #K2 #HK12 + elim (drop_lpx_trans … HLK1 … HK12) -HK12 + /3 width=7 by fqu_drop, ex3_2_intro/ +] +qed-. + +lemma fquq_lpx_trans: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G2, L2, T2⦄ → + ∀K2. ⦃G2, L2⦄ ⊢ ➡[h, g] K2 → + ∃∃K1,T. ⦃G1, L1⦄ ⊢ ➡[h, g] K1 & ⦃G1, L1⦄ ⊢ T1 ➡[h, g] T & ⦃G1, K1, T⦄ ⊐⸮ ⦃G2, K2, T2⦄. +#h #g #G1 #G2 #L1 #L2 #T1 #T2 #H #K2 #HLK2 elim (fquq_inv_gen … H) -H +[ #HT12 elim (fqu_lpx_trans … HT12 … HLK2) /3 width=5 by fqu_fquq, ex3_2_intro/ +| * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ +] +qed-. + +lemma lpx_fqu_trans: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ → + ∀K1. ⦃G1, K1⦄ ⊢ ➡[h, g] L1 → + ∃∃K2,T. ⦃G1, K1⦄ ⊢ T1 ➡[h, g] T & ⦃G1, K1, T⦄ ⊐ ⦃G2, K2, T2⦄ & ⦃G2, K2⦄ ⊢ ➡[h, g] L2. +#h #g #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 +/3 width=7 by fqu_pair_sn, fqu_bind_dx, fqu_flat_dx, lpx_pair, ex3_2_intro/ +[ #I #G1 #L1 #V1 #X #H elim (lpx_inv_pair2 … H) -H + #K1 #W1 #HKL1 #HWV1 #H destruct elim (lift_total V1 0 1) + /4 width=7 by cpx_delta, fqu_drop, drop_drop, ex3_2_intro/ +| #G #L1 #K1 #T1 #U1 #e #HLK1 #HTU1 #L0 #HL01 + elim (lpx_drop_trans_O1 … HL01 … HLK1) -L1 + /3 width=5 by fqu_drop, ex3_2_intro/ +] +qed-. + +lemma lpx_fquq_trans: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐⸮ ⦃G2, L2, T2⦄ → + ∀K1. ⦃G1, K1⦄ ⊢ ➡[h, g] L1 → + ∃∃K2,T. ⦃G1, K1⦄ ⊢ T1 ➡[h, g] T & ⦃G1, K1, T⦄ ⊐⸮ ⦃G2, K2, T2⦄ & ⦃G2, K2⦄ ⊢ ➡[h, g] L2. +#h #g #G1 #G2 #L1 #L2 #T1 #T2 #H #K1 #HKL1 elim (fquq_inv_gen … H) -H +[ #HT12 elim (lpx_fqu_trans … HT12 … HKL1) /3 width=5 by fqu_fquq, ex3_2_intro/ +| * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_frees.ma b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_frees.ma index b44d88504..6f4aac874 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_frees.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/reduction/lpx_frees.ma @@ -14,7 +14,7 @@ include "basic_2/multiple/frees_leq.ma". include "basic_2/multiple/frees_lift.ma". -include "basic_2/reduction/lpx_ldrop.ma". +include "basic_2/reduction/lpx_drop.ma". (* SN EXTENDED PARALLEL REDUCTION FOR LOCAL ENVIRONMENTS ********************) @@ -30,12 +30,12 @@ lemma lpx_cpx_frees_trans: ∀h,g,G,L1,U1,U2. ⦃G, L1⦄ ⊢ U1 ➡[h, g] U2 | #j #HG #HL #HU #U2 #H1 #L2 #HL12 #i #H2 elim (cpx_inv_lref1 … H1) -H1 [ #H destruct elim (frees_inv_lref … H2) -H2 // * #I #K2 #W2 #Hj #Hji #HLK2 #HW2 - elim (lpx_ldrop_trans_O1 … HL12 … HLK2) -HL12 #Y #HLK1 #H + elim (lpx_drop_trans_O1 … HL12 … HLK2) -HL12 #Y #HLK1 #H elim (lpx_inv_pair2 … H) -H #K1 #W1 #HK12 #HW12 #H destruct /4 width=11 by frees_lref_be, fqup_lref/ | * #I #K1 #W1 #W0 #HLK1 #HW10 #HW0U2 - lapply (ldrop_fwd_drop2 … HLK1) #H0 - elim (lpx_ldrop_conf … H0 … HL12) -H0 -HL12 #K2 #HK12 #HLK2 + lapply (drop_fwd_drop2 … HLK1) #H0 + elim (lpx_drop_conf … H0 … HL12) -H0 -HL12 #K2 #HK12 #HLK2 elim (lt_or_ge i (j+1)) #Hji [ -IH elim (frees_inv_lift_be … H2 … HLK2 … HW0U2) /2 width=1 by monotonic_pred/ | lapply (frees_inv_lift_ge … H2 … HLK2 … HW0U2 ?) -L2 -U2 // (lpx_inv_atom1 … H) -H @@ -129,8 +129,8 @@ fact leq_lpx_trans_lleq_aux: ∀h,g,G,L1,L0,d,e. L1 ≃[d, e] L0 → e = ∞ → ] qed-. -lemma leq_lpx_trans_lleq: ∀h,g,G,L1,L0,d. L1 ≃[d, ∞] L0 → +lemma leq_lpx_trans_lleq: ∀h,g,G,L1,L0,d. L1 ⩬[d, ∞] L0 → ∀L2. ⦃G, L0⦄ ⊢ ➡[h, g] L2 → - ∃∃L. L ≃[d, ∞] L2 & ⦃G, L1⦄ ⊢ ➡[h, g] L & + ∃∃L. L ⩬[d, ∞] L2 & ⦃G, L1⦄ ⊢ ➡[h, g] L & (∀T. L0 ≡[T, d] L2 ↔ L1 ≡[T, d] L). /2 width=1 by leq_lpx_trans_lleq_aux/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/aaa.ma b/matita/matita/contribs/lambdadelta/basic_2/static/aaa.ma index e0039e238..687a92199 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/aaa.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/aaa.ma @@ -15,7 +15,7 @@ include "basic_2/notation/relations/atomicarity_4.ma". include "basic_2/grammar/aarity.ma". include "basic_2/grammar/genv.ma". -include "basic_2/substitution/ldrop.ma". +include "basic_2/substitution/drop.ma". (* ATONIC ARITY ASSIGNMENT ON TERMS *****************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_aaa.ma b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_aaa.ma index 7c3645d22..2c6d530db 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_aaa.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_aaa.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_ldrop.ma". +include "basic_2/substitution/drop_drop.ma". include "basic_2/static/aaa.ma". (* ATONIC ARITY ASSIGNMENT ON TERMS *****************************************) @@ -25,7 +25,7 @@ theorem aaa_mono: ∀G,L,T,A1. ⦃G, L⦄ ⊢ T ⁝ A1 → ∀A2. ⦃G, L⦄ ⊢ >(aaa_inv_sort … H) -H // | #I1 #G #L #K1 #V1 #B #i #HLK1 #_ #IHA1 #A2 #H elim (aaa_inv_lref … H) -H #I2 #K2 #V2 #HLK2 #HA2 - lapply (ldrop_mono … HLK1 … HLK2) -L #H destruct /2 width=1/ + lapply (drop_mono … HLK1 … HLK2) -L #H destruct /2 width=1/ | #a #G #L #V #T #B1 #A1 #_ #_ #_ #IHA1 #A2 #H elim (aaa_inv_abbr … H) -H /2 width=1/ | #a #G #L #V1 #T1 #B1 #A1 #_ #_ #IHB1 #IHA1 #X #H diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_fqus.ma b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_fqus.ma index e32e0b529..576b0814e 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_fqus.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_fqus.ma @@ -23,7 +23,7 @@ lemma aaa_fqu_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊐ ⦃G2, L2, T2⦄ ∀A1. ⦃G1, L1⦄ ⊢ T1 ⁝ A1 → ∃A2. ⦃G2, L2⦄ ⊢ T2 ⁝ A2. #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #T #A #H elim (aaa_inv_lref … H) -H - #J #K #V #H #HA lapply (ldrop_inv_O2 … H) -H + #J #K #V #H #HA lapply (drop_inv_O2 … H) -H #H destruct /2 width=2 by ex_intro/ | * [ #a ] * #G #L #V #T #X #H [ elim (aaa_inv_abbr … H) diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lift.ma index c5fa16299..1b2b95b18 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lift.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_ldrop.ma". +include "basic_2/substitution/drop_drop.ma". include "basic_2/static/aaa.ma". (* ATONIC ARITY ASSIGNMENT ON TERMS *****************************************) @@ -26,18 +26,18 @@ lemma aaa_lift: ∀G,L1,T1,A. ⦃G, L1⦄ ⊢ T1 ⁝ A → ∀L2,s,d,e. ⇩[s, d >(lift_inv_sort1 … H) -H // | #I #G #L1 #K1 #V1 #B #i #HLK1 #_ #IHB #L2 #s #d #e #HL21 #T2 #H elim (lift_inv_lref1 … H) -H * #Hid #H destruct - [ elim (ldrop_trans_le … HL21 … HLK1) -L1 /2 width=2 by lt_to_le/ #X #HLK2 #H - elim (ldrop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K2 #V2 #HK21 #HV12 #H destruct + [ elim (drop_trans_le … HL21 … HLK1) -L1 /2 width=2 by lt_to_le/ #X #HLK2 #H + elim (drop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K2 #V2 #HK21 #HV12 #H destruct /3 width=9 by aaa_lref/ - | lapply (ldrop_trans_ge … HL21 … HLK1 ?) -L1 - /3 width=9 by aaa_lref, ldrop_inv_gen/ + | lapply (drop_trans_ge … HL21 … HLK1 ?) -L1 + /3 width=9 by aaa_lref, drop_inv_gen/ ] | #a #G #L1 #V1 #T1 #B #A #_ #_ #IHB #IHA #L2 #s #d #e #HL21 #X #H elim (lift_inv_bind1 … H) -H #V2 #T2 #HV12 #HT12 #H destruct - /4 width=5 by aaa_abbr, ldrop_skip/ + /4 width=5 by aaa_abbr, drop_skip/ | #a #G #L1 #V1 #T1 #B #A #_ #_ #IHB #IHA #L2 #s #d #e #HL21 #X #H elim (lift_inv_bind1 … H) -H #V2 #T2 #HV12 #HT12 #H destruct - /4 width=5 by aaa_abst, ldrop_skip/ + /4 width=5 by aaa_abst, drop_skip/ | #G #L1 #V1 #T1 #B #A #_ #_ #IHB #IHA #L2 #s #d #e #HL21 #X #H elim (lift_inv_flat1 … H) -H #V2 #T2 #HV12 #HT12 #H destruct /3 width=5 by aaa_appl/ @@ -54,15 +54,15 @@ lemma aaa_inv_lift: ∀G,L2,T2,A. ⦃G, L2⦄ ⊢ T2 ⁝ A → ∀L1,s,d,e. ⇩[ >(lift_inv_sort2 … H) -H // | #I #G #L2 #K2 #V2 #B #i #HLK2 #_ #IHB #L1 #s #d #e #HL21 #T1 #H elim (lift_inv_lref2 … H) -H * #Hid #H destruct - [ elim (ldrop_conf_lt … HL21 … HLK2) -L2 /3 width=9 by aaa_lref/ - | lapply (ldrop_conf_ge … HL21 … HLK2 ?) -L2 /3 width=9 by aaa_lref/ + [ elim (drop_conf_lt … HL21 … HLK2) -L2 /3 width=9 by aaa_lref/ + | lapply (drop_conf_ge … HL21 … HLK2 ?) -L2 /3 width=9 by aaa_lref/ ] | #a #G #L2 #V2 #T2 #B #A #_ #_ #IHB #IHA #L1 #s #d #e #HL21 #X #H elim (lift_inv_bind2 … H) -H #V1 #T1 #HV12 #HT12 #H destruct - /4 width=5 by aaa_abbr, ldrop_skip/ + /4 width=5 by aaa_abbr, drop_skip/ | #a #G #L2 #V2 #T2 #B #A #_ #_ #IHB #IHA #L1 #s #d #e #HL21 #X #H elim (lift_inv_bind2 … H) -H #V1 #T1 #HV12 #HT12 #H destruct - /4 width=5 by aaa_abst, ldrop_skip/ + /4 width=5 by aaa_abst, drop_skip/ | #G #L2 #V2 #T2 #B #A #_ #_ #IHB #IHA #L1 #s #d #e #HL21 #X #H elim (lift_inv_flat2 … H) -H #V1 #T1 #HV12 #HT12 #H destruct /3 width=5 by aaa_appl/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lifts.ma b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lifts.ma index 1c4547819..50c795b1f 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lifts.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lifts.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/multiple/ldrops.ma". +include "basic_2/multiple/drops.ma". include "basic_2/static/aaa_lift.ma". (* ATONIC ARITY ASSIGNMENT ON TERMS *****************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lleq.ma b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lleq.ma index 0daf65b6b..a81eb6166 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lleq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/aaa_lleq.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/multiple/lleq_ldrop.ma". +include "basic_2/multiple/lleq_drop.ma". include "basic_2/static/aaa.ma". (* ATONIC ARITY ASSIGNMENT ON TERMS *****************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/da.ma b/matita/matita/contribs/lambdadelta/basic_2/static/da.ma index 9b96b39c2..69baf3fdc 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/da.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/da.ma @@ -14,7 +14,7 @@ include "basic_2/notation/relations/degree_6.ma". include "basic_2/grammar/genv.ma". -include "basic_2/substitution/ldrop.ma". +include "basic_2/substitution/drop.ma". include "basic_2/static/sd.ma". (* DEGREE ASSIGNMENT FOR TERMS **********************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/da_da.ma b/matita/matita/contribs/lambdadelta/basic_2/static/da_da.ma index 5506b0980..09d8eceec 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/da_da.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/da_da.ma @@ -26,10 +26,10 @@ theorem da_mono: ∀h,g,G,L,T,l1. ⦃G, L⦄ ⊢ T ▪[h, g] l1 → >(deg_mono … Hkl2 … Hkl1) -h -k -l2 // | #G #L #K #V #i #l1 #HLK #_ #IHV #l2 #H elim (da_inv_lref … H) -H * #K0 #V0 [| #l0 ] #HLK0 #HV0 [| #Hl0 ] - lapply (ldrop_mono … HLK0 … HLK) -HLK -HLK0 #H destruct /2 width=1/ + lapply (drop_mono … HLK0 … HLK) -HLK -HLK0 #H destruct /2 width=1/ | #G #L #K #W #i #l1 #HLK #_ #IHW #l2 #H elim (da_inv_lref … H) -H * #K0 #W0 [| #l0 ] #HLK0 #HW0 [| #Hl0 ] - lapply (ldrop_mono … HLK0 … HLK) -HLK -HLK0 #H destruct /3 width=1/ + lapply (drop_mono … HLK0 … HLK) -HLK -HLK0 #H destruct /3 width=1/ | #a #I #G #L #V #T #l1 #_ #IHT #l2 #H lapply (da_inv_bind … H) -H /2 width=1/ | #I #G #L #V #T #l1 #_ #IHT #l2 #H diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/da_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/static/da_lift.ma index 597420ddf..b2ad8b882 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/da_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/da_lift.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_ldrop.ma". +include "basic_2/substitution/drop_drop.ma". include "basic_2/static/da.ma". (* DEGREE ASSIGNMENT FOR TERMS **********************************************) @@ -27,23 +27,23 @@ lemma da_lift: ∀h,g,G,L1,T1,l. ⦃G, L1⦄ ⊢ T1 ▪[h, g] l → >(lift_inv_sort1 … H) -X /2 width=1 by da_sort/ | #G #L1 #K1 #V1 #i #l #HLK1 #_ #IHV1 #L2 #s #d #e #HL21 #X #H elim (lift_inv_lref1 … H) * #Hid #H destruct - [ elim (ldrop_trans_le … HL21 … HLK1) -L1 /2 width=2 by lt_to_le/ #X #HLK2 #H - elim (ldrop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K2 #V2 #HK21 #HV12 #H destruct + [ elim (drop_trans_le … HL21 … HLK1) -L1 /2 width=2 by lt_to_le/ #X #HLK2 #H + elim (drop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K2 #V2 #HK21 #HV12 #H destruct /3 width=9 by da_ldef/ - | lapply (ldrop_trans_ge … HL21 … HLK1 ?) -L1 - /3 width=8 by da_ldef, ldrop_inv_gen/ + | lapply (drop_trans_ge … HL21 … HLK1 ?) -L1 + /3 width=8 by da_ldef, drop_inv_gen/ ] | #G #L1 #K1 #W1 #i #l #HLK1 #_ #IHW1 #L2 #s #d #e #HL21 #X #H elim (lift_inv_lref1 … H) * #Hid #H destruct - [ elim (ldrop_trans_le … HL21 … HLK1) -L1 /2 width=2 by lt_to_le/ #X #HLK2 #H - elim (ldrop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K2 #W2 #HK21 #HW12 #H destruct + [ elim (drop_trans_le … HL21 … HLK1) -L1 /2 width=2 by lt_to_le/ #X #HLK2 #H + elim (drop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K2 #W2 #HK21 #HW12 #H destruct /3 width=8 by da_ldec/ - | lapply (ldrop_trans_ge … HL21 … HLK1 ?) -L1 - /3 width=8 by da_ldec, ldrop_inv_gen/ + | lapply (drop_trans_ge … HL21 … HLK1 ?) -L1 + /3 width=8 by da_ldec, drop_inv_gen/ ] | #a #I #G #L1 #V1 #T1 #l #_ #IHT1 #L2 #s #d #e #HL21 #X #H elim (lift_inv_bind1 … H) -H #V2 #T2 #HV12 #HU12 #H destruct - /4 width=5 by da_bind, ldrop_skip/ + /4 width=5 by da_bind, drop_skip/ | #I #G #L1 #V1 #T1 #l #_ #IHT1 #L2 #s #d #e #HL21 #X #H elim (lift_inv_flat1 … H) -H #V2 #T2 #HV12 #HU12 #H destruct /3 width=5 by da_flat/ @@ -60,17 +60,17 @@ lemma da_inv_lift: ∀h,g,G,L2,T2,l. ⦃G, L2⦄ ⊢ T2 ▪[h, g] l → >(lift_inv_sort2 … H) -X /2 width=1 by da_sort/ | #G #L2 #K2 #V2 #i #l #HLK2 #HV2 #IHV2 #L1 #s #d #e #HL21 #X #H elim (lift_inv_lref2 … H) * #Hid #H destruct [ -HV2 | -IHV2 ] - [ elim (ldrop_conf_lt … HL21 … HLK2) -L2 /3 width=8 by da_ldef/ - | lapply (ldrop_conf_ge … HL21 … HLK2 ?) -L2 /2 width=4 by da_ldef/ + [ elim (drop_conf_lt … HL21 … HLK2) -L2 /3 width=8 by da_ldef/ + | lapply (drop_conf_ge … HL21 … HLK2 ?) -L2 /2 width=4 by da_ldef/ ] | #G #L2 #K2 #W2 #i #l #HLK2 #HW2 #IHW2 #L1 #s #d #e #HL21 #X #H elim (lift_inv_lref2 … H) * #Hid #H destruct [ -HW2 | -IHW2 ] - [ elim (ldrop_conf_lt … HL21 … HLK2) -L2 /3 width=8 by da_ldec/ - | lapply (ldrop_conf_ge … HL21 … HLK2 ?) -L2 /2 width=4 by da_ldec/ + [ elim (drop_conf_lt … HL21 … HLK2) -L2 /3 width=8 by da_ldec/ + | lapply (drop_conf_ge … HL21 … HLK2 ?) -L2 /2 width=4 by da_ldec/ ] | #a #I #G #L2 #V2 #T2 #l #_ #IHT2 #L1 #s #d #e #HL21 #X #H elim (lift_inv_bind2 … H) -H #V1 #T1 #HV12 #HT12 #H destruct - /4 width=5 by da_bind, ldrop_skip/ + /4 width=5 by da_bind, drop_skip/ | #I #G #L2 #V2 #T2 #l #_ #IHT2 #L1 #s #d #e #HL21 #X #H elim (lift_inv_flat2 … H) -H #V1 #T1 #HV12 #HT12 #H destruct /3 width=5 by da_flat/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/da_sta.ma b/matita/matita/contribs/lambdadelta/basic_2/static/da_sta.ma index 3c706856b..26f83c888 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/da_sta.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/da_sta.ma @@ -24,12 +24,12 @@ lemma da_sta_conf: ∀h,g,G,L,T,U. ⦃G, L⦄ ⊢ T •[h] U → lapply (da_inv_sort … H) -H /3 width=1 by da_sort, deg_next/ | #G #L #K #V #U #W #i #HLK #_ #HWU #IHVW #l #H elim (da_inv_lref … H) -H * #K0 #V0 [| #l0] #HLK0 #HV0 - lapply (ldrop_mono … HLK0 … HLK) -HLK0 #H destruct - lapply (ldrop_fwd_drop2 … HLK) -HLK /3 width=8 by da_lift/ + lapply (drop_mono … HLK0 … HLK) -HLK0 #H destruct + lapply (drop_fwd_drop2 … HLK) -HLK /3 width=8 by da_lift/ | #G #L #K #W #V #U #i #HLK #_ #HWU #IHWV #l #H elim (da_inv_lref … H) -H * #K0 #V0 [| #l0] #HLK0 #HV0 [| #H0 ] - lapply (ldrop_mono … HLK0 … HLK) -HLK0 #H destruct - lapply (ldrop_fwd_drop2 … HLK) -HLK /3 width=8 by da_lift/ + lapply (drop_mono … HLK0 … HLK) -HLK0 #H destruct + lapply (drop_fwd_drop2 … HLK) -HLK /3 width=8 by da_lift/ | #a #I #G #L #V #T #U #_ #IHTU #l #H lapply (da_inv_bind … H) -H /3 width=1 by da_bind/ | #G #L #V #T #U #_ #IHTU #l #H diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/lsuba.ma b/matita/matita/contribs/lambdadelta/basic_2/static/lsuba.ma index a353d95df..e996418dc 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/lsuba.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/lsuba.ma @@ -100,45 +100,45 @@ lemma lsuba_refl: ∀G,L. G ⊢ L ⁝⫃ L. qed. (* Note: the constant 0 cannot be generalized *) -lemma lsuba_ldrop_O1_conf: ∀G,L1,L2. G ⊢ L1 ⁝⫃ L2 → ∀K1,s,e. ⇩[s, 0, e] L1 ≡ K1 → - ∃∃K2. G ⊢ K1 ⁝⫃ K2 & ⇩[s, 0, e] L2 ≡ K2. +lemma lsuba_drop_O1_conf: ∀G,L1,L2. G ⊢ L1 ⁝⫃ L2 → ∀K1,s,e. ⇩[s, 0, e] L1 ≡ K1 → + ∃∃K2. G ⊢ K1 ⁝⫃ K2 & ⇩[s, 0, e] L2 ≡ K2. #G #L1 #L2 #H elim H -L1 -L2 [ /2 width=3 by ex2_intro/ | #I #L1 #L2 #V #_ #IHL12 #K1 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK1 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK1 [ destruct elim (IHL12 L1 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsuba_pair, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK1) -L1 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsuba_pair, drop_pair, ex2_intro/ + | elim (IHL12 … HLK1) -L1 /3 width=3 by drop_drop_lt, ex2_intro/ ] | #L1 #L2 #W #V #A #HV #HW #_ #IHL12 #K1 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK1 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK1 [ destruct elim (IHL12 L1 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsuba_abbr, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK1) -L1 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsuba_abbr, drop_pair, ex2_intro/ + | elim (IHL12 … HLK1) -L1 /3 width=3 by drop_drop_lt, ex2_intro/ ] ] qed-. (* Note: the constant 0 cannot be generalized *) -lemma lsuba_ldrop_O1_trans: ∀G,L1,L2. G ⊢ L1 ⁝⫃ L2 → ∀K2,s,e. ⇩[s, 0, e] L2 ≡ K2 → - ∃∃K1. G ⊢ K1 ⁝⫃ K2 & ⇩[s, 0, e] L1 ≡ K1. +lemma lsuba_drop_O1_trans: ∀G,L1,L2. G ⊢ L1 ⁝⫃ L2 → ∀K2,s,e. ⇩[s, 0, e] L2 ≡ K2 → + ∃∃K1. G ⊢ K1 ⁝⫃ K2 & ⇩[s, 0, e] L1 ≡ K1. #G #L1 #L2 #H elim H -L1 -L2 [ /2 width=3 by ex2_intro/ | #I #L1 #L2 #V #_ #IHL12 #K2 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK2 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK2 [ destruct elim (IHL12 L2 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsuba_pair, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK2) -L2 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsuba_pair, drop_pair, ex2_intro/ + | elim (IHL12 … HLK2) -L2 /3 width=3 by drop_drop_lt, ex2_intro/ ] | #L1 #L2 #W #V #A #HV #HW #_ #IHL12 #K2 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK2 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK2 [ destruct elim (IHL12 L2 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsuba_abbr, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK2) -L2 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsuba_abbr, drop_pair, ex2_intro/ + | elim (IHL12 … HLK2) -L2 /3 width=3 by drop_drop_lt, ex2_intro/ ] ] qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/lsuba_aaa.ma b/matita/matita/contribs/lambdadelta/basic_2/static/lsuba_aaa.ma index f4dd5a524..7588e5cc7 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/lsuba_aaa.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/lsuba_aaa.ma @@ -24,7 +24,7 @@ lemma lsuba_aaa_conf: ∀G,L1,V,A. ⦃G, L1⦄ ⊢ V ⁝ A → #G #L1 #V #A #H elim H -G -L1 -V -A [ // | #I #G #L1 #K1 #V #A #i #HLK1 #HV #IHV #L2 #HL12 - elim (lsuba_ldrop_O1_conf … HL12 … HLK1) -L1 #X #H #HLK2 + elim (lsuba_drop_O1_conf … HL12 … HLK1) -L1 #X #H #HLK2 elim (lsuba_inv_pair1 … H) -H * #K2 [ #HK12 #H destruct /3 width=5 by aaa_lref/ | #W0 #V0 #A0 #HV0 #HW0 #_ #H1 #H2 #H3 destruct @@ -42,7 +42,7 @@ lemma lsuba_aaa_trans: ∀G,L2,V,A. ⦃G, L2⦄ ⊢ V ⁝ A → #G #L2 #V #A #H elim H -G -L2 -V -A [ // | #I #G #L2 #K2 #V #A #i #HLK2 #H1V #IHV #L1 #HL12 - elim (lsuba_ldrop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 + elim (lsuba_drop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 elim (lsuba_inv_pair2 … H) -H * #K1 [ #HK12 #H destruct /3 width=5 by aaa_lref/ | #V0 #A0 #HV0 #H2V #_ #H1 #H2 destruct diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/lsubd.ma b/matita/matita/contribs/lambdadelta/basic_2/static/lsubd.ma index d6cf867a8..abbe1b062 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/lsubd.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/lsubd.ma @@ -105,47 +105,47 @@ lemma lsubd_refl: ∀h,g,G,L. G ⊢ L ▪⫃[h, g] L. qed. (* Note: the constant 0 cannot be generalized *) -lemma lsubd_ldrop_O1_conf: ∀h,g,G,L1,L2. G ⊢ L1 ▪⫃[h, g] L2 → - ∀K1,s,e. ⇩[s, 0, e] L1 ≡ K1 → - ∃∃K2. G ⊢ K1 ▪⫃[h, g] K2 & ⇩[s, 0, e] L2 ≡ K2. +lemma lsubd_drop_O1_conf: ∀h,g,G,L1,L2. G ⊢ L1 ▪⫃[h, g] L2 → + ∀K1,s,e. ⇩[s, 0, e] L1 ≡ K1 → + ∃∃K2. G ⊢ K1 ▪⫃[h, g] K2 & ⇩[s, 0, e] L2 ≡ K2. #h #g #G #L1 #L2 #H elim H -L1 -L2 [ /2 width=3 by ex2_intro/ | #I #L1 #L2 #V #_ #IHL12 #K1 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK1 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK1 [ destruct elim (IHL12 L1 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsubd_pair, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK1) -L1 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsubd_pair, drop_pair, ex2_intro/ + | elim (IHL12 … HLK1) -L1 /3 width=3 by drop_drop_lt, ex2_intro/ ] | #L1 #L2 #W #V #l #HV #HW #_ #IHL12 #K1 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK1 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK1 [ destruct elim (IHL12 L1 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsubd_abbr, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK1) -L1 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsubd_abbr, drop_pair, ex2_intro/ + | elim (IHL12 … HLK1) -L1 /3 width=3 by drop_drop_lt, ex2_intro/ ] ] qed-. (* Note: the constant 0 cannot be generalized *) -lemma lsubd_ldrop_O1_trans: ∀h,g,G,L1,L2. G ⊢ L1 ▪⫃[h, g] L2 → - ∀K2,s,e. ⇩[s, 0, e] L2 ≡ K2 → - ∃∃K1. G ⊢ K1 ▪⫃[h, g] K2 & ⇩[s, 0, e] L1 ≡ K1. +lemma lsubd_drop_O1_trans: ∀h,g,G,L1,L2. G ⊢ L1 ▪⫃[h, g] L2 → + ∀K2,s,e. ⇩[s, 0, e] L2 ≡ K2 → + ∃∃K1. G ⊢ K1 ▪⫃[h, g] K2 & ⇩[s, 0, e] L1 ≡ K1. #h #g #G #L1 #L2 #H elim H -L1 -L2 [ /2 width=3 by ex2_intro/ | #I #L1 #L2 #V #_ #IHL12 #K2 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK2 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK2 [ destruct elim (IHL12 L2 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsubd_pair, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK2) -L2 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsubd_pair, drop_pair, ex2_intro/ + | elim (IHL12 … HLK2) -L2 /3 width=3 by drop_drop_lt, ex2_intro/ ] | #L1 #L2 #W #V #l #HV #HW #_ #IHL12 #K2 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK2 + elim (drop_inv_O1_pair1 … H) -H * #He #HLK2 [ destruct elim (IHL12 L2 s 0) -IHL12 // #X #HL12 #H - <(ldrop_inv_O2 … H) in HL12; -H /3 width=3 by lsubd_abbr, ldrop_pair, ex2_intro/ - | elim (IHL12 … HLK2) -L2 /3 width=3 by ldrop_drop_lt, ex2_intro/ + <(drop_inv_O2 … H) in HL12; -H /3 width=3 by lsubd_abbr, drop_pair, ex2_intro/ + | elim (IHL12 … HLK2) -L2 /3 width=3 by drop_drop_lt, ex2_intro/ ] ] qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/lsubd_da.ma b/matita/matita/contribs/lambdadelta/basic_2/static/lsubd_da.ma index 2dddc71dd..935cd6252 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/lsubd_da.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/lsubd_da.ma @@ -24,13 +24,13 @@ lemma lsubd_da_trans: ∀h,g,G,L2,T,l. ⦃G, L2⦄ ⊢ T ▪[h, g] l → #h #g #G #L2 #T #l #H elim H -G -L2 -T -l [ /2 width=1/ | #G #L2 #K2 #V #i #l #HLK2 #_ #IHV #L1 #HL12 - elim (lsubd_ldrop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 + elim (lsubd_drop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 elim (lsubd_inv_pair2 … H) -H * #K1 [ | -IHV -HLK1 ] [ #HK12 #H destruct /3 width=4/ | #W #l0 #_ #_ #_ #H destruct ] | #G #L2 #K2 #W #i #l #HLK2 #HW #IHW #L1 #HL12 - elim (lsubd_ldrop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 + elim (lsubd_drop_O1_trans … HL12 … HLK2) -L2 #X #H #HLK1 elim (lsubd_inv_pair2 … H) -H * #K1 [ -HW | -IHW ] [ #HK12 #H destruct /3 width=4/ | #V #l0 #HV #H0W #_ #_ #H destruct @@ -46,7 +46,7 @@ lemma lsubd_da_conf: ∀h,g,G,L1,T,l. ⦃G, L1⦄ ⊢ T ▪[h, g] l → #h #g #G #L1 #T #l #H elim H -G -L1 -T -l [ /2 width=1/ | #G #L1 #K1 #V #i #l #HLK1 #HV #IHV #L2 #HL12 - elim (lsubd_ldrop_O1_conf … HL12 … HLK1) -L1 #X #H #HLK2 + elim (lsubd_drop_O1_conf … HL12 … HLK1) -L1 #X #H #HLK2 elim (lsubd_inv_pair1 … H) -H * #K2 [ -HV | -IHV ] [ #HK12 #H destruct /3 width=4/ | #W0 #V0 #l0 #HV0 #HW0 #_ #_ #H1 #H2 destruct @@ -54,7 +54,7 @@ lemma lsubd_da_conf: ∀h,g,G,L1,T,l. ⦃G, L1⦄ ⊢ T ▪[h, g] l → lapply (da_mono … H0V0 … HV0) -H0V0 -HV0 #H destruct /2 width=4/ ] | #G #L1 #K1 #W #i #l #HLK1 #HW #IHW #L2 #HL12 - elim (lsubd_ldrop_O1_conf … HL12 … HLK1) -L1 #X #H #HLK2 + elim (lsubd_drop_O1_conf … HL12 … HLK1) -L1 #X #H #HLK2 elim (lsubd_inv_pair1 … H) -H * #K2 [ -HW | -IHW ] [ #HK12 #H destruct /3 width=4/ | #W0 #V0 #l0 #HV0 #HW0 #_ #H destruct diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/lsubr.ma b/matita/matita/contribs/lambdadelta/basic_2/static/lsubr.ma index ea1ddabec..ab498fc63 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/lsubr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/lsubr.ma @@ -13,7 +13,7 @@ (**************************************************************************) include "basic_2/notation/relations/lrsubeqc_2.ma". -include "basic_2/substitution/ldrop.ma". +include "basic_2/substitution/drop.ma". (* RESTRICTED LOCAL ENVIRONMENT REFINEMENT **********************************) @@ -77,31 +77,31 @@ lemma lsubr_fwd_length: ∀L1,L2. L1 ⫃ L2 → |L2| ≤ |L1|. #L1 #L2 #H elim H -L1 -L2 /2 width=1 by monotonic_le_plus_l/ qed-. -lemma lsubr_fwd_ldrop2_bind: ∀L1,L2. L1 ⫃ L2 → - ∀I,K2,W,s,i. ⇩[s, 0, i] L2 ≡ K2.ⓑ{I}W → - (∃∃K1. K1 ⫃ K2 & ⇩[s, 0, i] L1 ≡ K1.ⓑ{I}W) ∨ - ∃∃K1,V. K1 ⫃ K2 & ⇩[s, 0, i] L1 ≡ K1.ⓓⓝW.V & I = Abst. +lemma lsubr_fwd_drop2_bind: ∀L1,L2. L1 ⫃ L2 → + ∀I,K2,W,s,i. ⇩[s, 0, i] L2 ≡ K2.ⓑ{I}W → + (∃∃K1. K1 ⫃ K2 & ⇩[s, 0, i] L1 ≡ K1.ⓑ{I}W) ∨ + ∃∃K1,V. K1 ⫃ K2 & ⇩[s, 0, i] L1 ≡ K1.ⓓⓝW.V & I = Abst. #L1 #L2 #H elim H -L1 -L2 [ #L #I #K2 #W #s #i #H - elim (ldrop_inv_atom1 … H) -H #H destruct + elim (drop_inv_atom1 … H) -H #H destruct | #J #L1 #L2 #V #HL12 #IHL12 #I #K2 #W #s #i #H - elim (ldrop_inv_O1_pair1 … H) -H * #Hi #HLK2 destruct [ -IHL12 | -HL12 ] - [ /3 width=3 by ldrop_pair, ex2_intro, or_introl/ + elim (drop_inv_O1_pair1 … H) -H * #Hi #HLK2 destruct [ -IHL12 | -HL12 ] + [ /3 width=3 by drop_pair, ex2_intro, or_introl/ | elim (IHL12 … HLK2) -IHL12 -HLK2 * - /4 width=4 by ldrop_drop_lt, ex3_2_intro, ex2_intro, or_introl, or_intror/ + /4 width=4 by drop_drop_lt, ex3_2_intro, ex2_intro, or_introl, or_intror/ ] | #L1 #L2 #V1 #V2 #HL12 #IHL12 #I #K2 #W #s #i #H - elim (ldrop_inv_O1_pair1 … H) -H * #Hi #HLK2 destruct [ -IHL12 | -HL12 ] - [ /3 width=4 by ldrop_pair, ex3_2_intro, or_intror/ + elim (drop_inv_O1_pair1 … H) -H * #Hi #HLK2 destruct [ -IHL12 | -HL12 ] + [ /3 width=4 by drop_pair, ex3_2_intro, or_intror/ | elim (IHL12 … HLK2) -IHL12 -HLK2 * - /4 width=4 by ldrop_drop_lt, ex3_2_intro, ex2_intro, or_introl, or_intror/ + /4 width=4 by drop_drop_lt, ex3_2_intro, ex2_intro, or_introl, or_intror/ ] ] qed-. -lemma lsubr_fwd_ldrop2_abbr: ∀L1,L2. L1 ⫃ L2 → - ∀K2,V,s,i. ⇩[s, 0, i] L2 ≡ K2.ⓓV → - ∃∃K1. K1 ⫃ K2 & ⇩[s, 0, i] L1 ≡ K1.ⓓV. -#L1 #L2 #HL12 #K2 #V #s #i #HLK2 elim (lsubr_fwd_ldrop2_bind … HL12 … HLK2) -L2 // * +lemma lsubr_fwd_drop2_abbr: ∀L1,L2. L1 ⫃ L2 → + ∀K2,V,s,i. ⇩[s, 0, i] L2 ≡ K2.ⓓV → + ∃∃K1. K1 ⫃ K2 & ⇩[s, 0, i] L1 ≡ K1.ⓓV. +#L1 #L2 #HL12 #K2 #V #s #i #HLK2 elim (lsubr_fwd_drop2_bind … HL12 … HLK2) -L2 // * #K1 #W #_ #_ #H destruct qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/sta.ma b/matita/matita/contribs/lambdadelta/basic_2/static/sta.ma index de2f51746..fc6bf6a2a 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/sta.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/sta.ma @@ -14,7 +14,7 @@ include "basic_2/notation/relations/statictype_5.ma". include "basic_2/grammar/genv.ma". -include "basic_2/substitution/ldrop.ma". +include "basic_2/substitution/drop.ma". include "basic_2/static/sh.ma". (* STATIC TYPE ASSIGNMENT ON TERMS ******************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/sta_aaa.ma b/matita/matita/contribs/lambdadelta/basic_2/static/sta_aaa.ma index c49c6ee21..affd2eded 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/sta_aaa.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/sta_aaa.ma @@ -37,8 +37,8 @@ lemma sta_aaa_conf: ∀h,G,L. Conf3 … (aaa G L) (sta h G L). lapply (sta_inv_sort1 … H) -H #H destruct // | #I #G #L #K #V #B #i #HLK #HV #IHV #U #H elim (sta_inv_lref1 … H) -H * #K0 #V0 #W0 #HLK0 #HVW0 #HU - lapply (ldrop_mono … HLK0 … HLK) -HLK0 #H0 destruct - lapply (ldrop_fwd_drop2 … HLK) -HLK #HLK + lapply (drop_mono … HLK0 … HLK) -HLK0 #H0 destruct + lapply (drop_fwd_drop2 … HLK) -HLK #HLK @(aaa_lift … HLK … HU) -HU -L /2 width=2 by/ | #a #G #L #V #T #B #A #HV #_ #_ #IHT #X #H elim (sta_inv_bind1 … H) -H #U #HTU #H destruct /3 width=2 by aaa_abbr/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/sta_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/static/sta_lift.ma index f31135aae..89868cfc3 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/sta_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/sta_lift.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_ldrop.ma". +include "basic_2/substitution/drop_drop.ma". include "basic_2/static/sta.ma". (* STATIC TYPE ASSIGNMENT ON TERMS ******************************************) @@ -28,26 +28,26 @@ lemma sta_lift: ∀h,G. l_liftable (sta h G). | #G #L1 #K1 #V1 #W1 #W #i #HLK1 #_ #HW1 #IHVW1 #L2 #s #d #e #HL21 #X #H #U2 #HWU2 elim (lift_inv_lref1 … H) * #Hid #H destruct [ elim (lift_trans_ge … HW1 … HWU2) -W // #W2 #HW12 #HWU2 - elim (ldrop_trans_le … HL21 … HLK1) -L1 /2 width=2 by lt_to_le/ #X #HLK2 #H - elim (ldrop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K2 #V2 #HK21 #HV12 #H destruct + elim (drop_trans_le … HL21 … HLK1) -L1 /2 width=2 by lt_to_le/ #X #HLK2 #H + elim (drop_inv_skip2 … H) -H /2 width=1 by lt_plus_to_minus_r/ -Hid #K2 #V2 #HK21 #HV12 #H destruct /3 width=9 by sta_ldef/ | lapply (lift_trans_be … HW1 … HWU2 ? ?) -W /2 width=1 by le_S/ #HW1U2 - lapply (ldrop_trans_ge … HL21 … HLK1 ?) -L1 /3 width=9 by sta_ldef, ldrop_inv_gen/ + lapply (drop_trans_ge … HL21 … HLK1 ?) -L1 /3 width=9 by sta_ldef, drop_inv_gen/ ] | #G #L1 #K1 #W1 #V1 #W #i #HLK1 #_ #HW1 #IHWV1 #L2 #s #d #e #HL21 #X #H #U2 #HWU2 elim (lift_inv_lref1 … H) * #Hid #H destruct [ elim (lift_trans_ge … HW1 … HWU2) -W // (lift_inv_sort2 … H) -X /2 width=3 by sta_sort, lift_sort, ex2_intro/ | #G #L2 #K2 #V2 #W2 #W #i #HLK2 #HVW2 #HW2 #IHVW2 #L1 #s #d #e #HL21 #X #H elim (lift_inv_lref2 … H) * #Hid #H destruct [ -HVW2 | -IHVW2 ] - [ elim (ldrop_conf_lt … HL21 … HLK2) -L2 // #K1 #V1 #HLK1 #HK21 #HV12 + [ elim (drop_conf_lt … HL21 … HLK2) -L2 // #K1 #V1 #HLK1 #HK21 #HV12 elim (IHVW2 … HK21 … HV12) -K2 -V2 #W1 #HW12 #HVW1 elim (lift_trans_le … HW12 … HW2) -W2 // >minus_plus minus_minus_m_m /3 width=8 by sta_ldef, le_S, ex2_intro/ ] | #G #L2 #K2 #W2 #V2 #W #i #HLK2 #HWV2 #HW2 #IHWV2 #L1 #s #d #e #HL21 #X #H elim (lift_inv_lref2 … H) * #Hid #H destruct [ -HWV2 | -IHWV2 ] - [ elim (ldrop_conf_lt … HL21 … HLK2) -L2 // #K1 #W1 #HLK1 #HK21 #HW12 + [ elim (drop_conf_lt … HL21 … HLK2) -L2 // #K1 #W1 #HLK1 #HK21 #HW12 elim (IHWV2 … HK21 … HW12) -K2 #V1 #_ #HWV1 elim (lift_trans_le … HW12 … HW2) -W2 // >minus_plus minus_minus_m_m /3 width=8 by sta_ldec, le_S, ex2_intro/ ] | #a #I #G #L2 #V2 #T2 #U2 #_ #IHTU2 #L1 #s #d #e #HL21 #X #H elim (lift_inv_bind2 … H) -H #V1 #T1 #HV12 #HT12 #H destruct - elim (IHTU2 (L1.ⓑ{I}V1) … HT12) -IHTU2 -HT12 /3 width=5 by sta_bind, ldrop_skip, lift_bind, ex2_intro/ + elim (IHTU2 (L1.ⓑ{I}V1) … HT12) -IHTU2 -HT12 /3 width=5 by sta_bind, drop_skip, lift_bind, ex2_intro/ | #G #L2 #V2 #T2 #U2 #_ #IHTU2 #L1 #s #d #e #HL21 #X #H elim (lift_inv_flat2 … H) -H #V1 #T1 #HV12 #HT12 #H destruct elim (IHTU2 … HL21 … HT12) -L2 -HT12 /3 width=5 by sta_appl, lift_flat, ex2_intro/ @@ -101,10 +101,10 @@ lemma sta_fwd_correct: ∀h,G,L,T,U. ⦃G, L⦄ ⊢ T •[h] U → ∃T0. ⦃G, #h #G #L #T #U #H elim H -G -L -T -U [ /2 width=2/ | #G #L #K #V #W #W0 #i #HLK #_ #HW0 * #V0 #HWV0 - lapply (ldrop_fwd_drop2 … HLK) -HLK #HLK + lapply (drop_fwd_drop2 … HLK) -HLK #HLK elim (lift_total V0 0 (i+1)) /3 width=11 by ex_intro, sta_lift/ | #G #L #K #W #V #V0 #i #HLK #HWV #HWV0 #_ - lapply (ldrop_fwd_drop2 … HLK) -HLK #HLK + lapply (drop_fwd_drop2 … HLK) -HLK #HLK elim (lift_total V 0 (i+1)) /3 width=11 by ex_intro, sta_lift/ | #a #I #G #L #V #T #U #_ * /3 width=2 by sta_bind, ex_intro/ | #G #L #V #T #U #_ * #T0 #HUT0 /3 width=2 by sta_appl, ex_intro/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/sta_llpx_sn.ma b/matita/matita/contribs/lambdadelta/basic_2/static/sta_llpx_sn.ma index af4cfb8c2..3adf28fc4 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/sta_llpx_sn.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/sta_llpx_sn.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/multiple/llpx_sn_ldrop.ma". +include "basic_2/multiple/llpx_sn_drop.ma". include "basic_2/static/sta.ma". (* STRATIFIED STATIC TYPE ASSIGNMENT FOR TERMS ******************************) @@ -25,13 +25,13 @@ lemma sta_llpx_sn_conf: ∀R. (∀L. reflexive … (R L)) → l_liftable R → [ /3 width=4 by llpx_sn_fwd_length, llpx_sn_sort/ | #G #Ls #Ks #V1s #W2s #V2s #i #HLKs #_ #HVW2s #IHV12s #Ld #H elim (llpx_sn_inv_lref_ge_sn … H … HLKs) // -H #Kd #V1d #HLKd #HV1s #HV1sd - lapply (ldrop_fwd_drop2 … HLKs) -HLKs #HLKs - lapply (ldrop_fwd_drop2 … HLKd) -HLKd #HLKd + lapply (drop_fwd_drop2 … HLKs) -HLKs #HLKs + lapply (drop_fwd_drop2 … HLKd) -HLKd #HLKd @(llpx_sn_lift_le … HLKs HLKd … HVW2s) -HLKs -HLKd -HVW2s /2 width=1 by/ (**) (* full auto too slow *) | #G #Ls #Ks #V1s #W1s #V2s #i #HLKs #_ #HV12s #IHVW1s #Ld #H elim (llpx_sn_inv_lref_ge_sn … H … HLKs) // -H #Kd #V1d #HLKd #HV1s #HV1sd - lapply (ldrop_fwd_drop2 … HLKs) -HLKs #HLKs - lapply (ldrop_fwd_drop2 … HLKd) -HLKd #HLKd + lapply (drop_fwd_drop2 … HLKs) -HLKs #HLKs + lapply (drop_fwd_drop2 … HLKd) -HLKd #HLKd @(llpx_sn_lift_le … HLKs HLKd … HV12s) -HLKs -HLKd -HV12s /2 width=1 by/ (**) (* full auto too slow *) | #a #I #G #Ls #V #T1 #T2 #_ #IHT12 #Ld #H elim (llpx_sn_inv_bind_O … H) -H /4 width=5 by llpx_sn_bind_repl_SO, llpx_sn_bind/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/sta_sta.ma b/matita/matita/contribs/lambdadelta/basic_2/static/sta_sta.ma index 6f737b59f..6d54d56d7 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/sta_sta.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/sta_sta.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_ldrop.ma". +include "basic_2/substitution/drop_drop.ma". include "basic_2/static/sta.ma". (* STATIC TYPE ASSIGNMENT ON TERMS ******************************************) @@ -25,12 +25,12 @@ theorem sta_mono: ∀h,G,L. singlevalued … (sta h G L). [ #G #L #k #X #H >(sta_inv_sort1 … H) -X // | #G #L #K #V #W #U1 #i #HLK #_ #HWU1 #IHVW #U2 #H elim (sta_inv_lref1 … H) -H * #K0 #V0 #W0 #HLK0 #HVW0 #HW0U2 - lapply (ldrop_mono … HLK0 … HLK) -HLK -HLK0 #H destruct + lapply (drop_mono … HLK0 … HLK) -HLK -HLK0 #H destruct lapply (IHVW … HVW0) -IHVW -HVW0 #H destruct >(lift_mono … HWU1 … HW0U2) -W0 -U1 // | #G #L #K #W #V #U1 #i #HLK #_ #HWU1 #IHWV #U2 #H elim (sta_inv_lref1 … H) -H * #K0 #W0 #V0 #HLK0 #HWV0 #HV0U2 - lapply (ldrop_mono … HLK0 … HLK) -HLK -HLK0 #H destruct + lapply (drop_mono … HLK0 … HLK) -HLK -HLK0 #H destruct lapply (IHWV … HWV0) -IHWV -HWV0 #H destruct >(lift_mono … HWU1 … HV0U2) -W -U1 // | #a #I #G #L #V #T #U1 #_ #IHTU1 #X #H diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy.ma index bf38e8a25..5dbbe92e6 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy.ma @@ -41,7 +41,7 @@ lemma lsuby_cpy_trans: ∀G,d,e. lsub_trans … (cpy d e G) (lsuby d e). #G #d #e #L1 #T1 #T2 #H elim H -G -L1 -T1 -T2 -d -e [ // | #I #G #L1 #K1 #V #W #i #d #e #Hdi #Hide #HLK1 #HVW #L2 #HL12 - elim (lsuby_ldrop_trans_be … HL12 … HLK1) -HL12 -HLK1 /2 width=5 by cpy_subst/ + elim (lsuby_drop_trans_be … HL12 … HLK1) -HL12 -HLK1 /2 width=5 by cpy_subst/ | /4 width=1 by lsuby_succ, cpy_bind/ | /3 width=1 by cpy_flat/ ] @@ -66,7 +66,7 @@ lemma cpy_full: ∀I,G,K,V,T1,L,d. ⇩[d] L ≡ K.ⓑ{I}V → | * [ #a ] #J #W1 #U1 #IHW1 #IHU1 #L #d #HLK elim (IHW1 … HLK) -IHW1 #W2 #W #HW12 #HW2 [ elim (IHU1 (L.ⓑ{J}W1) (d+1)) -IHU1 - /3 width=9 by cpy_bind, ldrop_drop, lift_bind, ex2_2_intro/ + /3 width=9 by cpy_bind, drop_drop, lift_bind, ex2_2_intro/ | elim (IHU1 … HLK) -IHU1 -HLK /3 width=8 by cpy_flat, lift_flat, ex2_2_intro/ ] @@ -87,7 +87,7 @@ lemma cpy_weak_top: ∀G,L,T1,T2,d,e. ⦃G, L⦄ ⊢ T1 ▶[d, e] T2 → ⦃G, L⦄ ⊢ T1 ▶[d, |L| - d] T2. #G #L #T1 #T2 #d #e #H elim H -G -L -T1 -T2 -d -e // [ #I #G #L #K #V #W #i #d #e #Hdi #_ #HLK #HVW - lapply (ldrop_fwd_length_lt2 … HLK) + lapply (drop_fwd_length_lt2 … HLK) /4 width=5 by cpy_subst, ylt_yle_trans, ylt_inj/ | #a #I #G #L #V1 #V2 normalize in match (|L.ⓑ{I}V2|); (**) (* |?| does not work *) /2 width=1 by cpy_bind/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_cpy.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_cpy.ma index 0aad278c1..28b5982c4 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_cpy.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_cpy.ma @@ -28,7 +28,7 @@ theorem cpy_conf_eq: ∀G,L,T0,T1,d1,e1. ⦃G, L⦄ ⊢ T0 ▶[d1, e1] T1 → elim (cpy_inv_lref1 … H) -H [ #HX destruct /3 width=7 by cpy_subst, ex2_intro/ | -Hd1 -Hde1 * #I2 #K2 #V2 #_ #_ #HLK2 #HVT2 - lapply (ldrop_mono … HLK1 … HLK2) -HLK1 -HLK2 #H destruct + lapply (drop_mono … HLK1 … HLK2) -HLK1 -HLK2 #H destruct >(lift_mono … HVT1 … HVT2) -HVT1 -HVT2 /2 width=3 by ex2_intro/ ] | #a #I #G #L #V0 #V1 #T0 #T1 #d1 #e1 #_ #_ #IHV01 #IHT01 #X #d2 #e2 #HX diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_lift.ma index 935844099..dcc1cba83 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_lift.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/substitution/ldrop_ldrop.ma". +include "basic_2/substitution/drop_drop.ma". include "basic_2/substitution/cpy.ma". (* CONTEXT-SENSITIVE EXTENDED ORDINARY SUBSTITUTION FOR TERMS ***************) @@ -32,13 +32,13 @@ lemma cpy_lift_le: ∀G,K,T1,T2,dt,et. ⦃G, K⦄ ⊢ T1 ▶[dt, et] T2 → lapply (ylt_inv_inj … Hid) -Hid #Hid lapply (lift_inv_lref1_lt … H … Hid) -H #H destruct elim (lift_trans_ge … HVW … HWU2) -W // (lift_mono … HVY … HVW) -Y -HVW #H destruct /2 width=5 by cpy_subst/ | #a #I #G #K #V1 #V2 #T1 #T2 #dt #et #_ #_ #IHV12 #IHT12 #L #U1 #U2 #s #d #e #HLK #H1 #H2 #Hdetd elim (lift_inv_bind1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 elim (lift_inv_bind1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct - /4 width=7 by cpy_bind, ldrop_skip, yle_succ/ + /4 width=7 by cpy_bind, drop_skip, yle_succ/ | #G #I #K #V1 #V2 #T1 #T2 #dt #et #_ #_ #IHV12 #IHT12 #L #U1 #U2 #s #d #e #HLK #H1 #H2 #Hdetd elim (lift_inv_flat1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 elim (lift_inv_flat1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct @@ -58,20 +58,20 @@ lemma cpy_lift_be: ∀G,K,T1,T2,dt,et. ⦃G, K⦄ ⊢ T1 ▶[dt, et] T2 → [ -Hdtd lapply (ylt_yle_trans … (dt+et+e) … Hidet) // -Hidet #Hidete elim (lift_trans_ge … HVW … HWU2) -W // (lift_mono … HVY … HVW) -V #H destruct /2 width=5 by cpy_subst/ | -Hdti elim (yle_inv_inj2 … Hdtd) -Hdtd #dtt #Hdtd #H destruct lapply (transitive_le … Hdtd Hid) -Hdtd #Hdti lapply (lift_trans_be … HVW … HWU2 ? ?) -W /2 width=1 by le_S/ >plus_plus_comm_23 #HVU2 - lapply (ldrop_trans_ge_comm … HLK … HKV ?) -K // -Hid - /4 width=5 by cpy_subst, ldrop_inv_gen, monotonic_ylt_plus_dx, yle_plus_dx1_trans, yle_inj/ + lapply (drop_trans_ge_comm … HLK … HKV ?) -K // -Hid + /4 width=5 by cpy_subst, drop_inv_gen, monotonic_ylt_plus_dx, yle_plus_dx1_trans, yle_inj/ ] | #a #I #G #K #V1 #V2 #T1 #T2 #dt #et #_ #_ #IHV12 #IHT12 #L #U1 #U2 #s #d #e #HLK #H1 #H2 #Hdtd #Hddet elim (lift_inv_bind1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 elim (lift_inv_bind1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct - /4 width=7 by cpy_bind, ldrop_skip, yle_succ/ + /4 width=7 by cpy_bind, drop_skip, yle_succ/ | #I #G #K #V1 #V2 #T1 #T2 #dt #et #_ #_ #IHV12 #IHT12 #L #U1 #U2 #s #d #e #HLK #H1 #H2 #Hdetd elim (lift_inv_flat1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 elim (lift_inv_flat1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct @@ -92,12 +92,12 @@ lemma cpy_lift_ge: ∀G,K,T1,T2,dt,et. ⦃G, K⦄ ⊢ T1 ▶[dt, et] T2 → elim (yle_inv_inj2 … Hid) -Hid #dd #Hddi #H0 destruct lapply (lift_inv_lref1_ge … H … Hddi) -H #H destruct lapply (lift_trans_be … HVW … HWU2 ? ?) -W /2 width=1 by le_S/ >plus_plus_comm_23 #HVU2 - lapply (ldrop_trans_ge_comm … HLK … HKV ?) -K // -Hddi - /3 width=5 by cpy_subst, ldrop_inv_gen, monotonic_ylt_plus_dx, monotonic_yle_plus_dx/ + lapply (drop_trans_ge_comm … HLK … HKV ?) -K // -Hddi + /3 width=5 by cpy_subst, drop_inv_gen, monotonic_ylt_plus_dx, monotonic_yle_plus_dx/ | #a #I #G #K #V1 #V2 #T1 #T2 #dt #et #_ #_ #IHV12 #IHT12 #L #U1 #U2 #s #d #e #HLK #H1 #H2 #Hddt elim (lift_inv_bind1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 elim (lift_inv_bind1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct - /4 width=6 by cpy_bind, ldrop_skip, yle_succ/ + /4 width=6 by cpy_bind, drop_skip, yle_succ/ | #I #G #K #V1 #V2 #T1 #T2 #dt #et #_ #_ #IHV12 #IHT12 #L #U1 #U2 #s #d #e #HLK #H1 #H2 #Hddt elim (lift_inv_flat1 … H1) -H1 #VV1 #TT1 #HVV1 #HTT1 #H1 elim (lift_inv_flat1 … H2) -H2 #VV2 #TT2 #HVV2 #HTT2 #H2 destruct @@ -122,13 +122,13 @@ lemma cpy_inv_lift1_le: ∀G,L,U1,U2,dt,et. ⦃G, L⦄ ⊢ U1 ▶[dt, et] U2 → lapply (ylt_yle_trans … Hdetd … Hidet) -Hdetd #Hid lapply (ylt_inv_inj … Hid) -Hid #Hid lapply (lift_inv_lref2_lt … H … Hid) -H #H destruct - elim (ldrop_conf_lt … HLK … HLKV) -L // #L #U #HKL #_ #HUV + elim (drop_conf_lt … HLK … HLKV) -L // #L #U #HKL #_ #HUV elim (lift_trans_le … HUV … HVW) -V // >minus_plus yplus_minus_assoc_inj /2 width=1 by yle_plus1_to_minus_inj2/ ] -Hdedet #Hidete - elim (ldrop_conf_lt … HLK … HLKV) -L // #L #U #HKL #_ #HUV + elim (drop_conf_lt … HLK … HLKV) -L // #L #U #HKL #_ #HUV elim (lift_trans_le … HUV … HVW) -V // >minus_plus plus_minus // plus_minus /2 width=1 by yle_inv_inj/ yminus_succ1_inj /3 width=5 by cpy_bind, lift_bind, ex2_intro/ | #I #G #L #W1 #W2 #U1 #U2 #dt #et #_ #_ #IHW12 #IHU12 #K #s #d #e #HLK #X #H #Hdetd elim (lift_inv_flat2 … H) -H #V1 #T1 #HVW1 #HTU1 #H destruct diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_nlift.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_nlift.ma index 226f6afab..5f1148dbf 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_nlift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/substitution/cpy_nlift.ma @@ -47,7 +47,7 @@ lemma cpy_fwd_nlift2_ge: ∀G,L,U1,U2,d,e. ⦃G, L⦄ ⊢ U1 ▶[d, e] U2 → | * #J #K #W #j #Hdj #Hji #HLK #HnW elim (yle_inv_succ1 … Hdj) -Hdj #Hdj #Hj lapply (ylt_O … Hj) -Hj #Hj - lapply (ldrop_inv_drop1_lt … HLK ?) // -HLK #HLK + lapply (drop_inv_drop1_lt … HLK ?) // -HLK #HLK >(plus_minus_m_m j 1) in ⊢ (%→?); [2: /3 width=3 by yle_trans, yle_inv_inj/ ] #HnU1 commutative_plus normalize #H destruct +] +qed-. + +lemma drop_inv_O1_pair1: ∀I,K,L2,V,s,e. ⇩[s, 0, e] K. ⓑ{I} V ≡ L2 → + (e = 0 ∧ L2 = K.ⓑ{I}V) ∨ + (0 < e ∧ ⇩[s, 0, e-1] K ≡ L2). +/2 width=3 by drop_inv_O1_pair1_aux/ qed-. + +lemma drop_inv_pair1: ∀I,K,L2,V,s. ⇩[s, 0, 0] K.ⓑ{I}V ≡ L2 → L2 = K.ⓑ{I}V. +#I #K #L2 #V #s #H +elim (drop_inv_O1_pair1 … H) -H * // #H destruct +elim (lt_refl_false … H) +qed-. + +(* Basic_1: was: drop_gen_drop *) +lemma drop_inv_drop1_lt: ∀I,K,L2,V,s,e. + ⇩[s, 0, e] K.ⓑ{I}V ≡ L2 → 0 < e → ⇩[s, 0, e-1] K ≡ L2. +#I #K #L2 #V #s #e #H #He +elim (drop_inv_O1_pair1 … H) -H * // #H destruct +elim (lt_refl_false … He) +qed-. + +lemma drop_inv_drop1: ∀I,K,L2,V,s,e. + ⇩[s, 0, e+1] K.ⓑ{I}V ≡ L2 → ⇩[s, 0, e] K ≡ L2. +#I #K #L2 #V #s #e #H lapply (drop_inv_drop1_lt … H ?) -H // +qed-. + +fact drop_inv_skip1_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → 0 < d → + ∀I,K1,V1. L1 = K1.ⓑ{I}V1 → + ∃∃K2,V2. ⇩[s, d-1, e] K1 ≡ K2 & + ⇧[d-1, e] V2 ≡ V1 & + L2 = K2.ⓑ{I}V2. +#L1 #L2 #s #d #e * -L1 -L2 -d -e +[ #d #e #_ #_ #J #K1 #W1 #H destruct +| #I #L #V #H elim (lt_refl_false … H) +| #I #L1 #L2 #V #e #_ #H elim (lt_refl_false … H) +| #I #L1 #L2 #V1 #V2 #d #e #HL12 #HV21 #_ #J #K1 #W1 #H destruct /2 width=5 by ex3_2_intro/ +] +qed-. + +(* Basic_1: was: drop_gen_skip_l *) +lemma drop_inv_skip1: ∀I,K1,V1,L2,s,d,e. ⇩[s, d, e] K1.ⓑ{I}V1 ≡ L2 → 0 < d → + ∃∃K2,V2. ⇩[s, d-1, e] K1 ≡ K2 & + ⇧[d-1, e] V2 ≡ V1 & + L2 = K2.ⓑ{I}V2. +/2 width=3 by drop_inv_skip1_aux/ qed-. + +lemma drop_inv_O1_pair2: ∀I,K,V,s,e,L1. ⇩[s, 0, e] L1 ≡ K.ⓑ{I}V → + (e = 0 ∧ L1 = K.ⓑ{I}V) ∨ + ∃∃I1,K1,V1. ⇩[s, 0, e-1] K1 ≡ K.ⓑ{I}V & L1 = K1.ⓑ{I1}V1 & 0 < e. +#I #K #V #s #e * +[ #H elim (drop_inv_atom1 … H) -H #H destruct +| #L1 #I1 #V1 #H + elim (drop_inv_O1_pair1 … H) -H * + [ #H1 #H2 destruct /3 width=1 by or_introl, conj/ + | /3 width=5 by ex3_3_intro, or_intror/ + ] +] +qed-. + +fact drop_inv_skip2_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → 0 < d → + ∀I,K2,V2. L2 = K2.ⓑ{I}V2 → + ∃∃K1,V1. ⇩[s, d-1, e] K1 ≡ K2 & + ⇧[d-1, e] V2 ≡ V1 & + L1 = K1.ⓑ{I}V1. +#L1 #L2 #s #d #e * -L1 -L2 -d -e +[ #d #e #_ #_ #J #K2 #W2 #H destruct +| #I #L #V #H elim (lt_refl_false … H) +| #I #L1 #L2 #V #e #_ #H elim (lt_refl_false … H) +| #I #L1 #L2 #V1 #V2 #d #e #HL12 #HV21 #_ #J #K2 #W2 #H destruct /2 width=5 by ex3_2_intro/ +] +qed-. + +(* Basic_1: was: drop_gen_skip_r *) +lemma drop_inv_skip2: ∀I,L1,K2,V2,s,d,e. ⇩[s, d, e] L1 ≡ K2.ⓑ{I}V2 → 0 < d → + ∃∃K1,V1. ⇩[s, d-1, e] K1 ≡ K2 & ⇧[d-1, e] V2 ≡ V1 & + L1 = K1.ⓑ{I}V1. +/2 width=3 by drop_inv_skip2_aux/ qed-. + +lemma drop_inv_O1_gt: ∀L,K,e,s. ⇩[s, 0, e] L ≡ K → |L| < e → + s = Ⓣ ∧ K = ⋆. +#L elim L -L [| #L #Z #X #IHL ] #K #e #s #H normalize in ⊢ (?%?→?); #H1e +[ elim (drop_inv_atom1 … H) -H elim s -s /2 width=1 by conj/ + #_ #Hs lapply (Hs ?) // -Hs #H destruct elim (lt_zero_false … H1e) +| elim (drop_inv_O1_pair1 … H) -H * #H2e #HLK destruct + [ elim (lt_zero_false … H1e) + | elim (IHL … HLK) -IHL -HLK /2 width=1 by lt_plus_to_minus_r, conj/ + ] +] +qed-. + +(* Basic properties *********************************************************) + +lemma drop_refl_atom_O2: ∀s,d. ⇩[s, d, O] ⋆ ≡ ⋆. +/2 width=1 by drop_atom/ qed. + +(* Basic_1: was by definition: drop_refl *) +lemma drop_refl: ∀L,d,s. ⇩[s, d, 0] L ≡ L. +#L elim L -L // +#L #I #V #IHL #d #s @(nat_ind_plus … d) -d /2 width=1 by drop_pair, drop_skip/ +qed. + +lemma drop_drop_lt: ∀I,L1,L2,V,s,e. + ⇩[s, 0, e-1] L1 ≡ L2 → 0 < e → ⇩[s, 0, e] L1.ⓑ{I}V ≡ L2. +#I #L1 #L2 #V #s #e #HL12 #He >(plus_minus_m_m e 1) /2 width=1 by drop_drop/ +qed. + +lemma drop_skip_lt: ∀I,L1,L2,V1,V2,s,d,e. + ⇩[s, d-1, e] L1 ≡ L2 → ⇧[d-1, e] V2 ≡ V1 → 0 < d → + ⇩[s, d, e] L1. ⓑ{I} V1 ≡ L2.ⓑ{I}V2. +#I #L1 #L2 #V1 #V2 #s #d #e #HL12 #HV21 #Hd >(plus_minus_m_m d 1) /2 width=1 by drop_skip/ +qed. + +lemma drop_O1_le: ∀s,e,L. e ≤ |L| → ∃K. ⇩[s, 0, e] L ≡ K. +#s #e @(nat_ind_plus … e) -e /2 width=2 by ex_intro/ +#e #IHe * +[ #H elim (le_plus_xSy_O_false … H) +| #L #I #V normalize #H elim (IHe L) -IHe /3 width=2 by drop_drop, monotonic_pred, ex_intro/ +] +qed-. + +lemma drop_O1_lt: ∀s,L,e. e < |L| → ∃∃I,K,V. ⇩[s, 0, e] L ≡ K.ⓑ{I}V. +#s #L elim L -L +[ #e #H elim (lt_zero_false … H) +| #L #I #V #IHL #e @(nat_ind_plus … e) -e /2 width=4 by drop_pair, ex1_3_intro/ + #e #_ normalize #H elim (IHL e) -IHL /3 width=4 by drop_drop, lt_plus_to_minus_r, lt_plus_to_lt_l, ex1_3_intro/ +] +qed-. + +lemma drop_O1_pair: ∀L,K,e,s. ⇩[s, 0, e] L ≡ K → e ≤ |L| → ∀I,V. + ∃∃J,W. ⇩[s, 0, e] L.ⓑ{I}V ≡ K.ⓑ{J}W. +#L elim L -L [| #L #Z #X #IHL ] #K #e #s #H normalize #He #I #V +[ elim (drop_inv_atom1 … H) -H #H <(le_n_O_to_eq … He) -e + #Hs destruct /2 width=3 by ex1_2_intro/ +| elim (drop_inv_O1_pair1 … H) -H * #He #HLK destruct /2 width=3 by ex1_2_intro/ + elim (IHL … HLK … Z X) -IHL -HLK + /3 width=3 by drop_drop_lt, le_plus_to_minus, ex1_2_intro/ +] +qed-. + +lemma drop_O1_ge: ∀L,e. |L| ≤ e → ⇩[Ⓣ, 0, e] L ≡ ⋆. +#L elim L -L [ #e #_ @drop_atom #H destruct ] +#L #I #V #IHL #e @(nat_ind_plus … e) -e [ #H elim (le_plus_xSy_O_false … H) ] +normalize /4 width=1 by drop_drop, monotonic_pred/ +qed. + +lemma drop_O1_eq: ∀L,s. ⇩[s, 0, |L|] L ≡ ⋆. +#L elim L -L /2 width=1 by drop_drop, drop_atom/ +qed. + +lemma drop_split: ∀L1,L2,d,e2,s. ⇩[s, d, e2] L1 ≡ L2 → ∀e1. e1 ≤ e2 → + ∃∃L. ⇩[s, d, e2 - e1] L1 ≡ L & ⇩[s, d, e1] L ≡ L2. +#L1 #L2 #d #e2 #s #H elim H -L1 -L2 -d -e2 +[ #d #e2 #Hs #e1 #He12 @(ex2_intro … (⋆)) + @drop_atom #H lapply (Hs H) -s #H destruct /2 width=1 by le_n_O_to_eq/ +| #I #L1 #V #e1 #He1 lapply (le_n_O_to_eq … He1) -He1 + #H destruct /2 width=3 by ex2_intro/ +| #I #L1 #L2 #V #e2 #HL12 #IHL12 #e1 @(nat_ind_plus … e1) -e1 + [ /3 width=3 by drop_drop, ex2_intro/ + | -HL12 #e1 #_ #He12 lapply (le_plus_to_le_r … He12) -He12 + #He12 elim (IHL12 … He12) -IHL12 >minus_plus_plus_l + #L #HL1 #HL2 elim (lt_or_ge (|L1|) (e2-e1)) #H0 + [ elim (drop_inv_O1_gt … HL1 H0) -HL1 #H1 #H2 destruct + elim (drop_inv_atom1 … HL2) -HL2 #H #_ destruct + @(ex2_intro … (⋆)) [ @drop_O1_ge normalize // ] + @drop_atom #H destruct + | elim (drop_O1_pair … HL1 H0 I V) -HL1 -H0 /3 width=5 by drop_drop, ex2_intro/ + ] + ] +| #I #L1 #L2 #V1 #V2 #d #e2 #_ #HV21 #IHL12 #e1 #He12 elim (IHL12 … He12) -IHL12 + #L #HL1 #HL2 elim (lift_split … HV21 d e1) -HV21 /3 width=5 by drop_skip, ex2_intro/ +] +qed-. + +lemma drop_FT: ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ L2 → ⇩[Ⓣ, d, e] L1 ≡ L2. +#L1 #L2 #d #e #H elim H -L1 -L2 -d -e +/3 width=1 by drop_atom, drop_drop, drop_skip/ +qed. + +lemma drop_gen: ∀L1,L2,s,d,e. ⇩[Ⓕ, d, e] L1 ≡ L2 → ⇩[s, d, e] L1 ≡ L2. +#L1 #L2 * /2 width=1 by drop_FT/ +qed-. + +lemma drop_T: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → ⇩[Ⓣ, d, e] L1 ≡ L2. +#L1 #L2 * /2 width=1 by drop_FT/ +qed-. + +lemma l_liftable_LTC: ∀R. l_liftable R → l_liftable (LTC … R). +#R #HR #K #T1 #T2 #H elim H -T2 +[ /3 width=10 by inj/ +| #T #T2 #_ #HT2 #IHT1 #L #s #d #e #HLK #U1 #HTU1 #U2 #HTU2 + elim (lift_total T d e) /4 width=12 by step/ +] +qed-. + +lemma l_deliftable_sn_LTC: ∀R. l_deliftable_sn R → l_deliftable_sn (LTC … R). +#R #HR #L #U1 #U2 #H elim H -U2 +[ #U2 #HU12 #K #s #d #e #HLK #T1 #HTU1 + elim (HR … HU12 … HLK … HTU1) -HR -L -U1 /3 width=3 by inj, ex2_intro/ +| #U #U2 #_ #HU2 #IHU1 #K #s #d #e #HLK #T1 #HTU1 + elim (IHU1 … HLK … HTU1) -IHU1 -U1 #T #HTU #HT1 + elim (HR … HU2 … HLK … HTU) -HR -L -U /3 width=5 by step, ex2_intro/ +] +qed-. + +lemma dropable_sn_TC: ∀R. dropable_sn R → dropable_sn (TC … R). +#R #HR #L1 #K1 #s #d #e #HLK1 #L2 #H elim H -L2 +[ #L2 #HL12 elim (HR … HLK1 … HL12) -HR -L1 + /3 width=3 by inj, ex2_intro/ +| #L #L2 #_ #HL2 * #K #HK1 #HLK elim (HR … HLK … HL2) -HR -L + /3 width=3 by step, ex2_intro/ +] +qed-. + +lemma dropable_dx_TC: ∀R. dropable_dx R → dropable_dx (TC … R). +#R #HR #L1 #L2 #H elim H -L2 +[ #L2 #HL12 #K2 #s #e #HLK2 elim (HR … HL12 … HLK2) -HR -L2 + /3 width=3 by inj, ex2_intro/ +| #L #L2 #_ #HL2 #IHL1 #K2 #s #e #HLK2 elim (HR … HL2 … HLK2) -HR -L2 + #K #HLK #HK2 elim (IHL1 … HLK) -L + /3 width=5 by step, ex2_intro/ +] +qed-. + +lemma l_deliftable_sn_llstar: ∀R. l_deliftable_sn R → + ∀l. l_deliftable_sn (llstar … R l). +#R #HR #l #L #U1 #U2 #H @(lstar_ind_r … l U2 H) -l -U2 +[ /2 width=3 by lstar_O, ex2_intro/ +| #l #U #U2 #_ #HU2 #IHU1 #K #s #d #e #HLK #T1 #HTU1 + elim (IHU1 … HLK … HTU1) -IHU1 -U1 #T #HTU #HT1 + elim (HR … HU2 … HLK … HTU) -HR -L -U /3 width=5 by lstar_dx, ex2_intro/ +] +qed-. + +(* Basic forvard lemmas *****************************************************) + +(* Basic_1: was: drop_S *) +lemma drop_fwd_drop2: ∀L1,I2,K2,V2,s,e. ⇩[s, O, e] L1 ≡ K2. ⓑ{I2} V2 → + ⇩[s, O, e + 1] L1 ≡ K2. +#L1 elim L1 -L1 +[ #I2 #K2 #V2 #s #e #H lapply (drop_inv_atom1 … H) -H * #H destruct +| #K1 #I1 #V1 #IHL1 #I2 #K2 #V2 #s #e #H + elim (drop_inv_O1_pair1 … H) -H * #He #H + [ -IHL1 destruct /2 width=1 by drop_drop/ + | @drop_drop >(plus_minus_m_m e 1) /2 width=3 by/ + ] +] +qed-. + +lemma drop_fwd_length_ge: ∀L1,L2,d,e,s. ⇩[s, d, e] L1 ≡ L2 → |L1| ≤ d → |L2| = |L1|. +#L1 #L2 #d #e #s #H elim H -L1 -L2 -d -e // normalize +[ #I #L1 #L2 #V #e #_ #_ #H elim (le_plus_xSy_O_false … H) +| /4 width=2 by le_plus_to_le_r, eq_f/ +] +qed-. + +lemma drop_fwd_length_le_le: ∀L1,L2,d,e,s. ⇩[s, d, e] L1 ≡ L2 → d ≤ |L1| → e ≤ |L1| - d → |L2| = |L1| - e. +#L1 #L2 #d #e #s #H elim H -L1 -L2 -d -e // normalize +[ /3 width=2 by le_plus_to_le_r/ +| #I #L1 #L2 #V1 #V2 #d #e #_ #_ #IHL12 >minus_plus_plus_l + #Hd #He lapply (le_plus_to_le_r … Hd) -Hd + #Hd >IHL12 // -L2 >plus_minus /2 width=3 by transitive_le/ +] +qed-. + +lemma drop_fwd_length_le_ge: ∀L1,L2,d,e,s. ⇩[s, d, e] L1 ≡ L2 → d ≤ |L1| → |L1| - d ≤ e → |L2| = d. +#L1 #L2 #d #e #s #H elim H -L1 -L2 -d -e normalize +[ /2 width=1 by le_n_O_to_eq/ +| #I #L #V #_ (lift_fwd_tw … HV21) -HV21 /2 width=1 by monotonic_le_plus_l/ +] +qed-. + +lemma drop_fwd_lw_lt: ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ L2 → 0 < e → ♯{L2} < ♯{L1}. +#L1 #L2 #d #e #H elim H -L1 -L2 -d -e +[ #d #e #H >H -H // +| #I #L #V #H elim (lt_refl_false … H) +| #I #L1 #L2 #V #e #HL12 #_ #_ + lapply (drop_fwd_lw … HL12) -HL12 #HL12 + @(le_to_lt_to_lt … HL12) -HL12 // +| #I #L1 #L2 #V1 #V2 #d #e #_ #HV21 #IHL12 #H normalize in ⊢ (?%%); -I + >(lift_fwd_tw … HV21) -V2 /3 by lt_minus_to_plus/ +] +qed-. + +lemma drop_fwd_rfw: ∀I,L,K,V,i. ⇩[i] L ≡ K.ⓑ{I}V → ∀T. ♯{K, V} < ♯{L, T}. +#I #L #K #V #i #HLK lapply (drop_fwd_lw … HLK) -HLK +normalize in ⊢ (%→?→?%%); /3 width=3 by le_to_lt_to_lt/ +qed-. + +(* Advanced inversion lemmas ************************************************) + +fact drop_inv_O2_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → e = 0 → L1 = L2. +#L1 #L2 #s #d #e #H elim H -L1 -L2 -d -e +[ // +| // +| #I #L1 #L2 #V #e #_ #_ >commutative_plus normalize #H destruct +| #I #L1 #L2 #V1 #V2 #d #e #_ #HV21 #IHL12 #H + >(IHL12 H) -L1 >(lift_inv_O2_aux … HV21 … H) -V2 -d -e // +] +qed-. + +(* Basic_1: was: drop_gen_refl *) +lemma drop_inv_O2: ∀L1,L2,s,d. ⇩[s, d, 0] L1 ≡ L2 → L1 = L2. +/2 width=5 by drop_inv_O2_aux/ qed-. + +lemma drop_inv_length_eq: ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ L2 → |L1| = |L2| → e = 0. +#L1 #L2 #d #e #H #HL12 lapply (drop_fwd_length_minus4 … H) // +qed-. + +lemma drop_inv_refl: ∀L,d,e. ⇩[Ⓕ, d, e] L ≡ L → e = 0. +/2 width=5 by drop_inv_length_eq/ qed-. + +fact drop_inv_FT_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → + ∀I,K,V. L2 = K.ⓑ{I}V → s = Ⓣ → d = 0 → + ⇩[Ⓕ, d, e] L1 ≡ K.ⓑ{I}V. +#L1 #L2 #s #d #e #H elim H -L1 -L2 -d -e +[ #d #e #_ #J #K #W #H destruct +| #I #L #V #J #K #W #H destruct // +| #I #L1 #L2 #V #e #_ #IHL12 #J #K #W #H1 #H2 destruct + /3 width=1 by drop_drop/ +| #I #L1 #L2 #V1 #V2 #d #e #_ #_ #_ #J #K #W #_ #_ + commutative_plus normalize #H destruct +| minus_minus_comm /3 width=1 by monotonic_pred/ +] +qed-. + +lemma drop_O1_inv_append1_le: ∀K,L1,L2,s,e. ⇩[s, 0, e] L1 @@ L2 ≡ K → e ≤ |L2| → + ∀K2. ⇩[s, 0, e] L2 ≡ K2 → K = L1 @@ K2. +#K #L1 #L2 elim L2 -L2 normalize +[ #s #e #H1 #H2 #K2 #H3 lapply (le_n_O_to_eq … H2) -H2 + #H2 elim (drop_inv_atom1 … H3) -H3 #H3 #_ destruct + >(drop_inv_O2 … H1) -H1 // +| #L2 #I #V #IHL2 #s #e @(nat_ind_plus … e) -e [ -IHL2 ] + [ #H1 #_ #K2 #H2 + lapply (drop_inv_O2 … H1) -H1 #H1 + lapply (drop_inv_O2 … H2) -H2 #H2 destruct // + | /4 width=7 by drop_inv_drop1, le_plus_to_le_r/ + ] +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/drop_drop.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/drop_drop.ma new file mode 100644 index 000000000..bfc54b072 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/substitution/drop_drop.ma @@ -0,0 +1,208 @@ +(**************************************************************************) +(* ___ *) +(* ||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/substitution/lift_lift.ma". +include "basic_2/substitution/drop.ma". + +(* BASIC SLICING FOR LOCAL ENVIRONMENTS *************************************) + +(* Main properties **********************************************************) + +(* Basic_1: was: drop_mono *) +theorem drop_mono: ∀L,L1,s1,d,e. ⇩[s1, d, e] L ≡ L1 → + ∀L2,s2. ⇩[s2, d, e] L ≡ L2 → L1 = L2. +#L #L1 #s1 #d #e #H elim H -L -L1 -d -e +[ #d #e #He #L2 #s2 #H elim (drop_inv_atom1 … H) -H // +| #I #K #V #L2 #s2 #HL12 <(drop_inv_O2 … HL12) -L2 // +| #I #L #K #V #e #_ #IHLK #L2 #s2 #H + lapply (drop_inv_drop1 … H) -H /2 width=2 by/ +| #I #L #K1 #T #V1 #d #e #_ #HVT1 #IHLK1 #X #s2 #H + elim (drop_inv_skip1 … H) -H // (lift_inj … HVT1 … HVT2) -HVT1 -HVT2 + >(IHLK1 … HLK2) -IHLK1 -HLK2 // +] +qed-. + +(* Basic_1: was: drop_conf_ge *) +theorem drop_conf_ge: ∀L,L1,s1,d1,e1. ⇩[s1, d1, e1] L ≡ L1 → + ∀L2,s2,e2. ⇩[s2, 0, e2] L ≡ L2 → d1 + e1 ≤ e2 → + ⇩[s2, 0, e2 - e1] L1 ≡ L2. +#L #L1 #s1 #d1 #e1 #H elim H -L -L1 -d1 -e1 // +[ #d #e #_ #L2 #s2 #e2 #H #_ elim (drop_inv_atom1 … H) -H + #H #He destruct + @drop_atom #H >He // (**) (* explicit constructor *) +| #I #L #K #V #e #_ #IHLK #L2 #s2 #e2 #H #He2 + lapply (drop_inv_drop1_lt … H ?) -H /2 width=2 by ltn_to_ltO/ #HL2 + minus_minus_comm /3 width=1 by monotonic_pred/ +| #I #L #K #V1 #V2 #d #e #_ #_ #IHLK #L2 #s2 #e2 #H #Hdee2 + lapply (transitive_le 1 … Hdee2) // #He2 + lapply (drop_inv_drop1_lt … H ?) -H // -He2 #HL2 + lapply (transitive_le (1+e) … Hdee2) // #Hee2 + @drop_drop_lt >minus_minus_comm /3 width=1 by lt_minus_to_plus_r, monotonic_le_minus_r, monotonic_pred/ (**) (* explicit constructor *) +] +qed. + +(* Note: apparently this was missing in basic_1 *) +theorem drop_conf_be: ∀L0,L1,s1,d1,e1. ⇩[s1, d1, e1] L0 ≡ L1 → + ∀L2,e2. ⇩[e2] L0 ≡ L2 → d1 ≤ e2 → e2 ≤ d1 + e1 → + ∃∃L. ⇩[s1, 0, d1 + e1 - e2] L2 ≡ L & ⇩[d1] L1 ≡ L. +#L0 #L1 #s1 #d1 #e1 #H elim H -L0 -L1 -d1 -e1 +[ #d1 #e1 #He1 #L2 #e2 #H #Hd1 #_ elim (drop_inv_atom1 … H) -H #H #He2 destruct + >(He2 ?) in Hd1; // -He2 #Hd1 <(le_n_O_to_eq … Hd1) -d1 + /4 width=3 by drop_atom, ex2_intro/ +| normalize #I #L #V #L2 #e2 #HL2 #_ #He2 + lapply (le_n_O_to_eq … He2) -He2 #H destruct + lapply (drop_inv_O2 … HL2) -HL2 #H destruct /2 width=3 by drop_pair, ex2_intro/ +| normalize #I #L0 #K0 #V1 #e1 #HLK0 #IHLK0 #L2 #e2 #H #_ #He21 + lapply (drop_inv_O1_pair1 … H) -H * * #He2 #HL20 + [ -IHLK0 -He21 destruct plus_plus_comm_23 #_ #_ #IHLK0 #L2 #e2 #H #Hd1e2 #He2de1 + elim (le_inv_plus_l … Hd1e2) #_ #He2 + minus_le_minus_minus_comm /3 width=3 by drop_drop_lt, ex2_intro/ + ] +] +qed-. + +(* Note: with "s2", the conclusion parameter is "s1 ∨ s2" *) +(* Basic_1: was: drop_trans_ge *) +theorem drop_trans_ge: ∀L1,L,s1,d1,e1. ⇩[s1, d1, e1] L1 ≡ L → + ∀L2,e2. ⇩[e2] L ≡ L2 → d1 ≤ e2 → ⇩[s1, 0, e1 + e2] L1 ≡ L2. +#L1 #L #s1 #d1 #e1 #H elim H -L1 -L -d1 -e1 +[ #d1 #e1 #He1 #L2 #e2 #H #_ elim (drop_inv_atom1 … H) -H + #H #He2 destruct /4 width=1 by drop_atom, eq_f2/ +| /2 width=1 by drop_gen/ +| /3 width=1 by drop_drop/ +| #I #L1 #L2 #V1 #V2 #d #e #_ #_ #IHL12 #L #e2 #H #Hde2 + lapply (lt_to_le_to_lt 0 … Hde2) // #He2 + lapply (lt_to_le_to_lt … (e + e2) He2 ?) // #Hee2 + lapply (drop_inv_drop1_lt … H ?) -H // #HL2 + @drop_drop_lt // >le_plus_minus /3 width=1 by monotonic_pred/ +] +qed. + +(* Basic_1: was: drop_trans_le *) +theorem drop_trans_le: ∀L1,L,s1,d1,e1. ⇩[s1, d1, e1] L1 ≡ L → + ∀L2,s2,e2. ⇩[s2, 0, e2] L ≡ L2 → e2 ≤ d1 → + ∃∃L0. ⇩[s2, 0, e2] L1 ≡ L0 & ⇩[s1, d1 - e2, e1] L0 ≡ L2. +#L1 #L #s1 #d1 #e1 #H elim H -L1 -L -d1 -e1 +[ #d1 #e1 #He1 #L2 #s2 #e2 #H #_ elim (drop_inv_atom1 … H) -H + #H #He2 destruct /4 width=3 by drop_atom, ex2_intro/ +| #I #K #V #L2 #s2 #e2 #HL2 #H lapply (le_n_O_to_eq … H) -H + #H destruct /2 width=3 by drop_pair, ex2_intro/ +| #I #L1 #L2 #V #e #_ #IHL12 #L #s2 #e2 #HL2 #H lapply (le_n_O_to_eq … H) -H + #H destruct elim (IHL12 … HL2) -IHL12 -HL2 // + #L0 #H #HL0 lapply (drop_inv_O2 … H) -H #H destruct + /3 width=5 by drop_pair, drop_drop, ex2_intro/ +| #I #L1 #L2 #V1 #V2 #d #e #HL12 #HV12 #IHL12 #L #s2 #e2 #H #He2d + elim (drop_inv_O1_pair1 … H) -H * + [ -He2d -IHL12 #H1 #H2 destruct /3 width=5 by drop_pair, drop_skip, ex2_intro/ + | -HL12 -HV12 #He2 #HL2 + elim (IHL12 … HL2) -L2 [ >minus_le_minus_minus_comm // /3 width=3 by drop_drop_lt, ex2_intro/ | /2 width=1 by monotonic_pred/ ] + ] +] +qed-. + +(* Advanced properties ******************************************************) + +lemma l_liftable_llstar: ∀R. l_liftable R → ∀l. l_liftable (llstar … R l). +#R #HR #l #K #T1 #T2 #H @(lstar_ind_r … l T2 H) -l -T2 +[ #L #s #d #e #_ #U1 #HTU1 #U2 #HTU2 -HR -K + >(lift_mono … HTU2 … HTU1) -T1 -U2 -d -e // +| #l #T #T2 #_ #HT2 #IHT1 #L #s #d #e #HLK #U1 #HTU1 #U2 #HTU2 + elim (lift_total T d e) /3 width=12 by lstar_dx/ +] +qed-. + +(* Basic_1: was: drop_conf_lt *) +lemma drop_conf_lt: ∀L,L1,s1,d1,e1. ⇩[s1, d1, e1] L ≡ L1 → + ∀I,K2,V2,s2,e2. ⇩[s2, 0, e2] L ≡ K2.ⓑ{I}V2 → + e2 < d1 → let d ≝ d1 - e2 - 1 in + ∃∃K1,V1. ⇩[s2, 0, e2] L1 ≡ K1.ⓑ{I}V1 & + ⇩[s1, d, e1] K2 ≡ K1 & ⇧[d, e1] V1 ≡ V2. +#L #L1 #s1 #d1 #e1 #H1 #I #K2 #V2 #s2 #e2 #H2 #He2d1 +elim (drop_conf_le … H1 … H2) -L /2 width=2 by lt_to_le/ #K #HL1K #HK2 +elim (drop_inv_skip1 … HK2) -HK2 /2 width=1 by lt_plus_to_minus_r/ +#K1 #V1 #HK21 #HV12 #H destruct /2 width=5 by ex3_2_intro/ +qed-. + +(* Note: apparently this was missing in basic_1 *) +lemma drop_trans_lt: ∀L1,L,s1,d1,e1. ⇩[s1, d1, e1] L1 ≡ L → + ∀I,L2,V2,s2,e2. ⇩[s2, 0, e2] L ≡ L2.ⓑ{I}V2 → + e2 < d1 → let d ≝ d1 - e2 - 1 in + ∃∃L0,V0. ⇩[s2, 0, e2] L1 ≡ L0.ⓑ{I}V0 & + ⇩[s1, d, e1] L0 ≡ L2 & ⇧[d, e1] V2 ≡ V0. +#L1 #L #s1 #d1 #e1 #HL1 #I #L2 #V2 #s2 #e2 #HL2 #Hd21 +elim (drop_trans_le … HL1 … HL2) -L /2 width=1 by lt_to_le/ #L0 #HL10 #HL02 +elim (drop_inv_skip2 … HL02) -HL02 /2 width=1 by lt_plus_to_minus_r/ #L #V1 #HL2 #HV21 #H destruct /2 width=5 by ex3_2_intro/ +qed-. + +lemma drop_trans_ge_comm: ∀L1,L,L2,s1,d1,e1,e2. + ⇩[s1, d1, e1] L1 ≡ L → ⇩[e2] L ≡ L2 → d1 ≤ e2 → + ⇩[s1, 0, e2 + e1] L1 ≡ L2. +#L1 #L #L2 #s1 #d1 #e1 #e2 +>commutative_plus /2 width=5 by drop_trans_ge/ +qed. + +lemma drop_conf_div: ∀I1,L,K,V1,e1. ⇩[e1] L ≡ K.ⓑ{I1}V1 → + ∀I2,V2,e2. ⇩[e2] L ≡ K.ⓑ{I2}V2 → + ∧∧ e1 = e2 & I1 = I2 & V1 = V2. +#I1 #L #K #V1 #e1 #HLK1 #I2 #V2 #e2 #HLK2 +elim (le_or_ge e1 e2) #He +[ lapply (drop_conf_ge … HLK1 … HLK2 ?) +| lapply (drop_conf_ge … HLK2 … HLK1 ?) +] -HLK1 -HLK2 // #HK +lapply (drop_fwd_length_minus2 … HK) #H +elim (discr_minus_x_xy … H) -H +[1,3: normalize H in HK; #HK +lapply (drop_inv_O2 … HK) -HK #H destruct +lapply (inv_eq_minus_O … H) -H /3 width=1 by le_to_le_to_eq, and3_intro/ +qed-. + +(* Advanced forward lemmas **************************************************) + +lemma drop_fwd_be: ∀L,K,s,d,e,i. ⇩[s, d, e] L ≡ K → |K| ≤ i → i < d → |L| ≤ i. +#L #K #s #d #e #i #HLK #HK #Hd elim (lt_or_ge i (|L|)) // +#HL elim (drop_O1_lt (Ⓕ) … HL) #I #K0 #V #HLK0 -HL +elim (drop_conf_lt … HLK … HLK0) // -HLK -HLK0 -Hd +#K1 #V1 #HK1 #_ #_ lapply (drop_fwd_length_lt2 … HK1) -I -K1 -V1 +#H elim (lt_refl_false i) /2 width=3 by lt_to_le_to_lt/ +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/drop_leq.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/drop_leq.ma new file mode 100644 index 000000000..98c5f48fd --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/substitution/drop_leq.ma @@ -0,0 +1,92 @@ +(**************************************************************************) +(* ___ *) +(* ||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/grammar/leq_leq.ma". +include "basic_2/substitution/drop.ma". + +(* BASIC SLICING FOR LOCAL ENVIRONMENTS *************************************) + +definition dedropable_sn: predicate (relation lenv) ≝ + λR. ∀L1,K1,s,d,e. ⇩[s, d, e] L1 ≡ K1 → ∀K2. R K1 K2 → + ∃∃L2. R L1 L2 & ⇩[s, d, e] L2 ≡ K2 & L1 ⩬[d, e] L2. + +(* Properties on equivalence ************************************************) + +lemma leq_drop_trans_be: ∀L1,L2,d,e. L1 ⩬[d, e] L2 → + ∀I,K2,W,s,i. ⇩[s, 0, i] L2 ≡ K2.ⓑ{I}W → + d ≤ i → i < d + e → + ∃∃K1. K1 ⩬[0, ⫰(d+e-i)] K2 & ⇩[s, 0, i] L1 ≡ K1.ⓑ{I}W. +#L1 #L2 #d #e #H elim H -L1 -L2 -d -e +[ #d #e #J #K2 #W #s #i #H + elim (drop_inv_atom1 … H) -H #H destruct +| #I1 #I2 #L1 #L2 #V1 #V2 #_ #_ #J #K2 #W #s #i #_ #_ #H + elim (ylt_yle_false … H) // +| #I #L1 #L2 #V #e #HL12 #IHL12 #J #K2 #W #s #i #H #_ >yplus_O1 + elim (drop_inv_O1_pair1 … H) -H * #Hi #HLK1 [ -IHL12 | -HL12 ] + [ #_ destruct >ypred_succ + /2 width=3 by drop_pair, ex2_intro/ + | lapply (ylt_inv_O1 i ?) /2 width=1 by ylt_inj/ + #H yminus_succ yplus_succ1 #H lapply (ylt_inv_succ … H) -H + #Hide lapply (drop_inv_drop1_lt … HLK2 ?) -HLK2 /2 width=1 by ylt_O/ + #HLK1 elim (IHL12 … HLK1) -IHL12 -HLK1 yminus_SO2 + /4 width=3 by ylt_O, drop_drop_lt, ex2_intro/ +] +qed-. + +lemma leq_drop_conf_be: ∀L1,L2,d,e. L1 ⩬[d, e] L2 → + ∀I,K1,W,s,i. ⇩[s, 0, i] L1 ≡ K1.ⓑ{I}W → + d ≤ i → i < d + e → + ∃∃K2. K1 ⩬[0, ⫰(d+e-i)] K2 & ⇩[s, 0, i] L2 ≡ K2.ⓑ{I}W. +#L1 #L2 #d #e #HL12 #I #K1 #W #s #i #HLK1 #Hdi #Hide +elim (leq_drop_trans_be … (leq_sym … HL12) … HLK1) // -L1 -Hdi -Hide +/3 width=3 by leq_sym, ex2_intro/ +qed-. + +lemma drop_O1_ex: ∀K2,i,L1. |L1| = |K2| + i → + ∃∃L2. L1 ⩬[0, i] L2 & ⇩[i] L2 ≡ K2. +#K2 #i @(nat_ind_plus … i) -i +[ /3 width=3 by leq_O2, ex2_intro/ +| #i #IHi #Y #Hi elim (drop_O1_lt (Ⓕ) Y 0) // + #I #L1 #V #H lapply (drop_inv_O2 … H) -H #H destruct + normalize in Hi; elim (IHi L1) -IHi + /3 width=5 by drop_drop, leq_pair, injective_plus_l, ex2_intro/ +] +qed-. + +lemma dedropable_sn_TC: ∀R. dedropable_sn R → dedropable_sn (TC … R). +#R #HR #L1 #K1 #s #d #e #HLK1 #K2 #H elim H -K2 +[ #K2 #HK12 elim (HR … HLK1 … HK12) -HR -K1 + /3 width=4 by inj, ex3_intro/ +| #K #K2 #_ #HK2 * #L #H1L1 #HLK #H2L1 elim (HR … HLK … HK2) -HR -K + /3 width=6 by leq_trans, step, ex3_intro/ +] +qed-. + +(* Inversion lemmas on equivalence ******************************************) + +lemma drop_O1_inj: ∀i,L1,L2,K. ⇩[i] L1 ≡ K → ⇩[i] L2 ≡ K → L1 ⩬[i, ∞] L2. +#i @(nat_ind_plus … i) -i +[ #L1 #L2 #K #H <(drop_inv_O2 … H) -K #H <(drop_inv_O2 … H) -L1 // +| #i #IHi * [2: #L1 #I1 #V1 ] * [2,4: #L2 #I2 #V2 ] #K #HLK1 #HLK2 // + lapply (drop_fwd_length … HLK1) + <(drop_fwd_length … HLK2) [ /4 width=5 by drop_inv_drop1, leq_succ/ ] + normalize (ldrop_inv_O2 … HLK) -L >(lift_inv_O2 … HTU) -T // +>(drop_inv_O2 … HLK) -L >(lift_inv_O2 … HTU) -T // qed. (* Main properties **********************************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop.ma deleted file mode 100644 index c8b2b11f2..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop.ma +++ /dev/null @@ -1,494 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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 "ground_2/lib/bool.ma". -include "ground_2/lib/lstar.ma". -include "basic_2/notation/relations/rdrop_5.ma". -include "basic_2/notation/relations/rdrop_4.ma". -include "basic_2/notation/relations/rdrop_3.ma". -include "basic_2/grammar/lenv_length.ma". -include "basic_2/grammar/cl_restricted_weight.ma". -include "basic_2/substitution/lift.ma". - -(* BASIC SLICING FOR LOCAL ENVIRONMENTS *************************************) - -(* Basic_1: includes: drop_skip_bind *) -inductive ldrop (s:bool): relation4 nat nat lenv lenv ≝ -| ldrop_atom: ∀d,e. (s = Ⓕ → e = 0) → ldrop s d e (⋆) (⋆) -| ldrop_pair: ∀I,L,V. ldrop s 0 0 (L.ⓑ{I}V) (L.ⓑ{I}V) -| ldrop_drop: ∀I,L1,L2,V,e. ldrop s 0 e L1 L2 → ldrop s 0 (e+1) (L1.ⓑ{I}V) L2 -| ldrop_skip: ∀I,L1,L2,V1,V2,d,e. - ldrop s d e L1 L2 → ⇧[d, e] V2 ≡ V1 → - ldrop s (d+1) e (L1.ⓑ{I}V1) (L2.ⓑ{I}V2) -. - -interpretation - "basic slicing (local environment) abstract" - 'RDrop s d e L1 L2 = (ldrop s d e L1 L2). -(* -interpretation - "basic slicing (local environment) general" - 'RDrop d e L1 L2 = (ldrop true d e L1 L2). -*) -interpretation - "basic slicing (local environment) lget" - 'RDrop e L1 L2 = (ldrop false O e L1 L2). - -definition l_liftable: predicate (lenv → relation term) ≝ - λR. ∀K,T1,T2. R K T1 T2 → ∀L,s,d,e. ⇩[s, d, e] L ≡ K → - ∀U1. ⇧[d, e] T1 ≡ U1 → ∀U2. ⇧[d, e] T2 ≡ U2 → R L U1 U2. - -definition l_deliftable_sn: predicate (lenv → relation term) ≝ - λR. ∀L,U1,U2. R L U1 U2 → ∀K,s,d,e. ⇩[s, d, e] L ≡ K → - ∀T1. ⇧[d, e] T1 ≡ U1 → - ∃∃T2. ⇧[d, e] T2 ≡ U2 & R K T1 T2. - -definition dropable_sn: predicate (relation lenv) ≝ - λR. ∀L1,K1,s,d,e. ⇩[s, d, e] L1 ≡ K1 → ∀L2. R L1 L2 → - ∃∃K2. R K1 K2 & ⇩[s, d, e] L2 ≡ K2. - -definition dropable_dx: predicate (relation lenv) ≝ - λR. ∀L1,L2. R L1 L2 → ∀K2,s,e. ⇩[s, 0, e] L2 ≡ K2 → - ∃∃K1. ⇩[s, 0, e] L1 ≡ K1 & R K1 K2. - -(* Basic inversion lemmas ***************************************************) - -fact ldrop_inv_atom1_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → L1 = ⋆ → - L2 = ⋆ ∧ (s = Ⓕ → e = 0). -#L1 #L2 #s #d #e * -L1 -L2 -d -e -[ /3 width=1 by conj/ -| #I #L #V #H destruct -| #I #L1 #L2 #V #e #_ #H destruct -| #I #L1 #L2 #V1 #V2 #d #e #_ #_ #H destruct -] -qed-. - -(* Basic_1: was: drop_gen_sort *) -lemma ldrop_inv_atom1: ∀L2,s,d,e. ⇩[s, d, e] ⋆ ≡ L2 → L2 = ⋆ ∧ (s = Ⓕ → e = 0). -/2 width=4 by ldrop_inv_atom1_aux/ qed-. - -fact ldrop_inv_O1_pair1_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → d = 0 → - ∀K,I,V. L1 = K.ⓑ{I}V → - (e = 0 ∧ L2 = K.ⓑ{I}V) ∨ - (0 < e ∧ ⇩[s, d, e-1] K ≡ L2). -#L1 #L2 #s #d #e * -L1 -L2 -d -e -[ #d #e #_ #_ #K #J #W #H destruct -| #I #L #V #_ #K #J #W #HX destruct /3 width=1 by or_introl, conj/ -| #I #L1 #L2 #V #e #HL12 #_ #K #J #W #H destruct /3 width=1 by or_intror, conj/ -| #I #L1 #L2 #V1 #V2 #d #e #_ #_ >commutative_plus normalize #H destruct -] -qed-. - -lemma ldrop_inv_O1_pair1: ∀I,K,L2,V,s,e. ⇩[s, 0, e] K. ⓑ{I} V ≡ L2 → - (e = 0 ∧ L2 = K.ⓑ{I}V) ∨ - (0 < e ∧ ⇩[s, 0, e-1] K ≡ L2). -/2 width=3 by ldrop_inv_O1_pair1_aux/ qed-. - -lemma ldrop_inv_pair1: ∀I,K,L2,V,s. ⇩[s, 0, 0] K.ⓑ{I}V ≡ L2 → L2 = K.ⓑ{I}V. -#I #K #L2 #V #s #H -elim (ldrop_inv_O1_pair1 … H) -H * // #H destruct -elim (lt_refl_false … H) -qed-. - -(* Basic_1: was: drop_gen_drop *) -lemma ldrop_inv_drop1_lt: ∀I,K,L2,V,s,e. - ⇩[s, 0, e] K.ⓑ{I}V ≡ L2 → 0 < e → ⇩[s, 0, e-1] K ≡ L2. -#I #K #L2 #V #s #e #H #He -elim (ldrop_inv_O1_pair1 … H) -H * // #H destruct -elim (lt_refl_false … He) -qed-. - -lemma ldrop_inv_drop1: ∀I,K,L2,V,s,e. - ⇩[s, 0, e+1] K.ⓑ{I}V ≡ L2 → ⇩[s, 0, e] K ≡ L2. -#I #K #L2 #V #s #e #H lapply (ldrop_inv_drop1_lt … H ?) -H // -qed-. - -fact ldrop_inv_skip1_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → 0 < d → - ∀I,K1,V1. L1 = K1.ⓑ{I}V1 → - ∃∃K2,V2. ⇩[s, d-1, e] K1 ≡ K2 & - ⇧[d-1, e] V2 ≡ V1 & - L2 = K2.ⓑ{I}V2. -#L1 #L2 #s #d #e * -L1 -L2 -d -e -[ #d #e #_ #_ #J #K1 #W1 #H destruct -| #I #L #V #H elim (lt_refl_false … H) -| #I #L1 #L2 #V #e #_ #H elim (lt_refl_false … H) -| #I #L1 #L2 #V1 #V2 #d #e #HL12 #HV21 #_ #J #K1 #W1 #H destruct /2 width=5 by ex3_2_intro/ -] -qed-. - -(* Basic_1: was: drop_gen_skip_l *) -lemma ldrop_inv_skip1: ∀I,K1,V1,L2,s,d,e. ⇩[s, d, e] K1.ⓑ{I}V1 ≡ L2 → 0 < d → - ∃∃K2,V2. ⇩[s, d-1, e] K1 ≡ K2 & - ⇧[d-1, e] V2 ≡ V1 & - L2 = K2.ⓑ{I}V2. -/2 width=3 by ldrop_inv_skip1_aux/ qed-. - -lemma ldrop_inv_O1_pair2: ∀I,K,V,s,e,L1. ⇩[s, 0, e] L1 ≡ K.ⓑ{I}V → - (e = 0 ∧ L1 = K.ⓑ{I}V) ∨ - ∃∃I1,K1,V1. ⇩[s, 0, e-1] K1 ≡ K.ⓑ{I}V & L1 = K1.ⓑ{I1}V1 & 0 < e. -#I #K #V #s #e * -[ #H elim (ldrop_inv_atom1 … H) -H #H destruct -| #L1 #I1 #V1 #H - elim (ldrop_inv_O1_pair1 … H) -H * - [ #H1 #H2 destruct /3 width=1 by or_introl, conj/ - | /3 width=5 by ex3_3_intro, or_intror/ - ] -] -qed-. - -fact ldrop_inv_skip2_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → 0 < d → - ∀I,K2,V2. L2 = K2.ⓑ{I}V2 → - ∃∃K1,V1. ⇩[s, d-1, e] K1 ≡ K2 & - ⇧[d-1, e] V2 ≡ V1 & - L1 = K1.ⓑ{I}V1. -#L1 #L2 #s #d #e * -L1 -L2 -d -e -[ #d #e #_ #_ #J #K2 #W2 #H destruct -| #I #L #V #H elim (lt_refl_false … H) -| #I #L1 #L2 #V #e #_ #H elim (lt_refl_false … H) -| #I #L1 #L2 #V1 #V2 #d #e #HL12 #HV21 #_ #J #K2 #W2 #H destruct /2 width=5 by ex3_2_intro/ -] -qed-. - -(* Basic_1: was: drop_gen_skip_r *) -lemma ldrop_inv_skip2: ∀I,L1,K2,V2,s,d,e. ⇩[s, d, e] L1 ≡ K2.ⓑ{I}V2 → 0 < d → - ∃∃K1,V1. ⇩[s, d-1, e] K1 ≡ K2 & ⇧[d-1, e] V2 ≡ V1 & - L1 = K1.ⓑ{I}V1. -/2 width=3 by ldrop_inv_skip2_aux/ qed-. - -lemma ldrop_inv_O1_gt: ∀L,K,e,s. ⇩[s, 0, e] L ≡ K → |L| < e → - s = Ⓣ ∧ K = ⋆. -#L elim L -L [| #L #Z #X #IHL ] #K #e #s #H normalize in ⊢ (?%?→?); #H1e -[ elim (ldrop_inv_atom1 … H) -H elim s -s /2 width=1 by conj/ - #_ #Hs lapply (Hs ?) // -Hs #H destruct elim (lt_zero_false … H1e) -| elim (ldrop_inv_O1_pair1 … H) -H * #H2e #HLK destruct - [ elim (lt_zero_false … H1e) - | elim (IHL … HLK) -IHL -HLK /2 width=1 by lt_plus_to_minus_r, conj/ - ] -] -qed-. - -(* Basic properties *********************************************************) - -lemma ldrop_refl_atom_O2: ∀s,d. ⇩[s, d, O] ⋆ ≡ ⋆. -/2 width=1 by ldrop_atom/ qed. - -(* Basic_1: was by definition: drop_refl *) -lemma ldrop_refl: ∀L,d,s. ⇩[s, d, 0] L ≡ L. -#L elim L -L // -#L #I #V #IHL #d #s @(nat_ind_plus … d) -d /2 width=1 by ldrop_pair, ldrop_skip/ -qed. - -lemma ldrop_drop_lt: ∀I,L1,L2,V,s,e. - ⇩[s, 0, e-1] L1 ≡ L2 → 0 < e → ⇩[s, 0, e] L1.ⓑ{I}V ≡ L2. -#I #L1 #L2 #V #s #e #HL12 #He >(plus_minus_m_m e 1) /2 width=1 by ldrop_drop/ -qed. - -lemma ldrop_skip_lt: ∀I,L1,L2,V1,V2,s,d,e. - ⇩[s, d-1, e] L1 ≡ L2 → ⇧[d-1, e] V2 ≡ V1 → 0 < d → - ⇩[s, d, e] L1. ⓑ{I} V1 ≡ L2.ⓑ{I}V2. -#I #L1 #L2 #V1 #V2 #s #d #e #HL12 #HV21 #Hd >(plus_minus_m_m d 1) /2 width=1 by ldrop_skip/ -qed. - -lemma ldrop_O1_le: ∀s,e,L. e ≤ |L| → ∃K. ⇩[s, 0, e] L ≡ K. -#s #e @(nat_ind_plus … e) -e /2 width=2 by ex_intro/ -#e #IHe * -[ #H elim (le_plus_xSy_O_false … H) -| #L #I #V normalize #H elim (IHe L) -IHe /3 width=2 by ldrop_drop, monotonic_pred, ex_intro/ -] -qed-. - -lemma ldrop_O1_lt: ∀s,L,e. e < |L| → ∃∃I,K,V. ⇩[s, 0, e] L ≡ K.ⓑ{I}V. -#s #L elim L -L -[ #e #H elim (lt_zero_false … H) -| #L #I #V #IHL #e @(nat_ind_plus … e) -e /2 width=4 by ldrop_pair, ex1_3_intro/ - #e #_ normalize #H elim (IHL e) -IHL /3 width=4 by ldrop_drop, lt_plus_to_minus_r, lt_plus_to_lt_l, ex1_3_intro/ -] -qed-. - -lemma ldrop_O1_pair: ∀L,K,e,s. ⇩[s, 0, e] L ≡ K → e ≤ |L| → ∀I,V. - ∃∃J,W. ⇩[s, 0, e] L.ⓑ{I}V ≡ K.ⓑ{J}W. -#L elim L -L [| #L #Z #X #IHL ] #K #e #s #H normalize #He #I #V -[ elim (ldrop_inv_atom1 … H) -H #H <(le_n_O_to_eq … He) -e - #Hs destruct /2 width=3 by ex1_2_intro/ -| elim (ldrop_inv_O1_pair1 … H) -H * #He #HLK destruct /2 width=3 by ex1_2_intro/ - elim (IHL … HLK … Z X) -IHL -HLK - /3 width=3 by ldrop_drop_lt, le_plus_to_minus, ex1_2_intro/ -] -qed-. - -lemma ldrop_O1_ge: ∀L,e. |L| ≤ e → ⇩[Ⓣ, 0, e] L ≡ ⋆. -#L elim L -L [ #e #_ @ldrop_atom #H destruct ] -#L #I #V #IHL #e @(nat_ind_plus … e) -e [ #H elim (le_plus_xSy_O_false … H) ] -normalize /4 width=1 by ldrop_drop, monotonic_pred/ -qed. - -lemma ldrop_O1_eq: ∀L,s. ⇩[s, 0, |L|] L ≡ ⋆. -#L elim L -L /2 width=1 by ldrop_drop, ldrop_atom/ -qed. - -lemma ldrop_split: ∀L1,L2,d,e2,s. ⇩[s, d, e2] L1 ≡ L2 → ∀e1. e1 ≤ e2 → - ∃∃L. ⇩[s, d, e2 - e1] L1 ≡ L & ⇩[s, d, e1] L ≡ L2. -#L1 #L2 #d #e2 #s #H elim H -L1 -L2 -d -e2 -[ #d #e2 #Hs #e1 #He12 @(ex2_intro … (⋆)) - @ldrop_atom #H lapply (Hs H) -s #H destruct /2 width=1 by le_n_O_to_eq/ -| #I #L1 #V #e1 #He1 lapply (le_n_O_to_eq … He1) -He1 - #H destruct /2 width=3 by ex2_intro/ -| #I #L1 #L2 #V #e2 #HL12 #IHL12 #e1 @(nat_ind_plus … e1) -e1 - [ /3 width=3 by ldrop_drop, ex2_intro/ - | -HL12 #e1 #_ #He12 lapply (le_plus_to_le_r … He12) -He12 - #He12 elim (IHL12 … He12) -IHL12 >minus_plus_plus_l - #L #HL1 #HL2 elim (lt_or_ge (|L1|) (e2-e1)) #H0 - [ elim (ldrop_inv_O1_gt … HL1 H0) -HL1 #H1 #H2 destruct - elim (ldrop_inv_atom1 … HL2) -HL2 #H #_ destruct - @(ex2_intro … (⋆)) [ @ldrop_O1_ge normalize // ] - @ldrop_atom #H destruct - | elim (ldrop_O1_pair … HL1 H0 I V) -HL1 -H0 /3 width=5 by ldrop_drop, ex2_intro/ - ] - ] -| #I #L1 #L2 #V1 #V2 #d #e2 #_ #HV21 #IHL12 #e1 #He12 elim (IHL12 … He12) -IHL12 - #L #HL1 #HL2 elim (lift_split … HV21 d e1) -HV21 /3 width=5 by ldrop_skip, ex2_intro/ -] -qed-. - -lemma ldrop_FT: ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ L2 → ⇩[Ⓣ, d, e] L1 ≡ L2. -#L1 #L2 #d #e #H elim H -L1 -L2 -d -e -/3 width=1 by ldrop_atom, ldrop_drop, ldrop_skip/ -qed. - -lemma ldrop_gen: ∀L1,L2,s,d,e. ⇩[Ⓕ, d, e] L1 ≡ L2 → ⇩[s, d, e] L1 ≡ L2. -#L1 #L2 * /2 width=1 by ldrop_FT/ -qed-. - -lemma ldrop_T: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → ⇩[Ⓣ, d, e] L1 ≡ L2. -#L1 #L2 * /2 width=1 by ldrop_FT/ -qed-. - -lemma l_liftable_LTC: ∀R. l_liftable R → l_liftable (LTC … R). -#R #HR #K #T1 #T2 #H elim H -T2 -[ /3 width=10 by inj/ -| #T #T2 #_ #HT2 #IHT1 #L #s #d #e #HLK #U1 #HTU1 #U2 #HTU2 - elim (lift_total T d e) /4 width=12 by step/ -] -qed-. - -lemma l_deliftable_sn_LTC: ∀R. l_deliftable_sn R → l_deliftable_sn (LTC … R). -#R #HR #L #U1 #U2 #H elim H -U2 -[ #U2 #HU12 #K #s #d #e #HLK #T1 #HTU1 - elim (HR … HU12 … HLK … HTU1) -HR -L -U1 /3 width=3 by inj, ex2_intro/ -| #U #U2 #_ #HU2 #IHU1 #K #s #d #e #HLK #T1 #HTU1 - elim (IHU1 … HLK … HTU1) -IHU1 -U1 #T #HTU #HT1 - elim (HR … HU2 … HLK … HTU) -HR -L -U /3 width=5 by step, ex2_intro/ -] -qed-. - -lemma dropable_sn_TC: ∀R. dropable_sn R → dropable_sn (TC … R). -#R #HR #L1 #K1 #s #d #e #HLK1 #L2 #H elim H -L2 -[ #L2 #HL12 elim (HR … HLK1 … HL12) -HR -L1 - /3 width=3 by inj, ex2_intro/ -| #L #L2 #_ #HL2 * #K #HK1 #HLK elim (HR … HLK … HL2) -HR -L - /3 width=3 by step, ex2_intro/ -] -qed-. - -lemma dropable_dx_TC: ∀R. dropable_dx R → dropable_dx (TC … R). -#R #HR #L1 #L2 #H elim H -L2 -[ #L2 #HL12 #K2 #s #e #HLK2 elim (HR … HL12 … HLK2) -HR -L2 - /3 width=3 by inj, ex2_intro/ -| #L #L2 #_ #HL2 #IHL1 #K2 #s #e #HLK2 elim (HR … HL2 … HLK2) -HR -L2 - #K #HLK #HK2 elim (IHL1 … HLK) -L - /3 width=5 by step, ex2_intro/ -] -qed-. - -lemma l_deliftable_sn_llstar: ∀R. l_deliftable_sn R → - ∀l. l_deliftable_sn (llstar … R l). -#R #HR #l #L #U1 #U2 #H @(lstar_ind_r … l U2 H) -l -U2 -[ /2 width=3 by lstar_O, ex2_intro/ -| #l #U #U2 #_ #HU2 #IHU1 #K #s #d #e #HLK #T1 #HTU1 - elim (IHU1 … HLK … HTU1) -IHU1 -U1 #T #HTU #HT1 - elim (HR … HU2 … HLK … HTU) -HR -L -U /3 width=5 by lstar_dx, ex2_intro/ -] -qed-. - -(* Basic forvard lemmas *****************************************************) - -(* Basic_1: was: drop_S *) -lemma ldrop_fwd_drop2: ∀L1,I2,K2,V2,s,e. ⇩[s, O, e] L1 ≡ K2. ⓑ{I2} V2 → - ⇩[s, O, e + 1] L1 ≡ K2. -#L1 elim L1 -L1 -[ #I2 #K2 #V2 #s #e #H lapply (ldrop_inv_atom1 … H) -H * #H destruct -| #K1 #I1 #V1 #IHL1 #I2 #K2 #V2 #s #e #H - elim (ldrop_inv_O1_pair1 … H) -H * #He #H - [ -IHL1 destruct /2 width=1 by ldrop_drop/ - | @ldrop_drop >(plus_minus_m_m e 1) /2 width=3 by/ - ] -] -qed-. - -lemma ldrop_fwd_length_ge: ∀L1,L2,d,e,s. ⇩[s, d, e] L1 ≡ L2 → |L1| ≤ d → |L2| = |L1|. -#L1 #L2 #d #e #s #H elim H -L1 -L2 -d -e // normalize -[ #I #L1 #L2 #V #e #_ #_ #H elim (le_plus_xSy_O_false … H) -| /4 width=2 by le_plus_to_le_r, eq_f/ -] -qed-. - -lemma ldrop_fwd_length_le_le: ∀L1,L2,d,e,s. ⇩[s, d, e] L1 ≡ L2 → d ≤ |L1| → e ≤ |L1| - d → |L2| = |L1| - e. -#L1 #L2 #d #e #s #H elim H -L1 -L2 -d -e // normalize -[ /3 width=2 by le_plus_to_le_r/ -| #I #L1 #L2 #V1 #V2 #d #e #_ #_ #IHL12 >minus_plus_plus_l - #Hd #He lapply (le_plus_to_le_r … Hd) -Hd - #Hd >IHL12 // -L2 >plus_minus /2 width=3 by transitive_le/ -] -qed-. - -lemma ldrop_fwd_length_le_ge: ∀L1,L2,d,e,s. ⇩[s, d, e] L1 ≡ L2 → d ≤ |L1| → |L1| - d ≤ e → |L2| = d. -#L1 #L2 #d #e #s #H elim H -L1 -L2 -d -e normalize -[ /2 width=1 by le_n_O_to_eq/ -| #I #L #V #_ (lift_fwd_tw … HV21) -HV21 /2 width=1 by monotonic_le_plus_l/ -] -qed-. - -lemma ldrop_fwd_lw_lt: ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ L2 → 0 < e → ♯{L2} < ♯{L1}. -#L1 #L2 #d #e #H elim H -L1 -L2 -d -e -[ #d #e #H >H -H // -| #I #L #V #H elim (lt_refl_false … H) -| #I #L1 #L2 #V #e #HL12 #_ #_ - lapply (ldrop_fwd_lw … HL12) -HL12 #HL12 - @(le_to_lt_to_lt … HL12) -HL12 // -| #I #L1 #L2 #V1 #V2 #d #e #_ #HV21 #IHL12 #H normalize in ⊢ (?%%); -I - >(lift_fwd_tw … HV21) -V2 /3 by lt_minus_to_plus/ -] -qed-. - -lemma ldrop_fwd_rfw: ∀I,L,K,V,i. ⇩[i] L ≡ K.ⓑ{I}V → ∀T. ♯{K, V} < ♯{L, T}. -#I #L #K #V #i #HLK lapply (ldrop_fwd_lw … HLK) -HLK -normalize in ⊢ (%→?→?%%); /3 width=3 by le_to_lt_to_lt/ -qed-. - -(* Advanced inversion lemmas ************************************************) - -fact ldrop_inv_O2_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → e = 0 → L1 = L2. -#L1 #L2 #s #d #e #H elim H -L1 -L2 -d -e -[ // -| // -| #I #L1 #L2 #V #e #_ #_ >commutative_plus normalize #H destruct -| #I #L1 #L2 #V1 #V2 #d #e #_ #HV21 #IHL12 #H - >(IHL12 H) -L1 >(lift_inv_O2_aux … HV21 … H) -V2 -d -e // -] -qed-. - -(* Basic_1: was: drop_gen_refl *) -lemma ldrop_inv_O2: ∀L1,L2,s,d. ⇩[s, d, 0] L1 ≡ L2 → L1 = L2. -/2 width=5 by ldrop_inv_O2_aux/ qed-. - -lemma ldrop_inv_length_eq: ∀L1,L2,d,e. ⇩[Ⓕ, d, e] L1 ≡ L2 → |L1| = |L2| → e = 0. -#L1 #L2 #d #e #H #HL12 lapply (ldrop_fwd_length_minus4 … H) // -qed-. - -lemma ldrop_inv_refl: ∀L,d,e. ⇩[Ⓕ, d, e] L ≡ L → e = 0. -/2 width=5 by ldrop_inv_length_eq/ qed-. - -fact ldrop_inv_FT_aux: ∀L1,L2,s,d,e. ⇩[s, d, e] L1 ≡ L2 → - ∀I,K,V. L2 = K.ⓑ{I}V → s = Ⓣ → d = 0 → - ⇩[Ⓕ, d, e] L1 ≡ K.ⓑ{I}V. -#L1 #L2 #s #d #e #H elim H -L1 -L2 -d -e -[ #d #e #_ #J #K #W #H destruct -| #I #L #V #J #K #W #H destruct // -| #I #L1 #L2 #V #e #_ #IHL12 #J #K #W #H1 #H2 destruct - /3 width=1 by ldrop_drop/ -| #I #L1 #L2 #V1 #V2 #d #e #_ #_ #_ #J #K #W #_ #_ - commutative_plus normalize #H destruct -| minus_minus_comm /3 width=1 by monotonic_pred/ -] -qed-. - -lemma ldrop_O1_inv_append1_le: ∀K,L1,L2,s,e. ⇩[s, 0, e] L1 @@ L2 ≡ K → e ≤ |L2| → - ∀K2. ⇩[s, 0, e] L2 ≡ K2 → K = L1 @@ K2. -#K #L1 #L2 elim L2 -L2 normalize -[ #s #e #H1 #H2 #K2 #H3 lapply (le_n_O_to_eq … H2) -H2 - #H2 elim (ldrop_inv_atom1 … H3) -H3 #H3 #_ destruct - >(ldrop_inv_O2 … H1) -H1 // -| #L2 #I #V #IHL2 #s #e @(nat_ind_plus … e) -e [ -IHL2 ] - [ #H1 #_ #K2 #H2 - lapply (ldrop_inv_O2 … H1) -H1 #H1 - lapply (ldrop_inv_O2 … H2) -H2 #H2 destruct // - | /4 width=7 by ldrop_inv_drop1, le_plus_to_le_r/ - ] -] -qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop_ldrop.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop_ldrop.ma deleted file mode 100644 index b256877b3..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop_ldrop.ma +++ /dev/null @@ -1,208 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/substitution/lift_lift.ma". -include "basic_2/substitution/ldrop.ma". - -(* BASIC SLICING FOR LOCAL ENVIRONMENTS *************************************) - -(* Main properties **********************************************************) - -(* Basic_1: was: drop_mono *) -theorem ldrop_mono: ∀L,L1,s1,d,e. ⇩[s1, d, e] L ≡ L1 → - ∀L2,s2. ⇩[s2, d, e] L ≡ L2 → L1 = L2. -#L #L1 #s1 #d #e #H elim H -L -L1 -d -e -[ #d #e #He #L2 #s2 #H elim (ldrop_inv_atom1 … H) -H // -| #I #K #V #L2 #s2 #HL12 <(ldrop_inv_O2 … HL12) -L2 // -| #I #L #K #V #e #_ #IHLK #L2 #s2 #H - lapply (ldrop_inv_drop1 … H) -H /2 width=2 by/ -| #I #L #K1 #T #V1 #d #e #_ #HVT1 #IHLK1 #X #s2 #H - elim (ldrop_inv_skip1 … H) -H // (lift_inj … HVT1 … HVT2) -HVT1 -HVT2 - >(IHLK1 … HLK2) -IHLK1 -HLK2 // -] -qed-. - -(* Basic_1: was: drop_conf_ge *) -theorem ldrop_conf_ge: ∀L,L1,s1,d1,e1. ⇩[s1, d1, e1] L ≡ L1 → - ∀L2,s2,e2. ⇩[s2, 0, e2] L ≡ L2 → d1 + e1 ≤ e2 → - ⇩[s2, 0, e2 - e1] L1 ≡ L2. -#L #L1 #s1 #d1 #e1 #H elim H -L -L1 -d1 -e1 // -[ #d #e #_ #L2 #s2 #e2 #H #_ elim (ldrop_inv_atom1 … H) -H - #H #He destruct - @ldrop_atom #H >He // (**) (* explicit constructor *) -| #I #L #K #V #e #_ #IHLK #L2 #s2 #e2 #H #He2 - lapply (ldrop_inv_drop1_lt … H ?) -H /2 width=2 by ltn_to_ltO/ #HL2 - minus_minus_comm /3 width=1 by monotonic_pred/ -| #I #L #K #V1 #V2 #d #e #_ #_ #IHLK #L2 #s2 #e2 #H #Hdee2 - lapply (transitive_le 1 … Hdee2) // #He2 - lapply (ldrop_inv_drop1_lt … H ?) -H // -He2 #HL2 - lapply (transitive_le (1+e) … Hdee2) // #Hee2 - @ldrop_drop_lt >minus_minus_comm /3 width=1 by lt_minus_to_plus_r, monotonic_le_minus_r, monotonic_pred/ (**) (* explicit constructor *) -] -qed. - -(* Note: apparently this was missing in basic_1 *) -theorem ldrop_conf_be: ∀L0,L1,s1,d1,e1. ⇩[s1, d1, e1] L0 ≡ L1 → - ∀L2,e2. ⇩[e2] L0 ≡ L2 → d1 ≤ e2 → e2 ≤ d1 + e1 → - ∃∃L. ⇩[s1, 0, d1 + e1 - e2] L2 ≡ L & ⇩[d1] L1 ≡ L. -#L0 #L1 #s1 #d1 #e1 #H elim H -L0 -L1 -d1 -e1 -[ #d1 #e1 #He1 #L2 #e2 #H #Hd1 #_ elim (ldrop_inv_atom1 … H) -H #H #He2 destruct - >(He2 ?) in Hd1; // -He2 #Hd1 <(le_n_O_to_eq … Hd1) -d1 - /4 width=3 by ldrop_atom, ex2_intro/ -| normalize #I #L #V #L2 #e2 #HL2 #_ #He2 - lapply (le_n_O_to_eq … He2) -He2 #H destruct - lapply (ldrop_inv_O2 … HL2) -HL2 #H destruct /2 width=3 by ldrop_pair, ex2_intro/ -| normalize #I #L0 #K0 #V1 #e1 #HLK0 #IHLK0 #L2 #e2 #H #_ #He21 - lapply (ldrop_inv_O1_pair1 … H) -H * * #He2 #HL20 - [ -IHLK0 -He21 destruct plus_plus_comm_23 #_ #_ #IHLK0 #L2 #e2 #H #Hd1e2 #He2de1 - elim (le_inv_plus_l … Hd1e2) #_ #He2 - minus_le_minus_minus_comm /3 width=3 by ldrop_drop_lt, ex2_intro/ - ] -] -qed-. - -(* Note: with "s2", the conclusion parameter is "s1 ∨ s2" *) -(* Basic_1: was: drop_trans_ge *) -theorem ldrop_trans_ge: ∀L1,L,s1,d1,e1. ⇩[s1, d1, e1] L1 ≡ L → - ∀L2,e2. ⇩[e2] L ≡ L2 → d1 ≤ e2 → ⇩[s1, 0, e1 + e2] L1 ≡ L2. -#L1 #L #s1 #d1 #e1 #H elim H -L1 -L -d1 -e1 -[ #d1 #e1 #He1 #L2 #e2 #H #_ elim (ldrop_inv_atom1 … H) -H - #H #He2 destruct /4 width=1 by ldrop_atom, eq_f2/ -| /2 width=1 by ldrop_gen/ -| /3 width=1 by ldrop_drop/ -| #I #L1 #L2 #V1 #V2 #d #e #_ #_ #IHL12 #L #e2 #H #Hde2 - lapply (lt_to_le_to_lt 0 … Hde2) // #He2 - lapply (lt_to_le_to_lt … (e + e2) He2 ?) // #Hee2 - lapply (ldrop_inv_drop1_lt … H ?) -H // #HL2 - @ldrop_drop_lt // >le_plus_minus /3 width=1 by monotonic_pred/ -] -qed. - -(* Basic_1: was: drop_trans_le *) -theorem ldrop_trans_le: ∀L1,L,s1,d1,e1. ⇩[s1, d1, e1] L1 ≡ L → - ∀L2,s2,e2. ⇩[s2, 0, e2] L ≡ L2 → e2 ≤ d1 → - ∃∃L0. ⇩[s2, 0, e2] L1 ≡ L0 & ⇩[s1, d1 - e2, e1] L0 ≡ L2. -#L1 #L #s1 #d1 #e1 #H elim H -L1 -L -d1 -e1 -[ #d1 #e1 #He1 #L2 #s2 #e2 #H #_ elim (ldrop_inv_atom1 … H) -H - #H #He2 destruct /4 width=3 by ldrop_atom, ex2_intro/ -| #I #K #V #L2 #s2 #e2 #HL2 #H lapply (le_n_O_to_eq … H) -H - #H destruct /2 width=3 by ldrop_pair, ex2_intro/ -| #I #L1 #L2 #V #e #_ #IHL12 #L #s2 #e2 #HL2 #H lapply (le_n_O_to_eq … H) -H - #H destruct elim (IHL12 … HL2) -IHL12 -HL2 // - #L0 #H #HL0 lapply (ldrop_inv_O2 … H) -H #H destruct - /3 width=5 by ldrop_pair, ldrop_drop, ex2_intro/ -| #I #L1 #L2 #V1 #V2 #d #e #HL12 #HV12 #IHL12 #L #s2 #e2 #H #He2d - elim (ldrop_inv_O1_pair1 … H) -H * - [ -He2d -IHL12 #H1 #H2 destruct /3 width=5 by ldrop_pair, ldrop_skip, ex2_intro/ - | -HL12 -HV12 #He2 #HL2 - elim (IHL12 … HL2) -L2 [ >minus_le_minus_minus_comm // /3 width=3 by ldrop_drop_lt, ex2_intro/ | /2 width=1 by monotonic_pred/ ] - ] -] -qed-. - -(* Advanced properties ******************************************************) - -lemma l_liftable_llstar: ∀R. l_liftable R → ∀l. l_liftable (llstar … R l). -#R #HR #l #K #T1 #T2 #H @(lstar_ind_r … l T2 H) -l -T2 -[ #L #s #d #e #_ #U1 #HTU1 #U2 #HTU2 -HR -K - >(lift_mono … HTU2 … HTU1) -T1 -U2 -d -e // -| #l #T #T2 #_ #HT2 #IHT1 #L #s #d #e #HLK #U1 #HTU1 #U2 #HTU2 - elim (lift_total T d e) /3 width=12 by lstar_dx/ -] -qed-. - -(* Basic_1: was: drop_conf_lt *) -lemma ldrop_conf_lt: ∀L,L1,s1,d1,e1. ⇩[s1, d1, e1] L ≡ L1 → - ∀I,K2,V2,s2,e2. ⇩[s2, 0, e2] L ≡ K2.ⓑ{I}V2 → - e2 < d1 → let d ≝ d1 - e2 - 1 in - ∃∃K1,V1. ⇩[s2, 0, e2] L1 ≡ K1.ⓑ{I}V1 & - ⇩[s1, d, e1] K2 ≡ K1 & ⇧[d, e1] V1 ≡ V2. -#L #L1 #s1 #d1 #e1 #H1 #I #K2 #V2 #s2 #e2 #H2 #He2d1 -elim (ldrop_conf_le … H1 … H2) -L /2 width=2 by lt_to_le/ #K #HL1K #HK2 -elim (ldrop_inv_skip1 … HK2) -HK2 /2 width=1 by lt_plus_to_minus_r/ -#K1 #V1 #HK21 #HV12 #H destruct /2 width=5 by ex3_2_intro/ -qed-. - -(* Note: apparently this was missing in basic_1 *) -lemma ldrop_trans_lt: ∀L1,L,s1,d1,e1. ⇩[s1, d1, e1] L1 ≡ L → - ∀I,L2,V2,s2,e2. ⇩[s2, 0, e2] L ≡ L2.ⓑ{I}V2 → - e2 < d1 → let d ≝ d1 - e2 - 1 in - ∃∃L0,V0. ⇩[s2, 0, e2] L1 ≡ L0.ⓑ{I}V0 & - ⇩[s1, d, e1] L0 ≡ L2 & ⇧[d, e1] V2 ≡ V0. -#L1 #L #s1 #d1 #e1 #HL1 #I #L2 #V2 #s2 #e2 #HL2 #Hd21 -elim (ldrop_trans_le … HL1 … HL2) -L /2 width=1 by lt_to_le/ #L0 #HL10 #HL02 -elim (ldrop_inv_skip2 … HL02) -HL02 /2 width=1 by lt_plus_to_minus_r/ #L #V1 #HL2 #HV21 #H destruct /2 width=5 by ex3_2_intro/ -qed-. - -lemma ldrop_trans_ge_comm: ∀L1,L,L2,s1,d1,e1,e2. - ⇩[s1, d1, e1] L1 ≡ L → ⇩[e2] L ≡ L2 → d1 ≤ e2 → - ⇩[s1, 0, e2 + e1] L1 ≡ L2. -#L1 #L #L2 #s1 #d1 #e1 #e2 ->commutative_plus /2 width=5 by ldrop_trans_ge/ -qed. - -lemma ldrop_conf_div: ∀I1,L,K,V1,e1. ⇩[e1] L ≡ K.ⓑ{I1}V1 → - ∀I2,V2,e2. ⇩[e2] L ≡ K.ⓑ{I2}V2 → - ∧∧ e1 = e2 & I1 = I2 & V1 = V2. -#I1 #L #K #V1 #e1 #HLK1 #I2 #V2 #e2 #HLK2 -elim (le_or_ge e1 e2) #He -[ lapply (ldrop_conf_ge … HLK1 … HLK2 ?) -| lapply (ldrop_conf_ge … HLK2 … HLK1 ?) -] -HLK1 -HLK2 // #HK -lapply (ldrop_fwd_length_minus2 … HK) #H -elim (discr_minus_x_xy … H) -H -[1,3: normalize H in HK; #HK -lapply (ldrop_inv_O2 … HK) -HK #H destruct -lapply (inv_eq_minus_O … H) -H /3 width=1 by le_to_le_to_eq, and3_intro/ -qed-. - -(* Advanced forward lemmas **************************************************) - -lemma ldrop_fwd_be: ∀L,K,s,d,e,i. ⇩[s, d, e] L ≡ K → |K| ≤ i → i < d → |L| ≤ i. -#L #K #s #d #e #i #HLK #HK #Hd elim (lt_or_ge i (|L|)) // -#HL elim (ldrop_O1_lt (Ⓕ) … HL) #I #K0 #V #HLK0 -HL -elim (ldrop_conf_lt … HLK … HLK0) // -HLK -HLK0 -Hd -#K1 #V1 #HK1 #_ #_ lapply (ldrop_fwd_length_lt2 … HK1) -I -K1 -V1 -#H elim (lt_refl_false i) /2 width=3 by lt_to_le_to_lt/ -qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop_leq.ma b/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop_leq.ma deleted file mode 100644 index 30d962a01..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop_leq.ma +++ /dev/null @@ -1,92 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/grammar/leq_leq.ma". -include "basic_2/substitution/ldrop.ma". - -(* BASIC SLICING FOR LOCAL ENVIRONMENTS *************************************) - -definition dedropable_sn: predicate (relation lenv) ≝ - λR. ∀L1,K1,s,d,e. ⇩[s, d, e] L1 ≡ K1 → ∀K2. R K1 K2 → - ∃∃L2. R L1 L2 & ⇩[s, d, e] L2 ≡ K2 & L1 ≃[d, e] L2. - -(* Properties on equivalence ************************************************) - -lemma leq_ldrop_trans_be: ∀L1,L2,d,e. L1 ≃[d, e] L2 → - ∀I,K2,W,s,i. ⇩[s, 0, i] L2 ≡ K2.ⓑ{I}W → - d ≤ i → i < d + e → - ∃∃K1. K1 ≃[0, ⫰(d+e-i)] K2 & ⇩[s, 0, i] L1 ≡ K1.ⓑ{I}W. -#L1 #L2 #d #e #H elim H -L1 -L2 -d -e -[ #d #e #J #K2 #W #s #i #H - elim (ldrop_inv_atom1 … H) -H #H destruct -| #I1 #I2 #L1 #L2 #V1 #V2 #_ #_ #J #K2 #W #s #i #_ #_ #H - elim (ylt_yle_false … H) // -| #I #L1 #L2 #V #e #HL12 #IHL12 #J #K2 #W #s #i #H #_ >yplus_O1 - elim (ldrop_inv_O1_pair1 … H) -H * #Hi #HLK1 [ -IHL12 | -HL12 ] - [ #_ destruct >ypred_succ - /2 width=3 by ldrop_pair, ex2_intro/ - | lapply (ylt_inv_O1 i ?) /2 width=1 by ylt_inj/ - #H yminus_succ yplus_succ1 #H lapply (ylt_inv_succ … H) -H - #Hide lapply (ldrop_inv_drop1_lt … HLK2 ?) -HLK2 /2 width=1 by ylt_O/ - #HLK1 elim (IHL12 … HLK1) -IHL12 -HLK1 yminus_SO2 - /4 width=3 by ylt_O, ldrop_drop_lt, ex2_intro/ -] -qed-. - -lemma leq_ldrop_conf_be: ∀L1,L2,d,e. L1 ≃[d, e] L2 → - ∀I,K1,W,s,i. ⇩[s, 0, i] L1 ≡ K1.ⓑ{I}W → - d ≤ i → i < d + e → - ∃∃K2. K1 ≃[0, ⫰(d+e-i)] K2 & ⇩[s, 0, i] L2 ≡ K2.ⓑ{I}W. -#L1 #L2 #d #e #HL12 #I #K1 #W #s #i #HLK1 #Hdi #Hide -elim (leq_ldrop_trans_be … (leq_sym … HL12) … HLK1) // -L1 -Hdi -Hide -/3 width=3 by leq_sym, ex2_intro/ -qed-. - -lemma ldrop_O1_ex: ∀K2,i,L1. |L1| = |K2| + i → - ∃∃L2. L1 ≃[0, i] L2 & ⇩[i] L2 ≡ K2. -#K2 #i @(nat_ind_plus … i) -i -[ /3 width=3 by leq_O2, ex2_intro/ -| #i #IHi #Y #Hi elim (ldrop_O1_lt (Ⓕ) Y 0) // - #I #L1 #V #H lapply (ldrop_inv_O2 … H) -H #H destruct - normalize in Hi; elim (IHi L1) -IHi - /3 width=5 by ldrop_drop, leq_pair, injective_plus_l, ex2_intro/ -] -qed-. - -lemma dedropable_sn_TC: ∀R. dedropable_sn R → dedropable_sn (TC … R). -#R #HR #L1 #K1 #s #d #e #HLK1 #K2 #H elim H -K2 -[ #K2 #HK12 elim (HR … HLK1 … HK12) -HR -K1 - /3 width=4 by inj, ex3_intro/ -| #K #K2 #_ #HK2 * #L #H1L1 #HLK #H2L1 elim (HR … HLK … HK2) -HR -K - /3 width=6 by leq_trans, step, ex3_intro/ -] -qed-. - -(* Inversion lemmas on equivalence ******************************************) - -lemma ldrop_O1_inj: ∀i,L1,L2,K. ⇩[i] L1 ≡ K → ⇩[i] L2 ≡ K → L1 ≃[i, ∞] L2. -#i @(nat_ind_plus … i) -i -[ #L1 #L2 #K #H <(ldrop_inv_O2 … H) -K #H <(ldrop_inv_O2 … H) -L1 // -| #i #IHi * [2: #L1 #I1 #V1 ] * [2,4: #L2 #I2 #V2 ] #K #HLK1 #HLK2 // - lapply (ldrop_fwd_length … HLK1) - <(ldrop_fwd_length … HLK2) [ /4 width=5 by ldrop_inv_drop1, leq_succ/ ] - normalize (lpx_sn_inv_atom1 … H) -H + /4 width=3 by drop_atom, lpx_sn_atom, ex2_intro/ +| #I #K1 #V1 #X #H elim (lpx_sn_inv_pair1 … H) -H + #L2 #V2 #HL12 #HV12 #H destruct + /3 width=5 by drop_pair, lpx_sn_pair, ex2_intro/ +| #I #L1 #K1 #V1 #e #_ #IHLK1 #X #H elim (lpx_sn_inv_pair1 … H) -H + #L2 #V2 #HL12 #HV12 #H destruct + elim (IHLK1 … HL12) -L1 /3 width=3 by drop_drop, ex2_intro/ +| #I #L1 #K1 #V1 #W1 #d #e #HLK1 #HWV1 #IHLK1 #X #H + elim (lpx_sn_inv_pair1 … H) -H #L2 #V2 #HL12 #HV12 #H destruct + elim (HR … HV12 … HLK1 … HWV1) -V1 + elim (IHLK1 … HL12) -L1 /3 width=5 by drop_skip, lpx_sn_pair, ex2_intro/ +] +qed-. + +lemma lpx_sn_liftable_dedropable: ∀R. (∀L. reflexive ? (R L)) → + l_liftable R → dedropable_sn (lpx_sn R). +#R #H1R #H2R #L1 #K1 #s #d #e #H elim H -L1 -K1 -d -e +[ #d #e #He #X #H >(lpx_sn_inv_atom1 … H) -H + /4 width=4 by drop_atom, lpx_sn_atom, ex3_intro/ +| #I #K1 #V1 #X #H elim (lpx_sn_inv_pair1 … H) -H + #K2 #V2 #HK12 #HV12 #H destruct + lapply (lpx_sn_fwd_length … HK12) + #H @(ex3_intro … (K2.ⓑ{I}V2)) (**) (* explicit constructor *) + /3 width=1 by lpx_sn_pair, monotonic_le_plus_l/ + @leq_O2 normalize // +| #I #L1 #K1 #V1 #e #_ #IHLK1 #K2 #HK12 elim (IHLK1 … HK12) -K1 + /3 width=5 by drop_drop, leq_pair, lpx_sn_pair, ex3_intro/ +| #I #L1 #K1 #V1 #W1 #d #e #HLK1 #HWV1 #IHLK1 #X #H + elim (lpx_sn_inv_pair1 … H) -H #K2 #W2 #HK12 #HW12 #H destruct + elim (lift_total W2 d e) #V2 #HWV2 + lapply (H2R … HW12 … HLK1 … HWV1 … HWV2) -W1 + elim (IHLK1 … HK12) -K1 + /3 width=6 by drop_skip, leq_succ, lpx_sn_pair, ex3_intro/ +] +qed-. + +fact lpx_sn_dropable_aux: ∀R,L2,K2,s,d,e. ⇩[s, d, e] L2 ≡ K2 → ∀L1. lpx_sn R L1 L2 → + d = 0 → ∃∃K1. ⇩[s, 0, e] L1 ≡ K1 & lpx_sn R K1 K2. +#R #L2 #K2 #s #d #e #H elim H -L2 -K2 -d -e +[ #d #e #He #X #H >(lpx_sn_inv_atom2 … H) -H + /4 width=3 by drop_atom, lpx_sn_atom, ex2_intro/ +| #I #K2 #V2 #X #H elim (lpx_sn_inv_pair2 … H) -H + #K1 #V1 #HK12 #HV12 #H destruct + /3 width=5 by drop_pair, lpx_sn_pair, ex2_intro/ +| #I #L2 #K2 #V2 #e #_ #IHLK2 #X #H #_ elim (lpx_sn_inv_pair2 … H) -H + #L1 #V1 #HL12 #HV12 #H destruct + elim (IHLK2 … HL12) -L2 /3 width=3 by drop_drop, ex2_intro/ +| #I #L2 #K2 #V2 #W2 #d #e #_ #_ #_ #L1 #_ + (lpx_sn_inv_atom1 … H) -H - /4 width=3 by ldrop_atom, lpx_sn_atom, ex2_intro/ -| #I #K1 #V1 #X #H elim (lpx_sn_inv_pair1 … H) -H - #L2 #V2 #HL12 #HV12 #H destruct - /3 width=5 by ldrop_pair, lpx_sn_pair, ex2_intro/ -| #I #L1 #K1 #V1 #e #_ #IHLK1 #X #H elim (lpx_sn_inv_pair1 … H) -H - #L2 #V2 #HL12 #HV12 #H destruct - elim (IHLK1 … HL12) -L1 /3 width=3 by ldrop_drop, ex2_intro/ -| #I #L1 #K1 #V1 #W1 #d #e #HLK1 #HWV1 #IHLK1 #X #H - elim (lpx_sn_inv_pair1 … H) -H #L2 #V2 #HL12 #HV12 #H destruct - elim (HR … HV12 … HLK1 … HWV1) -V1 - elim (IHLK1 … HL12) -L1 /3 width=5 by ldrop_skip, lpx_sn_pair, ex2_intro/ -] -qed-. - -lemma lpx_sn_liftable_dedropable: ∀R. (∀L. reflexive ? (R L)) → - l_liftable R → dedropable_sn (lpx_sn R). -#R #H1R #H2R #L1 #K1 #s #d #e #H elim H -L1 -K1 -d -e -[ #d #e #He #X #H >(lpx_sn_inv_atom1 … H) -H - /4 width=4 by ldrop_atom, lpx_sn_atom, ex3_intro/ -| #I #K1 #V1 #X #H elim (lpx_sn_inv_pair1 … H) -H - #K2 #V2 #HK12 #HV12 #H destruct - lapply (lpx_sn_fwd_length … HK12) - #H @(ex3_intro … (K2.ⓑ{I}V2)) (**) (* explicit constructor *) - /3 width=1 by lpx_sn_pair, monotonic_le_plus_l/ - @leq_O2 normalize // -| #I #L1 #K1 #V1 #e #_ #IHLK1 #K2 #HK12 elim (IHLK1 … HK12) -K1 - /3 width=5 by ldrop_drop, leq_pair, lpx_sn_pair, ex3_intro/ -| #I #L1 #K1 #V1 #W1 #d #e #HLK1 #HWV1 #IHLK1 #X #H - elim (lpx_sn_inv_pair1 … H) -H #K2 #W2 #HK12 #HW12 #H destruct - elim (lift_total W2 d e) #V2 #HWV2 - lapply (H2R … HW12 … HLK1 … HWV1 … HWV2) -W1 - elim (IHLK1 … HK12) -K1 - /3 width=6 by ldrop_skip, leq_succ, lpx_sn_pair, ex3_intro/ -] -qed-. - -fact lpx_sn_dropable_aux: ∀R,L2,K2,s,d,e. ⇩[s, d, e] L2 ≡ K2 → ∀L1. lpx_sn R L1 L2 → - d = 0 → ∃∃K1. ⇩[s, 0, e] L1 ≡ K1 & lpx_sn R K1 K2. -#R #L2 #K2 #s #d #e #H elim H -L2 -K2 -d -e -[ #d #e #He #X #H >(lpx_sn_inv_atom2 … H) -H - /4 width=3 by ldrop_atom, lpx_sn_atom, ex2_intro/ -| #I #K2 #V2 #X #H elim (lpx_sn_inv_pair2 … H) -H - #K1 #V1 #HK12 #HV12 #H destruct - /3 width=5 by ldrop_pair, lpx_sn_pair, ex2_intro/ -| #I #L2 #K2 #V2 #e #_ #IHLK2 #X #H #_ elim (lpx_sn_inv_pair2 … H) -H - #L1 #V1 #HL12 #HV12 #H destruct - elim (IHLK2 … HL12) -L2 /3 width=3 by ldrop_drop, ex2_intro/ -| #I #L2 #K2 #V2 #W2 #d #e #_ #_ #_ #L1 #_ - yplus_O1 - elim (ldrop_inv_O1_pair1 … H) -H * #Hi #HLK1 [ -IHL12 | -HL12 ] + elim (drop_inv_O1_pair1 … H) -H * #Hi #HLK1 [ -IHL12 | -HL12 ] [ #_ destruct -I2 >ypred_succ - /2 width=4 by ldrop_pair, ex2_2_intro/ + /2 width=4 by drop_pair, ex2_2_intro/ | lapply (ylt_inv_O1 i ?) /2 width=1 by ylt_inj/ #H yminus_succ yminus_succ yplus_succ1 #H lapply (ylt_inv_succ … H) -H - #Hide lapply (ldrop_inv_drop1_lt … HLK2 ?) -HLK2 /2 width=1 by ylt_O/ + #Hide lapply (drop_inv_drop1_lt … HLK2 ?) -HLK2 /2 width=1 by ylt_O/ #HLK1 elim (IHL12 … HLK1) -IHL12 -HLK1 yminus_SO2 - /4 width=4 by ylt_O, ldrop_drop_lt, ex2_2_intro/ + /4 width=4 by ylt_O, drop_drop_lt, ex2_2_intro/ ] qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/unfold/lstas_alt.ma b/matita/matita/contribs/lambdadelta/basic_2/unfold/lstas_alt.ma index 17e048a63..0ad7b9bbc 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/unfold/lstas_alt.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/unfold/lstas_alt.ma @@ -47,10 +47,10 @@ lemma lstasa_step_dx: ∀h,G,L,T1,T,l. ⦃G, L⦄ ⊢ T1 ••*[h, l] T → [ /2 width=1 by sta_lstasa/ | #G #L #l #k #X #H >(sta_inv_sort1 … H) -X >commutative_plus // | #G #L #K #V #W #U #i #l #HLK #_ #HWU #IHVW #U2 #HU2 - lapply (ldrop_fwd_drop2 … HLK) #H + lapply (drop_fwd_drop2 … HLK) #H elim (sta_inv_lift1 … HU2 … H … HWU) -H -U /3 width=6 by lstasa_ldef/ | #G #L #K #W #V #V0 #U #i #l #HLK #HWl0 #_ #HVU #IHWV #U2 #HU2 - lapply (ldrop_fwd_drop2 … HLK) #H + lapply (drop_fwd_drop2 … HLK) #H elim (sta_inv_lift1 … HU2 … H … HVU) -H -U /3 width=8 by lstasa_ldec/ | #a #I #G #L #V #T1 #U1 #l #_ #IHTU1 #X #H elim (sta_inv_bind1 … H) -H #U #HU1 #H destruct /3 width=1 by lstasa_bind/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/unfold/lstas_lift.ma b/matita/matita/contribs/lambdadelta/basic_2/unfold/lstas_lift.ma index 0c73881b0..947c16216 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/unfold/lstas_lift.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/unfold/lstas_lift.ma @@ -39,7 +39,7 @@ lemma lstas_inv_lref1: ∀h,G,L,U,i,l. ⦃G, L⦄ ⊢ #i •*[h, l+1] U → #h #G #L #U #i #l #H elim (lstas_inv_step_sn … H) -H #X #H #HXU elim (sta_inv_lref1 … H) -H * #K #V #W #HLK #HVW #HWX -lapply (ldrop_fwd_drop2 … HLK) #H0LK +lapply (drop_fwd_drop2 … HLK) #H0LK elim (lstas_inv_lift1 … HXU … H0LK … HWX) -H0LK -X /4 width=8 by lstas_step_sn, ex4_4_intro, ex3_3_intro, or_introl, or_intror/ qed-. @@ -67,7 +67,7 @@ lemma lstas_ldef: ∀h,G,L,K,V,i. ⇩[i] L ≡ K.ⓓV → ∀W,l. ⦃G, K⦄ ⊢ V •*[h, l+1] W → ∀U. ⇧[0, i+1] W ≡ U → ⦃G, L⦄ ⊢ #i •*[h, l+1] U. #h #G #L #K #V #i #HLK #W #l #HVW #U #HWU -lapply (ldrop_fwd_drop2 … HLK) +lapply (drop_fwd_drop2 … HLK) elim (lstas_inv_step_sn … HVW) -HVW #W0 elim (lift_total W0 0 (i+1)) /3 width=12 by lstas_step_sn, sta_ldef, lstas_lift/ qed. @@ -76,6 +76,6 @@ lemma lstas_ldec: ∀h,G,L,K,W,i. ⇩[i] L ≡ K.ⓛW → ∀V0. ⦃G, K⦄ ⊢ ∀V,l. ⦃G, K⦄ ⊢ W •*[h, l] V → ∀U. ⇧[0, i+1] V ≡ U → ⦃G, L⦄ ⊢ #i •*[h, l+1] U. #h #G #L #K #W #i #HLK #V0 #HWV0 #V #l #HWV #U #HVU -lapply (ldrop_fwd_drop2 … HLK) #H +lapply (drop_fwd_drop2 … HLK) #H elim (lift_total W 0 (i+1)) /3 width=12 by lstas_step_sn, sta_ldec, lstas_lift/ qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/unfold/unfold.ma b/matita/matita/contribs/lambdadelta/basic_2/unfold/unfold.ma index 17f6b1428..30d6ba732 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/unfold/unfold.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/unfold/unfold.ma @@ -15,7 +15,7 @@ include "basic_2/notation/relations/unfold_4.ma". include "basic_2/grammar/lenv_append.ma". include "basic_2/grammar/genv.ma". -include "basic_2/substitution/ldrop.ma". +include "basic_2/substitution/drop.ma". (* CONTEXT-SENSITIVE UNFOLD FOR TERMS ***************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/web/basic_2_src.tbl b/matita/matita/contribs/lambdadelta/basic_2/web/basic_2_src.tbl index 5a106401c..c2eecbacd 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/web/basic_2_src.tbl +++ b/matita/matita/contribs/lambdadelta/basic_2/web/basic_2_src.tbl @@ -31,7 +31,7 @@ table { [ { "dynamic typing" * } { (* [ { "local env. ref. for native type assignment" * } { - [ "lsubn ( ? ⊢ ? :⫃ ? )" "lsubn_ldrop" "lsubn_cpcs" "lsubn_nta" * ] + [ "lsubn ( ? ⊢ ? :⫃ ? )" "lsubn_drop" "lsubn_cpcs" "lsubn_nta" * ] } ] [ { "native type assignment" * } { @@ -85,7 +85,7 @@ table { ] [ { "strongly normalizing extended computation" * } { [ "lcosx ( ? ⊢ ~⬊*[?,?,?] ? )" "lcosx_cpx" * ] - [ "lsx ( ? ⊢ ⬊*[?,?,?,?] ? )" "lsx_alt ( ? ⊢ ⬊⬊*[?,?,?,?] ? )" "lsx_ldrop" + "lsx_lpx" + "lsx_lpxs" + "llsx_csx" * ] + [ "lsx ( ? ⊢ ⬊*[?,?,?,?] ? )" "lsx_alt ( ? ⊢ ⬊⬊*[?,?,?,?] ? )" "lsx_drop" + "lsx_lpx" + "lsx_lpxs" + "llsx_csx" * ] [ "csx_vector ( ⦃?,?⦄ ⊢ ⬊*[?,?] ? )" "csx_tstc_vector" + "csx_aaa" * ] [ "csx ( ⦃?,?⦄ ⊢ ⬊*[?,?] ? )" "csx_alt ( ⦃?,?⦄ ⊢ ⬊⬊*[?,?] ? )" "csx_lift" + "csx_lleq" + "csx_lpx" + "csx_lpxs" + "csx_fpbs" * ] } @@ -102,17 +102,17 @@ table { } ] [ { "context-sensitive extended computation" * } { - [ "lpxs ( ⦃?,?⦄ ⊢ ➡*[?,?] ? )" "lpxs_ldrop" + "lpxs_lleq" + "lpxs_aaa" + "lpxs_cpxs" + "lpxs_lpxs" * ] + [ "lpxs ( ⦃?,?⦄ ⊢ ➡*[?,?] ? )" "lpxs_drop" + "lpxs_lleq" + "lpxs_aaa" + "lpxs_cpxs" + "lpxs_lpxs" * ] [ "cpxs ( ⦃?,?⦄ ⊢ ? ➡*[?,?] ? )" "cpxs_tstc" + "cpxs_tstc_vector" + "cpxs_leq" + "cpxs_lift" + "cpxs_lleq" + "cpxs_aaa" + "cpxs_cpxs" * ] } ] [ { "context-sensitive computation" * } { - [ "lprs ( ⦃?,?⦄ ⊢ ➡* ? )" "lprs_ldrop" + "lprs_cprs" + "lprs_lprs" * ] + [ "lprs ( ⦃?,?⦄ ⊢ ➡* ? )" "lprs_drop" + "lprs_cprs" + "lprs_lprs" * ] [ "cprs ( ⦃?,?⦄ ⊢ ? ➡* ?)" "cprs_lift" + "cprs_cprs" * ] } ] [ { "local env. ref. for abstract candidates of reducibility" * } { - [ "lsubc ( ? ⊢ ? ⫃[?] ? )" "lsubc_ldrop" + "lsubc_ldrops" + "lsubc_lsuba" * ] + [ "lsubc ( ? ⊢ ? ⫃[?] ? )" "lsubc_drop" + "lsubc_drops" + "lsubc_lsuba" * ] } ] [ { "support for abstract computation properties" * } { @@ -132,7 +132,7 @@ table { } ] [ { "context-sensitive extended reduction" * } { - [ "lpx ( ⦃?,?⦄ ⊢ ➡[?,?] ? )" "lpx_ldrop" + "lpx_frees" "lpx_lleq" + "lpx_aaa" * ] + [ "lpx ( ⦃?,?⦄ ⊢ ➡[?,?] ? )" "lpx_drop" + "lpx_frees" "lpx_lleq" + "lpx_aaa" * ] [ "cpx ( ⦃?,?⦄ ⊢ ? ➡[?,?] ? )" "cpx_leq" + "cpx_lift" + "cpx_llpx_sn" + "cpx_lleq" + "cpx_cix" * ] } ] @@ -149,7 +149,7 @@ table { } ] [ { "context-sensitive reduction" * } { - [ "lpr ( ⦃?,?⦄ ⊢ ➡ ? )" "lpr_ldrop" + "lpr_lpr" * ] + [ "lpr ( ⦃?,?⦄ ⊢ ➡ ? )" "lpr_drop" + "lpr_lpr" * ] [ "cpr ( ⦃?,?⦄ ⊢ ? ➡ ? )" "cpr_lift" + "cpr_llpx_sn" + "cpr_cir" * ] } ] @@ -211,15 +211,15 @@ table { [ { "multiple substitution" * } { [ { "lazy equivalence" * } { [ "fleq ( ⦃?,?,?⦄ ≡[?] ⦃?,?,?⦄ )" "fleq_fleq" * ] - [ "lleq ( ? ≡[?,?] ? )" "lleq_alt" + "lleq_alt_rec" + "lleq_leq" + "lleq_ldrop" + "lleq_fqus" + "lleq_llor" + "lleq_lleq" * ] + [ "lleq ( ? ≡[?,?] ? )" "lleq_alt" + "lleq_alt_rec" + "lleq_leq" + "lleq_drop" + "lleq_fqus" + "lleq_llor" + "lleq_lleq" * ] } ] [ { "lazy pointwise extension of a relation" * } { - [ "llpx_sn" "llpx_sn_alt" + "llpx_sn_alt_rec" + "llpx_sn_tc" + "llpx_sn_leq" + "llpx_sn_ldrop" + "llpx_sn_lpx_sn" + "llpx_sn_frees" + "llpx_sn_llor" * ] + [ "llpx_sn" "llpx_sn_alt" + "llpx_sn_alt_rec" + "llpx_sn_tc" + "llpx_sn_leq" + "llpx_sn_drop" + "llpx_sn_lpx_sn" + "llpx_sn_frees" + "llpx_sn_llor" * ] } ] [ { "pointwise union for local environments" * } { - [ "llor ( ? ⩖[?,?] ? ≡ ? )" "llor_alt" + "llor_ldrop" * ] + [ "llor ( ? ⩖[?,?] ? ≡ ? )" "llor_alt" + "llor_drop" * ] } ] [ { "context-sensitive exclusion from free variables" * } { @@ -236,7 +236,7 @@ table { } ] [ { "iterated local env. slicing" * } { - [ "ldrops ( ⇩*[?,?] ? ≡ ? )" "ldrops_ldrop" + "ldrops_ldrops" * ] + [ "drops ( ⇩*[?,?] ? ≡ ? )" "drops_drop" + "drops_drops" * ] } ] [ { "generic term relocation" * } { @@ -270,11 +270,11 @@ table { } ] [ { "pointwise extension of a relation" * } { - [ "lpx_sn" "lpx_sn_alt" + "lpx_sn_tc" + "lpx_sn_ldrop" + "lpx_sn_lpx_sn" * ] + [ "lpx_sn" "lpx_sn_alt" + "lpx_sn_tc" + "lpx_sn_drop" + "lpx_sn_lpx_sn" * ] } ] [ { "basic local env. slicing" * } { - [ "ldrop ( ⇩[?,?,?] ? ≡ ? )" "ldrop_append" + "ldrop_leq" + "ldrop_ldrop" * ] + [ "drop ( ⇩[?,?,?] ? ≡ ? )" "drop_append" + "drop_leq" + "drop_drop" * ] } ] [ { "basic term relocation" * } { @@ -287,11 +287,11 @@ table { class "red" [ { "grammar" * } { [ { "equivalence for local environments" * } { - [ "leq ( ? ≃[?,?] ? )" "leq_leq" * ] + [ "leq ( ? ⩬[?,?] ? )" "leq_leq" * ] } ] [ { "same top term constructor" * } { - [ "tstc ( ? ≃ ? )" "tstc_tstc" + "tstc_vector" * ] + [ "tstc ( ? ≂ ? )" "tstc_tstc" + "tstc_vector" * ] } ] [ { "closures" * } {