@@ -155,6 +155,51 @@ theorem foldl_min [Min α] [Std.IdempotentOp (min : α → α → α)] [Std.Asso
155155 {l : List α} {a : α} : l.foldl (init := a) min = min a (l.min?.getD a) := by
156156 cases l <;> simp [min?, foldl_assoc, Std.IdempotentOp.idempotent]
157157
158+ /-! ### min -/
159+
160+ theorem min?_eq_some_min [Min α] : {l : List α} → (hl : l ≠ []) →
161+ l.min? = some (l.min hl)
162+ | a::as, _ => by simp [List.min, List.min?_cons']
163+
164+ theorem min_eq_head {α : Type u} [Min α] {l : List α}
165+ (hl : l ≠ [])
166+ (h : l.Pairwise (fun a b => min a b = a)) : l.min hl = l.head hl := by
167+ apply Option.some.inj
168+ rw [← min?_eq_some_min, ←head?_eq_some_head]
169+ exact min?_eq_head? h
170+
171+ theorem min_mem [Min α] [MinEqOr α] {l : List α} {hl : l ≠ []} :
172+ l.min hl ∈ l := by
173+ exact min?_mem (min?_eq_some_min hl)
174+
175+ protected theorem le_min_iff [Min α] [LE α] [LawfulOrderInf α]
176+ {l : List α} {hl : l ≠ []} : ∀ {x}, x ≤ l.min hl ↔ ∀ b, b ∈ l → x ≤ b := by
177+ exact le_min?_iff (min?_eq_some_min hl)
178+
179+ theorem min_iff [Min α] [LE α] {l : List α} [IsLinearOrder α] [LawfulOrderMin α] {hl : l ≠ []} :
180+ l.min hl = a ↔ a ∈ l ∧ ∀ b, b ∈ l → a ≤ b := by
181+ simpa [min?_eq_some_min hl] using (min?_eq_some_iff (xs := l))
182+
183+ theorem min_eq_min_attach [Min α] [MinEqOr α] {l : List α} {hl : l ≠ []} :
184+ l.min hl = Subtype.val (l.attach.min (List.attach_ne_nil_iff.mpr hl)) := by
185+ simpa [min?_eq_some_min hl, min?_eq_some_min (List.attach_ne_nil_iff.mpr hl)]
186+ using (min?_eq_min?_attach (xs := l))
187+
188+ theorem min_iff_subtype [Min α] [LE α] {l : List α} {hl : l ≠ []}
189+ [MinEqOr α] [IsLinearOrder (Subtype (· ∈ l))] [LawfulOrderMin (Subtype (· ∈ l))] :
190+ l.min hl = a ↔ a ∈ l ∧ ∀ b, b ∈ l → a ≤ b := by
191+ simpa [min?_eq_some_min hl] using (min?_eq_some_iff_subtype (xs := l))
192+
193+ theorem min_replicate [Min α] [MinEqOr α] {n : Nat} {a : α} (h: replicate n a ≠ []) :
194+ (replicate n a).min h = a := by
195+ have n_pos : 0 < n := Nat.pos_of_ne_zero (fun hn => by simp [hn] at h)
196+ simpa [min?_eq_some_min h] using (min?_replicate_of_pos (a:=a) n_pos)
197+
198+ theorem foldl_min_eq_min [Min α] [Std.IdempotentOp (min : α → α → α)] [Std.Associative (min : α → α → α)]
199+ {l : List α} {hl : l ≠ []} {a : α}:
200+ l.foldl min a = min a (l.min hl) := by
201+ simpa [min?_eq_some_min hl] using foldl_min (l := l)
202+
158203/-! ### max? -/
159204
160205@[simp] theorem max?_nil [Max α] : ([] : List α).max? = none := rfl
@@ -296,4 +341,49 @@ theorem foldl_max [Max α] [Std.IdempotentOp (max : α → α → α)] [Std.Asso
296341 {l : List α} {a : α} : l.foldl (init := a) max = max a (l.max?.getD a) := by
297342 cases l <;> simp [max?, foldl_assoc, Std.IdempotentOp.idempotent]
298343
344+ /-! ### max -/
345+
346+ theorem max?_eq_some_max [Max α] : {l : List α} → (hl : l ≠ []) →
347+ l.max? = some (l.max hl)
348+ | a::as, _ => by simp [List.max, List.max?_cons']
349+
350+ theorem max_eq_head {α : Type u} [Max α] {l : List α}
351+ (hl : l ≠ [])
352+ (h : l.Pairwise (fun a b => max a b = a)) : l.max hl = l.head hl := by
353+ apply Option.some.inj
354+ rw [← max?_eq_some_max, ←head?_eq_some_head]
355+ exact max?_eq_head? h
356+
357+ theorem max_mem [Max α] [MaxEqOr α] {l : List α} {hl : l ≠ []} :
358+ l.max hl ∈ l := by
359+ exact max?_mem (max?_eq_some_max hl)
360+
361+ protected theorem max_le_iff [Max α] [LE α] [LawfulOrderSup α]
362+ {l : List α} {hl : l ≠ []} : ∀ {x}, l.max hl ≤ x ↔ ∀ b, b ∈ l → b ≤ x := by
363+ exact max?_le_iff (max?_eq_some_max hl)
364+
365+ theorem max_iff [Max α] [LE α] {l : List α} [IsLinearOrder α] [LawfulOrderMax α] {hl : l ≠ []} :
366+ l.max hl = a ↔ a ∈ l ∧ ∀ b, b ∈ l → b ≤ a := by
367+ simpa [max?_eq_some_max hl] using (max?_eq_some_iff (xs := l))
368+
369+ theorem max_eq_max_attach [Max α] [MaxEqOr α] {l : List α} {hl : l ≠ []} :
370+ l.max hl = Subtype.val (l.attach.max (List.attach_ne_nil_iff.mpr hl)) := by
371+ simpa [max?_eq_some_max hl, max?_eq_some_max (List.attach_ne_nil_iff.mpr hl)]
372+ using (max?_eq_max?_attach (xs := l))
373+
374+ theorem max_iff_subtype [Max α] [LE α] {l : List α} {hl : l ≠ []}
375+ [MaxEqOr α] [IsLinearOrder (Subtype (· ∈ l))] [LawfulOrderMax (Subtype (· ∈ l))] :
376+ l.max hl = a ↔ a ∈ l ∧ ∀ b, b ∈ l → b ≤ a := by
377+ simpa [max?_eq_some_max hl] using (max?_eq_some_iff_subtype (xs := l))
378+
379+ theorem max_replicate [Max α] [MaxEqOr α] {n : Nat} {a : α} (h: replicate n a ≠ []) :
380+ (replicate n a).max h = a := by
381+ have n_pos : 0 < n := Nat.pos_of_ne_zero (fun hn => by simp [hn] at h)
382+ simpa [max?_eq_some_max h] using (max?_replicate_of_pos (a:=a) n_pos)
383+
384+ theorem foldl_max_eq_max [Max α] [Std.IdempotentOp (max : α → α → α)] [Std.Associative (max : α → α → α)]
385+ {l : List α} {hl : l ≠ []} {a : α}:
386+ l.foldl max a = max a (l.max hl) := by
387+ simpa [max?_eq_some_max hl] using foldl_max (l := l)
388+
299389end List
0 commit comments