@@ -39,6 +39,8 @@ attribute [simp] isEmpty uget
39
39
@[simp] theorem toArray_data : (a : Array α) → a.data.toArray = a
40
40
| ⟨l⟩ => ext' (data_toArray l)
41
41
42
+ @[simp] theorem data_length {l : Array α} : l.data.length = l.size := rfl
43
+
42
44
theorem mem_data {a : α} {l : Array α} : a ∈ l.data ↔ a ∈ l := (mem_def _ _).symm
43
45
44
46
theorem not_mem_nil (a : α) : ¬ a ∈ #[] := fun.
@@ -359,6 +361,59 @@ theorem forIn_eq_data_forIn [Monad m]
359
361
rw [loop (i := i)]; rw [← ij, Nat.succ_add]; rfl
360
362
simp [forIn, Array.forIn]; rw [loop (Nat.zero_add _)]; rfl
361
363
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
+
362
417
/-! ### join -/
363
418
364
419
@[simp] theorem join_data {l : Array (Array α)} : l.join.data = (l.data.map data).join := by
0 commit comments