]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/static_2/syntax/tweq.ma
91234b9cef188722b5b6efb2ac71fac40855320f
[helm.git] / matita / matita / contribs / lambdadelta / static_2 / syntax / tweq.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 "static_2/notation/relations/approxeq_2.ma".
16 include "static_2/syntax/term_weight.ma".
17
18 (* SORT-IRRELEVANT WHD EQUIVALENCE ON TERMS *********************************)
19
20 inductive tweq: relation term ≝
21 | tweq_sort: ∀s1,s2. tweq (⋆s1) (⋆s2)
22 | tweq_lref: ∀i. tweq (#i) (#i)
23 | tweq_gref: ∀l. tweq (§l) (§l)
24 | tweq_abbr: ∀p,V1,V2,T1,T2. (p=Ⓣ→tweq T1 T2) → tweq (ⓓ{p}V1.T1) (ⓓ{p}V2.T2)
25 | tweq_abst: ∀p,V1,V2,T1,T2. tweq (ⓛ{p}V1.T1) (ⓛ{p}V2.T2)
26 | tweq_appl: ∀V1,V2,T1,T2. tweq T1 T2 → tweq (ⓐV1.T1) (ⓐV2.T2)
27 | tweq_cast: ∀V1,V2,T1,T2. tweq V1 V2 → tweq T1 T2 → tweq (ⓝV1.T1) (ⓝV2.T2)
28 .
29
30 interpretation
31    "context-free tail sort-irrelevant equivalence (term)"
32    'ApproxEq T1 T2 = (tweq T1 T2).
33
34 (* Basic properties *********************************************************)
35
36 lemma tweq_abbr_pos: ∀V1,V2,T1,T2. T1 ≅ T2 → +ⓓV1.T1 ≅ +ⓓV2.T2.
37 /3 width=1 by tweq_abbr/ qed.
38
39 lemma tweq_abbr_neg: ∀V1,V2,T1,T2. -ⓓV1.T1 ≅ -ⓓV2.T2.
40 #V1 #V2 #T1 #T2
41 @tweq_abbr #H destruct
42 qed.
43
44 lemma tweq_refl: reflexive … tweq.
45 #T elim T -T * [||| #p * | * ]
46 /2 width=1 by tweq_sort, tweq_lref, tweq_gref, tweq_abbr, tweq_abst, tweq_appl, tweq_cast/
47 qed.
48
49 lemma tweq_sym: symmetric … tweq.
50 #T1 #T2 #H elim H -T1 -T2
51 /3 width=3 by tweq_sort, tweq_lref, tweq_gref, tweq_abbr, tweq_abst, tweq_appl, tweq_cast/
52 qed-.
53
54 (* Left basic inversion lemmas **********************************************)
55
56 fact tweq_inv_sort_sn_aux:
57      ∀X,Y. X ≅ Y → ∀s1. X = ⋆s1 → ∃s2. Y = ⋆s2.
58 #X #Y * -X -Y
59 [1  : #s1 #s2 #s #H destruct /2 width=2 by ex_intro/
60 |2,3: #i #s #H destruct
61 |4  : #p #V1 #V2 #T1 #T2 #_ #s #H destruct
62 |5  : #p #V1 #V2 #T1 #T2 #s #H destruct
63 |6  : #V1 #V2 #T1 #T2 #_ #s #H destruct
64 |7  : #V1 #V2 #T1 #T2 #_ #_ #s #H destruct
65 ]
66 qed-.
67
68 lemma tweq_inv_sort_sn:
69       ∀Y,s1. ⋆s1 ≅ Y → ∃s2. Y = ⋆s2.
70 /2 width=4 by tweq_inv_sort_sn_aux/ qed-.
71
72 fact tweq_inv_lref_sn_aux:
73      ∀X,Y. X ≅ Y → ∀i. X = #i → Y = #i.
74 #X #Y * -X -Y
75 [1  : #s1 #s2 #j #H destruct
76 |2,3: //
77 |4  : #p #V1 #V2 #T1 #T2 #_ #j #H destruct
78 |5  : #p #V1 #V2 #T1 #T2 #j #H destruct
79 |6  : #V1 #V2 #T1 #T2 #_ #j #H destruct
80 |7  : #V1 #V2 #T1 #T2 #_ #_ #j #H destruct
81 ]
82 qed-.
83
84 lemma tweq_inv_lref_sn: ∀Y,i. #i ≅ Y → Y = #i.
85 /2 width=5 by tweq_inv_lref_sn_aux/ qed-.
86
87 fact tweq_inv_gref_sn_aux:
88      ∀X,Y. X ≅ Y → ∀l. X = §l → Y = §l.
89 #X #Y * -X -Y
90 [1  : #s1 #s2 #k #H destruct
91 |2,3: //
92 |4  : #p #V1 #V2 #T1 #T2 #_ #k #H destruct
93 |5  : #p #V1 #V2 #T1 #T2 #k #H destruct
94 |6  : #V1 #V2 #T1 #T2 #_ #k #H destruct
95 |7  : #V1 #V2 #T1 #T2 #_ #_ #j #H destruct
96 ]
97 qed-.
98
99 lemma tweq_inv_gref_sn:
100       ∀Y,l. §l ≅ Y → Y = §l.
101 /2 width=5 by tweq_inv_gref_sn_aux/ qed-.
102
103 fact tweq_inv_abbr_sn_aux:
104      ∀X,Y. X ≅ Y → ∀p,V1,T1. X = ⓓ{p}V1.T1 →
105      ∃∃V2,T2. p = Ⓣ → T1 ≅ T2 & Y = ⓓ{p}V2.T2.
106 #X #Y * -X -Y
107 [1  : #s1 #s2 #q #W1 #U1 #H destruct
108 |2,3: #i #q #W1 #U1 #H destruct
109 |4  : #p #V1 #V2 #T1 #T2 #HT #q #W1 #U1 #H destruct /3 width=4 by ex2_2_intro/
110 |5  : #p #V1 #V2 #T1 #T2 #q #W1 #U1 #H destruct
111 |6  : #V1 #V2 #T1 #T2 #_ #q #W1 #U1 #H destruct
112 |7  : #V1 #V2 #T1 #T2 #_ #_ #q #W1 #U1 #H destruct
113 ]
114 qed-.
115
116 lemma tweq_inv_abbr_sn:
117       ∀p,V1,T1,Y. ⓓ{p}V1.T1 ≅ Y →
118       ∃∃V2,T2. p = Ⓣ → T1 ≅ T2 & Y = ⓓ{p}V2.T2.
119 /2 width=4 by tweq_inv_abbr_sn_aux/ qed-.
120
121 fact tweq_inv_abst_sn_aux:
122      ∀X,Y. X ≅ Y → ∀p,V1,T1. X = ⓛ{p}V1.T1 →
123      ∃∃V2,T2. Y = ⓛ{p}V2.T2.
124 #X #Y * -X -Y
125 [1  : #s1 #s2 #q #W1 #U1 #H destruct
126 |2,3: #i #q #W1 #U1 #H destruct
127 |4  : #p #V1 #V2 #T1 #T2 #_ #q #W1 #U1 #H destruct
128 |5  : #p #V1 #V2 #T1 #T2 #q #W1 #U1 #H destruct /2 width=3 by ex1_2_intro/
129 |6  : #V1 #V2 #T1 #T2 #_ #q #W1 #U1 #H destruct
130 |7  : #V1 #V2 #T1 #T2 #_ #_ #q #W1 #U1 #H destruct
131 ]
132 qed-.
133
134 lemma tweq_inv_abst_sn:
135       ∀p,V1,T1,Y. ⓛ{p}V1.T1 ≅ Y →
136       ∃∃V2,T2. Y = ⓛ{p}V2.T2.
137 /2 width=5 by tweq_inv_abst_sn_aux/ qed-.
138
139 fact tweq_inv_appl_sn_aux:
140      ∀X,Y. X ≅ Y → ∀V1,T1. X = ⓐV1.T1 →
141      ∃∃V2,T2. T1 ≅ T2 & Y = ⓐV2.T2.
142 #X #Y * -X -Y
143 [1  : #s1 #s2 #W1 #U1 #H destruct
144 |2,3: #i #W1 #U1 #H destruct
145 |4  : #p #V1 #V2 #T1 #T2 #HT #W1 #U1 #H destruct
146 |5  : #p #V1 #V2 #T1 #T2 #W1 #U1 #H destruct
147 |6  : #V1 #V2 #T1 #T2 #HT #W1 #U1 #H destruct /2 width=4 by ex2_2_intro/
148 |7  : #V1 #V2 #T1 #T2 #_ #_ #W1 #U1 #H destruct
149 ]
150 qed-.
151
152 lemma tweq_inv_appl_sn:
153       ∀V1,T1,Y. ⓐV1.T1 ≅ Y →
154       ∃∃V2,T2. T1 ≅ T2 & Y = ⓐV2.T2.
155 /2 width=4 by tweq_inv_appl_sn_aux/ qed-.
156
157 fact tweq_inv_cast_sn_aux:
158      ∀X,Y. X ≅ Y → ∀V1,T1. X = ⓝV1.T1 →
159      ∃∃V2,T2. V1 ≅ V2 & T1 ≅ T2 & Y = ⓝV2.T2.
160 #X #Y * -X -Y
161 [1  : #s1 #s2 #W1 #U1 #H destruct
162 |2,3: #i #W1 #U1 #H destruct
163 |4  : #p #V1 #V2 #T1 #T2 #_ #W1 #U1 #H destruct
164 |5  : #p #V1 #V2 #T1 #T2 #W1 #U1 #H destruct
165 |6  : #V1 #V2 #T1 #T2 #_ #W1 #U1 #H destruct
166 |7  : #V1 #V2 #T1 #T2 #HV #HT #W1 #U1 #H destruct /2 width=5 by ex3_2_intro/
167 ]
168 qed-.
169
170 lemma tweq_inv_cast_sn:
171       ∀V1,T1,Y. ⓝV1.T1 ≅ Y →
172       ∃∃V2,T2. V1 ≅ V2 & T1 ≅ T2 & Y = ⓝV2.T2.
173 /2 width=3 by tweq_inv_cast_sn_aux/ qed-.
174
175 (* Advanced inversion lemmas ************************************************)
176
177 lemma tweq_inv_abbr_pos_sn:
178       ∀V1,T1,Y. +ⓓV1.T1 ≅ Y → ∃∃V2,T2. T1 ≅ T2 & Y = +ⓓV2.T2.
179 #V1 #V2 #Y #H
180 elim (tweq_inv_abbr_sn … H) -H #V2 #T2
181 /3 width=4 by ex2_2_intro/
182 qed-.
183
184 lemma tweq_inv_abbr_neg_sn:
185       ∀V1,T1,Y. -ⓓV1.T1 ≅ Y → ∃∃V2,T2. Y = -ⓓV2.T2.
186 #V1 #V2 #Y #H
187 elim (tweq_inv_abbr_sn … H) -H #V2 #T2 #_
188 /2 width=3 by ex1_2_intro/
189 qed-.
190
191 lemma tweq_inv_abbr_pos_bi:
192       ∀V1,V2,T1,T2. +ⓓV1.T1 ≅ +ⓓV2.T2 → T1 ≅ T2.
193 #V1 #V2 #T1 #T2 #H
194 elim (tweq_inv_abbr_pos_sn … H) -H #W2 #U2 #HTU #H destruct //
195 qed-.
196
197 lemma tweq_inv_appl_bi:
198       ∀V1,V2,T1,T2. ⓐV1.T1 ≅ ⓐV2.T2 → T1 ≅ T2.
199 #V1 #V2 #T1 #T2 #H
200 elim (tweq_inv_appl_sn … H) -H #W2 #U2 #HTU #H destruct //
201 qed-.
202
203 lemma tweq_inv_cast_bi:
204       ∀V1,V2,T1,T2. ⓝV1.T1 ≅ ⓝV2.T2 → ∧∧ V1 ≅ V2 & T1 ≅ T2.
205 #V1 #V2 #T1 #T2 #H
206 elim (tweq_inv_cast_sn … H) -H #W2 #U2 #HVW #HTU #H destruct
207 /2 width=1 by conj/
208 qed-.
209
210 lemma tweq_inv_cast_xy_y: ∀T,V. ⓝV.T ≅ T → ⊥.
211 @(f_ind … tw) #n #IH #T #Hn #V #H destruct
212 elim (tweq_inv_cast_sn … H) -H #X1 #X2 #_ #HX2 #H destruct -V
213 /2 width=4 by/
214 qed-.
215
216 (* Advanced forward lemmas **************************************************)
217
218 lemma tweq_fwd_pair_sn (I):
219       ∀V1,T1,X2. ②{I}V1.T1 ≅ X2 → ∃∃V2,T2. X2 = ②{I}V2.T2.
220 * [ #p ] * [ cases p -p ] #V1 #T1 #X2 #H
221 [ elim (tweq_inv_abbr_pos_sn … H) -H #V2 #T2 #_ #H
222 | elim (tweq_inv_abbr_neg_sn … H) -H #V2 #T2 #H
223 | elim (tweq_inv_abst_sn … H) -H #V2 #T2 #H
224 | elim (tweq_inv_appl_sn … H) -H #V2 #T2 #_ #H
225 | elim (tweq_inv_cast_sn … H) -H #V2 #T2 #_ #_ #H
226 ] /2 width=3 by ex1_2_intro/
227 qed-.
228
229 lemma tweq_fwd_pair_bi (I1) (I2):
230       ∀V1,V2,T1,T2. ②{I1}V1.T1 ≅ ②{I2}V2.T2 → I1 = I2.
231 #I1 #I2 #V1 #V2 #T1 #T2 #H
232 elim (tweq_fwd_pair_sn … H) -H #W2 #U2 #H destruct //
233 qed-.
234
235 (* Advanced properties ******************************************************)
236
237 lemma tweq_dec: ∀T1,T2. Decidable (T1 ≅ T2).
238 #T1 elim T1 -T1 [ * #s1 | #I1 #V1 #T1 #IHV #IHT ] * [1,3,5,7: * #s2 |*: #I2 #V2 #T2 ]
239 [ /3 width=1 by tweq_sort, or_introl/
240 |2,3,13:
241   @or_intror #H
242   elim (tweq_inv_sort_sn … H) -H #x #H destruct
243 |4,6,14:
244   @or_intror #H
245   lapply (tweq_inv_lref_sn … H) -H #H destruct
246 |5:
247   elim (eq_nat_dec s1 s2) #Hs12 destruct /2 width=1 by or_introl/
248   @or_intror #H
249   lapply (tweq_inv_lref_sn … H) -H #H destruct /2 width=1 by/
250 |7,8,15:
251   @or_intror #H
252   lapply (tweq_inv_gref_sn … H) -H #H destruct
253 |9:
254   elim (eq_nat_dec s1 s2) #Hs12 destruct /2 width=1 by or_introl/
255   @or_intror #H
256   lapply (tweq_inv_gref_sn … H) -H #H destruct /2 width=1 by/
257 |10,11,12:
258   @or_intror #H
259   elim (tweq_fwd_pair_sn … H) -H #X1 #X2 #H destruct
260 |16:
261   elim (eq_item2_dec I1 I2) #HI12 destruct
262   [ cases I2 -I2 [ #p ] * [ cases p -p ]
263     [ elim (IHT T2) -IHT #HT12
264       [ /3 width=1 by tweq_abbr_pos, or_introl/
265       | /4 width=3 by tweq_inv_abbr_pos_bi, or_intror/
266       ]
267     | /3 width=1 by tweq_abbr_neg, or_introl/
268     | /3 width=1 by tweq_abst, or_introl/
269     | elim (IHT T2) -IHT #HT12
270       [ /3 width=1 by tweq_appl, or_introl/
271       | /4 width=3 by tweq_inv_appl_bi, or_intror/
272       ]
273     | elim (IHV V2) -IHV #HV12
274       elim (IHT T2) -IHT #HT12
275       [1: /3 width=1 by tweq_cast, or_introl/
276       |*: @or_intror #H
277           elim (tweq_inv_cast_bi … H) -H #HV12 #HT12
278           /2 width=1 by/
279       ]
280     ]
281   | /4 width=5 by tweq_fwd_pair_bi, or_intror/
282   ]
283 ]
284 qed-.