@@ -16,8 +16,8 @@ in order to minimize dependence on `SatisfiesM`.
1616
1717namespace Array
1818
19- theorem SatisfiesM_foldlM [Monad m] [LawfulMonad m]
20- {as : Array α} ( motive : Nat → β → Prop ) {init : β} (h0 : motive 0 init) {f : β → α → m β}
19+ theorem SatisfiesM_foldlM [Monad m] [LawfulMonad m] {as : Array α} {init : β}
20+ {motive : Nat → β → Prop } {f : β → α → m β} (h0 : motive 0 init)
2121 (hf : ∀ i : Fin as.size, ∀ b, motive i.1 b → SatisfiesM (motive (i.1 + 1 )) (f b as[i])) :
2222 SatisfiesM (motive as.size) (as.foldlM f init) := by
2323 let rec go {i j b} (h₁ : j ≤ as.size) (h₂ : as.size ≤ i + j) (H : motive j b) :
@@ -30,9 +30,8 @@ theorem SatisfiesM_foldlM [Monad m] [LawfulMonad m]
3030 · next hj => exact Nat.le_antisymm h₁ (Nat.ge_of_not_lt hj) ▸ .pure H
3131 simp [foldlM]; exact go (Nat.zero_le _) (Nat.le_refl _) h0
3232
33- theorem SatisfiesM_mapM [Monad m] [LawfulMonad m] (as : Array α) (f : α → m β)
34- (motive : Nat → Prop ) (h0 : motive 0 )
35- (p : Fin as.size → β → Prop )
33+ theorem SatisfiesM_mapM [Monad m] [LawfulMonad m] {as : Array α} {f : α → m β}
34+ {motive : Nat → Prop } {p : Fin as.size → β → Prop } (h0 : motive 0 )
3635 (hs : ∀ i, motive i.1 → SatisfiesM (p i · ∧ motive (i + 1 )) (f as[i])) :
3736 SatisfiesM
3837 (fun arr => motive as.size ∧ ∃ eq : arr.size = as.size, ∀ i h, p ⟨i, h⟩ arr[i])
@@ -48,26 +47,19 @@ theorem SatisfiesM_mapM [Monad m] [LawfulMonad m] (as : Array α) (f : α → m
4847 simp [getElem_push] at hj ⊢; split; {apply ih₂}
4948 cases j; cases (Nat.le_or_eq_of_le_succ hj).resolve_left ‹_›; cases eq; exact h₁
5049
51- theorem SatisfiesM_mapM' [Monad m] [LawfulMonad m] ( as : Array α) ( f : α → m β)
52- ( p : Fin as.size → β → Prop )
50+ theorem SatisfiesM_mapM' [Monad m] [LawfulMonad m] { as : Array α} { f : α → m β}
51+ { p : Fin as.size → β → Prop }
5352 (hs : ∀ i, SatisfiesM (p i) (f as[i])) :
5453 SatisfiesM
5554 (fun arr => ∃ eq : arr.size = as.size, ∀ i h, p ⟨i, h⟩ arr[i])
5655 (Array.mapM f as) :=
57- (SatisfiesM_mapM _ _ ( fun _ => True) trivial _ (fun _ h => (hs _).imp (⟨·, h⟩))).imp (·.2 )
56+ (SatisfiesM_mapM (motive := fun _ => True) trivial (fun _ h => (hs _).imp (⟨·, h⟩))).imp (·.2 )
5857
5958theorem size_mapM [Monad m] [LawfulMonad m] (f : α → m β) (as : Array α) :
6059 SatisfiesM (fun arr => arr.size = as.size) (Array.mapM f as) :=
61- (SatisfiesM_mapM' _ _ ( fun _ _ => True) (fun _ => .trivial)).imp (·.1 )
60+ (SatisfiesM_mapM' (fun _ => .trivial)).imp (·.1 )
6261
63- proof_wanted size_mapIdxM [Monad m] [LawfulMonad m] (as : Array α) (f : Nat → α → m β) :
64- SatisfiesM (fun arr => arr.size = as.size) (Array.mapIdxM f as)
65-
66- proof_wanted size_mapFinIdxM [Monad m] [LawfulMonad m]
67- (as : Array α) (f : (i : Nat) → α → (h : i < as.size) → m β) :
68- SatisfiesM (fun arr => arr.size = as.size) (Array.mapFinIdxM as f)
69-
70- theorem SatisfiesM_anyM [Monad m] [LawfulMonad m] (p : α → m Bool) (as : Array α) (start stop )
62+ theorem SatisfiesM_anyM [Monad m] [LawfulMonad m] {p : α → m Bool} {as : Array α}
7163 (hstart : start ≤ min stop as.size) (tru : Prop ) (fal : Nat → Prop ) (h0 : fal start)
7264 (hp : ∀ i : Fin as.size, i.1 < stop → fal i.1 →
7365 SatisfiesM (bif · then tru else fal (i + 1 )) (p as[i])) :
@@ -91,14 +83,14 @@ theorem SatisfiesM_anyM [Monad m] [LawfulMonad m] (p : α → m Bool) (as : Arra
9183 exact go hstart _ h0 fun i hi => hp i <| Nat.lt_of_lt_of_le hi <| Nat.min_le_left ..
9284
9385theorem SatisfiesM_anyM_iff_exists [Monad m] [LawfulMonad m]
94- ( p : α → m Bool) ( as : Array α) (start stop ) ( q : Fin as.size → Prop )
86+ { p : α → m Bool} { as : Array α} { q : Fin as.size → Prop }
9587 (hp : ∀ i : Fin as.size, start ≤ i.1 → i.1 < stop → SatisfiesM (· = true ↔ q i) (p as[i])) :
9688 SatisfiesM
9789 (fun res => res = true ↔ ∃ i : Fin as.size, start ≤ i.1 ∧ i.1 < stop ∧ q i)
9890 (anyM p as start stop ) := by
9991 cases Nat.le_total start (min stop as.size) with
10092 | inl hstart =>
101- refine (SatisfiesM_anyM _ _ _ _ hstart
93+ refine (SatisfiesM_anyM hstart
10294 (fal := fun j => start ≤ j ∧ ¬ ∃ i : Fin as.size, start ≤ i.1 ∧ i.1 < j ∧ q i)
10395 (tru := ∃ i : Fin as.size, start ≤ i.1 ∧ i.1 < stop ∧ q i) ?_ ?_).imp ?_
10496 · exact ⟨Nat.le_refl _, fun ⟨i, h₁, h₂, _⟩ => (Nat.not_le_of_gt h₂ h₁).elim⟩
@@ -118,8 +110,8 @@ theorem SatisfiesM_anyM_iff_exists [Monad m] [LawfulMonad m]
118110 cases Nat.not_lt.2 (Nat.le_trans hstart h₁) (Nat.lt_min.2 ⟨h₂, j.2 ⟩)
119111
120112theorem SatisfiesM_foldrM [Monad m] [LawfulMonad m]
121- {as : Array α} ( motive : Nat → β → Prop )
122- {init : β} (h0 : motive as.size init) {f : α → β → m β}
113+ {as : Array α} {init : β} { motive : Nat → β → Prop } {f : α → β → m β}
114+ (h0 : motive as.size init)
123115 (hf : ∀ i : Fin as.size, ∀ b, motive (i.1 + 1 ) b → SatisfiesM (motive i.1 ) (f as[i] b)) :
124116 SatisfiesM (motive 0 ) (as.foldrM f init) := by
125117 let rec go {i b} (hi : i ≤ as.size) (H : motive i b) :
@@ -133,11 +125,10 @@ theorem SatisfiesM_foldrM [Monad m] [LawfulMonad m]
133125 simp [foldrM]; split; {exact go _ h0}
134126 · next h => exact .pure (Nat.eq_zero_of_not_pos h ▸ h0)
135127
136- theorem SatisfiesM_mapFinIdxM [Monad m] [LawfulMonad m] (as : Array α)
137- (f : (i : Nat) → α → (h : i < as.size) → m β)
138- (motive : Nat → Prop ) (h0 : motive 0 )
139- (p : (i : Nat) → β → (h : i < as.size) → Prop )
140- (hs : ∀ i h, motive i → SatisfiesM (p i · h ∧ motive (i + 1 )) (f i as[i] h)) :
128+ theorem SatisfiesM_mapFinIdxM [Monad m] [LawfulMonad m]
129+ {as : Array α} {f : (i : Nat) → α → i < as.size → m β} {motive : Nat → Prop }
130+ {p : (i : Nat) → β → i < as.size → Prop }
131+ (h0 : motive 0 ) (hs : ∀ i h, motive i → SatisfiesM (p i · h ∧ motive (i + 1 )) (f i as[i] h)) :
141132 SatisfiesM
142133 (fun arr => motive as.size ∧ ∃ eq : arr.size = as.size, ∀ i h, p i arr[i] h)
143134 (Array.mapFinIdxM as f) := by
@@ -156,27 +147,26 @@ theorem SatisfiesM_mapFinIdxM [Monad m] [LawfulMonad m] (as : Array α)
156147 · next h => cases h₁.symm ▸ (Nat.le_or_eq_of_le_succ hi').resolve_left h; exact hb.1
157148 simp [mapFinIdxM]; exact go rfl nofun h0
158149
159- theorem SatisfiesM_mapIdxM [Monad m] [LawfulMonad m] (as : Array α) (f : Nat → α → m β)
160- (motive : Nat → Prop ) (h0 : motive 0 )
161- (p : (i : Nat) → β → (h : i < as.size) → Prop )
162- (hs : ∀ i h, motive i → SatisfiesM (p i · h ∧ motive (i + 1 )) (f i as[i])) :
150+ theorem SatisfiesM_mapIdxM [Monad m] [LawfulMonad m] {as : Array α} {f : Nat → α → m β}
151+ {p : (i : Nat) → β → i < as.size → Prop } {motive : Nat → Prop }
152+ (h0 : motive 0 ) (hs : ∀ i h, motive i → SatisfiesM (p i · h ∧ motive (i + 1 )) (f i as[i])) :
163153 SatisfiesM
164154 (fun arr => motive as.size ∧ ∃ eq : arr.size = as.size, ∀ i h, p i arr[i] h)
165155 (as.mapIdxM f) :=
166- SatisfiesM_mapFinIdxM as ( fun i a _ => f i a) motive h0 p hs
156+ SatisfiesM_mapFinIdxM h0 hs
167157
168158theorem size_mapFinIdxM [Monad m] [LawfulMonad m]
169- (as : Array α) (f : (i : Nat) → α → (h : i < as.size) → m β) :
159+ (as : Array α) (f : (i : Nat) → α → i < as.size → m β) :
170160 SatisfiesM (fun arr => arr.size = as.size) (Array.mapFinIdxM as f) :=
171- (SatisfiesM_mapFinIdxM _ _ ( fun _ => True) trivial ( fun _ _ _ => True)
161+ (SatisfiesM_mapFinIdxM (motive := fun _ => True) trivial
172162 (fun _ _ _ => .of_true fun _ => ⟨trivial, trivial⟩)).imp (·.2 .1 )
173163
174164theorem size_mapIdxM [Monad m] [LawfulMonad m] (as : Array α) (f : Nat → α → m β) :
175165 SatisfiesM (fun arr => arr.size = as.size) (Array.mapIdxM f as) :=
176166 size_mapFinIdxM _ _
177167
178- theorem size_modifyM [Monad m] [LawfulMonad m] (a : Array α) (i : Nat) (f : α → m α) :
179- SatisfiesM (·.size = a .size) (a .modifyM i f) := by
168+ theorem size_modifyM [Monad m] [LawfulMonad m] (as : Array α) (i : Nat) (f : α → m α) :
169+ SatisfiesM (·.size = as .size) (as .modifyM i f) := by
180170 unfold modifyM; split
181171 · exact .bind_pre <| .of_true fun _ => .pure <| by simp only [size_set]
182172 · exact .pure rfl
0 commit comments