]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/ground_2/relocation/rtmap_at.ma
- second precommit for rtmap
[helm.git] / matita / matita / contribs / lambdadelta / ground_2 / relocation / rtmap_at.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.tcs.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 "ground_2/notation/relations/rat_3.ma".
16 include "ground_2/relocation/rtmap_id.ma".
17
18 (* RELOCATION MAP ***********************************************************)
19
20 coinductive at: rtmap → relation nat ≝
21 | at_refl: ∀f,g,j1,j2. ↑f = g → 0 = j1 → 0 = j2 → at g j1 j2 
22 | at_push: ∀f,i1,i2. at f i1 i2 → ∀g,j1,j2. ↑f = g → ⫯i1 = j1 → ⫯i2 = j2 → at g j1 j2
23 | at_next: ∀f,i1,i2. at f i1 i2 → ∀g,j2. ⫯f = g → ⫯i2 = j2 → at g i1 j2
24 .
25
26 interpretation "relational application (rtmap)"
27    'RAt i1 f i2 = (at f i1 i2).
28
29 (* Basic inversion lemmas ***************************************************)
30
31 lemma at_inv_ppx: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀g. 0 = i1 → ↑g = f → 0 = i2.
32 #f #i1 #i2 * -f -i1 -i2 //
33 [ #f #i1 #i2 #_ #g #j1 #j2 #_ * #_ #x #H destruct
34 | #f #i1 #i2 #_ #g #j2 * #_ #x #_ #H elim (discr_push_next … H)
35 ]
36 qed-.
37
38 lemma at_inv_npx: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀g,j1. ⫯j1 = i1 → ↑g = f →
39                   ∃∃j2. @⦃j1, g⦄ ≡ j2 & ⫯j2 = i2.
40 #f #i1 #i2 * -f -i1 -i2
41 [ #f #g #j1 #j2 #_ * #_ #x #x1 #H destruct
42 | #f #i1 #i2 #Hi #g #j1 #j2 * * * #x #x1 #H #Hf >(injective_push … Hf) -g destruct /2 width=3 by ex2_intro/
43 | #f #i1 #i2 #_ #g #j2 * #_ #x #x1 #_ #H elim (discr_push_next … H)
44 ]
45 qed-.
46
47 lemma at_inv_xnx: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀g. ⫯g = f →
48                   ∃∃j2. @⦃i1, g⦄ ≡ j2 & ⫯j2 = i2.
49 #f #i1 #i2 * -f -i1 -i2
50 [ #f #g #j1 #j2 * #_ #_ #x #H elim (discr_next_push … H)
51 | #f #i1 #i2 #_ #g #j1 #j2 * #_ #_ #x #H elim (discr_next_push … H)
52 | #f #i1 #i2 #Hi #g #j2 * * #x #H >(injective_next … H) -g /2 width=3 by ex2_intro/
53 ]
54 qed-.
55
56 (* Advanced inversion lemmas ************************************************)
57
58 lemma at_inv_ppn: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 →
59                   ∀g,j2. 0 = i1 → ↑g = f → ⫯j2 = i2 → ⊥.
60 #f #i1 #i2 #Hf #g #j2 #H1 #H <(at_inv_ppx … Hf … H1 H) -f -g -i1 -i2
61 #H destruct
62 qed-.
63
64 lemma at_inv_npp: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 →
65                   ∀g,j1. ⫯j1 = i1 → ↑g = f → 0 = i2 → ⊥.
66 #f #i1 #i2 #Hf #g #j1 #H1 #H elim (at_inv_npx … Hf … H1 H) -f -i1
67 #x2 #Hg * -i2 #H destruct
68 qed-.
69
70 lemma at_inv_npn: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 →
71                   ∀g,j1,j2. ⫯j1 = i1 → ↑g = f → ⫯j2 = i2 → @⦃j1, g⦄ ≡ j2.
72 #f #i1 #i2 #Hf #g #j1 #j2 #H1 #H elim (at_inv_npx … Hf … H1 H) -f -i1
73 #x2 #Hg * -i2 #H destruct //
74 qed-.
75
76 lemma at_inv_xnp: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 →
77                   ∀g. ⫯g = f → 0 = i2 → ⊥.
78 #f #i1 #i2 #Hf #g #H elim (at_inv_xnx … Hf … H) -f
79 #x2 #Hg * -i2 #H destruct
80 qed-.
81
82 lemma at_inv_xnn: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 →
83                   ∀g,j2. ⫯g = f → ⫯j2 = i2 → @⦃i1, g⦄ ≡ j2.
84 #f #i1 #i2 #Hf #g #j2 #H elim (at_inv_xnx … Hf … H) -f
85 #x2 #Hg * -i2 #H destruct //
86 qed-.
87
88 (* --------------------------------------------------------------------------*)
89
90 lemma at_inv_pxp: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → 0 = i1 → 0 = i2 → ∃g. ↑g = f.
91 #f elim (pn_split … f) * /2 width=2 by ex_intro/
92 #g #H #i1 #i2 #Hf #H1 #H2 cases (at_inv_xnp … Hf … H H2)
93 qed-.
94
95 lemma at_inv_pxn: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀j2. 0 = i1 → ⫯j2 = i2 →
96                   ∃∃g. @⦃i1, g⦄ ≡ j2 & ⫯g = f.
97 #f elim (pn_split … f) *
98 #g #H #i1 #i2 #Hf #j2 #H1 #H2
99 [ elim (at_inv_ppn … Hf … H1 H H2)
100 | /3 width=5 by at_inv_xnn, ex2_intro/
101 ]
102 qed-.
103
104 lemma at_inv_nxp: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 →
105                   ∀j1. ⫯j1 = i1 → 0 = i2 → ⊥.
106 #f elim (pn_split f) *
107 #g #H #i1 #i2 #Hf #j1 #H1 #H2
108 [ elim (at_inv_npp … Hf … H1 H H2)
109 | elim (at_inv_xnp … Hf … H H2)
110 ]
111 qed-.
112
113 lemma at_inv_nxn: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀j1,j2. ⫯j1 = i1 → ⫯j2 = i2 →
114                   (∃∃g. @⦃j1, g⦄ ≡ j2 & ↑g = f) ∨
115                   ∃∃g. @⦃i1, g⦄ ≡ j2 & ⫯g = f.
116 #f elim (pn_split f) *
117 /4 width=7 by at_inv_xnn, at_inv_npn, ex2_intro, or_intror, or_introl/
118 qed-.
119
120 (* --------------------------------------------------------------------------*)
121
122 lemma at_inv_xpx: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀g. ↑g = f →
123                   (0 = i1 ∧ 0 = i2) ∨
124                   ∃∃j1,j2. @⦃j1, g⦄ ≡ j2 & ⫯j1 = i1 & ⫯j2 = i2.
125 #f * [2: #i1 ] #i2 #Hf #g #H
126 [ elim (at_inv_npx … Hf … H) -f /3 width=5 by or_intror, ex3_2_intro/
127 | >(at_inv_ppx … Hf … H) -f /3 width=1 by conj, or_introl/
128 ]
129 qed-.
130
131 lemma at_inv_xpp: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀g. ↑g = f → 0 = i2 → 0 = i1.
132 #f #i1 #i2 #Hf #g #H elim (at_inv_xpx … Hf … H) -f * //
133 #j1 #j2 #_ #_ * -i2 #H destruct
134 qed-.
135
136 lemma at_inv_xpn: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀g,j2. ↑g = f → ⫯j2 = i2 →
137                   ∃∃j1. @⦃j1, g⦄ ≡ j2 & ⫯j1 = i1.
138 #f #i1 #i2 #Hf #g #j2 #H elim (at_inv_xpx … Hf … H) -f *
139 [ #_ * -i2 #H destruct
140 | #x1 #x2 #Hg #H1 * -i2 #H destruct /2 width=3 by ex2_intro/
141 ]
142 qed-.
143
144 lemma at_inv_xxp: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → 0 = i2 →
145                   ∃∃g. 0 = i1 & ↑g = f.
146 #f elim (pn_split f) *
147 #g #H #i1 #i2 #Hf #H2
148 [ /3 width=6 by at_inv_xpp, ex2_intro/
149 | elim (at_inv_xnp … Hf … H H2)
150 ]
151 qed-.
152
153 lemma at_inv_xxn: ∀f,i1,i2. @⦃i1, f⦄ ≡ i2 → ∀j2.  ⫯j2 = i2 →
154                   (∃∃g,j1. @⦃j1, g⦄ ≡ j2 & ⫯j1 = i1 & ↑g = f) ∨
155                   ∃∃g. @⦃i1, g⦄ ≡ j2 & ⫯g = f.
156 #f elim (pn_split f) *
157 #g #H #i1 #i2 #Hf #j2 #H2
158 [ elim (at_inv_xpn … Hf … H H2) -i2 /3 width=5 by or_introl, ex3_2_intro/
159 | lapply (at_inv_xnn … Hf … H H2) -i2 /3 width=3 by or_intror, ex2_intro/
160 ]
161 qed-.
162
163 (* Basic forward lemmas *****************************************************)
164
165 lemma at_increasing: ∀i2,i1,f. @⦃i1, f⦄ ≡ i2 → i1 ≤ i2.
166 #i2 elim i2 -i2
167 [ #i1 #f #Hf elim (at_inv_xxp … Hf) -Hf //
168 | #i2 #IH * //
169   #i1 #f #Hf elim (at_inv_nxn … Hf) -Hf [1,4: * |*: // ]
170   /3 width=2 by le_S_S, le_S/
171 ]
172 qed-.
173
174 lemma at_increasing_strict: ∀g,i1,i2. @⦃i1, g⦄ ≡ i2 → ∀f. ⫯f = g →
175                             i1 < i2 ∧ @⦃i1, f⦄ ≡ ⫰i2.
176 #g #i1 #i2 #Hg #f #H elim (at_inv_xnx … Hg … H) -Hg -H
177 /4 width=2 by conj, at_increasing, le_S_S/
178 qed-.
179
180 lemma at_fwd_id_ex: ∀f,i. @⦃i, f⦄ ≡ i → ∃g. ↑g = f.
181 #f elim (pn_split f) * /2 width=2 by ex_intro/
182 #g #H #i #Hf elim (at_inv_xnx … Hf … H) -Hf -H
183 #j2 #Hg #H destruct lapply (at_increasing … Hg) -Hg
184 #H elim (lt_le_false … H) -H //
185 qed-.
186
187 (* Basic properties *********************************************************)
188
189 let corec at_eq_repl_back: ∀i1,i2. eq_repl_back (λf. @⦃i1, f⦄ ≡ i2) ≝ ?.
190 #i1 #i2 #f1 #H1 cases H1 -f1 -i1 -i2
191 [ #f1 #g1 #j1 #j2 #H #H1 #H2 #f2 #H12 cases (eq_inv_px … H12 … H) -g1 /2 width=2 by at_refl/
192 | #f1 #i1 #i2 #Hf1 #g1 #j1 #j2 #H #H1 #H2 #f2 #H12 cases (eq_inv_px … H12 … H) -g1 /3 width=7 by at_push/
193 | #f1 #i1 #i2 #Hf1 #g1 #j2 #H #H2 #f2 #H12 cases (eq_inv_nx … H12 … H) -g1 /3 width=5 by at_next/
194 ]
195 qed-.
196
197 lemma at_eq_repl_fwd: ∀i1,i2. eq_repl_fwd (λf. @⦃i1, f⦄ ≡ i2).
198 #i1 #i2 @eq_repl_sym /2 width=3 by at_eq_repl_back/
199 qed-.
200
201 lemma at_le_ex: ∀j2,i2,f. @⦃i2, f⦄ ≡ j2 → ∀i1. i1 ≤ i2 →
202                 ∃∃j1. @⦃i1, f⦄ ≡ j1 & j1 ≤ j2.
203 #j2 elim j2 -j2 [2: #j2 #IH ] #i2 #f #Hf
204 [ elim (at_inv_xxn … Hf) -Hf [1,3: * |*: // ]
205   #g [ #x2 ] #Hg [ #H2 ] #H0
206   [ * /3 width=3 by at_refl, ex2_intro/
207     #i1 #Hi12 destruct lapply (le_S_S_to_le … Hi12) -Hi12
208     #Hi12 elim (IH … Hg … Hi12) -x2 -IH
209     /3 width=7 by at_push, ex2_intro, le_S_S/
210   | #i1 #Hi12 elim (IH … Hg … Hi12) -IH -i2
211     /3 width=5 by at_next, ex2_intro, le_S_S/
212   ]
213 | elim (at_inv_xxp … Hf) -Hf //
214   #g * -i2 #H2 #i1 #Hi12 <(le_n_O_to_eq … Hi12)
215   /3 width=3 by at_refl, ex2_intro/
216 ]
217 qed-.
218
219 lemma at_id_le: ∀i1,i2. i1 ≤ i2 → ∀f. @⦃i2, f⦄ ≡ i2 → @⦃i1, f⦄ ≡ i1.
220 #i1 #i2 #H @(le_elim … H) -i1 -i2 [ #i2 | #i1 #i2 #IH ]
221 #f #Hf elim (at_fwd_id_ex … Hf) /4 width=7 by at_inv_npn, at_push, at_refl/
222 qed-.
223
224 (* Main properties **********************************************************)
225
226 theorem at_monotonic: ∀j2,i2,f. @⦃i2, f⦄ ≡ j2 → ∀j1,i1. @⦃i1, f⦄ ≡ j1 →
227                       i1 < i2 → j1 < j2.
228 #j2 elim j2 -j2
229 [ #i2 #f #H2f elim (at_inv_xxp … H2f) -H2f //
230   #g #H21 #_ #j1 #i1 #_ #Hi elim (lt_le_false … Hi) -Hi //
231 | #j2 #IH #i2 #f #H2f * //
232   #j1 #i1 #H1f #Hi elim (lt_inv_gen … Hi)
233   #x2 #_ #H21 elim (at_inv_nxn … H2f … H21) -H2f [1,3: * |*: // ]
234   #g #H2g #H
235   [ elim (at_inv_xpn … H1f … H) -f
236     /4 width=8 by lt_S_S_to_lt, lt_S_S/
237   | /4 width=8 by at_inv_xnn, lt_S_S/
238   ]
239 ]
240 qed-.
241
242 theorem at_inv_monotonic: ∀j1,i1,f. @⦃i1, f⦄ ≡ j1 → ∀j2,i2. @⦃i2, f⦄ ≡ j2 →
243                           j1 < j2 → i1 < i2.
244 #j1 elim j1 -j1
245 [ #i1 #f #H1f elim (at_inv_xxp … H1f) -H1f //
246   #g * -i1 #H #j2 #i2 #H2f #Hj elim (lt_inv_O1 … Hj) -Hj
247   #x2 #H22 elim (at_inv_xpn … H2f … H H22) -f //
248 | #j1 #IH *
249   [ #f #H1f elim (at_inv_pxn … H1f) -H1f [ |*: // ]
250     #g #H1g #H #j2 #i2 #H2f #Hj elim (lt_inv_S1 … Hj) -Hj
251     /3 width=7 by at_inv_xnn/
252   | #i1 #f #H1f #j2 #i2 #H2f #Hj elim (lt_inv_S1 … Hj) -Hj
253     #y2 #Hj #H22 elim (at_inv_nxn … H1f) -H1f [1,4: * |*: // ]
254     #g #Hg #H
255     [ elim (at_inv_xpn … H2f … H H22) -f -H22
256       /3 width=7 by lt_S_S/
257     | /3 width=7 by at_inv_xnn/
258     ]
259   ]
260 ]
261 qed-.
262
263 theorem at_mono: ∀f,i,i1. @⦃i, f⦄ ≡ i1 → ∀i2. @⦃i, f⦄ ≡ i2 → i2 = i1.
264 #f #i #i1 #H1 #i2 #H2 elim (lt_or_eq_or_gt i2 i1) //
265 #Hi elim (lt_le_false i i) /3 width=6 by at_inv_monotonic, eq_sym/
266 qed-.
267
268 theorem at_inj: ∀f,i1,i. @⦃i1, f⦄ ≡ i → ∀i2. @⦃i2, f⦄ ≡ i → i1 = i2.
269 #f #i1 #i #H1 #i2 #H2 elim (lt_or_eq_or_gt i2 i1) //
270 #Hi elim (lt_le_false i i) /3 width=6 by at_monotonic, eq_sym/
271 qed-.
272
273 (* Properties on minus ******************************************************)
274
275 lemma at_pxx_minus: ∀n,f. @⦃0, f⦄ ≡ n → @⦃0, f-n⦄ ≡ 0.
276 #n elim n -n //
277 #n #IH #f #Hf cases (at_inv_pxn … Hf) -Hf /2 width=3 by/
278 qed.
279
280 (* Advanced inversion lemmas on isid ****************************************)
281
282 lemma isid_inv_at: ∀i,f. 𝐈⦃f⦄ → @⦃i, f⦄ ≡ i.
283 #i elim i -i
284 [ #f #H elim (isid_inv_gen … H) -H /2 width=2 by at_refl/
285 | #i #IH #f #H elim (isid_inv_gen … H) -H /3 width=7 by at_push/
286 ]
287 qed.
288
289 lemma isid_inv_at_mono: ∀f,i1,i2. 𝐈⦃f⦄ → @⦃i1, f⦄ ≡ i2 → i1 = i2.
290 /3 width=6 by isid_inv_at, at_mono/ qed-.
291
292 (* Advancedd properties on isid *********************************************)
293
294 let corec isid_at: ∀f. (∀i. @⦃i, f⦄ ≡ i) → 𝐈⦃f⦄ ≝ ?.
295 #f #Hf lapply (Hf 0)
296 #H cases (at_fwd_id_ex … H) -H
297 #g #H @(isid_push … H) /3 width=7 by at_inv_npn/
298 qed-.
299
300 (* Advanced properties on id ************************************************)
301
302 lemma id_inv_at: ∀f. (∀i. @⦃i, f⦄ ≡ i) → 𝐈𝐝 ≗ f.
303 /3 width=1 by isid_at, eq_id_inv_isid/ qed-.
304
305 lemma id_at: ∀i. @⦃i, 𝐈𝐝⦄ ≡ i.
306 /2 width=1 by isid_inv_at/ qed.