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]
@[reducible, inline, deprecated Std.HashMap.Raw.size_empty (since := "2025-03-12")]
@[reducible, inline, deprecated Std.HashMap.Raw.isEmpty_empty (since := "2025-03-12")]
@[reducible, inline, deprecated Std.HashMap.Raw.contains_empty (since := "2025-03-12")]
@[reducible, inline, deprecated Std.HashMap.Raw.not_mem_empty (since := "2025-03-12")]
@[reducible, inline, deprecated Std.HashMap.Raw.erase_empty (since := "2025-03-12")]
@[reducible, inline, deprecated Std.HashMap.Raw.get?_empty (since := "2025-03-12")]
@[reducible, inline, deprecated Std.HashMap.Raw.getD_empty (since := "2025-03-12")]
abbrev
Std.HashMap.Raw.getD_emptyc
{α : Type u_1}
{β : Type u_2}
[BEq α]
[Hashable α]
{a : α}
{fallback : β}
:
@[reducible, inline, deprecated Std.HashMap.Raw.getKey?_empty (since := "2025-03-12")]
theorem
Std.HashMap.Raw.getKey?_beq
{α : Type u}
{β : Type v}
{m : Raw α β}
[BEq α]
[Hashable α]
[EquivBEq α]
[LawfulHashable α]
(h : m.WF)
{k : α}
:
@[reducible, inline, deprecated Std.HashMap.Raw.getKeyD_empty (since := "2025-03-12")]
abbrev
Std.HashMap.Raw.getKeyD_emptyc
{α : Type u_1}
{β : Type u_2}
[BEq α]
[Hashable α]
{a fallback : α}
:
@[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.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)
:
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.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]
@[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]
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}
:
@[deprecated Std.HashMap.Raw.getElem?_alter (since := "2025-02-09")]
@[deprecated Std.HashMap.Raw.getElem_alter (since := "2025-02-09")]
@[deprecated Std.HashMap.Raw.getElem_alter_self (since := "2025-02-09")]
@[deprecated Std.HashMap.Raw.getElem!_alter (since := "2025-02-09")]
@[deprecated Std.HashMap.Raw.getElem!_alter_self (since := "2025-02-09")]
@[deprecated Std.HashMap.Raw.getElem?_modify (since := "2025-03-07")]
@[deprecated Std.HashMap.Raw.getElem?_modify_self (since := "2025-03-07")]
theorem
Std.HashMap.Raw.get?_modify_self
{α : Type u}
{β : Type v}
[BEq α]
[Hashable α]
{m : Raw α β}
[EquivBEq α]
[LawfulHashable α]
{k : α}
{f : β → β}
(h : m.WF)
:
@[deprecated Std.HashMap.Raw.getElem_modify (since := "2025-03-07")]
@[deprecated Std.HashMap.Raw.getElem_modify_self (since := "2025-03-07")]
@[deprecated Std.HashMap.Raw.getElem!_modify (since := "2025-03-07")]
@[deprecated Std.HashMap.Raw.getElem!_modify_self (since := "2025-03-07")]
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₂)
@[reducible, inline, deprecated Std.HashMap.Raw.equiv_empty_iff_isEmpty (since := "2025-03-12")]
abbrev
Std.HashMap.Raw.equiv_emptyc_iff_isEmpty
{α : Type u_1}
{β : Type u_2}
[BEq α]
[Hashable α]
{m : Raw α β}
[EquivBEq α]
[LawfulHashable α]
(h : m.WF)
: