Skip to content

Commit eaa1bc1

Browse files
authored
chore: more simp lemmas for LawfulGetElem (#8470)
This PR adds `@[simp]` to `getElem_pos/neg` (similarly for `getElem!`). These are often already simp lemmas for concrete types.
1 parent a912652 commit eaa1bc1

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

src/Init/GetElem.lean

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -164,25 +164,25 @@ export LawfulGetElem (getElem?_def getElem!_def)
164164
instance (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")]
254254
abbrev 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

src/Std/Tactic/BVDecide/LRAT/Internal/Clause.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ theorem ofArray.folder_foldl_mem_of_mem
278278
· next hfoo =>
279279
rw [hl]
280280
cases x
281-
simp [Std.HashMap.getElem?_insertIfNew]
281+
simp [Std.HashMap.getElem_insertIfNew]
282282
intro hbar
283283
exfalso
284284
apply hfoo

0 commit comments

Comments
 (0)