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 set "baseuri" "cic:/matita/nat/permutation".
17 include "nat/compare.ma".
18 include "nat/sigma_and_pi.ma".
20 definition injn: (nat \to nat) \to nat \to Prop \def
21 \lambda f:nat \to nat.\lambda n:nat.\forall i,j:nat.
22 i \le n \to j \le n \to f i = f j \to i = j.
24 theorem injn_Sn_n: \forall f:nat \to nat. \forall n:nat.
25 injn f (S n) \to injn f n.simplify.
27 apply le_S.assumption.
28 apply le_S.assumption.
32 theorem injective_to_injn: \forall f:nat \to nat. \forall n:nat.
33 injective nat nat f \to injn f n.
34 simplify.intros.apply H.assumption.
37 definition permut : (nat \to nat) \to nat \to Prop
38 \def \lambda f:nat \to nat. \lambda m:nat.
39 (\forall i:nat. i \le m \to f i \le m )\land injn f m.
41 theorem permut_O_to_eq_O: \forall h:nat \to nat.
42 permut h O \to (h O) = O.
43 intros.unfold permut in H.
44 elim H.apply sym_eq.apply le_n_O_to_eq.
48 theorem permut_S_to_permut: \forall f:nat \to nat. \forall m:nat.
49 permut f (S m) \to f (S m) = (S m) \to permut f m.
53 cut f i < S m \lor f i = S m.
55 apply le_S_S_to_le.assumption.
59 rewrite > Hcut1.assumption.
60 apply H3.apply le_n.apply le_S.assumption.
61 rewrite > H5.assumption.
62 apply le_to_or_lt_eq.apply H2.apply le_S.assumption.
63 apply injn_Sn_n f m H3.
68 definition transpose : nat \to nat \to nat \to nat \def
75 | false \Rightarrow n]].
77 lemma transpose_i_j_i: \forall i,j:nat. transpose i j i = j.
78 intros.unfold transpose.
79 rewrite > eqb_n_n i.simplify. reflexivity.
82 lemma transpose_i_j_j: \forall i,j:nat. transpose i j j = i.
83 intros.unfold transpose.
84 apply eqb_elim j i.simplify.intro.assumption.
85 rewrite > eqb_n_n j.simplify.
89 theorem transpose_i_i: \forall i,n:nat. (transpose i i n) = n.
90 intros.unfold transpose.
92 intro.simplify.apply sym_eq. assumption.
93 intro.simplify.reflexivity.
96 theorem transpose_i_j_j_i: \forall i,j,n:nat.
97 transpose i j n = transpose j i n.
98 intros.unfold transpose.
101 intros. simplify.rewrite < H. rewrite < H1.
103 intros.simplify.reflexivity.
105 intros.simplify.reflexivity.
106 intros.simplify.reflexivity.
109 theorem transpose_transpose: \forall i,j,n:nat.
110 (transpose i j (transpose i j n)) = n.
111 intros.unfold transpose. unfold transpose.
112 apply eqb_elim n i.simplify.
115 simplify.intros.rewrite > H. rewrite > H1.reflexivity.
116 rewrite > eqb_n_n j.simplify.intros.
119 apply eqb_elim n j.simplify.
120 rewrite > eqb_n_n i.intros.simplify.
121 apply sym_eq. assumption.
123 rewrite > not_eq_to_eqb_false n i H1.
124 rewrite > not_eq_to_eqb_false n j H.
125 simplify.reflexivity.
128 theorem injective_transpose : \forall i,j:nat.
129 injective nat nat (transpose i j).
132 rewrite < transpose_transpose i j x.
133 rewrite < transpose_transpose i j y.
134 apply eq_f.assumption.
137 variant inj_transpose: \forall i,j,n,m:nat.
138 transpose i j n = transpose i j m \to n = m \def
141 theorem permut_transpose: \forall i,j,n:nat. i \le n \to j \le n \to
142 permut (transpose i j) n.
143 unfold permut.intros.
144 split.unfold transpose.
146 elim eqb i1 i.simplify.assumption.
147 elim eqb i1 j.simplify.assumption.
149 apply injective_to_injn (transpose i j) n.
150 apply injective_transpose.
153 theorem permut_fg: \forall f,g:nat \to nat. \forall n:nat.
154 permut f n \to permut g n \to permut (\lambda m.(f(g m))) n.
155 unfold permut. intros.
157 split.intros.simplify.apply H2.
160 apply H5.assumption.assumption.
161 apply H3.apply H4.assumption.apply H4.assumption.
165 theorem permut_transpose_l:
166 \forall f:nat \to nat. \forall m,i,j:nat.
167 i \le m \to j \le m \to permut f m \to permut (\lambda n.transpose i j (f n)) m.
168 intros.apply permut_fg (transpose i j) f m ? ?.
169 apply permut_transpose.assumption.assumption.
173 theorem permut_transpose_r:
174 \forall f:nat \to nat. \forall m,i,j:nat.
175 i \le m \to j \le m \to permut f m \to permut (\lambda n.f (transpose i j n)) m.
176 intros.apply permut_fg f (transpose i j) m ? ?.
177 assumption.apply permut_transpose.assumption.assumption.
180 theorem eq_transpose : \forall i,j,k,n:nat. \lnot j=i \to
181 \lnot i=k \to \lnot j=k \to
182 transpose i j n = transpose i k (transpose k j (transpose i k n)).
183 (* uffa: triplo unfold? *)
184 intros.unfold transpose.unfold transpose.unfold transpose.
185 apply eqb_elim n i.intro.
186 simplify.rewrite > eqb_n_n k.
187 simplify.rewrite > not_eq_to_eqb_false j i H.
188 rewrite > not_eq_to_eqb_false j k H2.
190 intro.apply eqb_elim n j.
194 rewrite > not_eq_to_eqb_false n k Hcut.
196 rewrite > not_eq_to_eqb_false n k Hcut.
197 rewrite > eq_to_eqb_true n j H4.
199 rewrite > not_eq_to_eqb_false k i.
201 simplify.reflexivity.
202 simplify.intro.apply H1.apply sym_eq.assumption.
204 simplify.intro.apply H2.apply trans_eq ? ? n.
205 apply sym_eq.assumption.assumption.
206 intro.apply eqb_elim n k.intro.
208 rewrite > not_eq_to_eqb_false i k H1.
209 rewrite > not_eq_to_eqb_false i j.
213 simplify.intro.apply H.apply sym_eq.assumption.
215 rewrite > not_eq_to_eqb_false n k H5.
216 rewrite > not_eq_to_eqb_false n j H4.
218 rewrite > not_eq_to_eqb_false n i H3.
219 rewrite > not_eq_to_eqb_false n k H5.
220 simplify.reflexivity.
223 theorem permut_S_to_permut_transpose: \forall f:nat \to nat.
224 \forall m:nat. permut f (S m) \to permut (\lambda n.transpose (f (S m)) (S m)
226 unfold permut.intros.
228 split.intros.simplify.
229 apply eqb_elim (f i) (f (S m)).simplify.
230 intro.apply False_ind.
233 rewrite < Hcut.assumption.
234 apply H2.apply le_S.assumption.apply le_n.assumption.
236 apply eqb_elim (f i) (S m).simplify.
238 cut f (S m) \lt (S m) \lor f (S m) = (S m).
239 elim Hcut.apply le_S_S_to_le.assumption.
240 apply False_ind.apply H4.rewrite > H6.assumption.
241 apply le_to_or_lt_eq.apply H1.apply le_n.
243 cut f i \lt (S m) \lor f i = (S m).
244 elim Hcut.apply le_S_S_to_le.assumption.
245 apply False_ind.apply H5.assumption.
246 apply le_to_or_lt_eq.apply H1.apply le_S.assumption.
248 apply H2.apply le_S.assumption.apply le_S.assumption.
249 apply inj_transpose (f (S m)) (S m).
253 (* bounded bijectivity *)
255 definition bijn : (nat \to nat) \to nat \to Prop \def
256 \lambda f:nat \to nat. \lambda n. \forall m:nat. m \le n \to
257 ex nat (\lambda p. p \le n \land f p = m).
259 theorem eq_to_bijn: \forall f,g:nat\to nat. \forall n:nat.
260 (\forall i:nat. i \le n \to (f i) = (g i)) \to
261 bijn f n \to bijn g n.
262 intros 4.unfold bijn.
264 apply ex_intro ? ? a.
265 rewrite < H a.assumption.
266 elim H3.assumption.assumption.
269 theorem bijn_Sn_n: \forall f:nat \to nat. \forall n:nat.
270 bijn f (S n) \to f (S n) = (S n) \to bijn f n.
271 unfold bijn.intros.elim H m.
273 apply ex_intro ? ? a.split.
274 cut a < S n \lor a = S n.
275 elim Hcut.apply le_S_S_to_le.assumption.
278 rewrite < H1.rewrite < H6.rewrite > H5.assumption.
279 apply le_to_or_lt_eq.assumption.assumption.
280 apply le_S.assumption.
283 theorem bijn_n_Sn: \forall f:nat \to nat. \forall n:nat.
284 bijn f n \to f (S n) = (S n) \to bijn f (S n).
286 cut m < S n \lor m = S n.
290 apply ex_intro ? ? a.split.
291 apply le_S.assumption.assumption.
292 apply le_S_S_to_le.assumption.
293 apply ex_intro ? ? (S n).
295 rewrite > H3.assumption.
296 apply le_to_or_lt_eq.assumption.
299 theorem bijn_fg: \forall f,g:nat\to nat. \forall n:nat.
300 bijn f n \to bijn g n \to bijn (\lambda p.f(g p)) n.
305 apply ex_intro ? ? a1.
307 rewrite > H8.assumption.
308 assumption.assumption.
311 theorem bijn_transpose : \forall n,i,j. i \le n \to j \le n \to
312 bijn (transpose i j) n.
313 intros.simplify.intros.
314 cut m = i \lor \lnot m = i.
316 apply ex_intro ? ? j.
319 intro.simplify.rewrite > H3.rewrite > H4.reflexivity.
320 rewrite > eqb_n_n j.simplify.
321 intros. apply sym_eq.assumption.
322 cut m = j \lor \lnot m = j.
324 apply ex_intro ? ? i.
326 rewrite > eqb_n_n i.simplify.
327 apply sym_eq. assumption.
328 apply ex_intro ? ? m.
330 rewrite > not_eq_to_eqb_false m i.
331 rewrite > not_eq_to_eqb_false m j.
332 simplify. reflexivity.
335 apply decidable_eq_nat m j.
336 apply decidable_eq_nat m i.
339 theorem bijn_transpose_r: \forall f:nat\to nat.\forall n,i,j. i \le n \to j \le n \to
340 bijn f n \to bijn (\lambda p.f (transpose i j p)) n.
342 apply bijn_fg f ?.assumption.
343 apply bijn_transpose n i j.assumption.assumption.
346 theorem bijn_transpose_l: \forall f:nat\to nat.\forall n,i,j. i \le n \to j \le n \to
347 bijn f n \to bijn (\lambda p.transpose i j (f p)) n.
350 apply bijn_transpose n i j.assumption.assumption.
355 theorem permut_to_bijn: \forall n:nat.\forall f:nat\to nat.
356 permut f n \to bijn f n.
358 elim n.simplify.intros.
359 apply ex_intro ? ? m.
361 apply le_n_O_elim m ? (\lambda p. f p = p).
362 assumption.unfold permut in H.
363 elim H.apply sym_eq. apply le_n_O_to_eq.apply H2.apply le_n.
364 apply eq_to_bijn (\lambda p.
365 (transpose (f (S n1)) (S n1)) (transpose (f (S n1)) (S n1) (f p))) f.
366 intros.apply transpose_transpose.
367 apply bijn_fg (transpose (f (S n1)) (S n1)).
368 apply bijn_transpose.
370 elim H1.apply H2.apply le_n.apply le_n.
373 apply permut_S_to_permut_transpose.
375 rewrite > eqb_n_n (f (S n1)).simplify.reflexivity.
378 let rec invert_permut n f m \def
379 match eqb m (f n) with
384 |(S p) \Rightarrow invert_permut p f m]].
386 theorem invert_permut_f: \forall f:nat \to nat. \forall n,m:nat.
387 m \le n \to (\forall p:nat. f m = f p \to m = p) \to invert_permut n f (f m) = m.
392 rewrite > eqb_n_n (f O).simplify.reflexivity.
394 rewrite > eqb_n_n (f (S m1)).simplify.reflexivity.
396 rewrite > not_eq_to_eqb_false (f m) (f (S n1)).
397 simplify.apply H2.assumption.
398 simplify.intro.absurd m = S n1.
399 apply H3.assumption.simplify.intro.
400 apply not_le_Sn_n n1.rewrite < H5.assumption.
405 let rec map_iter n (g:nat \to nat) f (a:nat) \def
408 | (S p) \Rightarrow f (g p) (map_iter p g f a)].
410 theorem eq_map_iter: \forall g1,g2:nat \to nat.
411 \forall f:nat \to nat \to nat. \forall n,a:nat.
412 (\forall m:nat. m \lt n \to g1 m = g2 m) \to
413 map_iter n g1 f a = map_iter n g2 f a.
414 intros 5.elim n.simplify.reflexivity.
415 simplify.apply eq_f2.apply H1.simplify.apply le_n.
416 apply H.intros.apply H1.apply trans_lt ? n1.assumption.
420 (* map_iter examples *)
421 theorem eq_map_iter_sigma: \forall g:nat \to nat. \forall n:nat.
422 map_iter n g plus O = sigma n g.
423 intros.elim n.simplify.reflexivity.
425 apply eq_f.assumption.
428 theorem eq_map_iter_pi: \forall g:nat \to nat. \forall n:nat.
429 map_iter n g times (S O) = pi n g.
430 intros.elim n.simplify.reflexivity.
432 apply eq_f.assumption.
435 theorem eq_map_iter_transpose_i_Si : \forall f:nat\to nat \to nat.associative nat f \to
436 symmetric2 nat nat f \to \forall g:nat \to nat. \forall n,i,a:nat. i \lt n \to
437 map_iter (S n) g f a = map_iter (S n) (\lambda m. g (transpose i (S i) m)) f a.
438 intros 5.elim n.apply False_ind.apply not_le_Sn_O i H2.
440 cut i < n1 \lor i = n1.
442 f (g (S n1)) (map_iter (S n1) g f a) =
443 f (g (transpose i (S i) (S n1))) (map_iter (S n1) (\lambda m. g (transpose i (S i) m)) f a).
445 cut g (transpose i (S i) (S n1)) = g (S n1).
447 rewrite < H2 i a H4.reflexivity.
449 rewrite > not_eq_to_eqb_false (S n1) i.
450 rewrite > not_eq_to_eqb_false (S n1) (S i).
451 simplify.reflexivity.
453 apply lt_to_not_eq i n1 H4.
454 apply injective_S i.apply sym_eq.assumption.
456 apply lt_to_not_eq i (S n1).
457 apply trans_lt ? n1.assumption.simplify.apply le_n.
458 apply sym_eq.assumption.
459 (* interesting case *)
461 change with f (g (S n1)) (f (g n1) (map_iter n1 g f a)) =
462 f (g (transpose n1 (S n1) (S n1)))
463 (f (g (transpose n1 (S n1) n1))
464 (map_iter n1 (\lambda m. g (transpose n1 (S n1) m)) f a)).
465 cut (g (transpose n1 (S n1) (S n1))) = g n1.
466 cut (g (transpose n1 (S n1) n1)) = g (S n1).
467 cut map_iter n1 (\lambda m. g (transpose n1 (S n1) m)) f a = map_iter n1 g f a.
468 rewrite > Hcut1.rewrite > Hcut2.rewrite > Hcut3.
470 rewrite > H1 (g (S n1)).
471 rewrite > H.reflexivity.
473 intros.unfold transpose.
474 rewrite > not_eq_to_eqb_false m n1.
475 rewrite > not_eq_to_eqb_false m (S n1).
476 simplify.reflexivity.
477 simplify. intro.apply lt_to_not_eq m (S n1).
478 apply trans_lt ? n1.assumption.simplify. apply le_n.
480 simplify. intro.apply lt_to_not_eq m n1.
481 assumption.assumption.
483 rewrite > eqb_n_n n1.simplify.reflexivity.
485 rewrite > not_eq_to_eqb_false.simplify.
486 rewrite > eqb_n_n n1.simplify.reflexivity.
488 apply not_eq_n_Sn n1. apply sym_eq.assumption.
489 apply le_to_or_lt_eq.
490 apply le_S_S_to_le.assumption.
493 theorem eq_map_iter_transpose: \forall f:nat\to nat \to nat.associative nat f \to
494 symmetric2 nat nat f \to \forall n,a,k:nat.
495 \forall g:nat \to nat. \forall i:nat. S (k + i) \le n \to
496 map_iter (S n) g f a = map_iter (S n) (\lambda m. g (transpose i (S(k + i)) m)) f a.
502 apply eq_map_iter_transpose_i_Si ? H H1.
505 apply trans_eq ? ? (map_iter (S n) (\lambda m. g (transpose i (S(m1 + i)) m)) f a).
507 simplify. apply le_n.
508 apply trans_le ? (S(S (m1+i))).
509 apply le_S.apply le_n.assumption.
510 apply trans_eq ? ? (map_iter (S n) (\lambda m. g
511 (transpose i (S(m1 + i)) (transpose (S(m1 + i)) (S(S(m1 + i))) m))) f a).
512 apply H2 O ? ? (S(m1+i)).
513 simplify.apply le_S_S.apply le_O_n.
515 apply trans_eq ? ? (map_iter (S n) (\lambda m. g
516 (transpose i (S(m1 + i))
517 (transpose (S(m1 + i)) (S(S(m1 + i)))
518 (transpose i (S(m1 + i)) m)))) f a).
520 simplify. apply le_n.
521 apply trans_le ? (S(S (m1+i))).
522 apply le_S.apply le_n.assumption.
525 apply sym_eq. apply eq_transpose.
528 rewrite < H5 in \vdash (? ? %).
529 apply le_S_S.apply le_S.
533 rewrite > H5 in \vdash (? ? %).
537 apply not_eq_n_Sn (S m1+i).
538 apply sym_eq.assumption.
541 theorem eq_map_iter_transpose1: \forall f:nat\to nat \to nat.associative nat f \to
542 symmetric2 nat nat f \to \forall n,a,i,j:nat.
543 \forall g:nat \to nat. i < j \to j \le n \to
544 map_iter (S n) g f a = map_iter (S n) (\lambda m. g (transpose i j m)) f a.
547 cut (S i) < j \lor (S i) = j.
549 cut j = S ((j - (S i)) + i).
551 apply eq_map_iter_transpose f H H1 n a (j - (S i)) g i.
552 rewrite < Hcut1.assumption.
554 apply plus_minus_m_m.apply lt_to_le.assumption.
556 apply eq_map_iter_transpose_i_Si f H H1 g.
558 apply trans_le ? j.assumption.assumption.
559 apply le_to_or_lt_eq.assumption.
562 theorem eq_map_iter_transpose2: \forall f:nat\to nat \to nat.associative nat f \to
563 symmetric2 nat nat f \to \forall n,a,i,j:nat.
564 \forall g:nat \to nat. i \le n \to j \le n \to
565 map_iter (S n) g f a = map_iter (S n) (\lambda m. g (transpose i j m)) f a.
567 apply nat_compare_elim i j.
568 intro.apply eq_map_iter_transpose1 f H H1 n a i j g H4 H3.
570 apply eq_map_iter.intros.
571 rewrite > transpose_i_i j.reflexivity.
573 apply trans_eq ? ? (map_iter (S n) (\lambda m:nat.g (transpose j i m)) f a).
574 apply eq_map_iter_transpose1 f H H1 n a j i g H4 H2.
576 intros.apply eq_f.apply transpose_i_j_j_i.
579 theorem permut_to_eq_map_iter:\forall f:nat\to nat \to nat.associative nat f \to
580 symmetric2 nat nat f \to \forall a,n:nat.\forall g,h:nat \to nat.
582 map_iter (S n) g f a = map_iter (S n) (\lambda m.g(h m)) f a.
584 simplify.rewrite > permut_O_to_eq_O h.reflexivity.assumption.
585 apply trans_eq ? ? (map_iter (S(S n1)) (\lambda m.g ((transpose (h (S n1)) (S n1)) m)) f a).
586 apply eq_map_iter_transpose2 f H H1 (S n1) a ? ? g.
588 elim H3.apply H4.apply le_n.apply le_n.
589 apply trans_eq ? ? (map_iter (S(S n1)) (\lambda m.
590 (g(transpose (h (S n1)) (S n1)
591 (transpose (h (S n1)) (S n1) (h m)))) )f a).
593 f (g (transpose (h (S n1)) (S n1) (S n1)))
594 (map_iter (S n1) (\lambda m.
595 g (transpose (h (S n1)) (S n1) m)) f a)
598 (g(transpose (h (S n1)) (S n1)
599 (transpose (h (S n1)) (S n1) (h (S n1)))))
602 (g(transpose (h (S n1)) (S n1)
603 (transpose (h (S n1)) (S n1) (h m))))) f a).
604 apply eq_f2.apply eq_f.
605 rewrite > transpose_i_j_j.
606 rewrite > transpose_i_j_i.
607 rewrite > transpose_i_j_j.reflexivity.
608 apply H2 (\lambda m.(g(transpose (h (S n1)) (S n1) m))).
609 apply permut_S_to_permut_transpose.
611 apply eq_map_iter.intros.
612 rewrite > transpose_transpose.reflexivity.
615 theorem eq_sigma_transpose_i_Si: \forall n,i:nat. \forall f:nat \to nat. i \lt n \to
616 sigma (S n) f = sigma (S n) (\lambda m. f (transpose i (S i) m)).
617 intro.elim n.apply False_ind.apply not_le_Sn_O i H.
619 cut i < n1 \lor i = n1.
621 (f (S n1))+(sigma (S n1) f) =
622 (f (transpose i (S i) (S n1)))+(sigma (S n1) (\lambda m. f (transpose i (S i) m))).
624 cut f (transpose i (S i) (S n1)) = f (S n1).
626 rewrite < H i f.reflexivity.
627 assumption.unfold transpose.
628 rewrite > not_eq_to_eqb_false (S n1) i.
629 rewrite > not_eq_to_eqb_false (S n1) (S i).
630 simplify.reflexivity.
632 apply lt_to_not_eq i n1 H2.
633 apply injective_S i.apply sym_eq.assumption.
635 apply lt_to_not_eq i (S n1).
636 apply trans_lt ? n1.assumption.simplify.apply le_n.
637 apply sym_eq.assumption.
639 change with (f (S n1))+((f n1)+(sigma n1 f)) =
640 (f (transpose n1 (S n1) (S n1)))+
641 ((f (transpose n1 (S n1) n1))+
642 (sigma n1 (\lambda m. f (transpose n1 (S n1) m)))).
643 cut (f (transpose n1 (S n1) (S n1))) = f n1.
644 cut (f (transpose n1 (S n1) n1)) = f (S n1).
645 cut sigma n1 (\lambda m. f (transpose n1 (S n1) m)) = sigma n1 f.
646 rewrite > Hcut1.rewrite > Hcut2.rewrite > Hcut3.
647 rewrite < assoc_plus.rewrite > sym_plus (f (S n1)).
648 rewrite > assoc_plus.reflexivity.
650 intros.unfold transpose.
651 rewrite > not_eq_to_eqb_false m n1.
652 rewrite > not_eq_to_eqb_false m (S n1).
653 simplify.reflexivity.
654 simplify. intro.apply lt_to_not_eq m (S n1).
655 apply trans_lt ? n1.assumption.simplify. apply le_n.
657 simplify. intro.apply lt_to_not_eq m n1.
658 assumption.assumption.
660 rewrite > eqb_n_n n1.simplify.reflexivity.
662 rewrite > not_eq_to_eqb_false.simplify.
663 rewrite > eqb_n_n n1.simplify.reflexivity.
665 apply not_eq_n_Sn n1. apply sym_eq.assumption.
666 apply le_to_or_lt_eq.
667 apply le_S_S_to_le.assumption.
670 theorem eq_sigma_transpose: \forall n,k:nat. \forall f:nat \to nat.
671 \forall i. S (k + i) \le n \to
672 sigma (S n) f = sigma (S n) (\lambda m. f (transpose i (S(k + i)) m)).
678 apply eq_sigma_transpose_i_Si n i f.
681 apply trans_eq ? ? (sigma (S n) (\lambda m. f (transpose i (S(m1 + i)) m))).
683 simplify. apply le_n.
684 apply trans_le ? (S(S (m1+i))).
685 apply le_S.apply le_n.assumption.
686 apply trans_eq ? ? (sigma (S n) (\lambda m. f
687 (transpose i (S(m1 + i)) (transpose (S(m1 + i)) (S(S(m1 + i))) m)))).
688 apply H O ? ? (S(m1+i)) ?.
689 simplify.apply le_S_S.apply le_O_n.
691 apply trans_eq ? ? (sigma (S n) (\lambda m. f
692 (transpose i (S(m1 + i))
693 (transpose (S(m1 + i)) (S(S(m1 + i)))
694 (transpose i (S(m1 + i)) m))))).
696 simplify. apply le_n.
697 apply trans_le ? (S(S (m1+i))).
698 apply le_S.apply le_n.assumption.
701 apply sym_eq. apply eq_transpose.
704 rewrite < H3 in \vdash (? ? %).
705 apply le_S_S.apply le_S.
709 rewrite > H3 in \vdash (? ? %).
713 apply not_eq_n_Sn (S m1+i).
714 apply sym_eq.assumption.
718 theorem bad: \forall n:nat. \forall f:nat \to nat.
719 permut f n \to sigma (S n) f = sigma (S n) (\lambda n.n).
721 simplify.unfold permut in H.elim H O.
722 rewrite < (le_n_O_to_eq (f O)).simplify. reflexivity.apply le_n.
723 cut permut (\lambda n.transpose (f (S n1)) (S n1) (f n)) n1.
725 (sigma (S(S n1)) (\lambda n.transpose (f (S n1)) (S n1) (f n))).