Skip to content

Commit 01b4ded

Browse files
authored
Merge pull request #36 from pi8027/avoid-restart
Avoid the `Restart` command
2 parents 574912b + 56e7582 commit 01b4ded

File tree

3 files changed

+44
-82
lines changed

3 files changed

+44
-82
lines changed

Make.icfp25

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,5 @@ icfp25/Section4_1.v
77
-R theories stablesort
88
-R icfp25 stablesort.icfp25
99

10-
-arg -async-proofs-cache -arg force
11-
-arg -w -arg -undo-batch-mode
1210
-arg -w -arg -notation-overridden
1311
-arg -w -arg -deprecated-coq-env-var

icfp25/AppendicesAB.v

Lines changed: 41 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -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

502505
Lemma sort_ind sort T (leT : rel T) (R : list T -> list T -> Prop) :
@@ -521,8 +524,7 @@ Proof. exact: stablesort.sort_map. Qed.
521524
Lemma pairwise_sort sort T (leT : rel T) (s : list T) :
522525
pairwise leT s -> sort T leT s = s.
523526
Proof.
524-
exact: stablesort.pairwise_sort.
525-
Restart.
527+
Succeed exact: stablesort.pairwise_sort.
526528
elim/sort_ind: (sort _ leT s) => // xs xs' IHxs ys ys' IHys.
527529
by rewrite pairwise_cat => /and3P[/allrel_merge <- /IHxs -> /IHys ->].
528530
rewrite pairwise_cat allrelC -allrel_rev2 => /and3P[hlr /IHxs -> /IHys ->].
@@ -532,26 +534,23 @@ Qed.
532534
Lemma sorted_sort sort T (leT : rel T) :
533535
transitive leT -> forall s : list T, sorted leT s -> sort T leT s = s.
534536
Proof.
535-
exact: stablesort.sorted_sort.
536-
Restart.
537+
Succeed exact: stablesort.sorted_sort.
537538
by move=> leT_tr s; rewrite sorted_pairwise //; apply/pairwise_sort.
538539
Qed.
539540

540541
Lemma 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.
543544
Proof.
544-
exact: stablesort.sorted_sort_in.
545-
Restart.
545+
Succeed exact: stablesort.sorted_sort_in.
546546
move=> /in3_sig ? _ /all_sigP[s ->].
547547
by rewrite sort_map sorted_map => /sorted_sort->.
548548
Qed.
549549

550550
Lemma 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).
552552
Proof.
553-
exact: stablesort.sort_pairwise_stable.
554-
Restart.
553+
Succeed exact: stablesort.sort_pairwise_stable.
555554
move=> leT_total s.
556555
suff: (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).
573572
Proof.
574-
exact: stablesort.sort_pairwise_stable_in.
575-
Restart.
573+
Succeed exact: stablesort.sort_pairwise_stable_in.
576574
move=> /in2_sig leT_total _ /all_sigP[s ->].
577575
by rewrite sort_map pairwise_map sorted_map; apply: sort_pairwise_stable.
578576
Qed.
579577

580578
Lemma 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).
582580
Proof.
583-
exact: stablesort.sort_stable.
584-
Restart.
581+
Succeed exact: stablesort.sort_stable.
585582
by move=> ? ? s; rewrite sorted_pairwise//; apply: sort_pairwise_stable.
586583
Qed.
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).
592589
Proof.
593-
exact: stablesort.sort_stable_in.
594-
Restart.
590+
Succeed exact: stablesort.sort_stable_in.
595591
move=> /in2_sig leT_total /in3_sig leT_tr _ /all_sigP[s ->].
596592
by rewrite sort_map !sorted_map; apply: sort_stable.
597593
Qed.
598594

599595
Lemma count_sort sort T (leT : rel T) (p : pred T) (s : list T) :
600596
count p (sort T leT s) = count p s.
601597
Proof.
602-
exact: stablesort.count_sort.
603-
Restart.
598+
Succeed exact: stablesort.count_sort.
604599
by 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.
606601
Qed.
607602

608603
Lemma size_sort sort T (leT : rel T) (s : list T) :
609604
size (sort T leT s) = size s.
610605
Proof.
611-
exact: stablesort.size_sort.
612-
Restart.
606+
Succeed exact: stablesort.size_sort.
613607
exact: (count_sort sort leT predT).
614608
Qed.
615609

616610
Lemma sort_nil sort T (leT : rel T) : sort T leT [::] = [::].
617611
Proof.
618-
exact: stablesort.sort_nil.
619-
Restart.
612+
Succeed exact: stablesort.sort_nil.
620613
by case: (sort _) (size_sort sort leT [::]).
621614
Qed.
622615

623616
Lemma all_sort sort T (p : pred T) (leT : rel T) (s : list T) :
624617
all p (sort T leT s) = all p s.
625618
Proof.
626-
exact: stablesort.all_sort.
627-
Restart.
619+
Succeed exact: stablesort.all_sort.
628620
by rewrite !all_count count_sort size_sort.
629621
Qed.
630622

