Skip to content

Commit 8beaca3

Browse files
committed
feat: add another List.find?_eq_some lemma
1 parent 4df71ed commit 8beaca3

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

src/Init/Data/List/Find.lean

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ theorem IsInfix.findSome?_eq_none {l₁ l₂ : List α} {f : α → Option β} (
206206
@[simp] theorem find?_eq_none : find? p l = none ↔ ∀ x ∈ l, ¬ p x := by
207207
induction l <;> simp [find?_cons]; split <;> simp [*]
208208

209-
theorem find?_eq_some : xs.find? p = some b ↔ p b ∧ ∃ as bs, xs = as ++ b :: bs ∧ ∀ a ∈ as, !p a := by
209+
theorem find?_eq_some_iff_append :
210+
xs.find? p = some b ↔ p b ∧ ∃ as bs, xs = as ++ b :: bs ∧ ∀ a ∈ as, !p a := by
210211
induction xs with
211212
| nil => simp
212213
| cons x xs ih =>
@@ -242,6 +243,9 @@ theorem find?_eq_some : xs.find? p = some b ↔ p b ∧ ∃ as bs, xs = as ++ b
242243
cases h₁
243244
simp
244245

246+
@[deprecated find?_eq_some_iff_append (since := "2024-11-06")]
247+
abbrev find?_eq_some := @find?_eq_some_iff_append
248+
245249
@[simp]
246250
theorem find?_cons_eq_some : (a :: xs).find? p = some b ↔ (p a ∧ a = b) ∨ (!p a ∧ xs.find? p = some b) := by
247251
rw [find?_cons]
@@ -347,7 +351,7 @@ theorem find?_flatten_eq_some {xs : List (List α)} {p : α → Bool} {a : α} :
347351
xs.flatten.find? p = some a ↔
348352
p a ∧ ∃ as ys zs bs, xs = as ++ (ys ++ a :: zs) :: bs ∧
349353
(∀ a ∈ as, ∀ x ∈ a, !p x) ∧ (∀ x ∈ ys, !p x) := by
350-
rw [find?_eq_some]
354+
rw [find?_eq_some_iff_append]
351355
constructor
352356
· rintro ⟨h, ⟨ys, zs, h₁, h₂⟩⟩
353357
refine ⟨h, ?_⟩

src/Init/Data/List/Nat/Find.lean

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,32 @@ import Init.Data.List.Find
99

1010
namespace List
1111

12+
open Nat
13+
14+
theorem find?_eq_some_iff_getElem {xs : List α} {p : α → Bool} {b : α} :
15+
xs.find? p = some b ↔ p b ∧ ∃ i h, xs[i] = b ∧ ∀ j : Nat, (hj : j < i) → !p xs[j] := by
16+
rw [find?_eq_some_iff_append]
17+
simp only [Bool.not_eq_eq_eq_not, Bool.not_true, exists_and_right, and_congr_right_iff]
18+
intro w
19+
constructor
20+
· rintro ⟨as, ⟨bs, rfl⟩, h⟩
21+
refine ⟨as.length, ⟨?_, ?_, ?_⟩⟩
22+
· simp only [length_append, length_cons]
23+
refine Nat.lt_add_of_pos_right (zero_lt_succ bs.length)
24+
· rw [getElem_append_right (Nat.le_refl as.length)]
25+
simp
26+
· intro j h'
27+
rw [getElem_append_left h']
28+
exact h _ (getElem_mem h')
29+
· rintro ⟨i, h, rfl, h'⟩
30+
refine ⟨xs.take i, ⟨xs.drop (i+1), ?_⟩, ?_⟩
31+
· rw [getElem_cons_drop, take_append_drop]
32+
· intro a m
33+
rw [mem_take_iff_getElem] at m
34+
obtain ⟨j, h, rfl⟩ := m
35+
apply h'
36+
omega
37+
1238
theorem findIdx?_eq_some_le_of_findIdx?_eq_some {xs : List α} {p q : α → Bool} (w : ∀ x ∈ xs, p x → q x) {i : Nat}
1339
(h : xs.findIdx? p = some i) : ∃ j, j ≤ i ∧ xs.findIdx? q = some j := by
1440
simp only [findIdx?_eq_findSome?_enum] at h

src/Init/Data/List/Nat/Range.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ theorem range'_eq_append_iff : range' s n = xs ++ ys ↔ ∃ k, k ≤ n ∧ xs =
108108

109109
@[simp] theorem find?_range'_eq_some {s n : Nat} {i : Nat} {p : Nat → Bool} :
110110
(range' s n).find? p = some i ↔ p i ∧ i ∈ range' s n ∧ ∀ j, s ≤ j → j < i → !p j := by
111-
rw [find?_eq_some]
111+
rw [find?_eq_some_iff_append]
112112
simp only [Bool.not_eq_eq_eq_not, Bool.not_true, exists_and_right, mem_range'_1,
113113
and_congr_right_iff]
114114
simp only [range'_eq_append_iff, eq_comm (a := i :: _), range'_eq_cons_iff]
@@ -282,7 +282,7 @@ theorem find?_iota_eq_none {n : Nat} {p : Nat → Bool} :
282282

283283
@[simp] theorem find?_iota_eq_some {n : Nat} {i : Nat} {p : Nat → Bool} :
284284
(iota n).find? p = some i ↔ p i ∧ i ∈ iota n ∧ ∀ j, i < j → j ≤ n → !p j := by
285-
rw [find?_eq_some]
285+
rw [find?_eq_some_iff_append]
286286
simp only [iota_eq_reverse_range', reverse_eq_append_iff, reverse_cons, append_assoc, cons_append,
287287
nil_append, Bool.not_eq_eq_eq_not, Bool.not_true, exists_and_right, mem_reverse, mem_range'_1,
288288
and_congr_right_iff]

0 commit comments

Comments
 (0)