1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| A.Asperti, C.Sacerdoti Coen, *)
8 (* ||A|| E.Tassi, S.Zacchiroli *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU Lesser General Public License Version 2.1 *)
13 (**************************************************************************)
15 include "basics/list2.ma".
21 | Lambda: T → T → T (* type, body *)
22 | Prod: T → T → T (* type, body *)
25 nlet rec lift_aux t k p ≝
28 | Rel n ⇒ if_then_else T (leb (S n) k) (Rel n) (Rel (n+p))
29 | App m n ⇒ App (lift_aux m k p) (lift_aux n k p)
30 | Lambda m n ⇒ Lambda (lift_aux m k p) (lift_aux n (k+1) p)
31 | Prod m n ⇒ Prod (lift_aux m k p) (lift_aux n (k+1) p)
34 ndefinition lift ≝ λt.λp.lift_aux t 0 p.
36 nlet rec subst_aux t k a ≝
39 | Rel n ⇒ if_then_else T (leb (S n) k) (Rel n)
40 (if_then_else T (eqb n k) (lift a n) (Rel (n-1)))
41 | App m n ⇒ App (subst_aux m k a) (subst_aux n k a)
42 | Lambda m n ⇒ Lambda (subst_aux m k a) (subst_aux n (k+1) a)
43 | Prod m n ⇒ Prod (subst_aux m k a) (subst_aux n (k+1) a)
46 ndefinition subst ≝ λa.λt.subst_aux t 0 a.
48 (*** properties of lift and subst ***)
49 nlemma lift_aux_0: ∀t:T.∀k. lift_aux t k 0 = t.
50 #t; nelim t; nnormalize; //; #n; #k; ncases (leb (S n) k);
53 nlemma lift_0: ∀t:T. lift t 0 = t.
54 #t; nelim t; nnormalize; //; nqed.
56 nlemma lift_sort: ∀i,k. lift (Sort i) k = Sort i.
59 nlemma lift_rel: ∀i,k. lift (Rel i) k = Rel (i+k).
62 nlemma lift_rel1: ∀i.lift (Rel i) 1 = Rel (S i).
63 #i; nchange with (lift (Rel i) 1 = Rel (1 + i)); //; nqed.
66 nlemma lift_lift_aux: ∀t.∀i,j,k,k1. k ≤ k1 → k1 ≤ k+j →
67 lift_aux (lift_aux t k j) k1 i = lift_aux t k (j+i).
68 #t; nelim t; nnormalize; //; #n; #i;#j; #k; #k1; #lel; #ler;
69 napply (leb_elim (S n) k); #Hnk;nnormalize;
70 ##[nrewrite > (le_to_leb_true ? ? Hnk);nnormalize;//;
71 ##|nrewrite > (lt_to_leb_false (S n+j) k ?);
72 nnormalize;//;napply (lt_to_le_to_lt ? (S n));
73 ##[napply not_le_to_lt;/2/;
74 ##|(* lento /2/; *) napply le_S_S;/1/;
78 nlemma lift_lift_aux: ∀t.∀i,j,k. lift_aux (lift_aux t k j) k i = lift_aux t k (j+i).
79 #t; nelim t; nnormalize; //; #n; #i;#j; #k;
80 napply (leb_elim (S n) k); #Hnk;nnormalize;
81 ##[nrewrite > (le_to_leb_true ? ? Hnk);nnormalize;//;
82 ##|nrewrite > (lt_to_leb_false (S n+j) k ?);
83 nnormalize;//; napply (lt_to_le_to_lt ? (S n));
84 ##[napply not_le_to_lt;//;
89 nlemma lift_lift_aux1: ∀t.∀i,j,k. lift_aux (lift_aux t k j) (j+k) i = lift_aux t k (j+i).
90 #t; nelim t; nnormalize; //; #n; #i;#j; #k;
91 napply (leb_elim (S n) k); #Hnk;nnormalize;
92 ##[nrewrite > (le_to_leb_true (S n) (j+k) ?);nnormalize;/2/;
93 ##|nrewrite > (lt_to_leb_false (S n+j) (j+k) ?);
94 nnormalize;//; napply le_S_S; napplyS monotonic_le_plus_r;
99 nlemma lift_lift_aux2: ∀t.∀i,j.j ≤ i → ∀h,k.
100 lift_aux (lift_aux t k i) (j+k) h = lift_aux t k (i+h).
101 #t; #i; #j; #h; nelim t; nnormalize; //; #n; #h;#k;
102 napply (leb_elim (S n) k); #Hnk;nnormalize;
103 ##[nrewrite > (le_to_leb_true (S n) (j+k) ?);nnormalize;/2/;
104 ##|nrewrite > (lt_to_leb_false (S n+i) (j+k) ?);
105 nnormalize;//;napply le_S_S; nrewrite > (symmetric_plus j k);
106 napply le_plus;//;napply not_lt_to_le;/2/;
110 nlemma lift_lift: ∀t.∀i,j. lift (lift t j) i = lift t (j+i).
114 nlemma subst_lift_aux_k: ∀A,B.∀k.
115 subst_aux (lift_aux B k 1) k A = B.
116 #A; #B; nelim B; nnormalize; /2/; #n; #k;
117 napply (leb_elim (S n) k); nnormalize; #Hnk;
118 ##[nrewrite > (le_to_leb_true ?? Hnk);nnormalize;//;
119 ##|nrewrite > (lt_to_leb_false (S (n + 1)) k ?); nnormalize;
120 ##[nrewrite > (not_eq_to_eqb_false (n+1) k ?);
121 nnormalize;/2/; napply (not_to_not … Hnk);//;
122 ##|napply le_S; napplyS (not_le_to_lt (S n) k Hnk);
127 nlemma subst_lift: ∀A,B. subst A (lift B 1) = B.
128 nnormalize; //; nqed.
130 nlemma subst_aux_sort: ∀A.∀n,k. subst_aux (Sort n) k A = Sort n.
133 nlemma subst_sort: ∀A.∀n. subst A (Sort n) = Sort n.
136 nlemma subst_rel: ∀A.subst A (Rel O) = A.
137 nnormalize; //; nqed.
139 nlemma subst_rel1: ∀A.∀k,i. i < k →
140 subst_aux (Rel i) k A = Rel i.
141 #A; #k; #i; nnormalize; #ltik;
142 nrewrite > (le_to_leb_true (S i) k ?); //; nqed.
144 nlemma subst_rel2: ∀A.∀k. subst_aux (Rel k) k A = lift A k.
146 nrewrite > (lt_to_leb_false (S k) k ?); //;
147 nrewrite > (eq_to_eqb_true … (refl …)); //;
150 nlemma subst_rel3: ∀A.∀k,i. k < i →
151 subst_aux (Rel i) k A = Rel (i-1).
152 #A; #k; #i; nnormalize; #ltik;
153 nrewrite > (lt_to_leb_false (S i) k ?); /2/;
154 nrewrite > (not_eq_to_eqb_false i k ?); //;
155 napply nmk; #eqik; nelim (lt_to_not_eq … (ltik …)); /2/;
159 nlemma lift_subst_aux_k: ∀A,B.∀j,k.
160 lift_aux (subst_aux B (j+k) A) k 1 = subst_aux (lift_aux B k 1) (j+k+1) A.
161 #A; #B; #j; nelim B; nnormalize; /2/; #n; #k;
162 napply (leb_elim (S n) (j + k)); nnormalize; #Hnjk;
163 ##[nelim (leb (S n) k);
164 ##[nrewrite > (subst_rel1 A (j+k+1) n ?);/2/;
165 ##|nrewrite > (subst_rel1 A (j+k+1) (n+1) ?);/2/;
167 ##|napply (eqb_elim n (j+k)); nnormalize; #Heqnjk;
168 ##[nrewrite > (lt_to_leb_false (S n) k ?);
169 ##[ncut (j+k+1 = n+1);##[//;##] #Heq;
170 nrewrite > Heq; nrewrite > (subst_rel2 A ?); nnormalize;
171 napplyS lift_lift_aux2 (* bello *);//;
175 ##[napply not_eq_to_le_to_lt;
176 ##[/2/;##|napply le_S_S_to_le;napply not_le_to_lt;/2/;##]
178 ncut (O < n); ##[/2/; ##] #posn;
179 ncut (k ≤ n); ##[/2/; ##] #lekn;
180 nrewrite > (lt_to_leb_false (S (n-1)) k ?); nnormalize;
181 ##[nrewrite > (lt_to_leb_false … (le_S_S … lekn));
182 nrewrite > (subst_rel3 A (j+k+1) (n+1) ?);
183 ##[nrewrite < (plus_minus_m_m … posn);//;
184 ##|napplyS monotonic_lt_plus_l; //;
187 napply (not_eq_to_le_to_le_minus … lekn);
194 naxiom lift_subst_aux_kij: ∀A,B.∀i,j,k.
195 lift_aux (subst_aux B (j+k) A) k i = subst_aux (lift_aux B k i) (j+k+i) A.
197 nlemma lift_subst_aux_k: ∀A,B.∀j,k.
198 lift_aux (subst_aux B (j+k) A) k 1 = subst_aux (lift_aux B k 1) (S(j+k)) A.
199 #A; #B; #j; nelim B; nnormalize; /2/; #n; #k;
200 napply (leb_elim (S n) (j + k)); nnormalize; #Hnjk;
201 ##[nelim (leb (S n) k);
202 ##[nrewrite > (subst_rel1 A (S(j+k)) n ?);/2/;
203 ##|nrewrite > (subst_rel1 A (S(j+k)) (n+1) ?);/2/;
205 ##|napply (eqb_elim n (j+k)); nnormalize; #Heqnjk;
206 ##[nrewrite > (lt_to_leb_false (S n) k ?);
207 ##[ncut (S(j+k) = n+1);##[//;##] #Heq;
208 nrewrite > Heq; nrewrite > (subst_rel2 A ?); nnormalize;
209 napplyS lift_lift_aux2 (* bello *);//;
213 ##[napply not_eq_to_le_to_lt;
214 ##[/2/;##|napply le_S_S_to_le;napply not_le_to_lt;/2/;##]
216 ncut (O < n); ##[/2/; ##] #posn;
217 ncut (k ≤ n); ##[/2/; ##] #lekn;
218 nrewrite > (lt_to_leb_false (S (n-1)) k ?); nnormalize;
219 ##[nrewrite > (lt_to_leb_false … (le_S_S … lekn));
220 nrewrite > (subst_rel3 A (S(j+k)) (n+1) ?);
221 ##[nrewrite < (plus_minus_m_m … posn);//;
222 ##|ncut (S n = n +1); /2/;
224 ##|napply le_S_S; (* /3/;*)
225 napply (not_eq_to_le_to_le_minus … lekn);
233 nlemma lift_subst_aux_k: ∀A,B.∀k.
234 lift_aux (subst_aux B k A) k 1 = subst_aux (lift_aux B k 1) (k+1) A.
235 #A; #B; nelim B; nnormalize; /2/; #n; #k;
236 napply (leb_elim (S n) k); nnormalize; #Hnk;
237 ##[nrewrite > (le_to_leb_true ?? Hnk);
238 nrewrite > (le_to_leb_true (S n) (k +1) ?);nnormalize;/2/;
239 ##|nrewrite > (lt_to_leb_false (S (n + 1)) (k+1) ?);
240 ##[##2: napply le_S_S; napply (monotonic_le_plus_l 1 k n);
241 napply not_lt_to_le; napply Hnk; ##]
242 napply (eqb_elim n k);#eqnk;
243 ##[nrewrite > (eq_to_eqb_true (n+1) (k+1) ?);/2/;
244 nnormalize; nrewrite < eqnk; //; (* strano *)
245 ##|nrewrite > (not_eq_to_eqb_false (n+1) (k+1) ?);/2/;
248 ##[napply not_le_to_lt;#len;
249 napply eqnk; napply le_to_le_to_eq;
250 ##[napply transitive_le; //;
251 ##|napply not_lt_to_le; /2/;
254 nrewrite > (lt_to_leb_false (S (n - 1)) k ?);
256 (* nrewrite < (minus_plus_m_m n 1); *)
257 nrewrite < (plus_minus_m_m n 1 ?);//;
258 ##|napply le_S_S; napply not_eq_to_le_to_le_minus;
260 ##|napply (not_lt_to_le … Hnk);
269 ntheorem delift : ∀A,B.∀i,j,k. i ≤ j → j ≤ i + k →
270 subst_aux (lift_aux B i (S k)) j A = (lift_aux B i k).
271 #A; #B; nelim B; nnormalize; /2/;
272 ##[##2,3,4: #T; #T0; #Hind1; #Hind2; #i; #j; #k; #leij; #lejk;
273 napply eq_f2;/2/; napply Hind2;
274 napplyS (monotonic_le_plus_l 1);//
275 ##|#n; #i; #j; #k; #leij; #ltjk;
276 napply (leb_elim (S n) i); nnormalize; #len;
277 ##[nrewrite > (le_to_leb_true (S n) j ?);/2/;
278 ##|nrewrite > (lt_to_leb_false (S (n+S k)) j ?);
280 nrewrite > (not_eq_to_eqb_false (n+S k) j ?);
281 nnormalize; /2/; napply (not_to_not …len);
282 #H; napply (le_plus_to_le_r k); (* why napplyS ltjk; *)
284 ##|napply le_S_S; napply (transitive_le … ltjk);
285 napply le_plus;//; napply not_lt_to_le; /2/;
290 (********************* substitution lemma ***********************)
291 nlemma subst_lemma: ∀A,B,C.∀k,i.
292 subst_aux (subst_aux A i B) (k+i) C =
293 subst_aux (subst_aux A (S (k+i)) C) i (subst_aux B k C).
294 #A; #B; #C; #k; nelim A; nnormalize;//; (* WOW *)
295 #n; #i; napply (leb_elim (S n) i); #Hle;
296 ##[ncut (n < k+i); ##[/2/##] #ltn; (* lento *)
297 ncut (n ≤ k+i); ##[/2/##] #len;
298 nrewrite > (subst_rel1 C (k+i) n ltn);
299 nrewrite > (le_to_leb_true n (k+i) len);
300 nrewrite > (subst_rel1 … Hle);//;
301 ##|napply (eqb_elim n i); #eqni;
303 nrewrite > (le_to_leb_true i (k+i) ?); //;
304 nrewrite > (subst_rel2 …); nnormalize;
306 napplyS (lift_subst_aux_kij C B i k O);
307 ##|napply (leb_elim (S (n-1)) (k+i)); #nk;
308 ##[nrewrite > (subst_rel1 C (k+i) (n-1) nk);
309 nrewrite > (le_to_leb_true n (k+i) ?);
310 ##[nrewrite > (subst_rel3 ? i n ?);//;
311 napply not_eq_to_le_to_lt;
313 ##|napply not_lt_to_le;/2/;
315 ##|napply (transitive_le … nk);//;
318 ##[napply not_eq_to_le_to_lt; ##[/2/]
319 napply (not_lt_to_le … Hle);##]
320 #ltin; ncut (O < n); ##[/2/;##] #posn;
321 napply (eqb_elim (n-1) (k+i)); #H
322 ##[nrewrite > H; nrewrite > (subst_rel2 C (k+i));
323 nrewrite > (lt_to_leb_false n (k+i) ?);
324 ##[nrewrite > (eq_to_eqb_true n (S(k+i)) ?);
326 ##|nrewrite < H; napplyS plus_minus_m_m;//;
328 ##|nrewrite < H; napply (lt_O_n_elim … posn);
332 ##[napply not_eq_to_le_to_lt;
333 ##[napply symmetric_not_eq; napply H;
334 ##|napply (not_lt_to_le … nk);
337 #Hlt; nrewrite > (lt_to_leb_false n (k+i) ?);
338 ##[nrewrite > (not_eq_to_eqb_false n (S(k+i)) ?);
339 ##[nrewrite > (subst_rel3 C (k+i) (n-1) Hlt);
340 nrewrite > (subst_rel3 ? i (n-1) ?);//;
341 napply (le_to_lt_to_lt … Hlt);//;
342 ##|napply (not_to_not … H); #Hn; nrewrite > Hn; nnormalize;//;
344 ##|napply (transitive_lt … Hlt);
345 napply (lt_O_n_elim … posn);
350 ncut (∃m:nat. S m = n);
351 ##[napply (lt_O_n_elim … posn); #m;@ m;//;
352 ##|*; #m; #Hm; nrewrite < Hm;
353 nrewrite > (delift ???????);nnormalize;/2/;
357 (*************************** substl *****************************)
359 nlet rec substl (G:list T) (N:T) : list T ≝
362 | cons A D ⇒ ((subst_aux A (length T D) N)::(substl D N))
366 (*****************************************************************)
368 naxiom A: nat → nat → Prop.
369 naxiom R: nat → nat → nat → Prop.
370 naxiom conv: T → T → Prop.
372 ninductive TJ: list T → T → T → Prop ≝
373 | ax : ∀i,j. A i j → TJ [] (Sort i) (Sort j)
374 | start: ∀G.∀A.∀i.TJ G A (Sort i) → TJ (A::G) (Rel 0) (lift A 1)
375 | weak: ∀G.∀A,B,C.∀i.
376 TJ G A B → TJ G C (Sort i) → TJ (C::G) (lift A 1) (lift B 1)
377 | prod: ∀G.∀A,B.∀i,j,k. R i j k →
378 TJ G A (Sort i) → TJ (A::G) B (Sort j) → TJ G (Prod A B) (Sort k)
380 TJ G F (Prod A B) → TJ G a A → TJ G (App F a) (subst B a)
382 TJ (A::G) b B → TJ G (Prod A B) (Sort i) → TJ G (Lambda A b) (Prod A B)
383 | conv: ∀G.∀A,B,C.∀i. conv B C →
384 TJ G A B → TJ G B (Sort i) → TJ G A C.
386 ninverter TJ_inv2 for TJ (%?%) : Prop.
388 (**** definitions ****)
390 ninductive Glegal (G: list T) : Prop ≝
391 glegalk : ∀A,B.TJ G A B → Glegal G.
393 ninductive Gterm (G: list T) (A:T) : Prop ≝
394 | is_term: ∀B.TJ G A B → Gterm G A
395 | is_type: ∀B.TJ G B A → Gterm G A.
397 ninductive Gtype (G: list T) (A:T) : Prop ≝
398 gtypek: ∀i.TJ G A (Sort i) → Gtype G A.
400 ninductive Gelement (G:list T) (A:T) : Prop ≝
401 gelementk: ∀B.TJ G A B → Gtype G B → Gelement G A.
403 ninductive Tlegal (A:T) : Prop ≝
404 tlegalk: ∀G. Gterm G A → Tlegal A.
407 ndefinition Glegal ≝ λG: list T.∃A,B:T.TJ G A B .
409 ndefinition Gterm ≝ λG: list T.λA.∃B.TJ G A B ∨ TJ G B A.
411 ndefinition Gtype ≝ λG: list T.λA.∃i.TJ G A (Sort i).
413 ndefinition Gelement ≝ λG: list T.λA.∃B.TJ G A B ∨ Gtype G B.
415 ndefinition Tlegal ≝ λA:T.∃G: list T.Gterm G A.
419 ntheorem free_var1: ∀G.∀A,B,C. TJ G A B →
421 #G; #i; #j; #axij; #Gleg; ncases Gleg;
422 #A; #B; #tjAB; nelim tjAB; /2/; (* bello *) nqed.
425 ntheorem start_lemma1: ∀G.∀i,j.
426 A i j → Glegal G → TJ G (Sort i) (Sort j).
427 #G; #i; #j; #axij; #Gleg; ncases Gleg;
428 #A; #B; #tjAB; nelim tjAB; /2/;
431 ntheorem start_rel: ∀G.∀A.∀C.∀n,i,q.
432 TJ G C (Sort q) → TJ G (Rel n) (lift A i) → TJ (C::G) (Rel (S n)) (lift A (S i)).
433 #G; #A; #C; #n; #i; #p; #tjC; #tjn;
434 napplyS (weak G (Rel n));//. (* bello *)
436 nrewrite > (plus_n_O i);
437 nrewrite > (plus_n_Sm i O);
438 nrewrite < (lift_lift A 1 i);
439 nrewrite > (plus_n_O n); nrewrite > (plus_n_Sm n O);
440 applyS (weak G (Rel n) (lift A i) C p tjn tjC). *)
443 ntheorem start_lemma2: ∀G.
444 Glegal G → ∀n. n < length T G → TJ G (Rel n) (lift (nth n T G (Rel O)) (S n)).
445 #G; #Gleg; ncases Gleg; #A; #B; #tjAB; nelim tjAB; /2/;
446 ##[#i; #j; #axij; #p; nnormalize; #abs; napply False_ind;
447 napply (absurd … abs); //;
448 ##|#G; #A; #i; #tjA; #Hind; #m; ncases m; /2/;
449 #p; #Hle; napply start_rel; //; napply Hind;
450 napply le_S_S_to_le; napply Hle;
451 ##|#G; #A; #B; #C; #i; #tjAB; #tjC; #Hind1; #_; #m; ncases m;
452 /2/; #p; #Hle; napply start_rel; //;
453 napply Hind1; napply le_S_S_to_le; napply Hle;
458 nlet rec TJm G D on D : Prop ≝
461 | cons A D1 ⇒ TJ G (Rel 0) A ∧ TJm G D1
464 nlemma tjm1: ∀G,D.∀A. TJm G (A::D) → TJ G (Rel 0) A.
465 #G; #D; #A; *; //; nqed.
467 ntheorem transitivity_tj: ∀D.∀A,B. TJ D A B →
468 ∀G. Glegal G → TJm G D → TJ G A B.
469 #D; #A; #B; #tjAB; nelim tjAB;
472 ##|#E; #T; #T0; #T1; #n; #tjT; #tjT1; #H; #H1; #G; #HlegG;
477 ntheorem substitution_tj:
478 ∀G.∀A,B,N,M.TJ (A::G) M B → TJ G N A →
479 TJ G (subst N M) (subst N B).
481 napply (TJ_inv2 (A::G) M B);
483 ##|#G; #A; #N; #tjA; #Hind; #Heq;
485 ##|#G; #A; #B; #C; #n; #tjA; #tjC; #Hind1; #Hind2; #Heq;
487 ##|nnormalize; #E; #A; #B; #i; #j; #k;
488 #Ax; #tjA; #tjB; #Hind1; #_;
489 #Heq; #HeqB; #tjN; napply (prod ?????? Ax);
491 ##|nnormalize; napplyS weak;
495 ntheorem substitution_tj:
496 ∀E.∀A,B,M.TJ E M B → ∀G,D.∀N. E = D@A::G → TJ G N A →
497 TJ ((substl D N)@G) (subst_aux M (length ? D) N) (subst_aux B (length ? D) N).
498 #E; #A; #B; #M; #tjMB; nelim tjMB;
499 ##[nnormalize; #i; #j; #k; #G; #D; #N; ncases D;
500 ##[nnormalize; #isnil; ndestruct;
501 ##|#P; #L; nnormalize; #isnil; ndestruct;
503 ##|#G; #A1; #i; #tjA; #Hind; #G1; #D; ncases D;
505 nrewrite > (delift (lift N O) A1 O O O ??); //;
506 nnormalize in Heq; ndestruct;/2/;
507 ##|#H; #L; #N1; #Heq; nnormalize in Heq;
508 #tjN1; nnormalize; ndestruct;
510 ncut (S (length T L) = S ((length T L)+0)); ##[//##] #Heq;
512 nrewrite < (lift_subst_aux_k N1 H (length T L) O);
513 nrewrite < (plus_n_O (length T L));
516 ##|#G; #P; #Q; #R; #i; #tjP; #tjR; #Hind1; #Hind2;
517 #G1; #D; #N; ncases D; nnormalize;
518 ##[#Heq; ndestruct; #tjN; //;
522 ncut (S (length T L) = S ((length T L)+0)); ##[//##] #Heq;
524 nrewrite < (lift_subst_aux_k N P (length T L) O);
525 nrewrite < (lift_subst_aux_k N Q (length T L) O);
526 nrewrite < (plus_n_O (length T L));
529 ##|#G; #P; #Q; #i; #j; #k; #Ax; #tjP; #tjQ; #Hind1; #Hind2;
530 #G1; #D; #N; #Heq; #tjN;
535 ##|#G; #P; #Q; #R; #S; #tjP; #tjS; #Hind1; #Hind2;
536 #G1; #D; #N; #Heq; #tjN; nnormalize;
542 ntheorem substitution_tj:
543 ∀E.∀A,B,M.TJ E M B → ∀G,D.∀N. E = D@A::G → TJ G N A →
545 TJ ((substl D N)@G) (subst_aux M k N) (subst_aux B k N).
546 #E; #A; #B; #M; #tjMB; nelim tjMB;
547 ##[nnormalize; (* /3/; *)
548 ##|#G; #A1; #i; #tjA; #Hind;
550 ##[#N; #Heq; #tjN; #k; nnormalize in ⊢ (% → ?); #kO;
552 nrewrite > (delift (lift N O) A1 O O O ??); //;
553 nnormalize in Heq; ndestruct;/2/;
554 ##|#H; #L; #N1; #Heq; nnormalize in Heq;
555 #tjN1; #k; #len; nnormalize in len;
557 nnormalize; ndestruct;
559 ncut (S (length T L) = S ((length T L)+0)); ##[//##] #Heq;
561 nrewrite < (lift_subst_aux_k N1 H (length T L) O);
562 nrewrite < (plus_n_O (length T L));
563 napply (start (substl L N1@G1) (subst_aux H (length T L) N1) i ?).