Skip to content

Commit 4c07cf3

Browse files
eric-wieserSebastian Graf
authored andcommitted
Fix all the theorem statements too
1 parent 28a977b commit 4c07cf3

File tree

27 files changed

+151
-156
lines changed

27 files changed

+151
-156
lines changed

src/Init/Control/Lawful/Basic.lean

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Sebastian Ullrich, Leonardo de Moura, Mario Carneiro
66
module
77

88
prelude
9+
import Init.Ext
910
import Init.SimpLemmas
1011
import Init.Meta
1112

@@ -241,13 +242,23 @@ theorem LawfulMonad.mk' (m : Type u → Type v) [Monad m]
241242

242243
namespace Id
243244

244-
@[simp] theorem map_eq (x : Id α) (f : α → β) : f <$> x = f x := rfl
245-
@[simp] theorem bind_eq (x : Id α) (f : α → id β) : x >>= f = f x := rfl
246-
@[simp] theorem pure_eq (a : α) : (pure a : Id α) = a := rfl
245+
@[ext] theorem ext {x y : Id α} (h : x.run = y.run) : x = y := h
247246

248247
instance : LawfulMonad Id := by
249248
refine LawfulMonad.mk' _ ?_ ?_ ?_ <;> intros <;> rfl
250249

250+
@[simp] theorem run_map (x : Id α) (f : α → β) : (f <$> x).run = f x.run := rfl
251+
@[simp] theorem run_bind (x : Id α) (f : α → Id β) : (x >>= f).run = (f x.run).run := rfl
252+
@[simp] theorem run_pure (a : α) : (pure a : Id α).run = a := rfl
253+
@[simp] theorem run_seqRight (x y : Id α) : (x *> y).run = y.run := rfl
254+
@[simp] theorem run_seqLeft (x y : Id α) : (x <* y).run = x.run := rfl
255+
@[simp] theorem run_seq (f : Id (α → β)) (x : Id α) : (f <*> x).run = f.run x.run := rfl
256+
257+
-- These lemmas are bad as they abuse the defeq of `Id α` and `α`
258+
@[deprecated run_map (since := "2025-03-05")] theorem map_eq (x : Id α) (f : α → β) : f <$> x = f x := rfl
259+
@[deprecated run_bind (since := "2025-03-05")] theorem bind_eq (x : Id α) (f : α → id β) : x >>= f = f x := rfl
260+
@[deprecated run_pure (since := "2025-03-05")] theorem pure_eq (a : α) : (pure a : Id α) = a := rfl
261+
251262
end Id
252263

253264
/-! # Option -/

