@@ -612,13 +612,13 @@ theorem anyM_loop_cons [Monad m] {p : α → m Bool} {a : α} {as : List α} {st
612612
613613-- Auxiliary for `any_iff_exists`.
614614theorem anyM_loop_iff_exists {p : α → Bool} {as : Array α} {start stop} (h : stop ≤ as.size) :
615- anyM.loop (m := Id) p as stop h start = true ↔
615+ ( anyM.loop (m := Id) (pure <| p ·) as stop h start).run = true ↔
616616 ∃ (i : Nat) (_ : i < as.size), start ≤ i ∧ i < stop ∧ p as[i] = true := by
617617 unfold anyM.loop
618618 split <;> rename_i h₁
619619 · dsimp
620620 split <;> rename_i h₂
621- · simp only [true_iff]
621+ · simp only [true_iff, Id.run_pure ]
622622 refine ⟨start, by omega, by omega, by omega, h₂⟩
623623 · rw [anyM_loop_iff_exists]
624624 constructor
@@ -635,9 +635,9 @@ termination_by stop - start
635635-- This could also be proved from `SatisfiesM_anyM_iff_exists` in `Batteries.Data.Array.Init.Monadic`
636636theorem any_iff_exists {p : α → Bool} {as : Array α} {start stop} :
637637 as.any p start stop ↔ ∃ (i : Nat) (_ : i < as.size), start ≤ i ∧ i < stop ∧ p as[i] := by
638- dsimp [any, anyM, Id.run ]
638+ dsimp [any, anyM]
639639 split
640- · rw [anyM_loop_iff_exists]
640+ · rw [anyM_loop_iff_exists (p := p) ]
641641 · rw [anyM_loop_iff_exists]
642642 constructor
643643 · rintro ⟨i, hi, ge, _, h⟩
@@ -1369,17 +1369,17 @@ theorem mapM_eq_mapM_toList [Monad m] [LawfulMonad m] {f : α → m β} {xs : Ar
13691369
13701370@[deprecated " Use `mapM_eq_foldlM` instead" (since := " 2025-01-08" )]
13711371theorem mapM_map_eq_foldl {as : Array α} {f : α → β} {i : Nat} :
1372- mapM.map (m := Id) f as i b = as.foldl (start := i) (fun acc a => acc.push (f a)) b := by
1372+ mapM.map (m := Id) (pure <| f ·) as i b = pure ( as.foldl (start := i) (fun acc a => acc.push (f a)) b) := by
13731373 unfold mapM.map
13741374 split <;> rename_i h
1375- · simp only [Id.bind_eq]
1376- dsimp [foldl, Id.run, foldlM]
1375+ · ext : 1
1376+ dsimp [foldl, foldlM]
13771377 rw [mapM_map_eq_foldl, dif_pos (by omega), foldlM.loop, dif_pos h]
13781378 -- Calling `split` here gives a bad goal.
13791379 have : size as - i = Nat.succ (size as - i - 1 ) := by omega
13801380 rw [this ]
1381- simp [foldl, foldlM, Id.run, Nat.sub_add_eq]
1382- · dsimp [foldl, Id.run, foldlM]
1381+ simp [foldl, foldlM, Nat.sub_add_eq]
1382+ · dsimp [foldl, foldlM]
13831383 rw [dif_pos (by omega), foldlM.loop, dif_neg h]
13841384 rfl
13851385termination_by as.size - i
@@ -1601,8 +1601,8 @@ theorem filterMap_congr {as bs : Array α} (h : as = bs)
16011601 as.toList ++ List.filterMap f xs := ?_
16021602 exact this #[]
16031603 induction xs
1604- · simp_all [Id.run]
1605- · simp_all [Id.run, List.filterMap_cons]
1604+ · simp_all
1605+ · simp_all [List.filterMap_cons]
16061606 split <;> simp_all
16071607
16081608@[grind] theorem toList_filterMap {f : α → Option β} {xs : Array α} :
@@ -3214,18 +3214,16 @@ theorem foldlM_push [Monad m] [LawfulMonad m] {xs : Array α} {a : α} {f : β
32143214 rw [foldr, foldrM_start_stop, ← foldrM_toList, List.foldrM_pure, foldr_toList, foldr, ← foldrM_start_stop]
32153215
32163216theorem foldl_eq_foldlM {f : β → α → β} {b} {xs : Array α} {start stop : Nat} :
3217- xs.foldl f b start stop = xs.foldlM (m := Id) f b start stop := by
3218- simp [foldl, Id.run]
3217+ xs.foldl f b start stop = (xs.foldlM (m := Id) (pure <| f · ·) b start stop).run := rfl
32193218
32203219theorem foldr_eq_foldrM {f : α → β → β} {b} {xs : Array α} {start stop : Nat} :
3221- xs.foldr f b start stop = xs.foldrM (m := Id) f b start stop := by
3222- simp [foldr, Id.run]
3220+ xs.foldr f b start stop = (xs.foldrM (m := Id) (pure <| f · ·) b start stop).run := rfl
32233221
32243222@[simp] theorem id_run_foldlM {f : β → α → Id β} {b} {xs : Array α} {start stop : Nat} :
3225- Id.run (xs.foldlM f b start stop) = xs.foldl f b start stop := foldl_eq_foldlM.symm
3223+ Id.run (xs.foldlM f b start stop) = xs.foldl (f · · |>.run) b start stop := rfl
32263224
32273225@[simp] theorem id_run_foldrM {f : α → β → Id β} {b} {xs : Array α} {start stop : Nat} :
3228- Id.run (xs.foldrM f b start stop) = xs.foldr f b start stop := foldr_eq_foldrM.symm
3226+ Id.run (xs.foldrM f b start stop) = xs.foldr (f · · |>.run) b start stop := rfl
32293227
32303228/-- Variant of `foldlM_reverse` with a side condition for the `stop` argument. -/
32313229@[simp] theorem foldlM_reverse' [Monad m] {xs : Array α} {f : β → α → m β} {b} {stop : Nat}
@@ -3483,17 +3481,16 @@ theorem foldrM_append [Monad m] [LawfulMonad m] {f : α → β → m β} {b} {xs
34833481
34843482@[simp] theorem foldr_append' {f : α → β → β} {b} {xs ys : Array α} {start : Nat}
34853483 (w : start = xs.size + ys.size) :
3486- (xs ++ ys).foldr f b start 0 = xs.foldr f (ys.foldr f b) := by
3487- subst w
3488- simp [foldr_eq_foldrM]
3484+ (xs ++ ys).foldr f b start 0 = xs.foldr f (ys.foldr f b) :=
3485+ foldrM_append' _ _ _ _ w
34893486
34903487@[grind _=_] theorem foldl_append {β : Type _} {f : β → α → β} {b} {xs ys : Array α} :
3491- (xs ++ ys).foldl f b = ys.foldl f (xs.foldl f b) := by
3492- simp [foldl_eq_foldlM]
3488+ (xs ++ ys).foldl f b = ys.foldl f (xs.foldl f b) :=
3489+ foldlM_append _ _ _ _
34933490
34943491@[grind _=_] theorem foldr_append {f : α → β → β} {b} {xs ys : Array α} :
3495- (xs ++ ys).foldr f b = xs.foldr f (ys.foldr f b) := by
3496- simp [foldr_eq_foldrM]
3492+ (xs ++ ys).foldr f b = xs.foldr f (ys.foldr f b) :=
3493+ foldrM_append _ _ _ _
34973494
34983495@[simp] theorem foldl_flatten' {f : β → α → β} {b} {xss : Array (Array α)} {stop : Nat}
34993496 (w : stop = xss.flatten.size) :
@@ -3522,21 +3519,22 @@ theorem foldrM_append [Monad m] [LawfulMonad m] {f : α → β → m β} {b} {xs
35223519/-- Variant of `foldl_reverse` with a side condition for the `stop` argument. -/
35233520@[simp] theorem foldl_reverse' {xs : Array α} {f : β → α → β} {b} {stop : Nat}
35243521 (w : stop = xs.size) :
3525- xs.reverse.foldl f b 0 stop = xs.foldr (fun x y => f y x) b := by
3526- simp [w, foldl_eq_foldlM, foldr_eq_foldrM]
3522+ xs.reverse.foldl f b 0 stop = xs.foldr (fun x y => f y x) b :=
3523+ foldlM_reverse' _ _ _ w
35273524
35283525/-- Variant of `foldr_reverse` with a side condition for the `start` argument. -/
35293526@[simp] theorem foldr_reverse' {xs : Array α} {f : α → β → β} {b} {start : Nat}
35303527 (w : start = xs.size) :
3531- xs.reverse.foldr f b start 0 = xs.foldl (fun x y => f y x) b := by
3532- simp [w, foldl_eq_foldlM, foldr_eq_foldrM]
3528+ xs.reverse.foldr f b start 0 = xs.foldl (fun x y => f y x) b :=
3529+ foldrM_reverse' _ _ _ w
35333530
35343531@[grind] theorem foldl_reverse {xs : Array α} {f : β → α → β} {b} :
3535- xs.reverse.foldl f b = xs.foldr (fun x y => f y x) b := by simp [foldl_eq_foldlM, foldr_eq_foldrM]
3532+ xs.reverse.foldl f b = xs.foldr (fun x y => f y x) b :=
3533+ foldlM_reverse _ _ _
35363534
35373535@[grind] theorem foldr_reverse {xs : Array α} {f : α → β → β} {b} :
35383536 xs.reverse.foldr f b = xs.foldl (fun x y => f y x) b :=
3539- (foldl_reverse ..).symm.trans <| by simp
3537+ foldrM_reverse _ _ _
35403538
35413539theorem foldl_eq_foldr_reverse {xs : Array α} {f : β → α → β} {b} :
35423540 xs.foldl f b = xs.reverse.foldr (fun x y => f y x) b := by simp
@@ -4600,12 +4598,12 @@ namespace Array
46004598@[simp] theorem findSomeRev ?_eq_findSome ?_reverse {f : α → Option β} {xs : Array α} :
46014599 xs.findSomeRev? f = xs.reverse.findSome? f := by
46024600 cases xs
4603- simp [findSomeRev?, Id.run ]
4601+ simp [findSomeRev?]
46044602
46054603@[simp] theorem findRev ?_eq_find ?_reverse {f : α → Bool} {xs : Array α} :
46064604 xs.findRev? f = xs.reverse.find? f := by
46074605 cases xs
4608- simp [findRev?, Id.run ]
4606+ simp [findRev?]
46094607
46104608/-! ### unzip -/
46114609
0 commit comments