]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/basic_2/substitution/ldrop_sfr.ma
- lambda_delta: programmed renaming to lambdadelta
[helm.git] / matita / matita / contribs / lambdadelta / basic_2 / substitution / ldrop_sfr.ma
1 (**************************************************************************)
2 (*       ___                                                              *)
3 (*      ||M||                                                             *)
4 (*      ||A||       A project by Andrea Asperti                           *)
5 (*      ||T||                                                             *)
6 (*      ||I||       Developers:                                           *)
7 (*      ||T||         The HELM team.                                      *)
8 (*      ||A||         http://helm.cs.unibo.it                             *)
9 (*      \   /                                                             *)
10 (*       \ /        This file is distributed under the terms of the       *)
11 (*        v         GNU General Public License Version 2                  *)
12 (*                                                                        *)
13 (**************************************************************************)
14
15 include "basic_2/substitution/lsubs_sfr.ma".
16 include "basic_2/substitution/ldrop_ldrop.ma".
17
18 (* DROPPING *****************************************************************)
19
20 (* Inversion lemmas about local env. full refinement for substitution *******)
21
22 (* Note: ldrop_ldrop not needed *)
23 lemma sfr_inv_ldrop: ∀I,L,K,V,i. ⇩[0, i] L ≡ K. ⓑ{I}V → ∀d,e. ≽ [d, e] L →
24                      d ≤ i → i < d + e → I = Abbr.
25 #I #L elim L -L
26 [ #K #V #i #H
27   lapply (ldrop_inv_atom1 … H) -H #H destruct
28 | #L #J #W #IHL #K #V #i #H
29   elim (ldrop_inv_O1 … H) -H *
30   [ -IHL #H1 #H2 #d #e #HL #Hdi #Hide destruct
31     lapply (le_n_O_to_eq … Hdi) -Hdi #H destruct
32     lapply (HL … (L.ⓓW) ?) -HL /2 width=1/ #H
33     elim (lsubs_inv_abbr2 … H ?) -H // -Hide #K #_ #H destruct //
34   | #Hi #HLK #d @(nat_ind_plus … d) -d
35     [ #e #H #_ #Hide
36       elim (sfr_inv_bind … H ?) -H [2: /2 width=2/ ] #HL #H destruct
37       @(IHL … HLK … HL) -IHL -HLK -HL // /2 width=1/
38     | #d #_ #e #H #Hdi #Hide
39       lapply (sfr_inv_skip … H ?) -H // #HL
40       @(IHL … HLK … HL) -IHL -HLK -HL /2 width=1/
41     ]
42   ]
43 ]
44 qed-.
45
46 (* Properties about local env. full refinement for substitution *************)
47
48 (* Note: ldrop_ldrop not needed *)
49 lemma sfr_ldrop: ∀L,d,e.
50                  (∀I,K,V,i. d ≤ i → i < d + e → ⇩[0, i] L ≡ K. ⓑ{I}V → I = Abbr) →
51                  ≽ [d, e] L.
52 #L elim L -L //
53 #L #I #V #IHL #d @(nat_ind_plus … d) -d
54 [ #e @(nat_ind_plus … e) -e //
55   #e #_ #HH
56   >(HH I L V 0 ? ? ?) // /5 width=6/
57 | /5 width=6/
58 ]
59 qed.
60
61 lemma sfr_ldrop_trans_le: ∀L1,L2,d,e. ⇩[d, e] L1 ≡ L2 → ∀dd,ee. ≽ [dd, ee] L1 → 
62                           dd + ee ≤ d → ≽ [dd, ee] L2.
63 #L1 #L2 #d #e #HL12 #dd #ee #HL1 #Hddee
64 @sfr_ldrop #I #K2 #V2 #i #Hddi #Hiddee #HLK2
65 lapply (lt_to_le_to_lt … Hiddee Hddee) -Hddee #Hid
66 elim (ldrop_trans_le … HL12 … HLK2 ?) -L2 /2 width=2/ #X #HLK1 #H
67 elim (ldrop_inv_skip2 … H ?) -H /2 width=1/ -Hid #K1 #V1 #HK12 #HV21 #H destruct
68 @(sfr_inv_ldrop … HLK1 … HL1) -L1 -K1 -V1 //
69 qed.
70
71 lemma sfr_ldrop_trans_be_up: ∀L1,L2,d,e. ⇩[d, e] L1 ≡ L2 →
72                              ∀dd,ee. ≽ [dd, ee] L1 →
73                              dd ≤ d + e → d + e ≤ dd + ee →
74                              ≽ [d, dd + ee - d - e] L2.
75 #L1 #L2 #d #e #HL12 #dd #ee #HL1 #Hdde #Hddee
76 @sfr_ldrop #I #K2 #V2 #i #Hdi #Hiddee #HLK2
77 lapply (transitive_le ? ? (i+e)… Hdde ?) -Hdde /2 width=1/ #Hddie
78 >commutative_plus in Hiddee; >minus_minus_comm <plus_minus_m_m /2 width=1/ -Hddee #Hiddee
79 lapply (ldrop_trans_ge … HL12 … HLK2 ?) -L2 // -Hdi  #HL1K2
80 @(sfr_inv_ldrop … HL1K2 … HL1) -L1 >commutative_plus // -Hddie /2 width=1/
81 qed.
82
83 lemma sfr_ldrop_trans_ge: ∀L1,L2,d,e. ⇩[d, e] L1 ≡ L2 → ∀dd,ee. ≽ [dd, ee] L1 → 
84                           d + e ≤ dd → ≽ [dd - e, ee] L2.
85 #L1 #L2 #d #e #HL12 #dd #ee #HL1 #Hddee
86 @sfr_ldrop #I #K2 #V2 #i #Hddi #Hiddee #HLK2
87 elim (le_inv_plus_l … Hddee) -Hddee #Hdde #Hedd
88 >plus_minus in Hiddee; // #Hiddee
89 lapply (transitive_le … Hdde Hddi) -Hdde #Hid
90 lapply (ldrop_trans_ge … HL12 … HLK2 ?) -L2 // -Hid #HL1K2
91 @(sfr_inv_ldrop … HL1K2 … HL1) -L1 >commutative_plus /2 width=1/
92 qed.