]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/basic_2/equivalence/cpcs_cpcs.ma
- probe: critical bug fixed (all objects were deleted due to wrong test)
[helm.git] / matita / matita / contribs / lambdadelta / basic_2 / equivalence / cpcs_cpcs.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/computation/lprs_cprs.ma".
16 include "basic_2/conversion/cpc_cpc.ma".
17 include "basic_2/equivalence/cpcs_cprs.ma".
18
19 (* CONTEXT-SENSITIVE PARALLEL EQUIVALENCE ON TERMS **************************)
20
21 (* Advanced inversion lemmas ************************************************)
22
23 lemma cpcs_inv_cprs: ∀L,T1,T2. L ⊢ T1 ⬌* T2 →
24                      ∃∃T. L ⊢ T1 ➡* T & L ⊢ T2 ➡* T.
25 #L #T1 #T2 #H @(cpcs_ind … H) -T2
26 [ /3 width=3/
27 | #T #T2 #_ #HT2 * #T0 #HT10 elim HT2 -HT2 #HT2 #HT0
28   [ elim (cprs_strip … HT0 … HT2) -T #T #HT0 #HT2
29     lapply (cprs_strap1 … HT10 … HT0) -T0 /2 width=3/
30   | lapply (cprs_strap2 … HT2 … HT0) -T /2 width=3/
31   ]
32 ]
33 qed-.
34
35 (* Basic_1: was: pc3_gen_sort *)
36 lemma cpcs_inv_sort: ∀L,k1,k2. L ⊢ ⋆k1 ⬌* ⋆k2 → k1 = k2.
37 #L #k1 #k2 #H
38 elim (cpcs_inv_cprs … H) -H #T #H1
39 >(cprs_inv_sort1 … H1) -T #H2
40 lapply (cprs_inv_sort1 … H2) -L #H destruct //
41 qed-.
42
43 lemma cpcs_inv_abst1: ∀a,L,W1,T1,T. L ⊢ ⓛ{a}W1.T1 ⬌* T →
44                       ∃∃W2,T2. L ⊢ T ➡* ⓛ{a}W2.T2 & L ⊢ ⓛ{a}W1.T1 ➡* ⓛ{a}W2.T2.
45 #a #L #W1 #T1 #T #H
46 elim (cpcs_inv_cprs … H) -H #X #H1 #H2
47 elim (cprs_inv_abst1 … H1) -H1 #W2 #T2 #HW12 #HT12 #H destruct
48 @(ex2_2_intro … H2) -H2 /2 width=2/ (**) (* explicit constructor, /3 width=6/ is slow *)
49 qed-.
50
51 lemma cpcs_inv_abst2: ∀a,L,W1,T1,T. L ⊢ T ⬌* ⓛ{a}W1.T1 →
52                       ∃∃W2,T2. L ⊢ T ➡* ⓛ{a}W2.T2 & L ⊢ ⓛ{a}W1.T1 ➡* ⓛ{a}W2.T2.
53 /3 width=1 by cpcs_inv_abst1, cpcs_sym/ qed-.
54
55 (* Basic_1: was: pc3_gen_sort_abst *)
56 lemma cpcs_inv_sort_abst: ∀a,L,W,T,k. L ⊢ ⋆k ⬌* ⓛ{a}W.T → ⊥.
57 #a #L #W #T #k #H
58 elim (cpcs_inv_cprs … H) -H #X #H1
59 >(cprs_inv_sort1 … H1) -X #H2
60 elim (cprs_inv_abst1 … H2) -H2 #W0 #T0 #_ #_ #H destruct
61 qed-.
62
63 (* Basic_1: was: pc3_gen_lift *)
64 lemma cpcs_inv_lift: ∀L,K,d,e. ⇩[d, e] L ≡ K →
65                      ∀T1,U1. ⇧[d, e] T1 ≡ U1 → ∀T2,U2. ⇧[d, e] T2 ≡ U2 →
66                      L ⊢ U1 ⬌* U2 → K ⊢ T1 ⬌* T2.
67 #L #K #d #e #HLK #T1 #U1 #HTU1 #T2 #U2 #HTU2 #HU12
68 elim (cpcs_inv_cprs … HU12) -HU12 #U #HU1 #HU2
69 elim (cprs_inv_lift1 … HU1 … HLK … HTU1) -U1 #T #HTU #HT1
70 elim (cprs_inv_lift1 … HU2 … HLK … HTU2) -L -U2 #X #HXU
71 >(lift_inj … HXU … HTU) -X -U -d -e /2 width=3/
72 qed-.
73
74 (* Advanced properties ******************************************************)
75
76 lemma lpr_cpcs_trans: ∀L1,L2. L1 ⊢ ➡ L2 → ∀T1,T2. L2 ⊢ T1 ⬌* T2 → L1 ⊢ T1 ⬌* T2.
77 #L1 #L2 #HL12 #T1 #T2 #H
78 elim (cpcs_inv_cprs … H) -H #T #HT1 #HT2
79 lapply (lpr_cprs_trans … HT1 … HL12) -HT1
80 lapply (lpr_cprs_trans … HT2 … HL12) -L2 /2 width=3/
81 qed-.
82
83 lemma lprs_cpcs_trans: ∀L1,L2. L1 ⊢ ➡* L2 → ∀T1,T2. L2 ⊢ T1 ⬌* T2 → L1 ⊢ T1 ⬌* T2.
84 #L1 #L2 #HL12 #T1 #T2 #H
85 elim (cpcs_inv_cprs … H) -H #T #HT1 #HT2
86 lapply (lprs_cprs_trans … HT1 … HL12) -HT1
87 lapply (lprs_cprs_trans … HT2 … HL12) -L2 /2 width=3/
88 qed-.
89
90 lemma cpr_cprs_conf_cpcs: ∀L,T,T1,T2. L ⊢ T ➡* T1 → L ⊢ T ➡ T2 → L ⊢ T1 ⬌* T2.
91 #L #T #T1 #T2 #HT1 #HT2
92 elim (cprs_strip … HT1 … HT2) /2 width=3 by cpr_cprs_div/
93 qed-.
94
95 lemma cprs_cpr_conf_cpcs: ∀L,T,T1,T2. L ⊢ T ➡* T1 → L ⊢ T ➡ T2 → L ⊢ T2 ⬌* T1.
96 #L #T #T1 #T2 #HT1 #HT2
97 elim (cprs_strip … HT1 … HT2) /2 width=3 by cprs_cpr_div/
98 qed-.
99
100 lemma cprs_conf_cpcs: ∀L,T,T1,T2. L ⊢ T ➡* T1 → L ⊢ T ➡* T2 → L ⊢ T1 ⬌* T2.
101 #L #T #T1 #T2 #HT1 #HT2
102 elim (cprs_conf … HT1 … HT2) /2 width=3/
103 qed-.
104
105 lemma lprs_cprs_conf: ∀L1,L2. L1 ⊢ ➡* L2 → ∀T1,T2. L1 ⊢ T1 ➡* T2 → L2 ⊢ T1 ⬌* T2.
106 #L1 #L2 #HL12 #T1 #T2 #HT12
107 elim (lprs_cprs_conf_dx … HT12 … HL12) -L1 /2 width=3/
108 qed-.
109
110 (* Basic_1: was: pc3_wcpr0_t *)
111 (* Basic_1: note: pc3_wcpr0_t should be renamed *)
112 lemma lpr_cprs_conf: ∀L1,L2. L1 ⊢ ➡ L2 → ∀T1,T2. L1 ⊢ T1 ➡* T2 → L2 ⊢ T1 ⬌* T2.
113 /3 width=5 by lprs_cprs_conf, lpr_lprs/ qed-.
114
115 (* Basic_1: was only: pc3_pr0_pr2_t *)
116 (* Basic_1: note: pc3_pr0_pr2_t should be renamed *)
117 lemma lpr_cpr_conf: ∀L1,L2. L1 ⊢ ➡ L2 → ∀T1,T2. L1 ⊢ T1 ➡ T2 → L2 ⊢ T1 ⬌* T2.
118 /3 width=5 by lpr_cprs_conf, cpr_cprs/ qed-.
119
120 (* Basic_1: was only: pc3_thin_dx *)
121 lemma cpcs_flat: ∀L,V1,V2. L ⊢ V1 ⬌* V2 → ∀T1,T2. L ⊢ T1 ⬌* T2 →
122                  ∀I. L ⊢ ⓕ{I}V1. T1 ⬌* ⓕ{I}V2. T2.
123 #L #V1 #V2 #HV12 #T1 #T2 #HT12 #I
124 elim (cpcs_inv_cprs … HV12) -HV12 #V #HV1 #HV2
125 elim (cpcs_inv_cprs … HT12) -HT12 /3 width=5 by cprs_flat, cprs_div/ (**) (* /3 width=5/ is too slow *)
126 qed.
127
128 lemma cpcs_flat_dx_cpr_rev: ∀L,V1,V2. L ⊢ V2 ➡ V1 → ∀T1,T2. L ⊢ T1 ⬌* T2 →
129                             ∀I. L ⊢ ⓕ{I}V1. T1 ⬌* ⓕ{I}V2. T2.
130 /3 width=1/ qed.
131
132 lemma cpcs_bind_dx: ∀a,I,L,V,T1,T2. L.ⓑ{I}V ⊢ T1 ⬌* T2 →
133                     L ⊢ ⓑ{a,I}V. T1 ⬌* ⓑ{a,I}V. T2.
134 #a #I #L #V #T1 #T2 #HT12
135 elim (cpcs_inv_cprs … HT12) -HT12 /3 width=5 by cprs_div, cprs_bind/ (**) (* /3 width=5/ is a bit slow *)
136 qed.
137
138 lemma cpcs_bind_sn: ∀a,I,L,V1,V2,T. L ⊢ V1 ⬌* V2 → L ⊢ ⓑ{a,I}V1. T ⬌* ⓑ{a,I}V2. T.
139 #a #I #L #V1 #V2 #T #HV12
140 elim (cpcs_inv_cprs … HV12) -HV12 /3 width=5 by cprs_div, cprs_bind/ (**) (* /3 width=5/ is a bit slow *)
141 qed.
142
143 lemma lsubr_cpcs_trans: ∀L1,T1,T2. L1 ⊢ T1 ⬌* T2 →
144                         ∀L2. L2 ⊑ L1 → L2 ⊢ T1 ⬌* T2.
145 #L1 #T1 #T2 #HT12
146 elim (cpcs_inv_cprs … HT12) -HT12
147 /3 width=5 by cprs_div, lsubr_cprs_trans/ (**) (* /3 width=5/ is a bit slow *)
148 qed-.
149
150 (* Basic_1: was: pc3_lift *)
151 lemma cpcs_lift: ∀L,K,d,e. ⇩[d, e] L ≡ K →
152                  ∀T1,U1. ⇧[d, e] T1 ≡ U1 → ∀T2,U2. ⇧[d, e] T2 ≡ U2 →
153                  K ⊢ T1 ⬌* T2 → L ⊢ U1 ⬌* U2.
154 #L #K #d #e #HLK #T1 #U1 #HTU1 #T2 #U2 #HTU2 #HT12
155 elim (cpcs_inv_cprs … HT12) -HT12 #T #HT1 #HT2
156 elim (lift_total T d e) #U #HTU
157 lapply (cprs_lift … HT1 … HLK … HTU1 … HTU) -T1 #HU1
158 lapply (cprs_lift … HT2 … HLK … HTU2 … HTU) -K -T2 -T -d -e /2 width=3/
159 qed.
160
161 lemma cpcs_strip: ∀L,T1,T. L ⊢ T ⬌* T1 → ∀T2. L ⊢ T ⬌ T2 →
162                   ∃∃T0. L ⊢ T1 ⬌ T0 & L ⊢ T2 ⬌* T0.
163 #L #T1 #T @TC_strip1 /2 width=3/ qed-.
164
165 (* More inversion lemmas ****************************************************)
166
167 lemma cpcs_inv_abst_sn: ∀a1,a2,L,W1,W2,T1,T2. L ⊢ ⓛ{a1}W1.T1 ⬌* ⓛ{a2}W2.T2 →
168                         ∧∧ L ⊢ W1 ⬌* W2 & L.ⓛW1 ⊢ T1 ⬌* T2 & a1 = a2.
169 #a1 #a2 #L #W1 #W2 #T1 #T2 #H
170 elim (cpcs_inv_cprs … H) -H #T #H1 #H2
171 elim (cprs_inv_abst1 … H1) -H1 #W0 #T0 #HW10 #HT10 #H destruct
172 elim (cprs_inv_abst1 … H2) -H2 #W #T #HW2 #HT2 #H destruct
173 lapply (lprs_cprs_conf … (L.ⓛW) … HT2) /2 width=1/ -HT2 #HT2
174 lapply (lprs_cpcs_trans … (L.ⓛW1) … HT2) /2 width=1/ -HT2 #HT2
175 /4 width=3 by and3_intro, cprs_div, cpcs_cprs_div, cpcs_sym/
176 qed-.
177
178 lemma cpcs_inv_abst_dx: ∀a1,a2,L,W1,W2,T1,T2. L ⊢ ⓛ{a1}W1.T1 ⬌* ⓛ{a2}W2.T2 →
179                         ∧∧ L ⊢ W1 ⬌* W2 & L. ⓛW2 ⊢ T1 ⬌* T2 & a1 = a2.
180 #a1 #a2 #L #W1 #W2 #T1 #T2 #HT12
181 lapply (cpcs_sym … HT12) -HT12 #HT12
182 elim (cpcs_inv_abst_sn … HT12) -HT12 /3 width=1/
183 qed-.
184
185 (* Main properties **********************************************************)
186
187 (* Basic_1: was pc3_t *)
188 theorem cpcs_trans: ∀L,T1,T. L ⊢ T1 ⬌* T → ∀T2. L ⊢ T ⬌* T2 → L ⊢ T1 ⬌* T2.
189 #L #T1 #T #HT1 #T2 @(trans_TC … HT1) qed-.
190
191 theorem cpcs_canc_sn: ∀L,T,T1,T2. L ⊢ T ⬌* T1 → L ⊢ T ⬌* T2 → L ⊢ T1 ⬌* T2.
192 /3 width=3 by cpcs_trans, cpcs_sym/ qed-. (**) (* /3 width=3/ is too slow *)
193
194 theorem cpcs_canc_dx: ∀L,T,T1,T2. L ⊢ T1 ⬌* T → L ⊢ T2 ⬌* T → L ⊢ T1 ⬌* T2.
195 /3 width=3 by cpcs_trans, cpcs_sym/ qed-. (**) (* /3 width=3/ is too slow *)
196
197 lemma cpcs_bind1: ∀a,I,L,V1,V2. L ⊢ V1 ⬌* V2 → ∀T1,T2. L.ⓑ{I}V1 ⊢ T1 ⬌* T2 →
198                   L ⊢ ⓑ{a,I}V1. T1 ⬌* ⓑ{a,I}V2. T2.
199 #a #I #L #V1 #V2 #HV12 #T1 #T2 #HT12
200 @(cpcs_trans … (ⓑ{a,I}V1.T2)) /2 width=1/
201 qed.
202
203 lemma cpcs_bind2: ∀a,I,L,V1,V2. L ⊢ V1 ⬌* V2 → ∀T1,T2. L.ⓑ{I}V2 ⊢ T1 ⬌* T2 →
204                   L ⊢ ⓑ{a,I}V1. T1 ⬌* ⓑ{a,I}V2. T2.
205 #a #I #L #V1 #V2 #HV12 #T1 #T2 #HT12
206 @(cpcs_trans … (ⓑ{a,I}V2.T1)) /2 width=1/
207 qed.
208
209 (* Basic_1: was: pc3_wcpr0 *)
210 lemma lpr_cpcs_conf: ∀L1,L2. L1 ⊢ ➡ L2 → ∀T1,T2. L1 ⊢ T1 ⬌* T2 → L2 ⊢ T1 ⬌* T2.
211 #L1 #L2 #HL12 #T1 #T2 #H
212 elim (cpcs_inv_cprs … H) -H /3 width=5 by cpcs_canc_dx, lpr_cprs_conf/
213 qed-.