Defines `mergeSort`, a naive stable merge sort algorithm, replaces it via a `@[csimp]` lemma with something faster at runtime, and proves the following results: * `mergeSort_sorted`: `mergeSort` produces a sorted list. * `mergeSort_perm`: `mergeSort` is a permutation of the input list. * `mergeSort_of_sorted`: `mergeSort` does not change a sorted list. * `mergeSort_cons`: proves `mergeSort le (x :: xs) = l₁ ++ x :: l₂` for some `l₁, l₂` so that `mergeSort le xs = l₁ ++ l₂`, and no `a ∈ l₁` satisfies `le a x`. * `mergeSort_stable`: if `c` is a sorted sublist of `l`, then `c` is still a sublist of `mergeSort le l`.
25 lines
717 B
Text
25 lines
717 B
Text
/-
|
|
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Leonardo de Moura
|
|
-/
|
|
prelude
|
|
import Init.Data.List.Attach
|
|
import Init.Data.List.Basic
|
|
import Init.Data.List.BasicAux
|
|
import Init.Data.List.Control
|
|
import Init.Data.List.Count
|
|
import Init.Data.List.Erase
|
|
import Init.Data.List.Find
|
|
import Init.Data.List.Impl
|
|
import Init.Data.List.Lemmas
|
|
import Init.Data.List.MinMax
|
|
import Init.Data.List.Monadic
|
|
import Init.Data.List.Nat
|
|
import Init.Data.List.Notation
|
|
import Init.Data.List.Pairwise
|
|
import Init.Data.List.Sublist
|
|
import Init.Data.List.TakeDrop
|
|
import Init.Data.List.Zip
|
|
import Init.Data.List.Perm
|
|
import Init.Data.List.Sort
|