631623
Lemma perm_sort sort (T : eqType) (leT : rel T) (s : list T) :
632624
perm_eql (sort T leT s) s.
633625
Proof.
634-
exact: stablesort.perm_sort.
635-
Restart.
626+
Succeed exact: stablesort.perm_sort.
636627
by apply/permPl/permP => ?; rewrite count_sort.
637628
Qed.
638629

639630
Lemma mem_sort sort (T : eqType) (leT : rel T) (s : list T) : sort T leT s =i s.
640631
Proof.
641-
exact: stablesort.mem_sort.
642-
Restart.
632+
Succeed exact: stablesort.mem_sort.
643633
exact/perm_mem/permPl/perm_sort.
644634
Qed.
645635

646636
Lemma sort_uniq sort (T : eqType) (leT : rel T) (s : list T) :
647637
uniq (sort T leT s) = uniq s.
648638
Proof.
649-
exact: stablesort.sort_uniq.
650-
Restart.
639+
Succeed exact: stablesort.sort_uniq.
651640
exact/perm_uniq/permPl/perm_sort.
652641
Qed.
653642

654643
Lemma 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).
657646
Proof.
658-
exact: stablesort.filter_sort.
659-
Restart.
647+
Succeed exact: stablesort.filter_sort.
660648
move=> leT_total leT_tr p s; case Ds: s => [|x s1]; first by rewrite sort_nil.
661649
pose lt := lexord (relpre (nth x s) leT) ltn.
662650
have 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).
675663
Proof.
676-
exact: stablesort.filter_sort_in.
677-
Restart.
664+
Succeed exact: stablesort.filter_sort_in.
678665
move=> /in2_sig leT_total /in3_sig leT_tr p _ /all_sigP[s ->].
679666
by rewrite !(sort_map, filter_map) filter_sort.
680667
Qed.
@@ -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.
686673
Proof.
687-
exact: stablesort.sorted_filter_sort.
688-
Restart.
674+
Succeed exact: stablesort.sorted_filter_sort.
689675
by move=> *; rewrite filter_sort// sorted_sort.
690676
Qed.
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.
696682
Proof.
697-
exact: stablesort.sorted_filter_sort_in.
698-
Restart.
683+
Succeed exact: stablesort.sorted_filter_sort_in.
699684
move=> /in2_sig leT_total /in3_sig leT_tr p _ /all_sigP[s ->].
700685
by rewrite sort_map !filter_map sorted_map /= => /sorted_filter_sort ->.
701686
Qed.
@@ -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.
706691
Proof.
707-
exact: stablesort.sort_sort.
708-
Restart.
692+
Succeed exact: stablesort.sort_sort.
709693
move=> leT_total leT_tr leT'_total leT'_tr s.
710694
case Ds: s => [|x s1]; first by rewrite !sort_nil.
711695
pose 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.
729713
Proof.
730-
exact: stablesort.sort_sort_in.
731-
Restart.
714+
Succeed exact: stablesort.sort_sort_in.
732715
move=> /in2_sig leT_total /in3_sig leT_tr /in2_sig leT'_total /in3_sig leT'_tr.
733716
by move=> _ /all_sigP[s ->]; rewrite !sort_map sort_sort.
734717
Qed.
735718

