]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/basic_2/etc_2A1/cpr/tpss_tpss.etc
update in binaries for λδ
[helm.git] / matita / matita / contribs / lambdadelta / basic_2 / etc_2A1 / cpr / tpss_tpss.etc
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/tps_tps.ma".
16 include "basic_2/unfold/tpss_lift.ma".
17
18 (* PARTIAL UNFOLD ON TERMS **************************************************)
19
20 (* Advanced inversion lemmas ************************************************)
21
22 lemma tpss_inv_SO2: ∀L,T1,T2,d. L ⊢ T1 ▶* [d, 1] T2 → L ⊢ T1 ▶ [d, 1] T2.
23 #L #T1 #T2 #d #H @(tpss_ind … H) -T2 //
24 #T #T2 #_ #HT2 #IHT1
25 lapply (tps_trans_ge … IHT1 … HT2 ?) //
26 qed-.
27
28 (* Advanced properties ******************************************************)
29
30 lemma tpss_strip_eq: ∀L,T0,T1,d1,e1. L ⊢ T0 ▶* [d1, e1] T1 →
31                      ∀T2,d2,e2. L ⊢ T0 ▶ [d2, e2] T2 →
32                      ∃∃T. L ⊢ T1 ▶ [d2, e2] T & L ⊢ T2 ▶* [d1, e1] T.
33 /3 width=3/ qed.
34
35 lemma tpss_strip_neq: ∀L1,T0,T1,d1,e1. L1 ⊢ T0 ▶* [d1, e1] T1 →
36                       ∀L2,T2,d2,e2. L2 ⊢ T0 ▶ [d2, e2] T2 →
37                       (d1 + e1 ≤ d2 ∨ d2 + e2 ≤ d1) →
38                       ∃∃T. L2 ⊢ T1 ▶ [d2, e2] T & L1 ⊢ T2 ▶* [d1, e1] T.
39 /3 width=3/ qed.
40
41 lemma tpss_strap1_down: ∀L,T1,T0,d1,e1. L ⊢ T1 ▶* [d1, e1] T0 →
42                         ∀T2,d2,e2. L ⊢ T0 ▶ [d2, e2] T2 → d2 + e2 ≤ d1 →
43                         ∃∃T. L ⊢ T1 ▶ [d2, e2] T & L ⊢ T ▶* [d1, e1] T2.
44 /3 width=3/ qed.
45
46 lemma tpss_strap2_down: ∀L,T1,T0,d1,e1. L ⊢ T1 ▶ [d1, e1] T0 →
47                         ∀T2,d2,e2. L ⊢ T0 ▶* [d2, e2] T2 → d2 + e2 ≤ d1 →
48                         ∃∃T. L ⊢ T1 ▶* [d2, e2] T & L ⊢ T ▶ [d1, e1] T2.
49 /3 width=3/ qed.
50
51 lemma tpss_split_up: ∀L,T1,T2,d,e. L ⊢ T1 ▶* [d, e] T2 →
52                      ∀i. d ≤ i → i ≤ d + e →
53                      ∃∃T. L ⊢ T1 ▶* [d, i - d] T & L ⊢ T ▶* [i, d + e - i] T2.
54 #L #T1 #T2 #d #e #H #i #Hdi #Hide @(tpss_ind … H) -T2
55 [ /2 width=3/
56 | #T #T2 #_ #HT12 * #T3 #HT13 #HT3
57   elim (tps_split_up … HT12 … Hdi Hide) -HT12 -Hide #T0 #HT0 #HT02
58   elim (tpss_strap1_down … HT3 … HT0 ?) -T [2: >commutative_plus /2 width=1/ ]
59   /3 width=7 by ex2_intro, step/ (**) (* just /3 width=7/ is too slow *)
60 ]
61 qed.
62
63 lemma tpss_inv_lift1_up: ∀L,U1,U2,dt,et. L ⊢ U1 ▶* [dt, et] U2 →
64                          ∀K,d,e. ⇩[d, e] L ≡ K → ∀T1. ⇧[d, e] T1 ≡ U1 →
65                          d ≤ dt → dt ≤ d + e → d + e ≤ dt + et →
66                          ∃∃T2. K ⊢ T1 ▶* [d, dt + et - (d + e)] T2 &
67                                ⇧[d, e] T2 ≡ U2.
68 #L #U1 #U2 #dt #et #HU12 #K #d #e #HLK #T1 #HTU1 #Hddt #Hdtde #Hdedet
69 elim (tpss_split_up … HU12 (d + e) ? ?) -HU12 // -Hdedet #U #HU1 #HU2
70 lapply (tpss_weak … HU1 d e ? ?) -HU1 // [ >commutative_plus /2 width=1/ ] -Hddt -Hdtde #HU1
71 lapply (tpss_inv_lift1_eq … HU1 … HTU1) -HU1 #HU1 destruct
72 elim (tpss_inv_lift1_ge … HU2 … HLK … HTU1 ?) -HU2 -HLK -HTU1 // <minus_plus_m_m /2 width=3/
73 qed.
74
75 (* Main properties **********************************************************)
76
77 theorem tpss_conf_eq: ∀L,T0,T1,d1,e1. L ⊢ T0 ▶* [d1, e1] T1 →
78                       ∀T2,d2,e2. L ⊢ T0 ▶* [d2, e2] T2 →
79                       ∃∃T. L ⊢ T1 ▶* [d2, e2] T & L ⊢ T2 ▶* [d1, e1] T.
80 /3 width=3/ qed.
81
82 theorem tpss_conf_neq: ∀L1,T0,T1,d1,e1. L1 ⊢ T0 ▶* [d1, e1] T1 →
83                        ∀L2,T2,d2,e2. L2 ⊢ T0 ▶* [d2, e2] T2 →
84                        (d1 + e1 ≤ d2 ∨ d2 + e2 ≤ d1) →
85                        ∃∃T. L2 ⊢ T1 ▶* [d2, e2] T & L1 ⊢ T2 ▶* [d1, e1] T.
86 /3 width=3/ qed.
87
88 theorem tpss_trans_eq: ∀L,T1,T,T2,d,e.
89                        L ⊢ T1 ▶* [d, e] T → L ⊢ T ▶* [d, e] T2 →
90                        L ⊢ T1 ▶* [d, e] T2.
91 /2 width=3/ qed.
92
93 theorem tpss_trans_down: ∀L,T1,T0,d1,e1. L ⊢ T1 ▶* [d1, e1] T0 →
94                          ∀T2,d2,e2. L ⊢ T0 ▶* [d2, e2] T2 → d2 + e2 ≤ d1 →
95                          ∃∃T. L ⊢ T1 ▶* [d2, e2] T & L ⊢ T ▶* [d1, e1] T2.
96 /3 width=3/ qed.