src/Init/Data/Array/Lemmas.lean

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -612,13 +612,13 @@ theorem anyM_loop_cons [Monad m] {p : α → m Bool} {a : α} {as : List α} {st
612612

613613
-- Auxiliary for `any_iff_exists`.
614614
theorem 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`
636636
theorem 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")]
13711371
theorem 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
13851385
termination_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

32163216
theorem 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

32203219
theorem 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

35413539
theorem 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

src/Init/Data/Array/Lex/Lemmas.lean

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ protected theorem not_le_iff_gt [DecidableEq α] [LT α] [DecidableLT α] {l₁
2929
Decidable.not_not
3030

3131
@[simp] theorem lex_empty [BEq α] {lt : α → α → Bool} {xs : Array α} : xs.lex #[] lt = false := by
32-
simp [lex, Id.run]
32+
simp [lex]
3333

3434
@[simp] theorem singleton_lex_singleton [BEq α] {lt : α → α → Bool} : #[a].lex #[b] lt = lt a b := by
3535
simp only [lex, List.getElem_toArray, List.getElem_singleton]
36-
cases lt a b <;> cases a != b <;> simp [Id.run]
36+
cases lt a b <;> cases a != b <;> simp
3737

3838
private theorem cons_lex_cons [BEq α] {lt : α → α → Bool} {a b : α} {xs ys : Array α} :
3939
(#[a] ++ xs).lex (#[b] ++ ys) lt =
4040
(lt a b || a == b && xs.lex ys lt) := by
41-
simp only [lex, Id.run]
41+
simp only [lex]
4242
simp only [Std.Range.forIn'_eq_forIn'_range', size_append, List.size_toArray, List.length_singleton,
4343
Nat.add_comm 1]
4444
simp [Nat.add_min_add_right, List.range'_succ, getElem_append_left, List.range'_succ_left,
@@ -51,10 +51,10 @@ private theorem cons_lex_cons [BEq α] {lt : α → α → Bool} {a b : α} {xs
5151
@[simp, grind =] theorem _root_.List.lex_toArray [BEq α] {lt : α → α → Bool} {l₁ l₂ : List α} :
5252
l₁.toArray.lex l₂.toArray lt = l₁.lex l₂ lt := by
5353
induction l₁ generalizing l₂ with
54-
| nil => cases l₂ <;> simp [lex, Id.run]
54+
| nil => cases l₂ <;> simp [lex]
5555
| cons x l₁ ih =>
5656
cases l₂ with
57-
| nil => simp [lex, Id.run]
57+
| nil => simp [lex]
5858
| cons y l₂ =>
5959
rw [List.toArray_cons, List.toArray_cons y, cons_lex_cons, List.lex, ih]
6060

src/Init/Data/Array/MapIdx.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ theorem mapFinIdx_induction (xs : Array α) (f : (i : Nat) → α → (h : i < x
2727
motive xs.size ∧ ∃ eq : (Array.mapFinIdx xs f).size = xs.size,
2828
∀ i h, p i ((Array.mapFinIdx xs f)[i]) h := by
2929
let rec go {bs i j h} (h₁ : j = bs.size) (h₂ : ∀ i h h', p i bs[i] h) (hm : motive j) :
30-
let as : Array β := Array.mapFinIdxM.map (m := Id) xs f i j h bs
30+
let as : Array β := Id.run <| Array.mapFinIdxM.map xs (pure <| f · · ·) i j h bs
3131
motive xs.size ∧ ∃ eq : as.size = xs.size, ∀ i h, p i as[i] h := by
3232
induction i generalizing j bs with simp [mapFinIdxM.map]
3333
| zero =>

src/Init/Data/Array/Monadic.lean

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ open Nat
3131
xs.mapM (m := m) (pure <| f ·) = pure (xs.map f) := by
3232
induction xs; simp_all
3333

34-
@[simp] theorem mapM_id {xs : Array α} {f : α → Id β} : xs.mapM f = xs.map f :=
34+
@[simp] theorem mapM_id {xs : Array α} {f : α → Id β} : (xs.mapM f).run = xs.map (f · |>.run) :=
3535
mapM_pure
3636

3737
@[simp] theorem mapM_append [Monad m] [LawfulMonad m] {f : α → m β} {xs ys : Array α} :
@@ -182,11 +182,10 @@ theorem forIn'_eq_foldlM [Monad m] [LawfulMonad m]
182182
simp [List.forIn'_pure_yield_eq_foldl, List.foldl_map]
183183

184184
@[simp] theorem forIn'_yield_eq_foldl
185-
{xs : Array α} (f : (a : α) → a ∈ xs → β → β) (init : β) :
186-
forIn' (m := Id) xs init (fun a m b => .yield (f a m b)) =
187-
xs.attach.foldl (fun b ⟨a, h⟩ => f a h b) init := by
188-
rcases xs with ⟨xs⟩
189-
simp [List.foldl_map]
185+
{xs : Array α} (f : (a : α) → a ∈ xs → β → Id β) (init : β) :
186+
(forIn' xs init (fun a m b => .yield <$> f a m b)).run =
187+
xs.attach.foldl (fun b ⟨a, h⟩ => f a h b |>.run) init :=
188+
forIn'_pure_yield_eq_foldl _ _ _
190189

191190
@[simp] theorem forIn'_map [Monad m] [LawfulMonad m]
192191
{xs : Array α} (g : α → β) (f : (b : β) → b ∈ xs.map g → γ → m (ForInStep γ)) :
@@ -224,11 +223,10 @@ theorem forIn_eq_foldlM [Monad m] [LawfulMonad m]
224223
simp [List.forIn_pure_yield_eq_foldl, List.foldl_map]
225224

226225
@[simp] theorem forIn_yield_eq_foldl
227-
{xs : Array α} (f : α → β → β) (init : β) :
228-
forIn (m := Id) xs init (fun a b => .yield (f a b)) =
229-
xs.foldl (fun b a => f a b) init := by
230-
rcases xs with ⟨xs⟩
231-
simp [List.foldl_map]
226+
{xs : Array α} (f : α → β → Id β) (init : β) :
227+
(forIn xs init (fun a b => .yield <$> f a b)).run =
228+
xs.foldl (fun b a => f a b |>.run) init :=
229+
forIn_pure_yield_eq_foldl _ _ _
232230

233231
@[simp] theorem forIn_map [Monad m] [LawfulMonad m]
234232
{xs : Array α} {g : α → β} {f : β → γ → m (ForInStep γ)} :

src/Init/Data/Fin/Fold.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ theorem foldl_succ_last (f : α → Fin (n+1) → α) (x) :
190190
| succ n ih => rw [foldl_succ, ih (f · ·.succ), foldl_succ]; simp [succ_castSucc]
191191

192192
theorem foldl_eq_foldlM (f : α → Fin n → α) (x) :
193-
foldl n f x = foldlM (m:=Id) n f x := by
193+
foldl n f x = (foldlM (m := Id) n (pure <| f · ·) x).run := by
194194
induction n generalizing x <;> simp [foldl_succ, foldlM_succ, *]
195195

196196
/-! ### foldr -/
@@ -223,7 +223,7 @@ theorem foldr_succ_last (f : Fin (n+1) → α → α) (x) :
223223
| succ n ih => rw [foldr_succ, ih (f ·.succ), foldr_succ]; simp [succ_castSucc]
224224

225225
theorem foldr_eq_foldrM (f : Fin n → α → α) (x) :
226-
foldr n f x = foldrM (m:=Id) n f x := by
226+
foldr n f x = (foldrM (m := Id) n (pure <| f · ·) x).run := by
227227
induction n <;> simp [foldr_succ, foldrM_succ, *]
228228

229229
theorem foldl_rev (f : Fin n → α → α) (x) :

src/Init/Data/List/Control.lean

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,8 @@ theorem findM?_pure {m} [Monad m] [LawfulMonad m] (p : α → Bool) (as : List
348348
| false => simp [ih]
349349

350350
@[simp]
351-
theorem findM?_id (p : α → Bool) (as : List α) : findM? (m := Id) p as = as.find? p :=
351+
theorem findM?_id (p : α → Id Bool) (as : List α) :
352+
(findM? p as).run = as.find? (p · |>.run) :=
352353
findM?_pure _ _
353354

354355
/--
@@ -394,7 +395,8 @@ theorem findSomeM?_pure [Monad m] [LawfulMonad m] {f : α → Option β} {as : L
394395
| none => simp [ih]
395396

396397
@[simp]
397-
theorem findSomeM?_id {f : α → Option β} {as : List α} : findSomeM? (m := Id) f as = as.findSome? f :=
398+
theorem findSomeM?_id (f : α → Id (Option β)) (as : List α) :
399+
(findSomeM? f as).run = as.findSome? (f · |>.run) :=
398400
findSomeM?_pure
399401

400402
theorem findM?_eq_findSomeM? [Monad m] [LawfulMonad m] {p : α → m Bool} {as : List α} :

src/Init/Data/List/Lemmas.lean

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2541,18 +2541,18 @@ theorem flatten_reverse {L : List (List α)} :
25412541
induction l generalizing b <;> simp [*]
25422542

25432543
theorem foldl_eq_foldlM {f : β → α → β} {b : β} {l : List α} :
2544-
l.foldl f b = l.foldlM (m := Id) f b := by
2545-
induction l generalizing b <;> simp [*, foldl]
2544+
l.foldl f b = (l.foldlM (m := Id) (pure <| f · ·) b).run := by
2545+
simp
25462546

25472547
theorem foldr_eq_foldrM {f : α → β → β} {b : β} {l : List α} :
2548-
l.foldr f b = l.foldrM (m := Id) f b := by
2549-
induction l <;> simp [*, foldr]
2548+
l.foldr f b = (l.foldrM (m := Id) (pure <| f · ·) b).run := by
2549+
simp
25502550

2551-
@[simp] theorem id_run_foldlM {f : β → α → Id β} {b : β} {l : List α} :
2552-
Id.run (l.foldlM f b) = l.foldl f b := foldl_eq_foldlM.symm
2551+
theorem id_run_foldlM {f : β → α → Id β} {b : β} {l : List α} :
2552+
Id.run (l.foldlM f b) = l.foldl (f · · |>.run) b := (foldl_eq_foldlM f b l).symm
25532553

2554-
@[simp] theorem id_run_foldrM {f : α → β → Id β} {b : β} {l : List α} :
2555-
Id.run (l.foldrM f b) = l.foldr f b := foldr_eq_foldrM.symm
2554+
theorem id_run_foldrM {f : α → β → Id β} {b : β} {l : List α} :
2555+
Id.run (l.foldrM f b) = l.foldr (f · · |>.run) b := (foldr_eq_foldrM f b l).symm
25562556

25572557
@[simp] theorem foldlM_reverse [Monad m] {l : List α} {f : β → α → m β} {b : β} :
25582558
l.reverse.foldlM f b = l.foldrM (fun x y => f y x) b := rfl
@@ -2641,10 +2641,10 @@ theorem foldr_map_hom {g : α → β} {f : α → α → α} {f' : β → β →
26412641
induction l <;> simp [*]
26422642

26432643
@[simp, grind _=_] theorem foldl_append {β : Type _} {f : β → α → β} {b : β} {l l' : List α} :
2644-
(l ++ l').foldl f b = l'.foldl f (l.foldl f b) := by simp [foldl_eq_foldlM]
2644+
(l ++ l').foldl f b = l'.foldl f (l.foldl f b) := by simp [foldl_eq_foldlM, -foldlM_pure]
26452645

26462646
@[simp, grind _=_] theorem foldr_append {f : α → β → β} {b : β} {l l' : List α} :
2647-
(l ++ l').foldr f b = l.foldr f (l'.foldr f b) := by simp [foldr_eq_foldrM]
2647+
(l ++ l').foldr f b = l.foldr f (l'.foldr f b) := by simp [foldr_eq_foldrM, -foldrM_pure]
26482648

26492649
@[grind] theorem foldl_flatten {f : β → α → β} {b : β} {L : List (List α)} :
26502650
(flatten L).foldl f b = L.foldl (fun b l => l.foldl f b) b := by
@@ -2655,7 +2655,8 @@ theorem foldr_map_hom {g : α → β} {f : α → α → α} {f' : β → β →
26552655
induction L <;> simp_all
26562656

26572657
@[simp, grind] theorem foldl_reverse {l : List α} {f : β → α → β} {b : β} :
2658-
l.reverse.foldl f b = l.foldr (fun x y => f y x) b := by simp [foldl_eq_foldlM, foldr_eq_foldrM]
2658+
l.reverse.foldl f b = l.foldr (fun x y => f y x) b := by
2659+
simp [foldl_eq_foldlM, foldr_eq_foldrM, -foldrM_pure]
26592660

26602661
@[simp, grind] theorem foldr_reverse {l : List α} {f : α → β → β} {b : β} :
26612662
l.reverse.foldr f b = l.foldl (fun x y => f y x) b :=

src/Init/Data/List/Monadic.lean

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ theorem mapM'_eq_mapM [Monad m] [LawfulMonad m] {f : α → m β} {l : List α}
6666
l.mapM (m := m) (pure <| f ·) = pure (l.map f) := by
6767
induction l <;> simp_all
6868

69-
@[simp] theorem mapM_id {l : List α} {f : α → Id β} : l.mapM f = l.map f :=
69+
@[simp] theorem mapM_id {l : List α} {f : α → Id β} : (l.mapM f).run = l.map (f · |>.run) :=
7070
mapM_pure
7171

7272
@[simp] theorem mapM_append [Monad m] [LawfulMonad m] {f : α → m β} {l₁ l₂ : List α} :
@@ -340,11 +340,10 @@ theorem forIn'_eq_foldlM [Monad m] [LawfulMonad m]
340340
induction l.attach generalizing init <;> simp_all
341341

342342
@[simp] theorem forIn'_yield_eq_foldl
343-
{l : List α} (f : (a : α) → a ∈ l → β → β) (init : β) :
344-
forIn' (m := Id) l init (fun a m b => .yield (f a m b)) =
345-
l.attach.foldl (fun b ⟨a, h⟩ => f a h b) init := by
346-
simp only [forIn'_eq_foldlM]
347-
induction l.attach generalizing init <;> simp_all
343+
(l : List α) (f : (a : α) → a ∈ l → β → Id β) (init : β) :
344+
(forIn' l init (fun a m b => .yield <$> f a m b)).run =
345+
l.attach.foldl (fun b ⟨a, h⟩ => f a h b |>.run) init :=
346+
forIn'_pure_yield_eq_foldl _ _ _
348347

349348
@[simp] theorem forIn'_map [Monad m] [LawfulMonad m]
350349
{l : List α} (g : α → β) (f : (b : β) → b ∈ l.map g → γ → m (ForInStep γ)) :
@@ -393,11 +392,10 @@ theorem forIn_eq_foldlM [Monad m] [LawfulMonad m]
393392
induction l generalizing init <;> simp_all
394393

395394
@[simp] theorem forIn_yield_eq_foldl
396-
{l : List α} (f : α → β → β) (init : β) :
397-
forIn (m := Id) l init (fun a b => .yield (f a b)) =
398-
l.foldl (fun b a => f a b) init := by
399-
simp only [forIn_eq_foldlM]
400-
induction l generalizing init <;> simp_all
395+
(l : List α) (f : α → β → Id β) (init : β) :
396+
(forIn l init (fun a b => .yield <$> f a b)).run =
397+
l.foldl (fun b a => f a b |>.run) init :=
398+
forIn_pure_yield_eq_foldl _ _ _
401399

402400
@[simp] theorem forIn_map [Monad m] [LawfulMonad m]
403401
{l : List α} {g : α → β} {f : β → γ → m (ForInStep γ)} :

0 commit comments

Comments
 (0)