Documentation

Init.Data.Array.MinMax

Minima and maxima #

min #

def Array.min {α : Type u_1} [Min α] (arr : Array α) (h : arr ≠ #[]) :
α

Returns the smallest element of a non-empty array.

Examples:

  • #[4].min (by decide) = 4
  • #[1, 4, 2, 10, 6].min (by decide) = 1
Equations
Instances For

    min? #

    def Array.min? {α : Type u_1} [Min α] (arr : Array α) :

    Returns the smallest element of the array if it is not empty, or none if it is empty.

    Examples:

    • #[].min? = none
    • #[4].min? = some 4
    • #[1, 4, 2, 10, 6].min? = some 1
    Equations
    Instances For

      max #

      def Array.max {α : Type u_1} [Max α] (arr : Array α) (h : arr ≠ #[]) :
      α

      Returns the largest element of a non-empty array.

      Examples:

      • #[4].max (by decide) = 4
      • #[1, 4, 2, 10, 6].max (by decide) = 10
      Equations
      Instances For

        max? #

        def Array.max? {α : Type u_1} [Max α] (arr : Array α) :

        Returns the largest element of the array if it is not empty, or none if it is empty.

        Examples:

        • #[].max? = none
        • #[4].max? = some 4
        • #[1, 4, 2, 10, 6].max? = some 10
        Equations
        Instances For

          Compatibility with List #

          @[simp]
          theorem List.min_toArray {α : Type u_1} [Min α] {l : List α} {h : l.toArray ≠ #[]} :
          l.toArray.min h = l.min ⋯
          theorem List.min_eq_min_toArray {α : Type u_1} [Min α] {l : List α} {h : l ≠ []} :
          l.min h = l.toArray.min ⋯
          @[simp]
          theorem Array.min_toList {α : Type u_1} [Min α] {xs : Array α} {h : xs.toList ≠ []} :
          xs.toList.min h = xs.min ⋯
          theorem Array.min_eq_min_toList {α : Type u_1} [Min α] {xs : Array α} {h : xs ≠ #[]} :
          xs.min h = xs.toList.min ⋯
          @[simp]
          theorem List.min?_toArray {α : Type u_1} [Min α] {l : List α} :
          @[simp]
          theorem Array.min?_toList {α : Type u_1} [Min α] {xs : Array α} :
          @[simp]
          theorem List.max_toArray {α : Type u_1} [Max α] {l : List α} {h : l.toArray ≠ #[]} :
          l.toArray.max h = l.max ⋯
          theorem List.max_eq_max_toArray {α : Type u_1} [Max α] {l : List α} {h : l ≠ []} :
          l.max h = l.toArray.max ⋯
          @[simp]
          theorem Array.max_toList {α : Type u_1} [Max α] {xs : Array α} {h : xs.toList ≠ []} :
          xs.toList.max h = xs.max ⋯
          theorem Array.max_eq_max_toList {α : Type u_1} [Max α] {xs : Array α} {h : xs ≠ #[]} :
          xs.max h = xs.toList.max ⋯
          @[simp]
          theorem List.max?_toArray {α : Type u_1} [Max α] {l : List α} :
          @[simp]
          theorem Array.max?_toList {α : Type u_1} [Max α] {xs : Array α} :

          Lemmas about min? #

          @[simp]
          theorem Array.min?_empty {α : Type u_1} [Min α] :
          @[simp]
          theorem Array.min?_singleton {α : Type u_1} [Min α] {x : α} :
          theorem Array.min?_singleton_append' {α : Type u_1} {x : α} [Min α] {xs : Array α} :
          (#[x] ++ xs).min? = some (foldl min x xs)
          @[simp]
          theorem Array.min?_singleton_append {α : Type u_1} {x : α} [Min α] [Std.Associative min] {xs : Array α} :
          (#[x] ++ xs).min? = some (xs.min?.elim x (min x))
          @[simp]
          theorem Array.min?_eq_none_iff {α : Type u_1} {xs : Array α} [Min α] :
          xs.min? = none ↔ xs = #[]
          @[simp]
          theorem Array.isSome_min?_iff {α : Type u_1} {xs : Array α} [Min α] :
          theorem Array.isSome_min?_of_mem {α : Type u_1} {xs : Array α} [Min α] {a : α} (h : a ∈ xs) :
          theorem Array.isSome_min?_of_ne_empty {α : Type u_1} [Min α] (xs : Array α) (h : xs ≠ #[]) :
          theorem Array.min?_mem {α : Type u_1} {a : α} [Min α] [Std.MinEqOr α] (xs : Array α) (h : xs.min? = some a) :
          a ∈ xs
          theorem Array.le_min?_iff {α : Type u_1} {a : α} [Min α] [LE α] [Std.LawfulOrderInf α] {xs : Array α} :
          xs.min? = some a → ∀ {x : α}, x ≤ a ↔ ∀ (b : α), b ∈ xs → x ≤ b
          theorem Array.min?_eq_some_iff {α : Type u_1} {a : α} [Min α] [LE α] {xs : Array α} [Std.IsLinearOrder α] [Std.LawfulOrderMin α] :
          xs.min? = some a ↔ a ∈ xs ∧ ∀ (b : α), b ∈ xs → a ≤ b
          theorem Array.min?_replicate {α : Type u_1} [Min α] [Std.IdempotentOp min] {n : Nat} {a : α} :
          @[simp]
          theorem Array.min?_replicate_of_pos {α : Type u_1} [Min α] [Std.MinEqOr α] {n : Nat} {a : α} (h : 0 < n) :
          theorem Array.foldl_min {α : Type u_1} [Min α] [Std.IdempotentOp min] [Std.Associative min] {xs : Array α} {a : α} :
          foldl min a xs = min a (xs.min?.getD a)

          Lemmas about max? #

          @[simp]
          theorem Array.max?_empty {α : Type u_1} [Max α] :
          @[simp]
          theorem Array.max?_singleton {α : Type u_1} [Max α] {x : α} :
          theorem Array.max?_singleton_append' {α : Type u_1} {x : α} [Max α] {xs : Array α} :
          (#[x] ++ xs).max? = some (foldl max x xs)
          @[simp]
          theorem Array.max?_singleton_append {α : Type u_1} {x : α} [Max α] [Std.Associative max] {xs : Array α} :
          (#[x] ++ xs).max? = some (xs.max?.elim x (max x))
          @[simp]
          theorem Array.max?_eq_none_iff {α : Type u_1} {xs : Array α} [Max α] :
          xs.max? = none ↔ xs = #[]
          @[simp]
          theorem Array.isSome_max?_iff {α : Type u_1} {xs : Array α} [Max α] :
          theorem Array.isSome_max?_of_mem {α : Type u_1} {xs : Array α} [Max α] {a : α} (h : a ∈ xs) :
          theorem Array.isSome_max?_of_ne_empty {α : Type u_1} [Max α] (xs : Array α) (h : xs ≠ #[]) :
          theorem Array.max?_mem {α : Type u_1} {a : α} [Max α] [Std.MaxEqOr α] (xs : Array α) (h : xs.max? = some a) :
          a ∈ xs
          theorem Array.max?_le_iff {α : Type u_1} {a : α} [Max α] [LE α] [Std.LawfulOrderSup α] {xs : Array α} :
          xs.max? = some a → ∀ {x : α}, a ≤ x ↔ ∀ (b : α), b ∈ xs → b ≤ x
          theorem Array.max?_eq_some_iff {α : Type u_1} {a : α} [Max α] [LE α] {xs : Array α} [Std.IsLinearOrder α] [Std.LawfulOrderMax α] :
          xs.max? = some a ↔ a ∈ xs ∧ ∀ (b : α), b ∈ xs → b ≤ a
          theorem Array.max?_replicate {α : Type u_1} [Max α] [Std.IdempotentOp max] {n : Nat} {a : α} :
          @[simp]
          theorem Array.max?_replicate_of_pos {α : Type u_1} [Max α] [Std.MaxEqOr α] {n : Nat} {a : α} (h : 0 < n) :
          theorem Array.foldl_max {α : Type u_1} [Max α] [Std.IdempotentOp max] [Std.Associative max] {xs : Array α} {a : α} :
          foldl max a xs = max a (xs.max?.getD a)

          Lemmas about min #

          theorem Array.min?_eq_some_min {α : Type u_1} [Min α] {xs : Array α} (h : xs ≠ #[]) :
          xs.min? = some (xs.min h)
          theorem Array.min_eq_get_min? {α : Type u_1} [Min α] (xs : Array α) (h : xs ≠ #[]) :
          xs.min h = xs.min?.get ⋯
          @[simp]
          theorem Array.get_min? {α : Type u_1} [Min α] {xs : Array α} {h : xs.min?.isSome = true} :
          xs.min?.get h = xs.min ⋯
          theorem Array.min_mem {α : Type u_1} [Min α] [Std.MinEqOr α] {xs : Array α} (h : xs ≠ #[]) :
          xs.min h ∈ xs
          theorem Array.min_le_of_mem {α : Type u_1} [Min α] [LE α] [Std.IsLinearOrder α] [Std.LawfulOrderMin α] {xs : Array α} {a : α} (ha : a ∈ xs) :
          xs.min ⋯ ≤ a
          theorem Array.le_min_iff {α : Type u_1} [Min α] [LE α] [Std.LawfulOrderInf α] {xs : Array α} (h : xs ≠ #[]) {x : α} :
          x ≤ xs.min h ↔ ∀ (b : α), b ∈ xs → x ≤ b
          theorem Array.min_eq_iff {α : Type u_1} {a : α} [Min α] [LE α] {xs : Array α} [Std.IsLinearOrder α] [Std.LawfulOrderMin α] (h : xs ≠ #[]) :
          xs.min h = a ↔ a ∈ xs ∧ ∀ (b : α), b ∈ xs → a ≤ b
          @[simp]
          theorem Array.min_replicate {α : Type u_1} [Min α] [Std.MinEqOr α] {n : Nat} {a : α} (h : replicate n a ≠ #[]) :
          (replicate n a).min h = a
          theorem Array.foldl_min_eq_min {α : Type u_1} [Min α] [Std.IdempotentOp min] [Std.Associative min] {xs : Array α} (h : xs ≠ #[]) {a : α} :
          foldl min a xs = min a (xs.min h)

          Lemmas about max #

          theorem Array.max?_eq_some_max {α : Type u_1} [Max α] {xs : Array α} (h : xs ≠ #[]) :
          xs.max? = some (xs.max h)
          theorem Array.max_eq_get_max? {α : Type u_1} [Max α] (xs : Array α) (h : xs ≠ #[]) :
          xs.max h = xs.max?.get ⋯
          @[simp]
          theorem Array.get_max? {α : Type u_1} [Max α] {xs : Array α} {h : xs.max?.isSome = true} :
          xs.max?.get h = xs.max ⋯
          theorem Array.max_mem {α : Type u_1} [Max α] [Std.MaxEqOr α] {xs : Array α} (h : xs ≠ #[]) :
          xs.max h ∈ xs
          theorem Array.max_le_iff {α : Type u_1} [Max α] [LE α] [Std.LawfulOrderSup α] {xs : Array α} (h : xs ≠ #[]) {x : α} :
          xs.max h ≤ x ↔ ∀ (b : α), b ∈ xs → b ≤ x
          theorem Array.max_eq_iff {α : Type u_1} {a : α} [Max α] [LE α] {xs : Array α} [Std.IsLinearOrder α] [Std.LawfulOrderMax α] (h : xs ≠ #[]) :
          xs.max h = a ↔ a ∈ xs ∧ ∀ (b : α), b ∈ xs → b ≤ a
          theorem Array.le_max_of_mem {α : Type u_1} [Max α] [LE α] [Std.IsLinearOrder α] [Std.LawfulOrderMax α] {xs : Array α} {a : α} (ha : a ∈ xs) :
          a ≤ xs.max ⋯
          @[simp]
          theorem Array.max_replicate {α : Type u_1} [Max α] [Std.MaxEqOr α] {n : Nat} {a : α} (h : replicate n a ≠ #[]) :
          (replicate n a).max h = a
          theorem Array.foldl_max_eq_max {α : Type u_1} [Max α] [Std.IdempotentOp max] [Std.Associative max] {xs : Array α} (h : xs ≠ #[]) {a : α} :
          foldl max a xs = max a (xs.max h)