@@ -412,14 +412,6 @@ theorem perm_split : ∀ {l l₁ l₂ : List α}, split l = (l₁, l₂) → l ~
412
412
exact ((perm_split e).trans perm_append_comm).cons a
413
413
#align list.perm_split List.perm_split
414
414
415
- /-- Merge two sorted lists into one in linear time.
416
-
417
- merge [1, 2, 4, 5] [0, 1, 3, 4] = [0, 1, 1, 2, 3, 4, 4, 5] -/
418
- def merge : List α → List α → List α
419
- | [], l' => l'
420
- | l, [] => l
421
- | a :: l, b :: l' => if a ≼ b then a :: merge l (b :: l') else b :: merge (a :: l) l'
422
- termination_by l₁ l₂ => length l₁ + length l₂
423
415
#align list.merge List.merge
424
416
425
417
/-- Implementation of a merge sort algorithm to sort a list. -/
@@ -433,28 +425,18 @@ def mergeSort : List α → List α
433
425
have h := length_split_lt e
434
426
have := h.1
435
427
have := h.2
436
- exact merge r (mergeSort ls.1 ) (mergeSort ls.2 )
428
+ exact merge (r · ·) (mergeSort ls.1 ) (mergeSort ls.2 )
437
429
termination_by l => length l
438
430
#align list.merge_sort List.mergeSort
439
431
440
432
@[nolint unusedHavesSuffices] -- Porting note: false positive
441
433
theorem mergeSort_cons_cons {a b} {l l₁ l₂ : List α} (h : split (a :: b :: l) = (l₁, l₂)) :
442
- mergeSort r (a :: b :: l) = merge r (mergeSort r l₁) (mergeSort r l₂) := by
434
+ mergeSort r (a :: b :: l) = merge (r · ·) (mergeSort r l₁) (mergeSort r l₂) := by
443
435
simp only [mergeSort, h]
444
436
#align list.merge_sort_cons_cons List.mergeSort_cons_cons
445
437
446
438
section Correctness
447
439
448
- theorem perm_merge : ∀ l l' : List α, merge r l l' ~ l ++ l'
449
- | [], [] => by simp [merge]
450
- | [], b :: l' => by simp [merge]
451
- | a :: l, [] => by simp [merge]
452
- | a :: l, b :: l' => by
453
- by_cases h : a ≼ b
454
- · simpa [merge, h] using perm_merge _ _
455
- · suffices b :: merge r (a :: l) l' ~ a :: (l ++ b :: l') by simpa [merge, h]
456
- exact ((perm_merge _ _).cons _).trans ((swap _ _ _).trans (perm_middle.symm.cons _))
457
- termination_by l₁ l₂ => length l₁ + length l₂
458
440
#align list.perm_merge List.perm_merge
459
441
460
442
theorem perm_mergeSort : ∀ l : List α, mergeSort r l ~ l
@@ -464,7 +446,7 @@ theorem perm_mergeSort : ∀ l : List α, mergeSort r l ~ l
464
446
cases' e : split (a :: b :: l) with l₁ l₂
465
447
cases' length_split_lt e with h₁ h₂
466
448
rw [mergeSort_cons_cons r e]
467
- apply (perm_merge r _ _).trans
449
+ apply (perm_merge (r · ·) _ _).trans
468
450
exact
469
451
((perm_mergeSort l₁).append (perm_mergeSort l₂)).trans (perm_split e).symm
470
452
termination_by l => length l
@@ -479,14 +461,14 @@ section TotalAndTransitive
479
461
480
462
variable {r} [IsTotal α r] [IsTrans α r]
481
463
482
- theorem Sorted.merge : ∀ {l l' : List α}, Sorted r l → Sorted r l' → Sorted r (merge r l l')
483
- | [], [], _, _ => by simp [List.merge]
484
- | [], b :: l', _, h₂ => by simpa [List.merge] using h₂
485
- | a :: l, [], h₁, _ => by simpa [List.merge] using h₁
464
+ theorem Sorted.merge : ∀ {l l' : List α}, Sorted r l → Sorted r l' → Sorted r (merge (r · ·) l l')
465
+ | [], [], _, _ => by simp
466
+ | [], b :: l', _, h₂ => by simpa using h₂
467
+ | a :: l, [], h₁, _ => by simpa using h₁
486
468
| a :: l, b :: l', h₁, h₂ => by
487
469
by_cases h : a ≼ b
488
- · suffices ∀ b' ∈ List.merge r l (b :: l'), r a b' by
489
- simpa [List.merge, h, h₁.of_cons.merge h₂]
470
+ · suffices ∀ b' ∈ List.merge (r · ·) l (b :: l'), r a b' by
471
+ simpa [h, h₁.of_cons.merge h₂]
490
472
intro b' bm
491
473
rcases show b' = b ∨ b' ∈ l ∨ b' ∈ l' by
492
474
simpa [or_left_comm] using (perm_merge _ _ _).subset bm with
@@ -495,8 +477,8 @@ theorem Sorted.merge : ∀ {l l' : List α}, Sorted r l → Sorted r l' → Sort
495
477
assumption
496
478
· exact rel_of_sorted_cons h₁ _ bl
497
479
· exact _root_.trans h (rel_of_sorted_cons h₂ _ bl')
498
- · suffices ∀ b' ∈ List.merge r (a :: l) l', r b b' by
499
- simpa [List.merge, h, h₁.merge h₂.of_cons]
480
+ · suffices ∀ b' ∈ List.merge (r · ·) (a :: l) l', r b b' by
481
+ simpa [h, h₁.merge h₂.of_cons]
500
482
intro b' bm
501
483
have ba : b ≼ a := (total_of r _ _).resolve_left h
502
484
have : b' = a ∨ b' ∈ l ∨ b' ∈ l' := by simpa using (perm_merge _ _ _).subset bm
0 commit comments