This PR replaces `List.lt` with `List.Lex`, from Mathlib, and adds the new `Bool` valued lexicographic comparatory function `List.lex`. This subtly changes the definition of `<` on Lists in some situations. `List.lt` was a weaker relation: in particular if `l₁ < l₂`, then `a :: l₁ < b :: l₂` may hold according to `List.lt` even if `a` and `b` are merely incomparable (either neither `a < b` nor `b < a`), whereas according to `List.Lex` this would require `a = b`. When `<` is total, in the sense that `¬ · < ·` is antisymmetric, then the two relations coincide. Mathlib was already overriding the order instances for `List α`, so this change should not be noticed by anyone already using Mathlib. We simultaneously add the boolean valued `List.lex` function, parameterised by a `BEq` typeclass and an arbitrary `lt` function. This will support the flexibility previously provided for `List.lt`, via a `==` function which is weaker than strict equality.
14 lines
554 B
Text
14 lines
554 B
Text
def List.bubblesort [LT α] [DecidableLT α] (l : List α) : {l' : List α // l.length = l'.length} :=
|
||
match l with
|
||
| [] => ⟨[], rfl⟩
|
||
| x :: xs =>
|
||
match bubblesort xs with
|
||
| ⟨[], h⟩ => ⟨[x], by simp[h]⟩
|
||
| ⟨y :: ys, h⟩ =>
|
||
if y < x then
|
||
have : Nat.succ (length ys) < Nat.succ (length xs) := by rw [h, List.length_cons]; apply Nat.lt_succ_self
|
||
let ⟨zs, he⟩ := bubblesort (x :: ys)
|
||
⟨y :: zs, by simp[h, ← he]⟩
|
||
else
|
||
⟨x :: y :: ys, by simp[h]⟩
|
||
termination_by l.length
|