@@ -164,25 +164,25 @@ export LawfulGetElem (getElem?_def getElem!_def)
164164instance (priority := low) [GetElem coll idx elem valid] [∀ xs i, Decidable (valid xs i)] :
165165 LawfulGetElem coll idx elem valid where
166166
167- theorem getElem?_pos [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
167+ @[simp] theorem getElem?_pos [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
168168 (c : cont) (i : idx) (h : dom c i) : c[i]? = some (c[i]'h) := by
169169 have : Decidable (dom c i) := .isTrue h
170170 rw [getElem?_def]
171171 exact dif_pos h
172172
173- theorem getElem?_neg [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
173+ @[simp] theorem getElem?_neg [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
174174 (c : cont) (i : idx) (h : ¬dom c i) : c[i]? = none := by
175175 have : Decidable (dom c i) := .isFalse h
176176 rw [getElem?_def]
177177 exact dif_neg h
178178
179- theorem getElem!_pos [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
179+ @[simp] theorem getElem!_pos [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
180180 [Inhabited elem] (c : cont) (i : idx) (h : dom c i) :
181181 c[i]! = c[i]'h := by
182182 have : Decidable (dom c i) := .isTrue h
183183 simp [getElem!_def, getElem?_def, h]
184184
185- theorem getElem!_neg [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
185+ @[simp] theorem getElem!_neg [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
186186 [Inhabited elem] (c : cont) (i : idx) (h : ¬dom c i) : c[i]! = default := by
187187 have : Decidable (dom c i) := .isFalse h
188188 simp [getElem!_def, getElem?_def, h]
@@ -243,12 +243,12 @@ grind_pattern getElem_of_getElem? => c[i]?, some e
243243@[simp] theorem some_getElem_eq_getElem?_iff [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
244244 {c : cont} {i : idx} [Decidable (dom c i)] (h : dom c i):
245245 (some c[i] = c[i]?) ↔ True := by
246- simpa [some_eq_getElem?_iff, h] using ⟨h, trivial⟩
246+ simp [h]
247247
248248@[simp] theorem getElem?_eq_some_getElem_iff [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
249249 {c : cont} {i : idx} [Decidable (dom c i)] (h : dom c i):
250250 (c[i]? = some c[i]) ↔ True := by
251- simpa [getElem?_eq_some_iff, h] using ⟨h, trivial⟩
251+ simp [h]
252252
253253@[deprecated getElem?_eq_none_iff (since := "2025-02-17")]
254254abbrev getElem?_eq_none := @getElem?_eq_none_iff
@@ -339,7 +339,8 @@ instance : GetElem? (List α) Nat α fun as i => i < as.length where
339339@[simp] theorem get!Internal_eq_getElem! [Inhabited α] {l : List α} {i : Nat} :
340340 l.get!Internal i = l[i]! := rfl
341341
342- @[simp] theorem getElem?_eq_getElem {l : List α} {i} (h : i < l.length) :
342+ -- This is only needed locally; after the `LawfulGetElem` instance the general `getElem?_pos` lemma applies.
343+ @[local simp] theorem getElem?_eq_getElem {l : List α} {i} (h : i < l.length) :
343344 l[i]? = some l[i] := by
344345 induction l generalizing i with
345346 | nil => cases h
0 commit comments