chore: remove @[simp] from List.getLast_eq_iff_getLast_eq_some (#5178)

This was not a great simp lemma, and hurts simp confluence. Better to
just use it locally where it is useful.

Similarly `List.head_eq_iff_head?_eq_some`.
This commit is contained in:
Kim Morrison 2024-08-27 13:23:39 +10:00 committed by GitHub
parent 9ef996259b
commit c4e4248487
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 13 additions and 25 deletions

View file

@ -267,6 +267,6 @@ theorem getLast?_attach {xs : List α} :
subst h'
simp at h
· symm
simpa
simpa [getLast_eq_iff_getLast_eq_some]
end List

View file

@ -67,7 +67,7 @@ theorem exists_of_findSome?_eq_some {l : List α} {f : α → Option β} (w : l.
@[simp] theorem filterMap_head (f : α → Option β) (l : List α) (h) :
(l.filterMap f).head h = (l.findSome? f).get (by simp_all [Option.isSome_iff_ne_none]) := by
simp
simp [head_eq_iff_head?_eq_some]
@[simp] theorem filterMap_getLast? (f : α → Option β) (l : List α) : (l.filterMap f).getLast? = l.reverse.findSome? f := by
rw [getLast?_eq_head?_reverse]
@ -75,7 +75,7 @@ theorem exists_of_findSome?_eq_some {l : List α} {f : α → Option β} (w : l.
@[simp] theorem filterMap_getLast (f : α → Option β) (l : List α) (h) :
(l.filterMap f).getLast h = (l.reverse.findSome? f).get (by simp_all [Option.isSome_iff_ne_none]) := by
simp
simp [getLast_eq_iff_getLast_eq_some]
@[simp] theorem map_findSome? (f : α → Option β) (g : β → γ) (l : List α) :
(l.findSome? f).map g = l.findSome? (Option.map g ∘ f) := by
@ -246,7 +246,7 @@ theorem mem_of_find?_eq_some : ∀ {l}, find? p l = some a → a ∈ l
@[simp] theorem filter_head (p : α → Bool) (l : List α) (h) :
(l.filter p).head h = (l.find? p).get (by simp_all [Option.isSome_iff_ne_none]) := by
simp
simp [head_eq_iff_head?_eq_some]
@[simp] theorem filter_getLast? (p : α → Bool) (l : List α) : (l.filter p).getLast? = l.reverse.find? p := by
rw [getLast?_eq_head?_reverse]
@ -254,7 +254,7 @@ theorem mem_of_find?_eq_some : ∀ {l}, find? p l = some a → a ∈ l
@[simp] theorem filter_getLast (p : α → Bool) (l : List α) (h) :
(l.filter p).getLast h = (l.reverse.find? p).get (by simp_all [Option.isSome_iff_ne_none]) := by
simp
simp [getLast_eq_iff_getLast_eq_some]
@[simp] theorem find?_filterMap (xs : List α) (f : α → Option β) (p : β → Bool) :
(xs.filterMap f).find? p = (xs.find? (fun a => (f a).any p)).bind f := by

View file

@ -917,13 +917,7 @@ theorem head!_of_head? [Inhabited α] : ∀ {l : List α}, head? l = some a →
theorem head?_eq_head : ∀ {l} h, @head? α l = some (head l h)
| _::_, _ => rfl
/--
We simplify `xs.head h = a` to `xs.head? = some a`,
despite not simplifying `xs.head h` to `(xs.head?).get ⋯`.
We can often make further progress on the goal after this simplification,
because the dependency on `h` has been removed.
-/
@[simp] theorem head_eq_iff_head?_eq_some {xs : List α} (h) : xs.head h = a ↔ xs.head? = some a := by
theorem head_eq_iff_head?_eq_some {xs : List α} (h) : xs.head h = a ↔ xs.head? = some a := by
cases xs with
| nil => simp at h
| cons x xs => simp
@ -2326,19 +2320,13 @@ theorem bind_reverse {β} (l : List α) (f : α → List β) : (l.reverse.bind f
by_cases h' : l = []
· simp_all
· simp only [head_eq_iff_head?_eq_some, head?_reverse] at ih
simp [ih, h, h', getLast_cons]
simp [ih, h, h', getLast_cons, head_eq_iff_head?_eq_some]
theorem getLast_eq_head_reverse {l : List α} (h : l ≠ []) :
l.getLast h = l.reverse.head (by simp_all) := by
rw [← head_reverse]
/--
We simplify `xs.getLast h = a` to `xs.getLast? = some a`,
despite not simplifying `xs.getLast h` to `(xs.getLast?).get ⋯`.
We can often make further progress on the goal after this simplification,
because the dependency on `h` has been removed.
-/
@[simp] theorem getLast_eq_iff_getLast_eq_some {xs : List α} (h) : xs.getLast h = a ↔ xs.getLast? = some a := by
theorem getLast_eq_iff_getLast_eq_some {xs : List α} (h) : xs.getLast h = a ↔ xs.getLast? = some a := by
rw [getLast_eq_head_reverse, head_eq_iff_head?_eq_some]
simp

View file

@ -69,7 +69,7 @@ theorem head?_range' (n : Nat) : (range' s n).head? = if n = 0 then none else so
induction n <;> simp_all [range'_succ, head?_append]
@[simp] theorem head_range' (n : Nat) (h) : (range' s n).head h = s := by
repeat simp_all [head?_range']
repeat simp_all [head?_range', head_eq_iff_head?_eq_some]
theorem getLast?_range' (n : Nat) : (range' s n).getLast? = if n = 0 then none else some (s + n - 1) := by
induction n generalizing s with
@ -86,7 +86,7 @@ theorem getLast?_range' (n : Nat) : (range' s n).getLast? = if n = 0 then none e
@[simp] theorem getLast_range' (n : Nat) (h) : (range' s n).getLast h = s + n - 1 := by
cases n with
| zero => simp at h
| succ n => simp [getLast?_range']
| succ n => simp [getLast?_range', getLast_eq_iff_getLast_eq_some]
theorem pairwise_lt_range' s n (step := 1) (pos : 0 < step := by simp) :
Pairwise (· < ·) (range' s n step) :=
@ -305,7 +305,7 @@ theorem head?_range (n : Nat) : (range n).head? = if n = 0 then none else some 0
@[simp] theorem head_range (n : Nat) (h) : (range n).head h = 0 := by
cases n with
| zero => simp at h
| succ n => simp [head?_range]
| succ n => simp [head?_range, head_eq_iff_head?_eq_some]
theorem getLast?_range (n : Nat) : (range n).getLast? = if n = 0 then none else some (n - 1) := by
induction n with
@ -317,7 +317,7 @@ theorem getLast?_range (n : Nat) : (range n).getLast? = if n = 0 then none else
@[simp] theorem getLast_range (n : Nat) (h) : (range n).getLast h = n - 1 := by
cases n with
| zero => simp at h
| succ n => simp [getLast?_range]
| succ n => simp [getLast?_range, getLast_eq_iff_getLast_eq_some]
theorem take_range (m n : Nat) : take m (range n) = range (min m n) := by
apply List.ext_getElem

View file

@ -275,7 +275,7 @@ theorem head?_drop (l : List α) (n : Nat) :
theorem head_drop {l : List α} {n : Nat} (h : l.drop n ≠ []) :
(l.drop n).head h = l[n]'(by simp_all) := by
have w : n < l.length := length_lt_of_drop_ne_nil h
simpa [getElem?_eq_getElem, h, w] using head?_drop l n
simpa [getElem?_eq_getElem, h, w, head_eq_iff_head?_eq_some] using head?_drop l n
theorem getLast?_drop {l : List α} : (l.drop n).getLast? = if l.length ≤ n then none else l.getLast? := by
rw [getLast?_eq_getElem?, getElem?_drop]