@@ -497,6 +497,9 @@ Proof. exact: seq.all_sigP. Qed.
497497
498498(***************************************************************************** *)
499499(* Appendix B: The theory of stable sort functions *)
500+ (* Most proofs come with the first line `Succeed exact: ...` to ensure that *)
501+ (* the statement matches exactly with the one in `stablesort.v`, followed by *)
502+ (* the copy of the proof. *)
500503(***************************************************************************** *)
501504
502505Lemma sort_ind sort T (leT : rel T) (R : list T -> list T -> Prop ) :
@@ -521,8 +524,7 @@ Proof. exact: stablesort.sort_map. Qed.
521524Lemma pairwise_sort sort T (leT : rel T) (s : list T) :
522525 pairwise leT s -> sort T leT s = s.
523526Proof .
524- exact: stablesort.pairwise_sort.
525- Restart.
527+ Succeed exact: stablesort.pairwise_sort.
526528elim/sort_ind: (sort _ leT s) => // xs xs' IHxs ys ys' IHys.
527529 by rewrite pairwise_cat => /and3P[/allrel_merge <- /IHxs -> /IHys ->].
528530rewrite pairwise_cat allrelC -allrel_rev2 => /and3P[hlr /IHxs -> /IHys ->].
@@ -532,26 +534,23 @@ Qed.
532534Lemma sorted_sort sort T (leT : rel T) :
533535 transitive leT -> forall s : list T, sorted leT s -> sort T leT s = s.
534536Proof .
535- exact: stablesort.sorted_sort.
536- Restart.
537+ Succeed exact: stablesort.sorted_sort.
537538by move=> leT_tr s; rewrite sorted_pairwise //; apply/pairwise_sort.
538539Qed .
539540
540541Lemma sorted_sort_in sort T (P : pred T) (leT : rel T) :
541542 {in P & &, transitive leT} ->
542543 forall s : list T, all P s -> sorted leT s -> sort T leT s = s.
543544Proof .
544- exact: stablesort.sorted_sort_in.
545- Restart.
545+ Succeed exact: stablesort.sorted_sort_in.
546546move=> /in3_sig ? _ /all_sigP[s ->].
547547by rewrite sort_map sorted_map => /sorted_sort->.
548548Qed .
549549
550550Lemma sort_pairwise_stable sort T (leT leT' : rel T) : total leT ->
551551 forall s : list T, pairwise leT' s -> sorted (lexord leT leT') (sort T leT s).
552552Proof .
553- exact: stablesort.sort_pairwise_stable.
554- Restart.
553+ Succeed exact: stablesort.sort_pairwise_stable.
555554move=> leT_total s.
556555suff: (forall P, all P s -> all P (sort T leT s)) /\
557556 (pairwise leT' s -> sorted (lexord leT leT') (sort T leT s)).
@@ -571,17 +570,15 @@ Lemma sort_pairwise_stable_in sort T (P : pred T) (leT leT' : rel T) :
571570 {in P &, total leT} -> forall s : list T, all P s -> pairwise leT' s ->
572571 sorted (lexord leT leT') (sort T leT s).
573572Proof .
574- exact: stablesort.sort_pairwise_stable_in.
575- Restart.
573+ Succeed exact: stablesort.sort_pairwise_stable_in.
576574move=> /in2_sig leT_total _ /all_sigP[s ->].
577575by rewrite sort_map pairwise_map sorted_map; apply: sort_pairwise_stable.
578576Qed .
579577
580578Lemma sort_stable sort T (leT leT' : rel T) : total leT -> transitive leT' ->
581579 forall s : list T, sorted leT' s -> sorted (lexord leT leT') (sort T leT s).
582580Proof .
583- exact: stablesort.sort_stable.
584- Restart.
581+ Succeed exact: stablesort.sort_stable.
585582by move=> ? ? s; rewrite sorted_pairwise//; apply: sort_pairwise_stable.
586583Qed .
587584
@@ -590,73 +587,64 @@ Lemma sort_stable_in sort T (P : pred T) (leT leT' : rel T) :
590587 forall s : list T, all P s -> sorted leT' s ->
591588 sorted (lexord leT leT') (sort T leT s).
592589Proof .
593- exact: stablesort.sort_stable_in.
594- Restart.
590+ Succeed exact: stablesort.sort_stable_in.
595591move=> /in2_sig leT_total /in3_sig leT_tr _ /all_sigP[s ->].
596592by rewrite sort_map !sorted_map; apply: sort_stable.
597593Qed .
598594
599595Lemma count_sort sort T (leT : rel T) (p : pred T) (s : list T) :
600596 count p (sort T leT s) = count p s.
601597Proof .
602- exact: stablesort.count_sort.
603- Restart.
598+ Succeed exact: stablesort.count_sort.
604599by elim/sort_ind: (sort _ leT s) => // xs xs' IHxs ys ys' IHys;
605600 rewrite ?count_rev count_merge !count_cat ?count_rev IHxs IHys // addnC.
606601Qed .
607602
608603Lemma size_sort sort T (leT : rel T) (s : list T) :
609604 size (sort T leT s) = size s.
610605Proof .
611- exact: stablesort.size_sort.
612- Restart.
606+ Succeed exact: stablesort.size_sort.
613607exact: (count_sort sort leT predT).
614608Qed .
615609
616610Lemma sort_nil sort T (leT : rel T) : sort T leT [::] = [::].
617611Proof .
618- exact: stablesort.sort_nil.
619- Restart.
612+ Succeed exact: stablesort.sort_nil.
620613by case: (sort _) (size_sort sort leT [::]).
621614Qed .
622615
623616Lemma all_sort sort T (p : pred T) (leT : rel T) (s : list T) :
624617 all p (sort T leT s) = all p s.
625618Proof .
626- exact: stablesort.all_sort.
627- Restart.
619+ Succeed exact: stablesort.all_sort.
628620by rewrite !all_count count_sort size_sort.
629621Qed .
630622
631623Lemma perm_sort sort (T : eqType) (leT : rel T) (s : list T) :
632624 perm_eql (sort T leT s) s.
633625Proof .
634- exact: stablesort.perm_sort.
635- Restart.
626+ Succeed exact: stablesort.perm_sort.
636627by apply/permPl/permP => ?; rewrite count_sort.
637628Qed .
638629
639630Lemma mem_sort sort (T : eqType) (leT : rel T) (s : list T) : sort T leT s =i s.
640631Proof .
641- exact: stablesort.mem_sort.
642- Restart.
632+ Succeed exact: stablesort.mem_sort.
643633exact/perm_mem/permPl/perm_sort.
644634Qed .
645635
646636Lemma sort_uniq sort (T : eqType) (leT : rel T) (s : list T) :
647637 uniq (sort T leT s) = uniq s.
648638Proof .
649- exact: stablesort.sort_uniq.
650- Restart.
639+ Succeed exact: stablesort.sort_uniq.
651640exact/perm_uniq/permPl/perm_sort.
652641Qed .
653642
654643Lemma filter_sort sort T (leT : rel T) : total leT -> transitive leT ->
655644 forall (p : pred T) (s : list T),
656645 filter p (sort T leT s) = sort T leT (filter p s).
657646Proof .
658- exact: stablesort.filter_sort.
659- Restart.
647+ Succeed exact: stablesort.filter_sort.
660648move=> leT_total leT_tr p s; case Ds: s => [|x s1]; first by rewrite sort_nil.
661649pose lt := lexord (relpre (nth x s) leT) ltn.
662650have lt_tr: transitive lt by apply/lexord_trans/ltn_trans/relpre_trans.
@@ -673,8 +661,7 @@ Lemma filter_sort_in sort T (P : pred T) (leT : rel T) :
673661 forall (p : pred T) (s : list T),
674662 all P s -> filter p (sort T leT s) = sort T leT (filter p s).
675663Proof .
676- exact: stablesort.filter_sort_in.
677- Restart.
664+ Succeed exact: stablesort.filter_sort_in.
678665move=> /in2_sig leT_total /in3_sig leT_tr p _ /all_sigP[s ->].
679666by rewrite !(sort_map, filter_map) filter_sort.
680667Qed .
@@ -684,8 +671,7 @@ Lemma sorted_filter_sort sort T (leT : rel T) :
684671 forall (p : pred T) (s : list T),
685672 sorted leT (filter p s) -> filter p (sort _ leT s) = filter p s.
686673Proof .
687- exact: stablesort.sorted_filter_sort.
688- Restart.
674+ Succeed exact: stablesort.sorted_filter_sort.
689675by move=> *; rewrite filter_sort// sorted_sort.
690676Qed .
691677
@@ -694,8 +680,7 @@ Lemma sorted_filter_sort_in sort T (P : {pred T}) (leT : rel T) :
694680 forall (p : pred T) (s : list T),
695681 all P s -> sorted leT (filter p s) -> filter p (sort _ leT s) = filter p s.
696682Proof .
697- exact: stablesort.sorted_filter_sort_in.
698- Restart.
683+ Succeed exact: stablesort.sorted_filter_sort_in.
699684move=> /in2_sig leT_total /in3_sig leT_tr p _ /all_sigP[s ->].
700685by rewrite sort_map !filter_map sorted_map /= => /sorted_filter_sort ->.
701686Qed .
@@ -704,8 +689,7 @@ Lemma sort_sort sort T (leT leT' : rel T) :
704689 total leT -> transitive leT -> total leT' -> transitive leT' ->
705690 forall s : list T, sort T leT (sort T leT' s) = sort T (lexord leT leT') s.
706691Proof .
707- exact: stablesort.sort_sort.
708- Restart.
692+ Succeed exact: stablesort.sort_sort.
709693move=> leT_total leT_tr leT'_total leT'_tr s.
710694case Ds: s => [|x s1]; first by rewrite !sort_nil.
711695pose lt' := lexord (relpre (nth x s) leT') ltn.
@@ -727,17 +711,15 @@ Lemma sort_sort_in sort T (P : pred T) (leT leT' : rel T) :
727711 forall s : list T,
728712 all P s -> sort T leT (sort T leT' s) = sort T (lexord leT leT') s.
729713Proof .
730- exact: stablesort.sort_sort_in.
731- Restart.
714+ Succeed exact: stablesort.sort_sort_in.
732715move=> /in2_sig leT_total /in3_sig leT_tr /in2_sig leT'_total /in3_sig leT'_tr.
733716by move=> _ /all_sigP[s ->]; rewrite !sort_map sort_sort.
734717Qed .
735718
736719Lemma sort_sorted sort T (leT : rel T) :
737720 total leT -> forall s : list T, sorted leT (sort T leT s).
738721Proof .
739- exact: stablesort.sort_sorted.
740- Restart.
722+ Succeed exact: stablesort.sort_sorted.
741723move=> leT_total s; apply/sub_sorted/sort_stable => //= [? ? /andP[] //|].
742724by case: s => // x s; elim: s x => /=.
743725Qed .
@@ -746,8 +728,7 @@ Lemma sort_sorted_in sort T (P : pred T) (leT : rel T) :
746728 {in P &, total leT} ->
747729 forall s : list T, all P s -> sorted leT (sort T leT s).
748730Proof .
749- exact: stablesort.sort_sorted_in.
750- Restart.
731+ Succeed exact: stablesort.sort_sorted_in.
751732by move=> /in2_sig ? _ /all_sigP[s ->]; rewrite sort_map sorted_map sort_sorted.
752733Qed .
753734
@@ -756,8 +737,7 @@ Lemma perm_sortP sort (T : eqType) (leT : rel T) :
756737 forall s1 s2 : list T,
757738 reflect (sort T leT s1 = sort T leT s2) (perm_eq s1 s2).
758739Proof .
759- exact: stablesort.perm_sortP.
760- Restart.
740+ Succeed exact: stablesort.perm_sortP.
761741move=> leT_total leT_tr leT_asym s1 s2.
762742apply: (iffP idP) => eq12; last by rewrite -(perm_sort sort leT) eq12 perm_sort.
763743apply: (sorted_eq leT_tr leT_asym); rewrite ?sort_sorted //.
@@ -769,8 +749,7 @@ Lemma perm_sort_inP sort (T : eqType) (leT : rel T) (s1 s2 : list T) :
769749 {in s1 &, antisymmetric leT} ->
770750 reflect (sort T leT s1 = sort T leT s2) (perm_eq s1 s2).
771751Proof .
772- exact: stablesort.perm_sort_inP.
773- Restart.
752+ Succeed exact: stablesort.perm_sort_inP.
774753move=> /in2_sig leT_total /in3_sig leT_tr /in2_sig/(_ _ _ _)/val_inj leT_asym.
775754apply: (iffP idP) => s1s2; last by rewrite -(perm_sort sort leT) s1s2 perm_sort.
776755move: (s1s2); have /all_sigP[s1' ->] := allss s1.
782761Lemma eq_sort sort1 sort2 T (leT : rel T) :
783762 total leT -> transitive leT -> sort1 T leT =1 sort2 T leT.
784763Proof .
785- exact: stablesort.eq_sort.
786- Restart.
764+ Succeed exact: stablesort.eq_sort.
787765move=> leT_total leT_tr s; case Ds: s => [|x s1]; first by rewrite !sort_nil.
788766pose lt := lexord (relpre (nth x s) leT) ltn.
789767have lt_tr: transitive lt by apply/lexord_trans/ltn_trans/relpre_trans.
@@ -799,8 +777,7 @@ Lemma eq_in_sort sort1 sort2 T (P : pred T) (leT : rel T) :
799777 {in P &, total leT} -> {in P & &, transitive leT} ->
800778 forall s : list T, all P s -> sort1 T leT s = sort2 T leT s.
801779Proof .
802- exact: stablesort.eq_in_sort.
803- Restart.
780+ Succeed exact: stablesort.eq_in_sort.
804781move=> /in2_sig ? /in3_sig ? _ /all_sigP[s ->].
805782by rewrite !sort_map; congr map; exact: eq_sort.
806783Qed .
@@ -823,8 +800,7 @@ Lemma sort_cat sort T (leT : rel T) : total leT -> transitive leT ->
823800 forall s1 s2 : list T,
824801 sort T leT (s1 ++ s2) = merge leT (sort T leT s1) (sort T leT s2).
825802Proof .
826- exact: stablesort.sort_cat.
827- Restart.
803+ Succeed exact: stablesort.sort_cat.
828804move=> leT_total leT_tr s1 s2.
829805by rewrite !eq_sort_insert; elim: s1 => //= x s1 ->; rewrite mergeA.
830806Qed .
@@ -834,8 +810,7 @@ Lemma sort_cat_in sort T (P : pred T) (leT : rel T) :
834810 forall s1 s2 : list T, all P s1 -> all P s2 ->
835811 sort T leT (s1 ++ s2) = merge leT (sort T leT s1) (sort T leT s2).
836812Proof .
837- exact: stablesort.sort_cat_in.
838- Restart.
813+ Succeed exact: stablesort.sort_cat_in.
839814move=> leT_total leT_tr s1 s2 /all_sigP [{}s1 ->] /all_sigP [{}s2 ->].
840815rewrite -map_cat !sort_map merge_map; congr map; apply: sort_cat.
841816 exact: in2_sig leT_total.
@@ -846,8 +821,7 @@ Lemma mask_sort sort T (leT : rel T) : total leT -> transitive leT ->
846821 forall (s : list T) (m : list bool),
847822 {m_s : list bool | mask m_s (sort T leT s) = sort T leT (mask m s)}.
848823Proof .
849- exact: stablesort.mask_sort.
850- Restart.
824+ Succeed exact: stablesort.mask_sort.
851825move=> leT_total leT_tr s m.
852826case Ds: {-}s => [|x s1]; first by exists [::]; rewrite Ds mask0 sort_nil.
853827rewrite -(mkseq_nth x s) -map_mask !sort_map.
@@ -862,8 +836,7 @@ Lemma mask_sort_in sort T (P : pred T) (leT : rel T) :
862836 forall (s : list T) (m : list bool), all P s ->
863837 {m_s : list bool | mask m_s (sort T leT s) = sort T leT (mask m s)}.
864838Proof .
865- exact: stablesort.mask_sort_in.
866- Restart.
839+ Succeed exact: stablesort.mask_sort_in.
867840move=> leT_total leT_tr s m.
868841pose le_sT := relpre (val : sig P -> _) leT.
869842pose le_sT_total : total le_sT := in2_sig leT_total.
@@ -877,8 +850,7 @@ Lemma sorted_mask_sort sort T (leT : rel T) : total leT -> transitive leT ->
877850 forall (s : list T) (m : list bool), sorted leT (mask m s) ->
878851 {m_s : list bool | mask m_s (sort T leT s) = mask m s}.
879852Proof .
880- exact: stablesort.sorted_mask_sort.
881- Restart.
853+ Succeed exact: stablesort.sorted_mask_sort.
882854move=> leT_total leT_tr s m.
883855by move/(sorted_sort sort leT_tr) <-; exact: mask_sort.
884856Qed .
@@ -888,8 +860,7 @@ Lemma sorted_mask_sort_in sort T (P : pred T) (leT : rel T) :
888860 forall (s : list T) (m : list bool), all P s -> sorted leT (mask m s) ->
889861 {m_s : list bool | mask m_s (sort T leT s) = mask m s}.
890862Proof .
891- exact: stablesort.sorted_mask_sort_in.
892- Restart.
863+ Succeed exact: stablesort.sorted_mask_sort_in.
893864move=> leT_total leT_tr s m allPs /(sorted_sort_in sort leT_tr _) <-.
894865 exact/mask_sort_in/allPs.
895866exact: all_mask.
@@ -899,8 +870,7 @@ Lemma subseq_sort sort (T : eqType) (leT : rel T) :
899870 total leT -> transitive leT ->
900871 forall t s : list T, subseq t s -> subseq (sort T leT t) (sort T leT s).
901872Proof .
902- exact: stablesort.subseq_sort.
903- Restart.
873+ Succeed exact: stablesort.subseq_sort.
904874move=> leT_total leT_tr _ s /subseqP [m _ ->].
905875by have [m' <-] := mask_sort sort leT_total leT_tr s m; exact: mask_subseq.
906876Qed .
@@ -909,8 +879,7 @@ Lemma subseq_sort_in sort (T : eqType) (leT : rel T) (t s : list T) :
909879 {in s &, total leT} -> {in s & &, transitive leT} ->
910880 subseq t s -> subseq (sort T leT t) (sort T leT s).
911881Proof .
912- exact: stablesort.subseq_sort_in.
913- Restart.
882+ Succeed exact: stablesort.subseq_sort_in.
914883move=> leT_total leT_tr /subseqP [m _ ->].
915884have [m' <-] := mask_sort_in sort leT_total leT_tr m (allss _).
916885exact: mask_subseq.
@@ -920,8 +889,7 @@ Lemma sorted_subseq_sort sort (T : eqType) (leT : rel T) :
920889 total leT -> transitive leT ->
921890 forall t s : list T, subseq t s -> sorted leT t -> subseq t (sort T leT s).
922891Proof .
923- exact: stablesort.sorted_subseq_sort.
924- Restart.
892+ Succeed exact: stablesort.sorted_subseq_sort.
925893move=> ? leT_tr t s subseq_ts /(sorted_sort sort leT_tr) <-.
926894exact: subseq_sort.
927895Qed .
@@ -930,8 +898,7 @@ Lemma sorted_subseq_sort_in sort (T : eqType) (leT : rel T) (t s : list T) :
930898 {in s &, total leT} -> {in s & &, transitive leT} ->
931899 subseq t s -> sorted leT t -> subseq t (sort T leT s).
932900Proof .
933- exact: stablesort.sorted_subseq_sort_in.
934- Restart.
901+ Succeed exact: stablesort.sorted_subseq_sort_in.
935902move=> ? leT_tr ? /(sorted_sort_in sort leT_tr) <-; last exact/allP/mem_subseq.
936903exact: subseq_sort_in.
937904Qed .
@@ -941,8 +908,7 @@ Lemma mem2_sort sort (T : eqType) (leT : rel T) :
941908 forall (s : list T) (x y : T),
942909 leT x y -> mem2 s x y -> mem2 (sort T leT s) x y.
943910Proof .
944- exact: stablesort.mem2_sort.
945- Restart.
911+ Succeed exact: stablesort.mem2_sort.
946912move=> leT_total leT_tr s x y lexy; rewrite !mem2E => ?.
947913by apply: sorted_subseq_sort => //; case: (_ == _); rewrite //= lexy.
948914Qed .
@@ -951,8 +917,7 @@ Lemma mem2_sort_in sort (T : eqType) (leT : rel T) (s : list T) :
951917 {in s &, total leT} -> {in s & &, transitive leT} ->
952918 forall x y : T, leT x y -> mem2 s x y -> mem2 (sort T leT s) x y.
953919Proof .
954- exact: stablesort.mem2_sort_in.
955- Restart.
920+ Succeed exact: stablesort.mem2_sort_in.
956921move=> leT_total leT_tr x y lexy; rewrite !mem2E.
957922move=> /[dup] /mem_subseq /allP ? /(subseq_sort_in sort leT_total leT_tr).
958923rewrite !(eq_in_sort_insert sort leT_total leT_tr) ?allss //.
0 commit comments