Hash map lemmas #
This module contains lemmas about Std.Data.HashMap.Raw. Most of the lemmas require
EquivBEq α and LawfulHashable α for the key type α. The easiest way to obtain these instances
is to provide an instance of LawfulBEq α.
@[simp]
@[simp]
@[simp]
@[simp]
theorem Std.HashMap.Raw.getKey?_beq {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k : α} :
@[simp]
theorem Std.HashMap.Raw.isEmpty_insertIfNew {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k : α} {v : β} :
theorem Std.HashMap.Raw.contains_insertIfNew_self {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k : α} {v : β} :
theorem Std.HashMap.Raw.mem_insertIfNew_self {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k : α} {v : β} :
theorem Std.HashMap.Raw.contains_of_contains_insertIfNew' {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k a : α} {v : β} :
This is a restatement of contains_of_contains_insertIfNew that is written to exactly match the proof
obligation in the statement of getElem_insertIfNew.
theorem Std.HashMap.Raw.mem_of_mem_insertIfNew' {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k a : α} {v : β} :
This is a restatement of mem_of_mem_insertIfNew that is written to exactly match the proof obligation
in the statement of getElem_insertIfNew.
theorem Std.HashMap.Raw.size_le_size_insertIfNew {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k : α} {v : β} :
theorem Std.HashMap.Raw.size_insertIfNew_le {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k : α} {v : β} :
theorem Std.HashMap.Raw.distinct_keys {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) :
List.Pairwise (fun (a b : α) => (a == b) = false) m.keys
theorem Std.HashMap.Raw.find?_toList_eq_some_iff_getKey?_eq_some_and_getElem?_eq_some {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k k' : α} {v : β} :
theorem Std.HashMap.Raw.find?_toArray_eq_some_iff_getKey?_eq_some_and_getElem?_eq_some {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {k k' : α} {v : β} :
theorem Std.HashMap.Raw.getKey?_insertMany_list_of_mem {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : k ∈ List.map Prod.fst l) :
theorem Std.HashMap.Raw.getKey_insertMany_list_of_mem {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : k ∈ List.map Prod.fst l) {h' : k' ∈ m.insertMany l} :
theorem Std.HashMap.Raw.getKey!_insertMany_list_of_mem {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] [Inhabited α] (h : m.WF) {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : k ∈ List.map Prod.fst l) :
theorem Std.HashMap.Raw.getKeyD_insertMany_list_of_mem {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List (α × β)} {k k' fallback : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : k ∈ List.map Prod.fst l) :
@[deprecated Std.HashMap.Raw.union_insert_right_equiv_insert_union (since := "2025-11-03")]
theorem Std.HashMap.Raw.getElem?_insertMany_list_of_mem {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) {v : β} (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : (k, v) ∈ l) :
theorem Std.HashMap.Raw.getElem_insertMany_list_of_mem {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) {v : β} (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : (k, v) ∈ l) {h' : k' ∈ m.insertMany l} :
theorem Std.HashMap.Raw.getElem!_insertMany_list_of_mem {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] [Inhabited β] (h : m.WF) {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) {v : β} (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : (k, v) ∈ l) :
theorem Std.HashMap.Raw.getD_insertMany_list_of_mem {α : Type u} {β : Type v} {m : Raw α β} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) {v fallback : β} (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : (k, v) ∈ l) :
theorem Std.HashMap.Raw.getKey?_insertManyIfNewUnit_list_of_not_mem_of_mem {α : Type u} [BEq α] [Hashable α] {m : Raw α Unit} [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List α} {k k' : α} (k_beq : (k == k') = true) (not_mem : ¬k ∈ m) (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) (mem : k ∈ l) :
theorem Std.HashMap.Raw.getKey_insertManyIfNewUnit_list_of_not_mem_of_mem {α : Type u} [BEq α] [Hashable α] {m : Raw α Unit} [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List α} {k k' : α} (k_beq : (k == k') = true) (not_mem : ¬k ∈ m) (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) (mem : k ∈ l) {h' : k' ∈ m.insertManyIfNewUnit l} :
theorem Std.HashMap.Raw.getKey_insertManyIfNewUnit_list_of_mem {α : Type u} [BEq α] [Hashable α] {m : Raw α Unit} [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List α} {k : α} (mem : k ∈ m) {h₃ : k ∈ m.insertManyIfNewUnit l} :
theorem Std.HashMap.Raw.getKey!_insertManyIfNewUnit_list_of_not_mem_of_mem {α : Type u} [BEq α] [Hashable α] {m : Raw α Unit} [EquivBEq α] [LawfulHashable α] [Inhabited α] (h : m.WF) {l : List α} {k k' : α} (k_beq : (k == k') = true) (not_mem : ¬k ∈ m) (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) (mem : k ∈ l) :
theorem Std.HashMap.Raw.getKeyD_insertManyIfNewUnit_list_of_not_mem_of_mem {α : Type u} [BEq α] [Hashable α] {m : Raw α Unit} [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List α} {k k' fallback : α} (k_beq : (k == k') = true) (not_mem : ¬k ∈ m) (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) (mem : k ∈ l) :
theorem Std.HashMap.Raw.size_insertManyIfNewUnit_list {α : Type u} [BEq α] [Hashable α] {m : Raw α Unit} [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List α} (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) :
theorem Std.HashMap.Raw.size_le_size_insertManyIfNewUnit_list {α : Type u} [BEq α] [Hashable α] {m : Raw α Unit} [EquivBEq α] [LawfulHashable α] (h : m.WF) {l : List α} :
theorem Std.HashMap.Raw.getElem_ofList_of_mem {α : Type u} {β : Type v} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) {v : β} (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : (k, v) ∈ l) {h : k' ∈ ofList l} :
theorem Std.HashMap.Raw.getElem!_ofList_of_mem {α : Type u} {β : Type v} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) {v : β} [Inhabited β] (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : (k, v) ∈ l) :
theorem Std.HashMap.Raw.getKey_ofList_of_mem {α : Type u} {β : Type v} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : k ∈ List.map Prod.fst l) {h' : k' ∈ ofList l} :
theorem Std.HashMap.Raw.getKey!_ofList_of_mem {α : Type u} {β : Type v} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] [Inhabited α] {l : List (α × β)} {k k' : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : k ∈ List.map Prod.fst l) :
theorem Std.HashMap.Raw.getKeyD_ofList_of_mem {α : Type u} {β : Type v} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List (α × β)} {k k' fallback : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α × β) => (a.fst == b.fst) = false) l) (mem : k ∈ List.map Prod.fst l) :
@[simp]
@[simp]
theorem Std.HashMap.Raw.unitOfList_eq_insertManyIfNewUnit_empty {α : Type u} [BEq α] [Hashable α] {l : List α} :
@[simp]
theorem Std.HashMap.Raw.contains_unitOfList {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} {k : α} :
@[simp]
theorem Std.HashMap.Raw.mem_unitOfList {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} {k : α} :
theorem Std.HashMap.Raw.getKey?_unitOfList_of_contains_eq_false {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} {k : α} (contains_eq_false : l.contains k = false) :
theorem Std.HashMap.Raw.getKey?_unitOfList_of_mem {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} {k k' : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) (mem : k ∈ l) :
theorem Std.HashMap.Raw.getKey_unitOfList_of_mem {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} {k k' : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) (mem : k ∈ l) {h' : k' ∈ unitOfList l} :
theorem Std.HashMap.Raw.getKeyD_unitOfList_of_contains_eq_false {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} {k fallback : α} (contains_eq_false : l.contains k = false) :
theorem Std.HashMap.Raw.getKeyD_unitOfList_of_mem {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} {k k' fallback : α} (k_beq : (k == k') = true) (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) (mem : k ∈ l) :
theorem Std.HashMap.Raw.size_unitOfList {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} (distinct : List.Pairwise (fun (a b : α) => (a == b) = false) l) :
theorem Std.HashMap.Raw.size_unitOfList_le {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} :
@[simp]
@[simp]
theorem Std.HashMap.Raw.isEmpty_unitOfList {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {l : List α} :
@[simp]
theorem Std.HashMap.Raw.getElem_unitOfList {α : Type u} [BEq α] [Hashable α] {l : List α} {k : α} {h : k ∈ unitOfList l} :
theorem Std.HashMap.Raw.Equiv.insertIfNew {α : Type u} {β : Type v} [BEq α] [Hashable α] {m₁ m₂ : Raw α β} [EquivBEq α] [LawfulHashable α] (h₁ : m₁.WF) (h₂ : m₂.WF) (k : α) (v : β) (h : m₁.Equiv m₂) :
(m₁.insertIfNew k v).Equiv (m₂.insertIfNew k v)
theorem Std.HashMap.Raw.Equiv.insertMany_list {α : Type u} {β : Type v} [BEq α] [Hashable α] {m₁ m₂ : Raw α β} [EquivBEq α] [LawfulHashable α] (h₁ : m₁.WF) (h₂ : m₂.WF) (l : List (α × β)) (h : m₁.Equiv m₂) :
(m₁.insertMany l).Equiv (m₂.insertMany l)
theorem Std.HashMap.Raw.Equiv.insertManyIfNewUnit_list {α : Type u} [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {m₁ m₂ : Raw α Unit} (h₁ : m₁.WF) (h₂ : m₂.WF) (l : List α) (h : m₁.Equiv m₂) :
(m₁.insertManyIfNewUnit l).Equiv (m₂.insertManyIfNewUnit l)
theorem Std.HashMap.Raw.Equiv.filter {α : Type u} {β : Type v} [BEq α] [Hashable α] {m₁ m₂ : Raw α β} (h₁ : m₁.WF) (h₂ : m₂.WF) (f : α → β → Bool) (h : m₁.Equiv m₂) :
(Raw.filter f m₁).Equiv (Raw.filter f m₂)
theorem Std.HashMap.Raw.Equiv.filterMap {α : Type u} {β : Type v} {γ : Type w} [BEq α] [Hashable α] {m₁ m₂ : Raw α β} (h₁ : m₁.WF) (h₂ : m₂.WF) (f : α → β → Option γ) (h : m₁.Equiv m₂) :
(Raw.filterMap f m₁).Equiv (Raw.filterMap f m₂)
theorem Std.HashMap.Raw.Equiv.of_forall_getKey_eq_of_forall_getElem?_eq {α : Type u} {β : Type v} [BEq α] [Hashable α] {m₁ m₂ : Raw α β} [EquivBEq α] [LawfulHashable α] (h₁ : m₁.WF) (h₂ : m₂.WF) (hk : ∀ (k : α) (hk : k ∈ m₁) (hk' : k ∈ m₂), m₁.getKey k hk = m₂.getKey k hk') (hv : ∀ (k : α), m₁[k]? = m₂[k]?) :
m₁.Equiv m₂
theorem Std.HashMap.Raw.insertManyIfNewUnit_list_equiv_foldl {α : Type u} [BEq α] [Hashable α] {m : Raw α Unit} {l : List α} (h : m.WF) :
(m.insertManyIfNewUnit l).Equiv (List.foldl (fun (acc : Raw α Unit) (a : α) => acc.insertIfNew a ()) m l)
theorem Std.HashMap.Raw.unitOfList_equiv_foldl {α : Type u} [BEq α] [Hashable α] {l : List α} :
(unitOfList l).Equiv (List.foldl (fun (acc : Raw α Unit) (a : α) => acc.insertIfNew a ()) ∅ l)
theorem Std.HashMap.Raw.getD_filter_of_getKey?_eq_some {α : Type u} {β : Type v} [BEq α] [Hashable α] {m : Raw α β} [EquivBEq α] [LawfulHashable α] {f : α → β → Bool} {k k' : α} {fallback : β} (h : m.WF) :
theorem Std.HashMap.Raw.getKeyD_filter {α : Type u} {β : Type v} [BEq α] [Hashable α] {m : Raw α β} [EquivBEq α] [LawfulHashable α] {f : α → β → Bool} {k fallback : α} (h : m.WF) :
@[simp]
theorem Std.HashMap.Raw.getElem?_map' {α : Type u} {β : Type v} {γ : Type w} [BEq α] [Hashable α] {m : Raw α β} [EquivBEq α] [LawfulHashable α] {f : α → β → γ} {k : α} (h : m.WF) :
Variant of getElem?_map that holds with EquivBEq (i.e. without LawfulBEq).
@[simp]
theorem Std.HashMap.Raw.getElem_map' {α : Type u} {β : Type v} {γ : Type w} [BEq α] [Hashable α] {m : Raw α β} [EquivBEq α] [LawfulHashable α] {f : α → β → γ} {k : α} {h' : k ∈ map f m} (h : m.WF) :
Variant of getElem_map that holds with EquivBEq (i.e. without LawfulBEq).
theorem Std.HashMap.Raw.getElem!_map' {α : Type u} {β : Type v} {γ : Type w} [BEq α] [Hashable α] {m : Raw α β} [EquivBEq α] [LawfulHashable α] [Inhabited γ] {f : α → β → γ} {k : α} (h : m.WF) :
Variant of getElem!_map that holds with EquivBEq (i.e. without LawfulBEq).