| /- | |
| Copyright (c) 2024 Lean FRO, LLC. All rights reserved. | |
| Released under Apache 2.0 license as described in the file LICENSE. | |
| Authors: Markus Himmel | |
| -/ | |
| prelude | |
| import Init.Data.Array.Lemmas | |
| import Init.Data.List.Nat.TakeDrop | |
| /-! | |
| These lemmas are used in the internals of HashMap. | |
| They should find a new home and/or be reformulated. | |
| -/ | |
| set_option linter.listVariables true -- Enforce naming conventions for `List`/`Array`/`Vector` variables. | |
| set_option linter.indexVariables true -- Enforce naming conventions for index variables. | |
| namespace List | |
| theorem exists_of_set {i : Nat} {a' : α} {l : List α} (h : i < l.length) : | |
| ∃ l₁ l₂, l = l₁ ++ l[i] :: l₂ ∧ l₁.length = i ∧ l.set i a' = l₁ ++ a' :: l₂ := by | |
| refine ⟨l.take i, l.drop (i + 1), ⟨by simp, ⟨length_take_of_le (Nat.le_of_lt h), ?_⟩⟩⟩ | |
| simp [set_eq_take_append_cons_drop, h] | |
| end List | |
| namespace Array | |
| theorem exists_of_uset (xs : Array α) (i d h) : | |
| ∃ l₁ l₂, xs.toList = l₁ ++ xs[i] :: l₂ ∧ List.length l₁ = i.toNat ∧ | |
| (xs.uset i d h).toList = l₁ ++ d :: l₂ := by | |
| simpa only [ugetElem_eq_getElem, ← getElem_toList, uset, toList_set] using | |
| List.exists_of_set _ | |
| end Array |