736719
Lemma sort_sorted sort T (leT : rel T) :
737720
total leT -> forall s : list T, sorted leT (sort T leT s).
738721
Proof.
739-
exact: stablesort.sort_sorted.
740-
Restart.
722+
Succeed exact: stablesort.sort_sorted.
741723
move=> leT_total s; apply/sub_sorted/sort_stable => //= [? ? /andP[] //|].
742724
by case: s => // x s; elim: s x => /=.
743725
Qed.
@@ -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).
748730
Proof.
749-
exact: stablesort.sort_sorted_in.
750-
Restart.
731+
Succeed exact: stablesort.sort_sorted_in.
751732
by move=> /in2_sig ? _ /all_sigP[s ->]; rewrite sort_map sorted_map sort_sorted.
752733
Qed.
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).
758739
Proof.
759-
exact: stablesort.perm_sortP.
760-
Restart.
740+
Succeed exact: stablesort.perm_sortP.
761741
move=> leT_total leT_tr leT_asym s1 s2.
762742
apply: (iffP idP) => eq12; last by rewrite -(perm_sort sort leT) eq12 perm_sort.
763743
apply: (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).
771751
Proof.
772-
exact: stablesort.perm_sort_inP.
773-
Restart.
752+
Succeed exact: stablesort.perm_sort_inP.
774753
move=> /in2_sig leT_total /in3_sig leT_tr /in2_sig/(_ _ _ _)/val_inj leT_asym.
775754
apply: (iffP idP) => s1s2; last by rewrite -(perm_sort sort leT) s1s2 perm_sort.
776755
move: (s1s2); have /all_sigP[s1' ->] := allss s1.
@@ -782,8 +761,7 @@ Qed.
782761
Lemma eq_sort sort1 sort2 T (leT : rel T) :
783762
total leT -> transitive leT -> sort1 T leT =1 sort2 T leT.
784763
Proof.
785-
exact: stablesort.eq_sort.
786-
Restart.
764+
Succeed exact: stablesort.eq_sort.
787765
move=> leT_total leT_tr s; case Ds: s => [|x s1]; first by rewrite !sort_nil.
788766
pose lt := lexord (relpre (nth x s) leT) ltn.
789767
have 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.
801779
Proof.
802-
exact: stablesort.eq_in_sort.
803-
Restart.
780+
Succeed exact: stablesort.eq_in_sort.
804781
move=> /in2_sig ? /in3_sig ? _ /all_sigP[s ->].
805782
by rewrite !sort_map; congr map; exact: eq_sort.
806783
Qed.
@@ -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).
825802
Proof.
826-
exact: stablesort.sort_cat.
827-
Restart.
803+
Succeed exact: stablesort.sort_cat.
828804
move=> leT_total leT_tr s1 s2.
829805
by rewrite !eq_sort_insert; elim: s1 => //= x s1 ->; rewrite mergeA.
830806
Qed.
@@ -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).
836812
Proof.
837-
exact: stablesort.sort_cat_in.
838-
Restart.
813+
Succeed exact: stablesort.sort_cat_in.
839814
move=> leT_total leT_tr s1 s2 /all_sigP [{}s1 ->] /all_sigP [{}s2 ->].
840815
rewrite -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)}.
848823
Proof.
849-
exact: stablesort.mask_sort.
850-
Restart.
824+
Succeed exact: stablesort.mask_sort.
851825
move=> leT_total leT_tr s m.
852826
case Ds: {-}s => [|x s1]; first by exists [::]; rewrite Ds mask0 sort_nil.
853827
rewrite -(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)}.
864838
Proof.
865-
exact: stablesort.mask_sort_in.
866-
Restart.
839+
Succeed exact: stablesort.mask_sort_in.
867840
move=> leT_total leT_tr s m.
868841
pose le_sT := relpre (val : sig P -> _) leT.
869842
pose 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}.
879852
Proof.
880-
exact: stablesort.sorted_mask_sort.
881-
Restart.
853+
Succeed exact: stablesort.sorted_mask_sort.
882854
move=> leT_total leT_tr s m.
883855
by move/(sorted_sort sort leT_tr) <-; exact: mask_sort.
884856
Qed.
@@ -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}.
890862
Proof.
891-
exact: stablesort.sorted_mask_sort_in.
892-
Restart.
863+
Succeed exact: stablesort.sorted_mask_sort_in.
893864
move=> leT_total leT_tr s m allPs /(sorted_sort_in sort leT_tr _) <-.
894865
exact/mask_sort_in/allPs.
895866
exact: 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).
901872
Proof.
902-
exact: stablesort.subseq_sort.
903-
Restart.
873+
Succeed exact: stablesort.subseq_sort.
904874
move=> leT_total leT_tr _ s /subseqP [m _ ->].
905875
by have [m' <-] := mask_sort sort leT_total leT_tr s m; exact: mask_subseq.
906876
Qed.
@@ -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).
911881
Proof.
912-
exact: stablesort.subseq_sort_in.
913-
Restart.
882+
Succeed exact: stablesort.subseq_sort_in.
914883
move=> leT_total leT_tr /subseqP [m _ ->].
915884
have [m' <-] := mask_sort_in sort leT_total leT_tr m (allss _).
916885
exact: 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).
922891
Proof.
923-
exact: stablesort.sorted_subseq_sort.
924-
Restart.
892+
Succeed exact: stablesort.sorted_subseq_sort.
925893
move=> ? leT_tr t s subseq_ts /(sorted_sort sort leT_tr) <-.
926894
exact: subseq_sort.
927895
Qed.
@@ -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).
932900
Proof.
933-
exact: stablesort.sorted_subseq_sort_in.
934-
Restart.
901+
Succeed exact: stablesort.sorted_subseq_sort_in.
935902
move=> ? leT_tr ? /(sorted_sort_in sort leT_tr) <-; last exact/allP/mem_subseq.
936903
exact: subseq_sort_in.
937904
Qed.
@@ -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.
943910
Proof.
944-
exact: stablesort.mem2_sort.
945-
Restart.
911+
Succeed exact: stablesort.mem2_sort.
946912
move=> leT_total leT_tr s x y lexy; rewrite !mem2E => ?.
947913
by apply: sorted_subseq_sort => //; case: (_ == _); rewrite //= lexy.
948914
Qed.
@@ -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.
953919
Proof.
954-
exact: stablesort.mem2_sort_in.
955-
Restart.
920+
Succeed exact: stablesort.mem2_sort_in.
956921
move=> leT_total leT_tr x y lexy; rewrite !mem2E.
957922
move=> /[dup] /mem_subseq /allP ? /(subseq_sort_in sort leT_total leT_tr).
958923
rewrite !(eq_in_sort_insert sort leT_total leT_tr) ?allss //.

0 commit comments

Comments
 (0)