Documentation

Cslib.Algorithms.Lean.Sort.Merge

A Monadic version of the builtin List.mergeSort #

This can be instantiated with Id to recover the original, or with TimeM or FreeM for algorithmic analysis.

@[irreducible]
def List.mergeM {m : TypeType u_1} [Monad m] {α : Type} (xs ys : List α) (le : ααm Bool) :
m (List α)

A monadic version of List.merge

Equations
Instances For
    @[simp]
    theorem List.nil_mergeM {m : TypeType u_1} [Monad m] {α : Type} (ys : List α) (le : ααm Bool) :
    [].mergeM ys le = pure ys
    @[simp]
    theorem List.mergeM_right {m : TypeType u_1} [Monad m] {α : Type} (xs : List α) (le : ααm Bool) :
    xs.mergeM [] le = pure xs
    @[simp]
    theorem List.cons_mergeM_cons {m : TypeType u_1} [Monad m] {α : Type} (x y : α) (xs ys : List α) (le : ααm Bool) :
    (x :: xs).mergeM (y :: ys) le = do let __do_liftle x y if __do_lift = true then do let __do_liftxs.mergeM (y :: ys) le pure (x :: __do_lift) else do let __do_lift(x :: xs).mergeM ys le pure (y :: __do_lift)
    @[simp]
    theorem List.mergeM_pure {m : TypeType u_1} [Monad m] {α : Type} [LawfulMonad m] (xs ys : List α) (le : ααBool) :
    (xs.mergeM ys fun (x y : α) => pure (le x y)) = pure (xs.merge ys le)
    @[simp]
    theorem List.idRun_mergeM {α : Type} (xs ys : List α) (le : ααId Bool) :
    (xs.mergeM ys le).run = xs.merge ys fun (x y : α) => (le x y).run
    theorem Cslib.IsMonadHom.map_listMergeM {m : TypeType u_1} {n : TypeType u_2} [Monad m] [Monad n] {α : Type} {f : {β : Type} → m βn β} (hf : IsMonadHom m n fun {α : Type} => f) (xs ys : List α) (le : ααm Bool) :
    f (xs.mergeM ys le) = xs.mergeM ys fun (x y : α) => f (le x y)
    @[irreducible]
    def List.mergeSortM {m : TypeType u_1} [Monad m] {α : Type} (xs : List α) (le : ααm Bool) :
    m (List α)

    A monadic version of List.mergeSortM

    Equations
    Instances For
      @[simp]
      theorem List.mergeSortM_nil {m : TypeType u_1} [Monad m] {α : Type} (le : ααm Bool) :
      @[simp]
      theorem List.mergeSortM_singleton {m : TypeType u_1} [Monad m] {α : Type} (a : α) (le : ααm Bool) :
      @[simp]
      theorem List.mergeSortM_pure {m : TypeType u_1} [Monad m] {α : Type} [LawfulMonad m] (xs : List α) (le : ααBool) :
      (xs.mergeSortM fun (x y : α) => pure (le x y)) = pure (xs.mergeSort le)
      @[simp]
      theorem List.idRun_mergeSortM {α : Type} (xs : List α) (le : ααId Bool) :
      (xs.mergeSortM le).run = xs.mergeSort fun (x y : α) => (le x y).run
      theorem Cslib.IsMonadHom.map_listMergeSortM {m : TypeType u_1} {n : TypeType u_2} [Monad m] [Monad n] {α : Type} {f : {β : Type} → m βn β} (hf : IsMonadHom m n fun {α : Type} => f) (xs : List α) (le : ααm Bool) :
      f (xs.mergeSortM le) = xs.mergeSortM fun (x y : α) => f (le x y)