From 990f97071a9939d47be16b36f6045d3b23f218e0 Mon Sep 17 00:00:00 2001 From: Ferruccio Guidi Date: Fri, 2 Mar 2018 14:29:56 +0100 Subject: [PATCH] update in ground_2 and basic_2 + minor additions + refactoring --- helm/www/lambdadelta/download/ld_talk_10s.pdf | Bin 0 -> 69907 bytes .../lambdadelta/web/home/documentation_3.tbl | 8 ++ .../lambdadelta/basic_2/etc/fid/fid.etc | 32 +++++ .../lambdadelta/basic_2/etc/fid/fle_fid.etc | 39 +++++ .../basic_2/etc/fid/isidentity_2.etc | 19 +++ .../lambdadelta/basic_2/etc/fid/lfeq_fid.etc | 39 +++++ .../basic_2/etc/frees/frees_drops2.etc | 56 ++++++++ .../lambdadelta/basic_2/etc/lfxs_fle.etc | 133 ++++++++++++++++++ .../basic_2/i_static/tc_lfxs_lex.ma | 2 +- .../basic_2/i_static/tc_lfxs_tc_lfxs.ma | 2 +- .../lambdadelta/basic_2/relocation/lex_tc.ma | 23 +++ .../basic_2/relocation/lexs_length.ma | 10 ++ .../lambdadelta/basic_2/relocation/lexs_tc.ma | 2 - .../basic_2/rt_computation/lfpxs_etc.ma | 1 + .../basic_2/rt_computation/lfpxs_etc2.ma | 63 +++++++++ .../basic_2/rt_computation/lfpxs_lpxs.ma | 2 +- .../basic_2/rt_transition/cpm_lfxs.ma | 8 +- .../basic_2/rt_transition/cpx_etc.ma | 71 ++++------ .../basic_2/rt_transition/cpx_lfxs.ma | 6 +- .../basic_2/rt_transition/lfpr_lfpr.ma | 2 +- .../basic_2/rt_transition/lfpx_lfdeq.ma | 10 +- .../lambdadelta/basic_2/static/fle.ma | 23 +-- .../lambdadelta/basic_2/static/frees_drops.ma | 1 + .../lambdadelta/basic_2/static/frees_fqup.ma | 49 +++++++ .../lambdadelta/basic_2/static/fsle.ma | 38 +++++ .../static/{fle_drops.ma => fsle_drops.ma} | 19 ++- .../static/{fle_fqup.ma => fsle_fqup.ma} | 37 ++--- .../static/{fle_fle.ma => fsle_fsle.ma} | 60 ++++---- .../lambdadelta/basic_2/static/fsle_length.ma | 35 +++++ .../basic_2/static/lfdeq_length.ma | 5 +- .../lambdadelta/basic_2/static/lfdeq_lfdeq.ma | 2 +- .../lambdadelta/basic_2/static/lfeq.ma | 34 ++++- .../lambdadelta/basic_2/static/lfxs.ma | 9 +- .../lambdadelta/basic_2/static/lfxs_fsle.ma | 24 ++++ .../lambdadelta/basic_2/static/lfxs_lfxs.ma | 22 +-- .../ground_2/relocation/rtmap_sor.ma | 9 +- matita/matita/matita.lang | 48 ++++--- 37 files changed, 754 insertions(+), 189 deletions(-) create mode 100644 helm/www/lambdadelta/download/ld_talk_10s.pdf create mode 100644 matita/matita/contribs/lambdadelta/basic_2/etc/fid/fid.etc create mode 100644 matita/matita/contribs/lambdadelta/basic_2/etc/fid/fle_fid.etc create mode 100644 matita/matita/contribs/lambdadelta/basic_2/etc/fid/isidentity_2.etc create mode 100644 matita/matita/contribs/lambdadelta/basic_2/etc/fid/lfeq_fid.etc create mode 100644 matita/matita/contribs/lambdadelta/basic_2/etc/frees/frees_drops2.etc create mode 100644 matita/matita/contribs/lambdadelta/basic_2/etc/lfxs_fle.etc create mode 100644 matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_etc2.ma create mode 100644 matita/matita/contribs/lambdadelta/basic_2/static/fsle.ma rename matita/matita/contribs/lambdadelta/basic_2/static/{fle_drops.ma => fsle_drops.ma} (76%) rename matita/matita/contribs/lambdadelta/basic_2/static/{fle_fqup.ma => fsle_fqup.ma} (71%) rename matita/matita/contribs/lambdadelta/basic_2/static/{fle_fle.ma => fsle_fsle.ma} (62%) create mode 100644 matita/matita/contribs/lambdadelta/basic_2/static/fsle_length.ma create mode 100644 matita/matita/contribs/lambdadelta/basic_2/static/lfxs_fsle.ma diff --git a/helm/www/lambdadelta/download/ld_talk_10s.pdf b/helm/www/lambdadelta/download/ld_talk_10s.pdf new file mode 100644 index 0000000000000000000000000000000000000000..68a98ce5d50be8d921036723392877902e0c0f35 GIT binary patch literal 69907 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 z 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
5tJ|11yepPJ-}_1w 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 literal 0 HcmV?d00001 diff --git a/helm/www/lambdadelta/web/home/documentation_3.tbl b/helm/www/lambdadelta/web/home/documentation_3.tbl index d5d17a570..b8a0eb9d8 100644 --- a/helm/www/lambdadelta/web/home/documentation_3.tbl +++ b/helm/www/lambdadelta/web/home/documentation_3.tbl @@ -20,6 +20,14 @@ table { @@("html/documentation.html#bibtex" "BibTeX entry") ^ "." * } ] + [ { name "ldP3a" "P3a." "" } { + "F. Guidi:" + + @@("download/ld_talk_10s.pdf" + "Adding Schematic Abstraction to λP") + + "(revised 2018-02)." + + "Presentation at University of Bologna (slides)." + * } + ] } class "top" [ * ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/etc/fid/fid.etc b/matita/matita/contribs/lambdadelta/basic_2/etc/fid/fid.etc new file mode 100644 index 000000000..89f533d8f --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/etc/fid/fid.etc @@ -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/notation/relations/isidentity_2.ma". +include "basic_2/static/frees.ma". + +(* FREE VARIABLES IDENTITY FOR RESTRICTED CLOSURES **************************) + +definition fid: relation2 … ≝ λL,T. + ∀f. L ⊢ 𝐅*⦃T⦄ ≡ f → 𝐈⦃f⦄. + +interpretation "free variables identity (restricted closure)" + 'IsIdentity L T = (fid L T). + +(* Basic properties *********************************************************) + +lemma fid_sort: ∀L,s. 𝐈⦃L, ⋆s⦄. +/2 width=3 by frees_inv_sort/ qed. + +lemma fid_gref: ∀L,l. 𝐈⦃L, §l⦄. +/2 width=3 by frees_inv_gref/ qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/etc/fid/fle_fid.etc b/matita/matita/contribs/lambdadelta/basic_2/etc/fid/fle_fid.etc new file mode 100644 index 000000000..310b1d82f --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/etc/fid/fle_fid.etc @@ -0,0 +1,39 @@ +(**************************************************************************) +(* ___ *) +(* ||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/fid.ma". +include "basic_2/static/fle_fqup.ma". + +(* FREE VARIABLES INCLUSION FOR RESTRICTED CLOSURES *************************) + +(* Properties with free variables identity for restricted closures **********) + +lemma fle_fid_sn: ∀L1,L2. |L1| = |L2| → + ∀T1,T2. 𝐈⦃L1, T1⦄ → ⦃L1, T1⦄ ⊆ ⦃L2, T2⦄. +#L1 #L2 #HL #T1 #T2 #HT1 +elim (frees_total L1 T1) #f1 #Hf1 +elim (frees_total L2 T2) #f2 #Hf2 +/4 width=8 by lveq_length_eq, sle_isid_sn, ex4_4_intro/ +qed. + +(* Inversion lemmas with free variables identity for restricted closures ****) + +lemma fle_inv_fid_dx: ∀L1,L2. |L1| = |L2| → + ∀T1,T2. ⦃L1, T1⦄ ⊆ ⦃L2, T2⦄ → 𝐈⦃L2, T2⦄ → 𝐈⦃L1, T1⦄. +#L1 #L2 #HL #T1 #T2 +* #n1 #n2 #f1 #f2 #Hf1 #Hf2 #HL12 #Hf12 #HT2 #g1 #Hg1 +elim (lveq_inj_length … HL12) // -HL -HL12 #H1 #H2 destruct +lapply (frees_mono … Hf1 … Hg1) -Hg1 #Hfg1 +/4 width=5 by sle_inv_isid_dx, isid_eq_repl_back/ +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/etc/fid/isidentity_2.etc b/matita/matita/contribs/lambdadelta/basic_2/etc/fid/isidentity_2.etc new file mode 100644 index 000000000..afd269223 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/etc/fid/isidentity_2.etc @@ -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( 𝐈 ⦃ term 46 L, break term 46 T ⦄ )" + non associative with precedence 45 + for @{ 'IsIdentity $L $T }. diff --git a/matita/matita/contribs/lambdadelta/basic_2/etc/fid/lfeq_fid.etc b/matita/matita/contribs/lambdadelta/basic_2/etc/fid/lfeq_fid.etc new file mode 100644 index 000000000..c735f95f6 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/etc/fid/lfeq_fid.etc @@ -0,0 +1,39 @@ +(**************************************************************************) +(* ___ *) +(* ||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/relocation/lexs_length.ma". +include "basic_2/static/frees_fqup.ma". +include "basic_2/static/fid.ma". +include "basic_2/static/lfeq.ma". + +(* SYNTACTIC EQUIVALENCE FOR LOCAL ENVIRONMENTS ON REFERRED ENTRIES *********) + +(* properties with free variables identity for restricted closures **********) + +lemma fid_lfeq: ∀L1,L2. |L1| = |L2| → ∀T. 𝐈⦃L1, T⦄ → L1 ≡[T] L2. +#L1 #L2 #HL1 #T #HT +elim (frees_total L1 T) #f #Hf +/4 width=3 by lexs_length_isid, ex2_intro/ +qed. + +(* Advanced properties with free variables identity for restricted closures *) + +lemma fid_length: ∀L1,L2. |L1| = |L2| → ∀T. 𝐈⦃L1, T⦄ → 𝐈⦃L2, T⦄. +#L1 #L2 #HL #T #HT #g #Hg +elim (frees_total L1 T) #f #Hf +lapply (frees_mono f … Hg) -Hg +[ /3 width=4 by fid_lfeq, frees_lfeq_conf/ +| /3 width=3 by isid_eq_repl_back/ +] +qed-. \ No newline at end of file diff --git a/matita/matita/contribs/lambdadelta/basic_2/etc/frees/frees_drops2.etc b/matita/matita/contribs/lambdadelta/basic_2/etc/frees/frees_drops2.etc new file mode 100644 index 000000000..3f95a1830 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/etc/frees/frees_drops2.etc @@ -0,0 +1,56 @@ +include "basic_2/static/frees_drops.ma". + +axiom frees_inv_drops_next_sle: ∀f1,L1,T1. L1 ⊢ 𝐅*⦃T1⦄ ≡ f1 → ∀f2. f1 ⊆ f2 → + ∀I2,L2,V2,n. ⬇*[n] L1 ≡ L2.ⓑ{I2}V2 → + ∀g1. ⫯g1 = ⫱*[n] f1 → + ∀g2. L2 ⊢ 𝐅*⦃V2⦄ ≡ g2 → ↑*[n]⫯g2 ⊆ f2. + +lemma frees_drops_next_sle: ∀f1,L1,T1. L1 ⊢ 𝐅*⦃T1⦄ ≡ f1 → ∀f2. ( + ∀n. ⬇*[Ⓕ, 𝐔❴n❵] L1 ≡ ⋆ → + ∀g1. ⫯g1 = ⫱*[n] f1 → + ∀g2. 𝐈⦃g2⦄ → ↑*[n]⫯g2 ⊆ f2 + ) → ( + ∀I2,L2,V2,n. ⬇*[n] L1 ≡ L2.ⓑ{I2}V2 → + ∀g1. ⫯g1 = ⫱*[n] f1 → + ∀g2. L2 ⊢ 𝐅*⦃V2⦄ ≡ g2 → ↑*[n]⫯g2 ⊆ f2 + ) → ( + ∀I2,L2,n. ⬇*[n] L1 ≡ L2.ⓤ{I2} → + ∀g1. ⫯g1 = ⫱*[n] f1 → + ∀g2. 𝐈⦃g2⦄ → ↑*[n]⫯g2 ⊆ f2 + ) → f1 ⊆ f2. +#f1 #L1 #T1 #H @(frees_ind_void … H) -f1 -L1 -T1 +[ /2 width=1 by sle_isid_sn/ +| /2 width=2 by/ +| /3 width=5 by drops_refl/ +| /3 width=3 by drops_refl/ +| /6 width=5 by drops_drop, sle_inv_tl_dx, sle_px_tl/ +| /2 width=1 by sle_isid_sn/ +| #f1a #f1b #f1 #p #I1 #L1 #V1 #T1 #_ #_ #Hf1 #IHa #IHb #f2 #H1 #H2 #H3 + lapply (sor_tls … Hf1) #Hn + @(sor_inv_sle … Hf1) -Hf1 + [ @IHa -IHa -IHb [| #I2 #L2 #V2 | #I2 #L2 ] #n #HL #g1a #Hg1a #g2 #Hg2 + lapply (Hn n) -Hn tls_xn (cpx_inv_gref1 … HX) -X + /3 width=1 by fle_gref_length, and3_intro/ +| #p #I #V0 #T0 #HG #HL #HT #X #HX #Y #HY destruct + lapply (lfxs_fwd_length … HY) #H0 + elim (lfxs_inv_bind … V0 ? HY) -HY // #HV0 #HT0 + elim (cpx_inv_bind1 … HX) -HX * + [ #V1 #T1 #HV01 #HT01 #H destruct + elim (IH … HV01 … HV0) -HV01 -HV0 // #H1V #H2V #H3V + elim (IH … HT01 … HT0) -HT01 -HT0 -IH // #H1T #H2T #H3T + /4 width=3 by fle_bind_eq, fle_fwd_pair_sn, and3_intro/ + | #T #HT #HXT #H1 #H2 destruct + elim (IH G0 … V0… V0 … HV0) -HV0 // #H1V #H2V #H3V + elim (IH … HT … HT0) -HT -HT0 -IH // #H1T #H2T #H3T + /3 width=5 by fle_bind, fle_inv_lifts_sn, and3_intro/ + ] +| #I #V0 #X0 #HG #HL #HT #X #HX #Y #HY destruct + elim (lfxs_inv_flat … HY) -HY #HV0 #HX0 + elim (cpx_inv_flat1 … HX) -HX * + [ #V1 #T1 #HV01 #HT01 #H destruct + elim (IH … HV01 … HV0) -HV01 -HV0 // #H1V #H2V #H3V + elim (IH … HT01 … HX0) -HT01 -HX0 -IH // #H1T #H2T #H3T + /3 width=3 by fle_flat, and3_intro/ + | #HX #H destruct + elim (IH G0 … V0… V0 … HV0) -HV0 // #H1V #H2V #H3V + elim (IH … HX … HX0) -HX -HX0 -IH // #H1T #H2T #H3T + /4 width=3 by fle_flat_sn, fle_flat_dx_dx, fle_flat_dx_sn, and3_intro/ + | #HX #H destruct + elim (IH … HX … HV0) -HX -HV0 // #H1V #H2V #H3V + elim (IH G0 … X0… X0 … HX0) -HX0 -IH // #H1T #H2T #H3T + /4 width=3 by fle_flat_sn, fle_flat_dx_dx, fle_flat_dx_sn, and3_intro/ + | #p #V1 #W0 #W1 #T0 #T1 #HV01 #HW01 #HT01 #H1 #H2 #H3 destruct + elim (lfxs_inv_bind … W0 ? HX0) -HX0 // #HW0 #HT0 + elim (IH … HV01 … HV0) -HV01 -HV0 // #H1V #H2V #H3V + elim (IH … HW01 … HW0) -HW01 -HW0 // #H1W #H2W #H3W + elim (IH … HT01 … HT0) -HT01 -HT0 -IH // #H1T #H2T #H3T + lapply (fle_fwd_pair_sn … H2T) -H2T #H2T + lapply (fle_fwd_pair_sn … H3T) -H3T #H3T + @and3_intro [ /3 width=5 by fle_flat, fle_bind/ ] (**) (* full auto too slow *) + @fle_bind_sn_ge /4 width=1 by fle_shift, fle_flat_sn, fle_flat_dx_dx, fle_flat_dx_sn, fle_bind_dx_sn/ + | #p #V1 #X1 #W0 #W1 #T0 #T1 #HV01 #HVX1 #HW01 #HT01 #H1 #H2 #H3 destruct + elim (lfxs_inv_bind … W0 ? HX0) -HX0 // #HW0 #HT0 + elim (IH … HV01 … HV0) -HV01 -HV0 // #H1V #H2V #H3V + elim (IH … HW01 … HW0) -HW01 -HW0 // #H1W #H2W #H3W + elim (IH … HT01 … HT0) -HT01 -HT0 -IH // #H1T #H2T #H3T + lapply (fle_fwd_pair_sn … H2T) -H2T #H2T + lapply (fle_fwd_pair_sn … H3T) -H3T #H3T + @and3_intro[ /3 width=5 by fle_flat, fle_bind/ ] (**) (* full auto too slow *) + @fle_bind_sn_ge // + [1,3: /3 width=1 by fle_flat_dx_dx, fle_bind_dx_sn/ + |2,4: /4 width=3 by fle_flat_sn, fle_flat_dx_sn, fle_flat_dx_dx, fle_shift, fle_lifts_sn/ + ] + ] +] +*) diff --git a/matita/matita/contribs/lambdadelta/basic_2/i_static/tc_lfxs_lex.ma b/matita/matita/contribs/lambdadelta/basic_2/i_static/tc_lfxs_lex.ma index 73ddeb26f..8a898e91f 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/i_static/tc_lfxs_lex.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/i_static/tc_lfxs_lex.ma @@ -36,7 +36,7 @@ lemma tc_lfxs_lex_lfeq: ∀R. c_reflexive … R → (* Note: s_rs_transitive_lex_inv_isid could be invoked in the last auto but makes it too slow *) lemma tc_lfxs_inv_lex_lfeq: ∀R. c_reflexive … R → - lfxs_fle_compatible R → + lfxs_fsle_compatible R → s_rs_transitive … R (λ_.lex R) → lfeq_transitive R → ∀L1,L2,T. L1 ⪤**[R, T] L2 → diff --git a/matita/matita/contribs/lambdadelta/basic_2/i_static/tc_lfxs_tc_lfxs.ma b/matita/matita/contribs/lambdadelta/basic_2/i_static/tc_lfxs_tc_lfxs.ma index 87f279a9b..09039c5e3 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/i_static/tc_lfxs_tc_lfxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/i_static/tc_lfxs_tc_lfxs.ma @@ -19,7 +19,7 @@ include "basic_2/i_static/tc_lfxs.ma". (* Advanced properties ******************************************************) -lemma tc_lfxs_sym: ∀R. lfxs_fle_compatible R → +lemma tc_lfxs_sym: ∀R. lfxs_fsle_compatible R → (∀L1,L2,T1,T2. R L1 T1 T2 → R L2 T2 T1) → ∀T. symmetric … (tc_lfxs R T). #R #H1R #H2R #T #L1 #L2 #H elim H -L2 diff --git a/matita/matita/contribs/lambdadelta/basic_2/relocation/lex_tc.ma b/matita/matita/contribs/lambdadelta/basic_2/relocation/lex_tc.ma index bb3aec919..d33476cae 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/relocation/lex_tc.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/relocation/lex_tc.ma @@ -12,14 +12,24 @@ (* *) (**************************************************************************) +include "ground_2/relocation/rtmap_id.ma". include "basic_2/syntax/ext2_tc.ma". include "basic_2/relocation/lexs_tc.ma". include "basic_2/relocation/lex.ma". +alias symbol "subseteq" = "relation inclusion". + (* GENERIC EXTENSION OF A CONTEXT-SENSITIVE REALTION FOR TERMS **************) (* Inversion lemmas with transitive closure *********************************) +(* Basic_2A1: was: lpx_sn_LTC_TC_lpx_sn *) +lemma lex_inv_ltc: ∀R. c_reflexive … R → + lex (LTC … R) ⊆ TC … (lex R). +#R #HR #L1 #L2 * +/5 width=11 by lexs_inv_tc_dx, lexs_co, ext2_inv_tc, ext2_refl, monotonic_TC, ex2_intro/ +qed-. + lemma s_rs_transitive_lex_inv_isid: ∀R. s_rs_transitive … R (λ_.lex R) → s_rs_transitive_isid cfull (cext2 R). #R #HR #f #Hf #L2 #T1 #T2 #H #L1 #HL12 @@ -30,3 +40,16 @@ elim (ext2_tc … H) -H @(HR … HV12) -HV12 /2 width=3 by ex2_intro/ (**) (* auto fails *) ] qed-. + +(* Properties with transitive closure ***************************************) + +(* Basic_2A1: was: TC_lpx_sn_inv_lpx_sn_LTC *) +lemma lex_ltc: ∀R. s_rs_transitive … R (λ_. lex R) → + TC … (lex R) ⊆ lex (LTC … R). +#R #HR #L1 #L2 #HL12 +lapply (monotonic_TC … (lexs cfull (cext2 R) 𝐈𝐝) … HL12) -HL12 +[ #L1 #L2 * /3 width=3 by lexs_eq_repl_fwd, eq_id_inv_isid/ +| /5 width=9 by s_rs_transitive_lex_inv_isid, lexs_tc_dx, lexs_co, ext2_tc, ex2_intro/ +] +qed-. + diff --git a/matita/matita/contribs/lambdadelta/basic_2/relocation/lexs_length.ma b/matita/matita/contribs/lambdadelta/basic_2/relocation/lexs_length.ma index 2ceec510b..faefb9989 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/relocation/lexs_length.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/relocation/lexs_length.ma @@ -35,3 +35,13 @@ lemma lexs_length_cfull: ∀L1,L2. |L1| = |L2| → ∀f. L1 ⪤*[cfull, cfull, f elim (pn_split f) * #g #H destruct /3 width=1 by lexs_next, lexs_push/ ] qed. + +lemma lexs_length_isid: ∀R,L1,L2. |L1| = |L2| → + ∀f. 𝐈⦃f⦄ → L1 ⪤*[R, cfull, f] L2. +#R #L1 elim L1 -L1 +[ #Y2 #H >(length_inv_zero_sn … H) -Y2 // +| #L1 #I1 #IH #Y2 #H #f #Hf + elim (length_inv_succ_sn … H) -H #I2 #L2 #HL12 #H destruct + elim (isid_inv_gen … Hf) -Hf #g #Hg #H destruct /3 width=1 by lexs_push/ +] +qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/relocation/lexs_tc.ma b/matita/matita/contribs/lambdadelta/basic_2/relocation/lexs_tc.ma index 24d8d9fcf..70cfdbd71 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/relocation/lexs_tc.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/relocation/lexs_tc.ma @@ -98,7 +98,6 @@ qed-. (* Advanced properties ******************************************************) -(* Basic_2A1: uses: TC_lpx_sn_inv_lpx_sn_LTC *) lemma lexs_tc_dx: ∀RN,RP. s_rs_transitive_isid RN RP → ∀f. 𝐈⦃f⦄ → ∀L1,L2. TC … (lexs RN RP f) L1 L2 → L1 ⪤*[RN, LTC … RP, f] L2. #RN #RP #HRP #f #Hf #L1 #L2 #H @(TC_ind_dx ??????? H) -L1 @@ -113,7 +112,6 @@ lemma lexs_inv_tc_sn: ∀RN,RP. c_reflexive … RN → c_reflexive … RP → /2 width=1 by lexs_tc_next, lexs_tc_push_sn, lexs_atom, inj/ qed-. -(* Basic_2A1: uses: lpx_sn_LTC_TC_lpx_sn *) lemma lexs_inv_tc_dx: ∀RN,RP. c_reflexive … RN → c_reflexive … RP → ∀f,L1,L2. L1 ⪤*[RN, LTC … RP, f] L2 → TC … (lexs RN RP f) L1 L2. #RN #RP #HRN #HRP #f #L1 #L2 #H elim H -f -L1 -L2 diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_etc.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_etc.ma index 0f34a15b3..d8989b799 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_etc.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_etc.ma @@ -7,6 +7,7 @@ lemma R_fle_comp_LTC: ∀R. R_fle_compatible R → R_fle_compatible (LTC … R). #R #HR #L #T1 #T2 #H elim H -T2 /3 width=3 by fle_trans_dx/ qed-. + lemma lfpxs_cpx_conf: ∀h,G. s_r_confluent1 … (cpx h G) (lfpxs h G). #h #G #L1 #T1 #T2 #HT12 #L2 #H elim (tc_lfxs_inv_lex_lfeq … H) -H #L #HL1 #HL2 diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_etc2.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_etc2.ma new file mode 100644 index 000000000..0fa9b73d5 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_etc2.ma @@ -0,0 +1,63 @@ + +include "basic_2/static/lfxs_lex.ma". +include "basic_2/rt_transition/cpx_etc.ma". +include "basic_2/rt_computation/lfpxs_lpxs.ma". + +axiom fle_trans: ∀L1,L,T1,T. ⦃L1, T1⦄ ⊆ ⦃L, T⦄ → + ∀L2,T2. ⦃L, T⦄ ⊆ ⦃L2, T2⦄ → ⦃L1, T1⦄ ⊆ ⦃L2, T2⦄. + +axiom pippo: ∀h,G,L1,T1,T2. ⦃G, L1⦄ ⊢ T1 ⬈[h] T2 → ∀L. ⦃G, L1⦄ ⊢⬈[h] L → + ∧∧ ⦃L, T1⦄ ⊆ ⦃L1, T1⦄ & ⦃L, T2⦄ ⊆ ⦃L, T1⦄ & ⦃L1, T2⦄ ⊆ ⦃L1, T1⦄. +(* +lemma pippos: ∀h,G,L1,L. ⦃G, L1⦄ ⊢⬈*[h] L → ∀T1,T2. ⦃G, L1⦄ ⊢ T1 ⬈[h] T2 → + ∧∧ ⦃L, T1⦄ ⊆ ⦃L1, T1⦄ & ⦃L, T2⦄ ⊆ ⦃L, T1⦄. +#h #G #L1 #L #H +lapply (lex_inv_ltc … H) -H // #H +@(TC_star_ind ???????? H) -L // +[ #T1 #T2 #H elim (pippo … H) -H /2 width=3 by conj/ +| #L #L0 #HL1 #HL0 #IH #T1 #T2 #HT12 + elim (IH … HT12) -IH #HT1 #HT21 + elim (pippo … T1 T1 … HL0) // #H1 #_ #_ + @conj + [ @(fle_trans … H1) // + +*)(* +lemma pippos: ∀h,G,L1,L. ⦃G, L1⦄ ⊢⬈*[h] L → ∀T1,T2. ⦃G, L1⦄ ⊢ T1 ⬈[h] T2 → + ∧∧ ⦃L, T1⦄ ⊆ ⦃L1, T1⦄ & ⦃L, T2⦄ ⊆ ⦃L, T1⦄ & ⦃L1, T2⦄ ⊆ ⦃L1, T1⦄. +#h #G #L1 #L #H +lapply (lex_inv_ltc … H) -H // #H +@(TC_star_ind_dx ???????? H) -L1 /2 width=5 by pippo/ +#L1 #L0 #HL10 #HL0 #IH #T1 #T2 #HT12 +elim (IH … HT12) -IH #HT1 #HT21 #H1T21 +@and3_intro +[2: +*) + +axiom pippos: ∀h,G,L1,L. ⦃G, L1⦄ ⊢⬈*[h] L → ∀T1,T2. ⦃G, L1⦄ ⊢ T1 ⬈[h] T2 → + ∃∃T. ⦃G, L⦄ ⊢ T1 ⬈[h] T & ⦃L, T2⦄ ⊆ ⦃L, T⦄. + +lemma fle_tc_lfxs_trans: ∀h,G,L1,L2,T1. ⦃G, L1⦄ ⊢⬈*[h, T1] L2 → + ∀T2. ⦃L1, T2⦄ ⊆ ⦃L1, T1⦄ → ⦃G, L1⦄ ⊢⬈* [h, T2] L2. +#h #G #L1 #L2 #T1 #H +@(TC_star_ind_dx ???????? H) -L1 /2 width=1 by tc_lfxs_refl, lfxs_refl/ +#L1 #L #HL1 #_ #IH #T2 #HT21 +lapply (fle_lfxs_trans … HT21 … HL1) -HL1 #HL1 +@(TC_strap … HL1) @IH -IH + + +lemma lfpxs_cpx_conf: ∀h,G. s_r_confluent1 … (cpx h G) (lfpxs h G). +#h #G #L1 #T1 #T2 #HT12 #L2 #H +lapply (cpx_fle_comp … HT12) -HT12 #HT21 + +elim (tc_lfxs_inv_lex_lfeq … H) -H #L #HL1 #HL2 +@(lfpxs_lpxs_lfeq … HL1) -HL1 + + +@(fle_lfxs_trans + +elim (pippos … HL1 … HT12) -HT12 #T #H #HT21 +@(lfpxs_lpxs_lfeq … HL1) -HL1 +@(fle_lfxs_trans … HL2) -HL2 // +qed-. + + diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_lpxs.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_lpxs.ma index 93118b9a0..fa56ac09c 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_lpxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lfpxs_lpxs.ma @@ -30,4 +30,4 @@ lemma lfpxs_lpxs_lfeq: ∀h,G,L1,L. ⦃G, L1⦄ ⊢ ⬈*[h] L → lemma tc_lfxs_inv_lex_lfeq: ∀h,G,L1,L2,T. ⦃G, L1⦄ ⊢ ⬈*[h, T] L2 → ∃∃L. ⦃G, L1⦄ ⊢ ⬈*[h] L & L ≡[T] L2. -/3 width=5 by lfpx_fle_comp, lpx_cpxs_trans, lfeq_cpx_trans, tc_lfxs_inv_lex_lfeq/ qed-. +/3 width=5 by lfpx_fsle_comp, lpx_cpxs_trans, lfeq_cpx_trans, tc_lfxs_inv_lex_lfeq/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpm_lfxs.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpm_lfxs.ma index 499a145bf..f59669831 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpm_lfxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpm_lfxs.ma @@ -19,11 +19,11 @@ include "basic_2/rt_transition/cpm_cpx.ma". (* Properties with context-sensitive free variables *************************) -lemma cpm_fle_comp: ∀n,h,G. R_fle_compatible (cpm n h G). -/3 width=6 by cpm_fwd_cpx, cpx_fle_comp/ qed-. +lemma cpm_fsle_comp: ∀n,h,G. R_fsle_compatible (cpm n h G). +/3 width=6 by cpm_fwd_cpx, cpx_fsle_comp/ qed-. -lemma lfpr_fle_comp: ∀h,G. lfxs_fle_compatible (cpm 0 h G). -/4 width=5 by cpm_fwd_cpx, lfpx_fle_comp, lfxs_co/ qed-. +lemma lfpr_fsle_comp: ∀h,G. lfxs_fsle_compatible (cpm 0 h G). +/4 width=5 by cpm_fwd_cpx, lfpx_fsle_comp, lfxs_co/ qed-. (* Properties with generic extension on referred entries ********************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_etc.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_etc.ma index 19999ed9b..2dcee12ee 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_etc.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_etc.ma @@ -12,40 +12,31 @@ (* *) (**************************************************************************) -include "basic_2/static/fle_drops.ma". -include "basic_2/static/fle_fqup.ma". -include "basic_2/static/fle_fle.ma". +include "basic_2/static/fsle_drops.ma". +include "basic_2/static/fsle_fqup.ma". +include "basic_2/static/fsle_fsle.ma". include "basic_2/static/lfxs_length.ma". +include "basic_2/static/lfxs_fsle.ma". include "basic_2/rt_transition/cpx.ma". - -lemma fle_zero_bi: ∀K1,K2. |K1| = |K2| → ∀V1,V2. ⦃K1, V1⦄ ⊆ ⦃K2, V2⦄ → - ∀I1,I2. ⦃K1.ⓑ{I1}V1, #O⦄ ⊆ ⦃K2.ⓑ{I2}V2, #O⦄. -#K1 #K2 #HK #V1 #V2 -* #n1 #n2 #f1 #f2 #Hf1 #Hf2 #HK12 #Hf12 -#I1 #I2 -elim (lveq_inj_length … HK12) // -HK #H1 #H2 destruct -/3 width=12 by frees_pair, lveq_bind, sle_next, ex4_4_intro/ -qed. - (* UNCOUNTED CONTEXT-SENSITIVE PARALLEL RT-TRANSITION FOR TERMS *************) (* Properties with context-sensitive free variables *************************) (* Note: "⦃L2, T1⦄ ⊆ ⦃L0, T1⦄" may not hold *) -axiom cpx_lfxs_conf_fle: ∀R,h. c_reflexive … R → - (∨∨ (∀G. (cpx h G) = R) | R_fle_compatible R) → - ∀G,L0,T0,T1. ⦃G, L0⦄ ⊢ T0 ⬈[h] T1 → - ∀L2. L0 ⪤*[R, T0] L2 → - ∧∧ ⦃L2, T0⦄ ⊆ ⦃L0, T0⦄ & ⦃L2, T1⦄ ⊆ ⦃L2, T0⦄ - & ⦃L0, T1⦄ ⊆ ⦃L0, T0⦄. +axiom cpx_lfxs_conf_fsle: ∀R,h. c_reflexive … R → + (∨∨ (∀G. (cpx h G) = R) | R_fsle_compatible R) → + ∀G,L0,T0,T1. ⦃G, L0⦄ ⊢ T0 ⬈[h] T1 → + ∀L2. L0 ⪤*[R, T0] L2 → + ∧∧ ⦃L2, T0⦄ ⊆ ⦃L0, T0⦄ & ⦃L2, T1⦄ ⊆ ⦃L2, T0⦄ + & ⦃L0, T1⦄ ⊆ ⦃L0, T0⦄. (* #R #h #H1R #H2R #G #L0 #T0 @(fqup_wf_ind_eq (Ⓕ) … G L0 T0) -G -L0 -T0 #G #L #T #IH #G0 #L0 * * [ #s #HG #HL #HT #X #HX #Y #HY destruct -IH lapply (lfxs_fwd_length … HY) -HY #H0 elim (cpx_inv_sort1 … HX) -HX #H destruct - /3 width=1 by fle_sort_length, and3_intro/ + /3 width=1 by fsle_sort_length, and3_intro/ | * [| #i ] #HG #HL #HT #X #HX #Y #HY destruct [ elim (cpx_inv_zero1 … HX) -HX [ #H destruct @@ -56,9 +47,9 @@ axiom cpx_lfxs_conf_fle: ∀R,h. c_reflexive … R → elim H2R -H2R #H2R [ <(H2R G0) in HV02; -H2R #HV02 elim (IH … HV02 … HK02) /2 width=2 by fqu_fqup, fqu_lref_O/ -IH -HV02 -HK02 #H1V #H2V #_ - /4 width=1 by fle_trans_tc, fle_zero_bi, and3_intro/ + /4 width=1 by fsle_trans_tc, fsle_zero_bi, and3_intro/ | lapply (H2R … HV02 … HK02) -H2R -HV02 -HK02 -IH #HKV20 - /3 width=1 by fle_zero_bi, and3_intro/ + /3 width=1 by fsle_zero_bi, and3_intro/ ] | #f #I #K0 #K2 #Hf #HK02 #H1 #H2 destruct ] @@ -72,19 +63,19 @@ axiom cpx_lfxs_conf_fle: ∀R,h. c_reflexive … R → | #I0 #I2 #K0 #K2 #HK02 #H1 #H2 destruct lapply (lfxs_fwd_length … HK02) #HK elim (IH … HK02) [|*: /2 width=4 by fqu_fqup/ ] -IH -HK02 - /3 width=5 by and3_intro, fle_lifts_SO/ + /3 width=5 by and3_intro, fsle_lifts_SO/ ] | * #I0 #K0 #V1 #HV1 #HV1X #H0 destruct elim (lfxs_inv_lref_bind_sn … HY) -HY #I2 #K2 #HK02 #H destruct lapply (lfxs_fwd_length … HK02) #HK elim (IH … HK02) [|*: /2 width=4 by fqu_fqup/ ] -IH -HV1 -HK02 - /3 width=5 by fle_lifts_SO, and3_intro/ + /3 width=5 by fsle_lifts_SO, and3_intro/ ] ] | #l #HG #HL #HT #X #HX #Y #HY destruct -IH lapply (lfxs_fwd_length … HY) -HY #H0 >(cpx_inv_gref1 … HX) -X - /3 width=1 by fle_gref_length, and3_intro/ + /3 width=1 by fsle_gref_length, and3_intro/ | #p #I #V0 #T0 #HG #HL #HT #X #HX #Y #HY destruct lapply (lfxs_fwd_length … HY) #H0 elim (lfxs_inv_bind … V0 ? HY) -HY // #HV0 #HT0 @@ -92,11 +83,11 @@ axiom cpx_lfxs_conf_fle: ∀R,h. c_reflexive … R → [ #V1 #T1 #HV01 #HT01 #H destruct elim (IH … HV01 … HV0) -HV01 -HV0 // #H1V #H2V #H3V elim (IH … HT01 … HT0) -HT01 -HT0 -IH // #H1T #H2T #H3T - /4 width=3 by fle_bind_eq, fle_fwd_pair_sn, and3_intro/ + /4 width=3 by fsle_bind_eq, fsle_fwd_pair_sn, and3_intro/ | #T #HT #HXT #H1 #H2 destruct elim (IH G0 … V0… V0 … HV0) -HV0 // #H1V #H2V #H3V elim (IH … HT … HT0) -HT -HT0 -IH // #H1T #H2T #H3T - /3 width=5 by fle_bind, fle_inv_lifts_sn, and3_intro/ + /3 width=5 by fsle_bind, fsle_inv_lifts_sn, and3_intro/ ] | #I #V0 #X0 #HG #HL #HT #X #HX #Y #HY destruct elim (lfxs_inv_flat … HY) -HY #HV0 #HX0 @@ -104,35 +95,35 @@ axiom cpx_lfxs_conf_fle: ∀R,h. c_reflexive … R → [ #V1 #T1 #HV01 #HT01 #H destruct elim (IH … HV01 … HV0) -HV01 -HV0 // #H1V #H2V #H3V elim (IH … HT01 … HX0) -HT01 -HX0 -IH // #H1T #H2T #H3T - /3 width=3 by fle_flat, and3_intro/ + /3 width=3 by fsle_flat, and3_intro/ | #HX #H destruct elim (IH G0 … V0… V0 … HV0) -HV0 // #H1V #H2V #H3V elim (IH … HX … HX0) -HX -HX0 -IH // #H1T #H2T #H3T - /4 width=3 by fle_flat_sn, fle_flat_dx_dx, fle_flat_dx_sn, and3_intro/ + /4 width=3 by fsle_flat_sn, fsle_flat_dx_dx, fsle_flat_dx_sn, and3_intro/ | #HX #H destruct elim (IH … HX … HV0) -HX -HV0 // #H1V #H2V #H3V elim (IH G0 … X0… X0 … HX0) -HX0 -IH // #H1T #H2T #H3T - /4 width=3 by fle_flat_sn, fle_flat_dx_dx, fle_flat_dx_sn, and3_intro/ + /4 width=3 by fsle_flat_sn, fsle_flat_dx_dx, fsle_flat_dx_sn, and3_intro/ | #p #V1 #W0 #W1 #T0 #T1 #HV01 #HW01 #HT01 #H1 #H2 #H3 destruct elim (lfxs_inv_bind … W0 ? HX0) -HX0 // #HW0 #HT0 elim (IH … HV01 … HV0) -HV01 -HV0 // #H1V #H2V #H3V elim (IH … HW01 … HW0) -HW01 -HW0 // #H1W #H2W #H3W elim (IH … HT01 … HT0) -HT01 -HT0 -IH // #H1T #H2T #H3T - lapply (fle_fwd_pair_sn … H2T) -H2T #H2T - lapply (fle_fwd_pair_sn … H3T) -H3T #H3T - @and3_intro [ /3 width=5 by fle_flat, fle_bind/ ] (**) (* full auto too slow *) - @fle_bind_sn_ge /4 width=1 by fle_shift, fle_flat_sn, fle_flat_dx_dx, fle_flat_dx_sn, fle_bind_dx_sn/ + lapply (fsle_fwd_pair_sn … H2T) -H2T #H2T + lapply (fsle_fwd_pair_sn … H3T) -H3T #H3T + @and3_intro [ /3 width=5 by fsle_flat, fsle_bind/ ] (**) (* full auto too slow *) + @fsle_bind_sn_ge /4 width=1 by fsle_shift, fsle_flat_sn, fsle_flat_dx_dx, fsle_flat_dx_sn, fsle_bind_dx_sn/ | #p #V1 #X1 #W0 #W1 #T0 #T1 #HV01 #HVX1 #HW01 #HT01 #H1 #H2 #H3 destruct elim (lfxs_inv_bind … W0 ? HX0) -HX0 // #HW0 #HT0 elim (IH … HV01 … HV0) -HV01 -HV0 // #H1V #H2V #H3V elim (IH … HW01 … HW0) -HW01 -HW0 // #H1W #H2W #H3W elim (IH … HT01 … HT0) -HT01 -HT0 -IH // #H1T #H2T #H3T - lapply (fle_fwd_pair_sn … H2T) -H2T #H2T - lapply (fle_fwd_pair_sn … H3T) -H3T #H3T - @and3_intro[ /3 width=5 by fle_flat, fle_bind/ ] (**) (* full auto too slow *) - @fle_bind_sn_ge // - [1,3: /3 width=1 by fle_flat_dx_dx, fle_bind_dx_sn/ - |2,4: /4 width=3 by fle_flat_sn, fle_flat_dx_sn, fle_flat_dx_dx, fle_shift, fle_lifts_sn/ + lapply (fsle_fwd_pair_sn … H2T) -H2T #H2T + lapply (fsle_fwd_pair_sn … H3T) -H3T #H3T + @and3_intro[ /3 width=5 by fsle_flat, fsle_bind/ ] (**) (* full auto too slow *) + @fsle_bind_sn_ge // + [1,3: /3 width=1 by fsle_flat_dx_dx, fsle_bind_dx_sn/ + |2,4: /4 width=3 by fsle_flat_sn, fsle_flat_dx_sn, fsle_flat_dx_dx, fsle_shift, fsle_lifts_sn/ ] ] ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_lfxs.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_lfxs.ma index 69eab45f9..78b1302df 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_lfxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_lfxs.ma @@ -17,7 +17,7 @@ include "basic_2/relocation/lexs_length.ma". include "basic_2/relocation/drops_lexs.ma". include "basic_2/static/frees_drops.ma". include "basic_2/static/lsubf_frees.ma". -include "basic_2/static/lfxs.ma". +include "basic_2/static/lfxs_fsle.ma". include "basic_2/rt_transition/cpx_drops.ma". include "basic_2/rt_transition/cpx_ext.ma". @@ -160,7 +160,7 @@ lemma cpx_frees_conf_lexs: ∀h,G,L1,T1,f1. L1 ⊢ 𝐅*⦃T1⦄ ≡ f1 → qed-. (* Basic_2A1: uses: cpx_frees_trans *) -lemma cpx_fle_comp: ∀h,G. R_fle_compatible (cpx h G). +lemma cpx_fsle_comp: ∀h,G. R_fsle_compatible (cpx h G). #h #G #L #T1 #T2 #HT12 elim (frees_total L T1) #f1 #Hf1 elim (cpx_frees_conf_lexs … Hf1 L … HT12) -HT12 @@ -168,7 +168,7 @@ elim (cpx_frees_conf_lexs … Hf1 L … HT12) -HT12 qed-. (* Basic_2A1: uses: lpx_frees_trans *) -lemma lfpx_fle_comp: ∀h,G. lfxs_fle_compatible (cpx h G). +lemma lfpx_fsle_comp: ∀h,G. lfxs_fsle_compatible (cpx h G). #h #G #L1 #L2 #T * #f1 #Hf1 #HL12 elim (cpx_frees_conf_lexs h … Hf1 … HL12 T) // #f2 #Hf2 lapply (lexs_fwd_length … HL12) diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lfpr_lfpr.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lfpr_lfpr.ma index 3db8912af..d5c4a4a8b 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lfpr_lfpr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lfpr_lfpr.ma @@ -380,7 +380,7 @@ qed-. (* Main properties **********************************************************) theorem lfpr_conf: ∀h,G,T. confluent … (lfpr h G T). -/3 width=6 by cpr_conf_lfpr, lfpr_fle_comp, lfxs_conf/ qed-. +/3 width=6 by cpr_conf_lfpr, lfpr_fsle_comp, lfxs_conf/ qed-. theorem lfpr_bind: ∀h,G,L1,L2,V1. ⦃G, L1⦄ ⊢ ➡[h, V1] L2 → ∀I,V2,T. ⦃G, L1.ⓑ{I}V1⦄ ⊢ ➡[h, T] L2.ⓑ{I}V2 → diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lfpx_lfdeq.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lfpx_lfdeq.ma index 1536a6483..8c997a9d3 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lfpx_lfdeq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lfpx_lfdeq.ma @@ -25,19 +25,19 @@ include "basic_2/rt_transition/lfpx.ma". lemma lfpx_pair_sn_split: ∀h,G,L1,L2,V. ⦃G, L1⦄ ⊢ ⬈[h, V] L2 → ∀o,I,T. ∃∃L. ⦃G, L1⦄ ⊢ ⬈[h, ②{I}V.T] L & L ≛[h, o, V] L2. -/3 width=5 by lfpx_fle_comp, lfxs_pair_sn_split/ qed-. +/3 width=5 by lfpx_fsle_comp, lfxs_pair_sn_split/ qed-. lemma lfpx_flat_dx_split: ∀h,G,L1,L2,T. ⦃G, L1⦄ ⊢ ⬈[h, T] L2 → ∀o,I,V. ∃∃L. ⦃G, L1⦄ ⊢ ⬈[h, ⓕ{I}V.T] L & L ≛[h, o, T] L2. -/3 width=5 by lfpx_fle_comp, lfxs_flat_dx_split/ qed-. +/3 width=5 by lfpx_fsle_comp, lfxs_flat_dx_split/ qed-. lemma lfpx_bind_dx_split: ∀h,I,G,L1,L2,V1,T. ⦃G, L1.ⓑ{I}V1⦄ ⊢ ⬈[h, T] L2 → ∀o,p. ∃∃L,V. ⦃G, L1⦄ ⊢ ⬈[h, ⓑ{p,I}V1.T] L & L.ⓑ{I}V ≛[h, o, T] L2 & ⦃G, L1⦄ ⊢ V1 ⬈[h] V. -/3 width=5 by lfpx_fle_comp, lfxs_bind_dx_split/ qed-. +/3 width=5 by lfpx_fsle_comp, lfxs_bind_dx_split/ qed-. lemma lfpx_bind_dx_split_void: ∀h,G,K1,L2,T. ⦃G, K1.ⓧ⦄ ⊢ ⬈[h, T] L2 → ∀o,p,I,V. ∃∃K2. ⦃G, K1⦄ ⊢ ⬈[h, ⓑ{p,I}V.T] K2 & K2.ⓧ ≛[h, o, T] L2. -/3 width=5 by lfpx_fle_comp, lfxs_bind_dx_split_void/ qed-. +/3 width=5 by lfpx_fsle_comp, lfxs_bind_dx_split_void/ qed-. lemma cpx_tdeq_conf_lexs: ∀h,o,G. R_confluent2_lfxs … (cpx h G) (cdeq h o) (cpx h G) (cdeq h o). #h #o #G #L0 #T0 #T1 #H @(cpx_ind … H) -G -L0 -T0 -T1 /2 width=3 by ex2_intro/ @@ -153,7 +153,7 @@ elim (cpx_lfdeq_conf … o … HT01 L2) -HT01 qed-. lemma lfpx_lfdeq_conf: ∀h,o,G,T. confluent2 … (lfpx h G T) (lfdeq h o T). -/3 width=6 by lfpx_fle_comp, lfdeq_fle_comp, cpx_tdeq_conf_lexs, lfxs_conf/ qed-. +/3 width=6 by lfpx_fsle_comp, lfdeq_fsle_comp, cpx_tdeq_conf_lexs, lfxs_conf/ qed-. (* Basic_2A1: uses: lleq_lpx_trans *) lemma lfdeq_lfpx_trans: ∀h,o,G,T,L2,K2. ⦃G, L2⦄ ⊢ ⬈[h, T] K2 → diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/fle.ma b/matita/matita/contribs/lambdadelta/basic_2/static/fle.ma index 921c37b88..cfc4778db 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/fle.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/fle.ma @@ -12,24 +12,9 @@ (* *) (**************************************************************************) -include "ground_2/relocation/rtmap_id.ma". -include "basic_2/notation/relations/subseteq_4.ma". -include "basic_2/syntax/lveq.ma". -include "basic_2/static/frees.ma". +include "basic_2/static/fsle.ma". -(* FREE VARIABLES INCLUSION FOR RESTRICTED CLOSURES *************************) +(* FREE VARIABLES INCLUSION FOR TERMS ***************************************) -definition fle: bi_relation lenv term ≝ λL1,T1,L2,T2. - ∃∃n1,n2,f1,f2. L1 ⊢ 𝐅*⦃T1⦄ ≡ f1 & L2 ⊢ 𝐅*⦃T2⦄ ≡ f2 & - L1 ≋ⓧ*[n1, n2] L2 & ⫱*[n1]f1 ⊆ ⫱*[n2]f2. - -interpretation "free variables inclusion (restricted closure)" - 'SubSetEq L1 T1 L2 T2 = (fle L1 T1 L2 T2). - -(* Basic properties *********************************************************) - -lemma fle_sort: ∀L,s1,s2. ⦃L, ⋆s1⦄ ⊆ ⦃L, ⋆s2⦄. -/3 width=8 by frees_sort, sle_refl, ex4_4_intro/ qed. - -lemma fle_gref: ∀L,l1,l2. ⦃L, §l1⦄ ⊆ ⦃L, §l2⦄. -/3 width=8 by frees_gref, sle_refl, ex4_4_intro/ qed. +interpretation "free variables inclusion (term)" + 'subseteq T1 T2 = (fsle LAtom T1 LAtom T2). diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/frees_drops.ma b/matita/matita/contribs/lambdadelta/basic_2/static/frees_drops.ma index f24e50785..096683f57 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/frees_drops.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/frees_drops.ma @@ -191,6 +191,7 @@ lemma frees_inv_lifts: ∀b,f2,L,U. L ⊢ 𝐅*⦃U⦄ ≡ f2 → /3 width=7 by frees_eq_repl_back, coafter_inj/ qed-. +(* Note: this is used by lfxs_conf and might be modified *) lemma frees_inv_drops_next: ∀f1,L1,T1. L1 ⊢ 𝐅*⦃T1⦄ ≡ f1 → ∀I2,L2,V2,n. ⬇*[n] L1 ≡ L2.ⓑ{I2}V2 → ∀g1. ⫯g1 = ⫱*[n] f1 → diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/frees_fqup.ma b/matita/matita/contribs/lambdadelta/basic_2/static/frees_fqup.ma index 9bbc83a89..e7fcf4eb8 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/frees_fqup.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/frees_fqup.ma @@ -99,3 +99,52 @@ elim (pn_split f0) * #g0 #H destruct /2 width=3 by sor_comm_23_idem/ ] qed-. + +lemma frees_ind_void: ∀R:relation3 …. + ( + ∀f,L,s. 𝐈⦃f⦄ → R L (⋆s) f + ) → ( + ∀f,i. 𝐈⦃f⦄ → R (⋆) (#i) (↑*[i]⫯f) + ) → ( + ∀f,I,L,V. + L ⊢ 𝐅*⦃V⦄ ≡ f → R L V f→ R (L.ⓑ{I}V) (#O) (⫯f) + ) → ( + ∀f,I,L. 𝐈⦃f⦄ → R (L.ⓤ{I}) (#O) (⫯f) + ) → ( + ∀f,I,L,i. + L ⊢ 𝐅*⦃#i⦄ ≡ f → R L (#i) f → R (L.ⓘ{I}) (#(⫯i)) (↑f) + ) → ( + ∀f,L,l. 𝐈⦃f⦄ → R L (§l) f + ) → ( + ∀f1,f2,f,p,I,L,V,T. + L ⊢ 𝐅*⦃V⦄ ≡ f1 → L.ⓧ ⊢𝐅*⦃T⦄≡ f2 → f1 ⋓ ⫱f2 ≡ f → + R L V f1 →R (L.ⓧ) T f2 → R L (ⓑ{p,I}V.T) f + ) → ( + ∀f1,f2,f,I,L,V,T. + L ⊢ 𝐅*⦃V⦄ ≡ f1 → L ⊢𝐅*⦃T⦄ ≡ f2 → f1 ⋓ f2 ≡ f → + R L V f1 → R L T f2 → R L (ⓕ{I}V.T) f + ) → + ∀L,T,f. L ⊢ 𝐅*⦃T⦄ ≡ f → R L T f. +#R #IH1 #IH2 #IH3 #IH4 #IH5 #IH6 #IH7 #IH8 #L #T +@(fqup_wf_ind_eq (Ⓕ) … (⋆) L T) -L -T #G0 #L0 #T0 #IH #G #L * * +[ #s #HG #HL #HT #f #H destruct -IH + lapply (frees_inv_sort … H) -H /2 width=1 by/ +| cases L -L + [ #i #HG #HL #HT #f #H destruct -IH + elim (frees_inv_atom … H) -H #g #Hg #H destruct /2 width=1 by/ + | #L #I * [ cases I -I #I [ | #V ] | #i ] #HG #HL #HT #f #H destruct + [ elim (frees_inv_unit … H) -H #g #Hg #H destruct /2 width=1 by/ + | elim (frees_inv_pair … H) -H #g #Hg #H destruct + /4 width=2 by fqu_fqup, fqu_lref_O/ + | elim (frees_inv_lref … H) -H #g #Hg #H destruct + /4 width=2 by fqu_fqup/ + ] + ] +| #l #HG #HL #HT #f #H destruct -IH + lapply (frees_inv_gref … H) -H /2 width=1 by/ +| #p #I #V #T #HG #HL #HT #f #H destruct + elim (frees_inv_bind_void … H) -H /3 width=7 by/ +| #I #V #T #HG #HL #HT #f #H destruct + elim (frees_inv_flat … H) -H /3 width=7 by/ +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/fsle.ma b/matita/matita/contribs/lambdadelta/basic_2/static/fsle.ma new file mode 100644 index 000000000..e0ef144b5 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/static/fsle.ma @@ -0,0 +1,38 @@ +(**************************************************************************) +(* ___ *) +(* ||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/relocation/rtmap_id.ma". +include "basic_2/notation/relations/subseteq_4.ma". +include "basic_2/syntax/lveq.ma". +include "basic_2/static/frees.ma". + +(* FREE VARIABLES INCLUSION FOR RESTRICTED CLOSURES *************************) + +definition fsle: bi_relation lenv term ≝ λL1,T1,L2,T2. + ∃∃n1,n2,f1,f2. L1 ⊢ 𝐅*⦃T1⦄ ≡ f1 & L2 ⊢ 𝐅*⦃T2⦄ ≡ f2 & + L1 ≋ⓧ*[n1, n2] L2 & ⫱*[n1]f1 ⊆ ⫱*[n2]f2. + +interpretation "free variables inclusion (restricted closure)" + 'SubSetEq L1 T1 L2 T2 = (fsle L1 T1 L2 T2). + +interpretation "free variables inclusion (term)" + 'subseteq T1 T2 = (fsle LAtom T1 LAtom T2). + +(* Basic properties *********************************************************) + +lemma fsle_sort: ∀L,s1,s2. ⦃L, ⋆s1⦄ ⊆ ⦃L, ⋆s2⦄. +/3 width=8 by frees_sort, sle_refl, ex4_4_intro/ qed. + +lemma fsle_gref: ∀L,l1,l2. ⦃L, §l1⦄ ⊆ ⦃L, §l2⦄. +/3 width=8 by frees_gref, sle_refl, ex4_4_intro/ qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/fle_drops.ma b/matita/matita/contribs/lambdadelta/basic_2/static/fsle_drops.ma similarity index 76% rename from matita/matita/contribs/lambdadelta/basic_2/static/fle_drops.ma rename to matita/matita/contribs/lambdadelta/basic_2/static/fsle_drops.ma index c64e197ef..273a2755a 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/fle_drops.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/fsle_drops.ma @@ -12,16 +12,15 @@ (* *) (**************************************************************************) -include "basic_2/syntax/lveq_length.ma". include "basic_2/static/frees_drops.ma". -include "basic_2/static/fle.ma". +include "basic_2/static/fsle_length.ma". (* FREE VARIABLES INCLUSION FOR RESTRICTED CLOSURES *************************) (* Advanced properties ******************************************************) -lemma fle_lifts_sn: ∀T1,U1. ⬆*[1] T1 ≡ U1 → ∀L1,L2. |L2| ≤ |L1| → - ∀T2. ⦃L1, T1⦄ ⊆ ⦃L2, T2⦄ → ⦃L1.ⓧ, U1⦄ ⊆ ⦃L2, T2⦄. +lemma fsle_lifts_sn: ∀T1,U1. ⬆*[1] T1 ≡ U1 → ∀L1,L2. |L2| ≤ |L1| → + ∀T2. ⦃L1, T1⦄ ⊆ ⦃L2, T2⦄ → ⦃L1.ⓧ, U1⦄ ⊆ ⦃L2, T2⦄. #T1 #U1 #HTU1 #L1 #L2 #H1L #T2 * #n #m #f #g #Hf #Hg #H2L #Hfg lapply (lveq_length_fwd_dx … H2L ?) // -H1L #H destruct @@ -30,9 +29,9 @@ lapply (frees_lifts_SO (Ⓣ) (L1.ⓧ) … HTU1 … Hf) @(ex4_4_intro … Hf Hg) /2 width=4 by lveq_void_sn/ (**) (* explict constructor *) qed-. -lemma fle_lifts_SO: ∀K1,K2. |K1| = |K2| → ∀T1,T2. ⦃K1, T1⦄ ⊆ ⦃K2, T2⦄ → - ∀U1,U2. ⬆*[1] T1 ≡ U1 → ⬆*[1] T2 ≡ U2 → - ∀I1,I2. ⦃K1.ⓘ{I1}, U1⦄ ⊆ ⦃K2.ⓘ{I2}, U2⦄. +lemma fsle_lifts_SO: ∀K1,K2. |K1| = |K2| → ∀T1,T2. ⦃K1, T1⦄ ⊆ ⦃K2, T2⦄ → + ∀U1,U2. ⬆*[1] T1 ≡ U1 → ⬆*[1] T2 ≡ U2 → + ∀I1,I2. ⦃K1.ⓘ{I1}, U1⦄ ⊆ ⦃K2.ⓘ{I2}, U2⦄. #K1 #K2 #HK #T1 #T2 * #n1 #n2 #f1 #f2 #Hf1 #Hf2 #HK12 #Hf12 #U1 #U2 #HTU1 #HTU2 #I1 #I2 @@ -42,9 +41,9 @@ qed. (* Advanced inversion lemmas ************************************************) -lemma fle_inv_lifts_sn: ∀T1,U1. ⬆*[1] T1 ≡ U1 → - ∀I1,I2,L1,L2,V1,V2,U2. ⦃L1.ⓑ{I1}V1,U1⦄ ⊆ ⦃L2.ⓑ{I2}V2, U2⦄ → - ∀p. ⦃L1, T1⦄ ⊆ ⦃L2, ⓑ{p,I2}V2.U2⦄. +lemma fsle_inv_lifts_sn: ∀T1,U1. ⬆*[1] T1 ≡ U1 → + ∀I1,I2,L1,L2,V1,V2,U2. ⦃L1.ⓑ{I1}V1,U1⦄ ⊆ ⦃L2.ⓑ{I2}V2, U2⦄ → + ∀p. ⦃L1, T1⦄ ⊆ ⦃L2, ⓑ{p,I2}V2.U2⦄. #T1 #U1 #HTU1 #I1 #I2 #L1 #L2 #V1 #V2 #U2 * #n #m #f2 #g2 #Hf2 #Hg2 #HL #Hfg2 #p elim (lveq_inv_pair_pair … HL) -HL #HL #H1 #H2 destruct diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/fle_fqup.ma b/matita/matita/contribs/lambdadelta/basic_2/static/fsle_fqup.ma similarity index 71% rename from matita/matita/contribs/lambdadelta/basic_2/static/fle_fqup.ma rename to matita/matita/contribs/lambdadelta/basic_2/static/fsle_fqup.ma index b50fa075d..84be1fe43 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/fle_fqup.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/fsle_fqup.ma @@ -12,29 +12,22 @@ (* *) (**************************************************************************) -include "basic_2/syntax/lveq_length.ma". include "basic_2/static/frees_fqup.ma". -include "basic_2/static/fle.ma". +include "basic_2/static/fsle_length.ma". (* FREE VARIABLES INCLUSION FOR RESTRICTED CLOSURES *************************) (* Advanced properties ******************************************************) -lemma fle_refl: bi_reflexive … fle. +lemma fsle_refl: bi_reflexive … fsle. #L #T elim (frees_total L T) #f #Hf /2 width=8 by sle_refl, ex4_4_intro/ qed. -lemma fle_sort_length: ∀L1,L2,s1,s2. |L1| = |L2| → ⦃L1, ⋆s1⦄ ⊆ ⦃L2, ⋆s2⦄. -/3 width=8 by lveq_length_eq, frees_sort, sle_refl, ex4_4_intro/ qed. - -lemma fle_gref_length: ∀L1,L2,l1,l2. |L1| = |L2| → ⦃L1, §l1⦄ ⊆ ⦃L2, §l2⦄. -/3 width=8 by lveq_length_eq, frees_gref, sle_refl, ex4_4_intro/ qed. - -lemma fle_shift: ∀L1,L2. |L1| = |L2| → - ∀I,T1,T2,V. ⦃L1.ⓧ, T1⦄ ⊆ ⦃L2.ⓑ{I}V, T2⦄ → - ∀p. ⦃L1.ⓧ, T1⦄ ⊆ ⦃L2, ⓑ{p,I}V.T2⦄. +lemma fsle_shift: ∀L1,L2. |L1| = |L2| → + ∀I,T1,T2,V. ⦃L1.ⓧ, T1⦄ ⊆ ⦃L2.ⓑ{I}V, T2⦄ → + ∀p. ⦃L1.ⓧ, T1⦄ ⊆ ⦃L2, ⓑ{p,I}V.T2⦄. #L1 #L2 #H1L #I #T1 #T2 #V * #n #m #f2 #g2 #Hf2 #Hg2 #H2L #Hfg2 #p elim (lveq_inj_length … H2L) // -H1L #H1 #H2 destruct @@ -45,8 +38,8 @@ lapply (sor_inv_sle_dx … Hg) #H0g /4 width=10 by frees_bind, lveq_void_sn, sle_tl, sle_trans, ex4_4_intro/ qed. -lemma fle_bind_dx_sn: ∀L1,L2,V1,V2. ⦃L1, V1⦄ ⊆ ⦃L2, V2⦄ → - ∀p,I,T2. ⦃L1, V1⦄ ⊆ ⦃L2, ⓑ{p,I}V2.T2⦄. +lemma fsle_bind_dx_sn: ∀L1,L2,V1,V2. ⦃L1, V1⦄ ⊆ ⦃L2, V2⦄ → + ∀p,I,T2. ⦃L1, V1⦄ ⊆ ⦃L2, ⓑ{p,I}V2.T2⦄. #L1 #L2 #V1 #V2 * #n1 #m1 #f1 #g1 #Hf1 #Hg1 #HL12 #Hfg1 #p #I #T2 elim (frees_total (L2.ⓧ) T2) #g2 #Hg2 elim (sor_isfin_ex g1 (⫱g2)) /3 width=3 by frees_fwd_isfin, isfin_tl/ #g #Hg #_ @@ -54,8 +47,8 @@ elim (sor_isfin_ex g1 (⫱g2)) /3 width=3 by frees_fwd_isfin, isfin_tl/ #g #Hg # /4 width=5 by frees_bind_void, sor_inv_sle_sn, sor_tls, sle_trans/ qed. -lemma fle_bind_dx_dx: ∀L1,L2,T1,T2. ⦃L1, T1⦄ ⊆ ⦃L2.ⓧ, T2⦄ → |L1| ≤ |L2| → - ∀p,I,V2. ⦃L1, T1⦄ ⊆ ⦃L2, ⓑ{p,I}V2.T2⦄. +lemma fsle_bind_dx_dx: ∀L1,L2,T1,T2. ⦃L1, T1⦄ ⊆ ⦃L2.ⓧ, T2⦄ → |L1| ≤ |L2| → + ∀p,I,V2. ⦃L1, T1⦄ ⊆ ⦃L2, ⓑ{p,I}V2.T2⦄. #L1 #L2 #T1 #T2 * #n1 #x1 #f2 #g2 #Hf2 #Hg2 #H #Hfg2 #HL12 #p #I #V2 elim (lveq_inv_void_dx_length … H HL12) -H -HL12 #m1 #HL12 #H1 #H2 destruct (lfxs_inv_atom_sn … H2) -L2 + /2 width=1 by frees_atom/ +| #f #I #L1 #V1 #_ #IH #Y #H2 + elim (lfeq_inv_zero_pair_sn … H2) -H2 #L2 #HL12 #H destruct + /3 width=1 by frees_pair/ +| #f #I #L1 #Hf #Y #H2 + elim (lfxs_inv_zero_unit_sn … H2) -H2 #g #L2 #_ #_ #H destruct + /2 width=1 by frees_unit/ +| #f #I #L1 #i #_ #IH #Y #H2 + elim (lfeq_inv_lref_bind_sn … H2) -H2 #J #L2 #HL12 #H destruct + /3 width=1 by frees_lref/ +| /2 width=1 by frees_gref/ +| #f1V #f1T #f1 #p #I #L1 #V1 #T1 #_ #_ #Hf1 #IHV #IHT #L2 #H2 + elim (lfeq_inv_bind … H2) -H2 /3 width=5 by frees_bind/ +| #f1V #f1T #f1 #I #L1 #V1 #T1 #_ #_ #Hf1 #IHV #IHT #L2 #H2 + elim (lfeq_inv_flat … H2) -H2 /3 width=5 by frees_flat/ +] +qed-. + (* Basic_2A1: removed theorems 10: lleq_ind lleq_fwd_lref lleq_fwd_drop_sn lleq_fwd_drop_dx diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/lfxs.ma b/matita/matita/contribs/lambdadelta/basic_2/static/lfxs.ma index 0e7e900d5..f3f64b5ff 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/lfxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/lfxs.ma @@ -12,10 +12,11 @@ (* *) (**************************************************************************) +include "ground_2/relocation/rtmap_id.ma". include "basic_2/notation/relations/relationstar_4.ma". include "basic_2/syntax/cext2.ma". include "basic_2/relocation/lexs.ma". -include "basic_2/static/fle.ma". +include "basic_2/static/frees.ma". (* GENERIC EXTENSION ON REFERRED ENTRIES OF A CONTEXT-SENSITIVE REALTION ****) @@ -25,12 +26,6 @@ definition lfxs (R) (T): relation lenv ≝ interpretation "generic extension on referred entries (local environment)" 'RelationStar R T L1 L2 = (lfxs R T L1 L2). -definition R_fle_compatible: predicate (relation3 …) ≝ λRN. - ∀L,T1,T2. RN L T1 T2 → ⦃L, T2⦄ ⊆ ⦃L, T1⦄. - -definition lfxs_fle_compatible: predicate (relation3 …) ≝ λRN. - ∀L1,L2,T. L1 ⪤*[RN, T] L2 → ⦃L2, T⦄ ⊆ ⦃L1, T⦄. - definition R_confluent2_lfxs: relation4 (relation3 lenv term term) (relation3 lenv term term) … ≝ λR1,R2,RP1,RP2. diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/lfxs_fsle.ma b/matita/matita/contribs/lambdadelta/basic_2/static/lfxs_fsle.ma new file mode 100644 index 000000000..0f3d67132 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/static/lfxs_fsle.ma @@ -0,0 +1,24 @@ +(**************************************************************************) +(* ___ *) +(* ||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/fsle.ma". +include "basic_2/static/lfxs.ma". + +(* GENERIC EXTENSION ON REFERRED ENTRIES OF A CONTEXT-SENSITIVE REALTION ****) + +definition R_fsle_compatible: predicate (relation3 …) ≝ λRN. + ∀L,T1,T2. RN L T1 T2 → ⦃L, T2⦄ ⊆ ⦃L, T1⦄. + +definition lfxs_fsle_compatible: predicate (relation3 …) ≝ λRN. + ∀L1,L2,T. L1 ⪤*[RN, T] L2 → ⦃L2, T⦄ ⊆ ⦃L1, T⦄. diff --git a/matita/matita/contribs/lambdadelta/basic_2/static/lfxs_lfxs.ma b/matita/matita/contribs/lambdadelta/basic_2/static/lfxs_lfxs.ma index f827a1f20..cdf65c7c0 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/static/lfxs_lfxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/static/lfxs_lfxs.ma @@ -15,8 +15,8 @@ include "basic_2/relocation/lexs_length.ma". include "basic_2/relocation/lexs_lexs.ma". include "basic_2/static/frees_drops.ma". -include "basic_2/static/fle_fle.ma". -include "basic_2/static/lfxs.ma". +include "basic_2/static/fsle_fsle.ma". +include "basic_2/static/lfxs_fsle.ma". (* GENERIC EXTENSION ON REFERRED ENTRIES OF A CONTEXT-SENSITIVE REALTION ****) @@ -27,13 +27,13 @@ lemma lfxs_inv_frees: ∀R,L1,L2,T. L1 ⪤*[R, T] L2 → #R #L1 #L2 #T * /3 width=6 by frees_mono, lexs_eq_repl_back/ qed-. -lemma frees_lexs_conf: ∀R. lfxs_fle_compatible R → +lemma frees_lexs_conf: ∀R. lfxs_fsle_compatible R → ∀L1,T,f1. L1 ⊢ 𝐅*⦃T⦄ ≡ f1 → ∀L2. L1 ⪤*[cext2 R, cfull, f1] L2 → ∃∃f2. L2 ⊢ 𝐅*⦃T⦄ ≡ f2 & f2 ⊆ f1. #R #HR #L1 #T #f1 #Hf1 #L2 #H1L lapply (HR L1 L2 T ?) /2 width=3 by ex2_intro/ #H2L -@(fle_frees_trans_eq … H2L … Hf1) /3 width=4 by lexs_fwd_length, sym_eq/ +@(fsle_frees_trans_eq … H2L … Hf1) /3 width=4 by lexs_fwd_length, sym_eq/ qed-. (* Properties with free variables inclusion for restricted closures *********) @@ -48,7 +48,7 @@ qed-. (* Advanced properties ******************************************************) -lemma lfxs_sym: ∀R. lfxs_fle_compatible R → +lemma lfxs_sym: ∀R. lfxs_fsle_compatible R → (∀L1,L2,T1,T2. R L1 T1 T2 → R L2 T2 T1) → ∀T. symmetric … (lfxs R T). #R #H1R #H2R #T #L1 #L2 @@ -67,7 +67,7 @@ elim (lexs_dec (cext2 R) cfull … L1 L2 f) qed-. lemma lfxs_pair_sn_split: ∀R1,R2. (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → - lfxs_fle_compatible R1 → + lfxs_fsle_compatible R1 → ∀L1,L2,V. L1 ⪤*[R1, V] L2 → ∀I,T. ∃∃L. L1 ⪤*[R1, ②{I}V.T] L & L ⪤*[R2, V] L2. #R1 #R2 #HR1 #HR2 #HR #L1 #L2 #V * #f #Hf #HL12 * [ #p ] #I #T @@ -86,7 +86,7 @@ elim (frees_lexs_conf … Hf … H) -Hf -H qed-. lemma lfxs_flat_dx_split: ∀R1,R2. (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → - lfxs_fle_compatible R1 → + lfxs_fsle_compatible R1 → ∀L1,L2,T. L1 ⪤*[R1, T] L2 → ∀I,V. ∃∃L. L1 ⪤*[R1, ⓕ{I}V.T] L & L ⪤*[R2, T] L2. #R1 #R2 #HR1 #HR2 #HR #L1 #L2 #T * #f #Hf #HL12 #I #V @@ -102,7 +102,7 @@ elim (frees_lexs_conf … Hf … H) -Hf -H qed-. lemma lfxs_bind_dx_split: ∀R1,R2. (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → - lfxs_fle_compatible R1 → + lfxs_fsle_compatible R1 → ∀I,L1,L2,V1,T. L1.ⓑ{I}V1 ⪤*[R1, T] L2 → ∀p. ∃∃L,V. L1 ⪤*[R1, ⓑ{p,I}V1.T] L & L.ⓑ{I}V ⪤*[R2, T] L2 & R1 L1 V1 V. #R1 #R2 #HR1 #HR2 #HR #I #L1 #L2 #V1 #T * #f #Hf #HL12 #p @@ -122,7 +122,7 @@ elim (frees_lexs_conf … Hf … H0) -Hf -H0 qed-. lemma lfxs_bind_dx_split_void: ∀R1,R2. (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → - lfxs_fle_compatible R1 → + lfxs_fsle_compatible R1 → ∀L1,L2,T. L1.ⓧ ⪤*[R1, T] L2 → ∀p,I,V. ∃∃L. L1 ⪤*[R1, ⓑ{p,I}V.T] L & L.ⓧ ⪤*[R2, T] L2. #R1 #R2 #HR1 #HR2 #HR #L1 #L2 #T * #f #Hf #HL12 #p #I #V @@ -169,8 +169,8 @@ lapply (lexs_fwd_bind … Hf2) -Hf2 #Hf2 elim (sor_isfin_ex f1 (⫱f2)) qed. theorem lfxs_conf: ∀R1,R2. - lfxs_fle_compatible R1 → - lfxs_fle_compatible R2 → + lfxs_fsle_compatible R1 → + lfxs_fsle_compatible R2 → R_confluent2_lfxs R1 R2 R1 R2 → ∀T. confluent2 … (lfxs R1 T) (lfxs R2 T). #R1 #R2 #HR1 #HR2 #HR12 #T #L0 #L1 * #f1 #Hf1 #HL01 #L2 * #f #Hf #HL02 diff --git a/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_sor.ma b/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_sor.ma index 7c5dc5435..864f3dcb9 100644 --- a/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_sor.ma +++ b/matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_sor.ma @@ -289,7 +289,14 @@ qed-. lemma sor_xnx_tl: ∀g1,g2,g. g1 ⋓ g2 ≡ g → ∀f2. ⫯f2 = g2 → ∃∃f1,f. f1 ⋓ f2 ≡ f & ⫱g1 = f1 & ⫯f = g. #g1 elim (pn_split g1) * #f1 #H1 #g2 #g #H #f2 #H2 -[ elim (sor_inv_pnx … H … H1 H2) | elim (sor_inv_nnx … H … H1 H2) ] -g2 #f #Hf #H0 +[ elim (sor_inv_pnx … H … H1 H2) | elim (sor_inv_nnx … H … H1 H2) ] -g2 +/3 width=5 by ex3_2_intro/ +qed-. + +lemma sor_nxx_tl: ∀g1,g2,g. g1 ⋓ g2 ≡ g → ∀f1. ⫯f1 = g1 → + ∃∃f2,f. f1 ⋓ f2 ≡ f & ⫱g2 = f2 & ⫯f = g. +#g1 #g2 elim (pn_split g2) * #f2 #H2 #g #H #f1 #H1 +[ elim (sor_inv_npx … H … H1 H2) | elim (sor_inv_nnx … H … H1 H2) ] -g1 /3 width=5 by ex3_2_intro/ qed-. diff --git a/matita/matita/matita.lang b/matita/matita/matita.lang index 399d5631b..3caf034a3 100644 --- a/matita/matita/matita.lang +++ b/matita/matita/matita.lang @@ -90,22 +90,22 @@ axiom - apply - applyS - cases - letin - auto - elim - whd - normalize - assumption - generalize - change - rewrite - cut + apply + applyS + cases + letin + auto + elim + whd + normalize + assumption + generalize + change + rewrite + cut inversion lapply - destruct + destruct alias @@ -116,23 +116,24 @@ prefer nocomposites coinductive - constraint + constraint corec cyclic default discriminator for + id include include' inductive inverter in interpretation - left + left let match names - non + non notation on precedence @@ -141,14 +142,15 @@ rec record return - right - source + right + source + symbol to - universe + universe using with - - + + unification hint @@ -166,7 +168,7 @@ coercions comments debug - + try solve -- 2.39.2