Skip to content

Commit d62205c

Browse files
kim-emfgdorais
andauthored
feat: lemmas about Array.filter and Array.filterMap (#387)
Co-authored-by: François G. Dorais <fgdorais@gmail.com>
1 parent b197bd2 commit d62205c

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

Std/Data/Array/Lemmas.lean

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ attribute [simp] isEmpty uget
3939
@[simp] theorem toArray_data : (a : Array α) → a.data.toArray = a
4040
| ⟨l⟩ => ext' (data_toArray l)
4141

42+
@[simp] theorem data_length {l : Array α} : l.data.length = l.size := rfl
43+
4244
theorem mem_data {a : α} {l : Array α} : a ∈ l.data ↔ a ∈ l := (mem_def _ _).symm
4345

4446
theorem not_mem_nil (a : α) : ¬ a ∈ #[] := fun.
@@ -359,6 +361,59 @@ theorem forIn_eq_data_forIn [Monad m]
359361
rw [loop (i := i)]; rw [← ij, Nat.succ_add]; rfl
360362
simp [forIn, Array.forIn]; rw [loop (Nat.zero_add _)]; rfl
361363

364+
/-! ### map -/
365+
366+
@[simp] theorem mem_map {f : α → β} {l : Array α} : b ∈ l.map f ↔ ∃ a, a ∈ l ∧ f a = b := by
367+
simp only [mem_def, map_data, List.mem_map]
368+
369+
/-! ### filter -/
370+
371+
@[simp] theorem filter_data (p : α → Bool) (l : Array α) :
372+
(l.filter p).data = l.data.filter p := by
373+
dsimp only [filter]
374+
rw [foldl_eq_foldl_data]
375+
generalize l.data = l
376+
suffices ∀ a, (List.foldl (fun r a => if p a = true then push r a else r) a l).data =
377+
a.data ++ List.filter p l by
378+
simpa using this #[]
379+
induction l with simp
380+
| cons => split <;> simp [*]
381+
382+
@[simp] theorem filter_filter (q) (l : Array α) :
383+
filter p (filter q l) = filter (fun a => p a ∧ q a) l := by
384+
apply ext'
385+
simp only [filter_data, List.filter_filter]
386+
387+
theorem size_filter_le (p : α → Bool) (l : Array α) :
388+
(l.filter p).size ≤ l.size := by
389+
simp only [← data_length, filter_data]
390+
apply List.length_filter_le
391+
392+
@[simp] theorem mem_filter : x ∈ filter p as ↔ x ∈ as ∧ p x := by
393+
simp only [mem_def, filter_data, List.mem_filter]
394+
395+
theorem mem_of_mem_filter {a : α} {l} (h : a ∈ filter p l) : a ∈ l :=
396+
(mem_filter.mp h).1
397+
398+
/-! ### filterMap -/
399+
400+
@[simp] theorem filterMap_data (f : α → Option β) (l : Array α) :
401+
(l.filterMap f).data = l.data.filterMap f := by
402+
dsimp only [filterMap, filterMapM]
403+
rw [foldlM_eq_foldlM_data]
404+
generalize l.data = l
405+
have this : ∀ a : Array β, (Id.run (List.foldlM (m := Id) ?_ a l)).data =
406+
a.data ++ List.filterMap f l := ?_
407+
exact this #[]
408+
induction l
409+
· simp_all [Id.run]
410+
· simp_all [Id.run]
411+
split <;> simp_all
412+
413+
@[simp] theorem mem_filterMap (f : α → Option β) (l : Array α) {b : β} :
414+
b ∈ filterMap f l ↔ ∃ a, a ∈ l ∧ f a = some b := by
415+
simp only [mem_def, filterMap_data, List.mem_filterMap]
416+
362417
/-! ### join -/
363418

364419
@[simp] theorem join_data {l : Array (Array α)} : l.join.data = (l.data.map data).join := by

Std/Data/List/Lemmas.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,10 @@ end erase
12821282
@[simp] theorem filter_cons_of_neg {p : α → Bool} {a : α} (l) (pa : ¬ p a) :
12831283
filter p (a :: l) = filter p l := by rw [filter, eq_false_of_ne_true pa]
12841284

1285+
theorem filter_cons :
1286+
(x :: xs : List α).filter p = if p x then x :: (xs.filter p) else xs.filter p := by
1287+
split <;> simp [*]
1288+
12851289
@[simp] theorem filter_append {p : α → Bool} :
12861290
∀ (l₁ l₂ : List α), filter p (l₁ ++ l₂) = filter p l₁ ++ filter p l₂
12871291
| [], l₂ => rfl

0 commit comments

Comments
 (0)