This PR verifies the various fold and for variants for hashmaps. --------- Co-authored-by: Markus Himmel <markus@himmel-villmar.de>
2714 lines
112 KiB
Text
2714 lines
112 KiB
Text
/-
|
||
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 Std.Data.DHashMap.Internal.Raw
|
||
import Std.Data.DHashMap.Internal.RawLemmas
|
||
|
||
/-!
|
||
# Dependent hash map lemmas
|
||
|
||
This file contains lemmas about `Std.Data.DHashMap`. 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 α`.
|
||
-/
|
||
|
||
open Std.DHashMap.Internal
|
||
|
||
set_option linter.missingDocs true
|
||
set_option autoImplicit false
|
||
|
||
universe u v w
|
||
|
||
variable {α : Type u} {β : α → Type v} {_ : BEq α} {_ : Hashable α}
|
||
|
||
namespace Std.DHashMap
|
||
|
||
variable {m : DHashMap α β}
|
||
|
||
@[simp]
|
||
theorem isEmpty_empty {c} : (empty c : DHashMap α β).isEmpty :=
|
||
Raw₀.isEmpty_empty
|
||
|
||
@[simp]
|
||
theorem isEmpty_emptyc : (∅ : DHashMap α β).isEmpty :=
|
||
isEmpty_empty
|
||
|
||
@[simp]
|
||
theorem isEmpty_insert [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insert k v).isEmpty = false :=
|
||
Raw₀.isEmpty_insert _ m.2
|
||
|
||
theorem mem_iff_contains {a : α} : a ∈ m ↔ m.contains a :=
|
||
Iff.rfl
|
||
|
||
theorem contains_congr [EquivBEq α] [LawfulHashable α] {a b : α} (hab : a == b) :
|
||
m.contains a = m.contains b :=
|
||
Raw₀.contains_congr _ m.2 hab
|
||
|
||
theorem mem_congr [EquivBEq α] [LawfulHashable α] {a b : α} (hab : a == b) : a ∈ m ↔ b ∈ m := by
|
||
simp [mem_iff_contains, contains_congr hab]
|
||
|
||
@[simp] theorem contains_empty {a : α} {c} : (empty c : DHashMap α β).contains a = false :=
|
||
Raw₀.contains_empty
|
||
|
||
@[simp] theorem not_mem_empty {a : α} {c} : ¬a ∈ (empty c : DHashMap α β) := by
|
||
simp [mem_iff_contains]
|
||
|
||
@[simp] theorem contains_emptyc {a : α} : (∅ : DHashMap α β).contains a = false :=
|
||
contains_empty
|
||
|
||
@[simp] theorem not_mem_emptyc {a : α} : ¬a ∈ (∅ : DHashMap α β) :=
|
||
not_mem_empty
|
||
|
||
theorem contains_of_isEmpty [EquivBEq α] [LawfulHashable α] {a : α} :
|
||
m.isEmpty → m.contains a = false :=
|
||
Raw₀.contains_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem not_mem_of_isEmpty [EquivBEq α] [LawfulHashable α] {a : α} :
|
||
m.isEmpty → ¬a ∈ m := by
|
||
simpa [mem_iff_contains] using contains_of_isEmpty
|
||
|
||
theorem isEmpty_eq_false_iff_exists_contains_eq_true [EquivBEq α] [LawfulHashable α] :
|
||
m.isEmpty = false ↔ ∃ a, m.contains a = true :=
|
||
Raw₀.isEmpty_eq_false_iff_exists_contains_eq_true ⟨m.1, _⟩ m.2
|
||
|
||
theorem isEmpty_eq_false_iff_exists_mem [EquivBEq α] [LawfulHashable α] :
|
||
m.isEmpty = false ↔ ∃ a, a ∈ m := by
|
||
simpa [mem_iff_contains] using isEmpty_eq_false_iff_exists_contains_eq_true
|
||
|
||
theorem isEmpty_iff_forall_contains [EquivBEq α] [LawfulHashable α] :
|
||
m.isEmpty = true ↔ ∀ a, m.contains a = false :=
|
||
Raw₀.isEmpty_iff_forall_contains ⟨m.1, _⟩ m.2
|
||
|
||
theorem isEmpty_iff_forall_not_mem [EquivBEq α] [LawfulHashable α] :
|
||
m.isEmpty = true ↔ ∀ a, ¬a ∈ m := by
|
||
simpa [mem_iff_contains] using isEmpty_iff_forall_contains
|
||
|
||
@[simp] theorem insert_eq_insert {p : (a : α) × β a} : Insert.insert p m = m.insert p.1 p.2 := rfl
|
||
|
||
@[simp] theorem singleton_eq_insert {p : (a : α) × β a} :
|
||
Singleton.singleton p = (∅ : DHashMap α β).insert p.1 p.2 :=
|
||
rfl
|
||
|
||
@[simp]
|
||
theorem contains_insert [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
(m.insert k v).contains a = (k == a || m.contains a) :=
|
||
Raw₀.contains_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_insert [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
a ∈ m.insert k v ↔ k == a ∨ a ∈ m := by
|
||
simp [mem_iff_contains, contains_insert]
|
||
|
||
theorem contains_of_contains_insert [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
(m.insert k v).contains a → (k == a) = false → m.contains a :=
|
||
Raw₀.contains_of_contains_insert ⟨m.1, _⟩ m.2
|
||
|
||
theorem mem_of_mem_insert [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
a ∈ m.insert k v → (k == a) = false → a ∈ m := by
|
||
simpa [mem_iff_contains, -contains_insert] using contains_of_contains_insert
|
||
|
||
theorem contains_insert_self [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insert k v).contains k := by simp
|
||
|
||
theorem mem_insert_self [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
k ∈ m.insert k v := by simp
|
||
|
||
@[simp]
|
||
theorem size_empty {c} : (empty c : DHashMap α β).size = 0 :=
|
||
Raw₀.size_empty
|
||
|
||
@[simp]
|
||
theorem size_emptyc : (∅ : DHashMap α β).size = 0 :=
|
||
size_empty
|
||
|
||
theorem isEmpty_eq_size_eq_zero : m.isEmpty = (m.size == 0) := rfl
|
||
|
||
theorem size_insert [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insert k v).size = if k ∈ m then m.size else m.size + 1 :=
|
||
Raw₀.size_insert ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_le_size_insert [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
m.size ≤ (m.insert k v).size :=
|
||
Raw₀.size_le_size_insert ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_insert_le [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insert k v).size ≤ m.size + 1 :=
|
||
Raw₀.size_insert_le ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem erase_empty {k : α} {c : Nat} : (empty c : DHashMap α β).erase k = empty c :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.erase_empty (k := k)) :) -- Lean code is happy
|
||
|
||
@[simp]
|
||
theorem erase_emptyc {k : α} : (∅ : DHashMap α β).erase k = ∅ :=
|
||
erase_empty
|
||
|
||
@[simp]
|
||
theorem isEmpty_erase [EquivBEq α] [LawfulHashable α] {k : α} :
|
||
(m.erase k).isEmpty = (m.isEmpty || (m.size == 1 && m.contains k)) :=
|
||
Raw₀.isEmpty_erase _ m.2
|
||
|
||
@[simp]
|
||
theorem contains_erase [EquivBEq α] [LawfulHashable α] {k a : α} :
|
||
(m.erase k).contains a = (!(k == a) && m.contains a) :=
|
||
Raw₀.contains_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_erase [EquivBEq α] [LawfulHashable α] {k a : α} :
|
||
a ∈ m.erase k ↔ (k == a) = false ∧ a ∈ m := by
|
||
simp [mem_iff_contains, contains_erase]
|
||
|
||
theorem contains_of_contains_erase [EquivBEq α] [LawfulHashable α] {k a : α} :
|
||
(m.erase k).contains a → m.contains a :=
|
||
Raw₀.contains_of_contains_erase ⟨m.1, _⟩ m.2
|
||
|
||
theorem mem_of_mem_erase [EquivBEq α] [LawfulHashable α] {k a : α} : a ∈ m.erase k → a ∈ m := by
|
||
simp
|
||
|
||
theorem size_erase [EquivBEq α] [LawfulHashable α] {k : α} :
|
||
(m.erase k).size = if k ∈ m then m.size - 1 else m.size :=
|
||
Raw₀.size_erase _ m.2
|
||
|
||
theorem size_erase_le [EquivBEq α] [LawfulHashable α] {k : α} : (m.erase k).size ≤ m.size :=
|
||
Raw₀.size_erase_le _ m.2
|
||
|
||
theorem size_le_size_erase [EquivBEq α] [LawfulHashable α] {k : α} :
|
||
m.size ≤ (m.erase k).size + 1 :=
|
||
Raw₀.size_le_size_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem containsThenInsert_fst {k : α} {v : β k} : (m.containsThenInsert k v).1 = m.contains k :=
|
||
Raw₀.containsThenInsert_fst _
|
||
|
||
@[simp]
|
||
theorem containsThenInsert_snd {k : α} {v : β k} : (m.containsThenInsert k v).2 = m.insert k v :=
|
||
Subtype.eq <| (congrArg Subtype.val (Raw₀.containsThenInsert_snd _ (k := k)) :)
|
||
|
||
@[simp]
|
||
theorem containsThenInsertIfNew_fst {k : α} {v : β k} :
|
||
(m.containsThenInsertIfNew k v).1 = m.contains k :=
|
||
Raw₀.containsThenInsertIfNew_fst _
|
||
|
||
@[simp]
|
||
theorem containsThenInsertIfNew_snd {k : α} {v : β k} :
|
||
(m.containsThenInsertIfNew k v).2 = m.insertIfNew k v :=
|
||
Subtype.eq <| (congrArg Subtype.val (Raw₀.containsThenInsertIfNew_snd _ (k := k)) :)
|
||
|
||
@[simp]
|
||
theorem get?_empty [LawfulBEq α] {a : α} {c} : (empty c : DHashMap α β).get? a = none :=
|
||
Raw₀.get?_empty
|
||
|
||
@[simp]
|
||
theorem get?_emptyc [LawfulBEq α] {a : α} : (∅ : DHashMap α β).get? a = none :=
|
||
get?_empty
|
||
|
||
theorem get?_of_isEmpty [LawfulBEq α] {a : α} : m.isEmpty = true → m.get? a = none :=
|
||
Raw₀.get?_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_insert [LawfulBEq α] {a k : α} {v : β k} : (m.insert k v).get? a =
|
||
if h : k == a then some (cast (congrArg β (eq_of_beq h)) v) else m.get? a :=
|
||
Raw₀.get?_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get?_insert_self [LawfulBEq α] {k : α} {v : β k} : (m.insert k v).get? k = some v :=
|
||
Raw₀.get?_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem contains_eq_isSome_get? [LawfulBEq α] {a : α} : m.contains a = (m.get? a).isSome :=
|
||
Raw₀.contains_eq_isSome_get? ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_none_of_contains_eq_false [LawfulBEq α] {a : α} :
|
||
m.contains a = false → m.get? a = none :=
|
||
Raw₀.get?_eq_none ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_none [LawfulBEq α] {a : α} : ¬a ∈ m → m.get? a = none := by
|
||
simpa [mem_iff_contains] using get?_eq_none_of_contains_eq_false
|
||
|
||
theorem get?_erase [LawfulBEq α] {k a : α} :
|
||
(m.erase k).get? a = if k == a then none else m.get? a :=
|
||
Raw₀.get?_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get?_erase_self [LawfulBEq α] {k : α} : (m.erase k).get? k = none :=
|
||
Raw₀.get?_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
@[simp]
|
||
theorem get?_empty {a : α} {c} : get? (empty c : DHashMap α (fun _ => β)) a = none :=
|
||
Raw₀.Const.get?_empty
|
||
|
||
@[simp]
|
||
theorem get?_emptyc {a : α} : get? (∅ : DHashMap α (fun _ => β)) a = none :=
|
||
get?_empty
|
||
|
||
theorem get?_of_isEmpty [EquivBEq α] [LawfulHashable α] {a : α} :
|
||
m.isEmpty = true → get? m a = none :=
|
||
Raw₀.Const.get?_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_insert [EquivBEq α] [LawfulHashable α] {k a : α} {v : β} :
|
||
get? (m.insert k v) a = if k == a then some v else get? m a :=
|
||
Raw₀.Const.get?_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get?_insert_self [EquivBEq α] [LawfulHashable α] {k : α} {v : β} :
|
||
get? (m.insert k v) k = some v :=
|
||
Raw₀.Const.get?_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem contains_eq_isSome_get? [EquivBEq α] [LawfulHashable α] {a : α} :
|
||
m.contains a = (get? m a).isSome :=
|
||
Raw₀.Const.contains_eq_isSome_get? ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_none_of_contains_eq_false [EquivBEq α] [LawfulHashable α] {a : α} :
|
||
m.contains a = false → get? m a = none :=
|
||
Raw₀.Const.get?_eq_none ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_none [EquivBEq α] [LawfulHashable α] {a : α } : ¬a ∈ m → get? m a = none := by
|
||
simpa [mem_iff_contains] using get?_eq_none_of_contains_eq_false
|
||
|
||
theorem get?_erase [EquivBEq α] [LawfulHashable α] {k a : α} :
|
||
Const.get? (m.erase k) a = if k == a then none else get? m a :=
|
||
Raw₀.Const.get?_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get?_erase_self [EquivBEq α] [LawfulHashable α] {k : α} : get? (m.erase k) k = none :=
|
||
Raw₀.Const.get?_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_get? [LawfulBEq α] {a : α} : get? m a = m.get? a :=
|
||
Raw₀.Const.get?_eq_get? ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_congr [EquivBEq α] [LawfulHashable α] {a b : α} (hab : a == b) : get? m a = get? m b :=
|
||
Raw₀.Const.get?_congr ⟨m.1, _⟩ m.2 hab
|
||
|
||
end Const
|
||
|
||
theorem get_insert [LawfulBEq α] {k a : α} {v : β k} {h₁} :
|
||
(m.insert k v).get a h₁ =
|
||
if h₂ : k == a then
|
||
cast (congrArg β (eq_of_beq h₂)) v
|
||
else
|
||
m.get a (mem_of_mem_insert h₁ (Bool.eq_false_iff.2 h₂)) :=
|
||
Raw₀.get_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get_insert_self [LawfulBEq α] {k : α} {v : β k} :
|
||
(m.insert k v).get k mem_insert_self = v :=
|
||
Raw₀.get_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get_erase [LawfulBEq α] {k a : α} {h'} :
|
||
(m.erase k).get a h' = m.get a (mem_of_mem_erase h') :=
|
||
Raw₀.get_erase ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_get [LawfulBEq α] {a : α} {h} : m.get? a = some (m.get a h) :=
|
||
Raw₀.get?_eq_some_get ⟨m.1, _⟩ m.2
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
theorem get_insert [EquivBEq α] [LawfulHashable α] {k a : α} {v : β} {h₁} :
|
||
get (m.insert k v) a h₁ =
|
||
if h₂ : k == a then v else get m a (mem_of_mem_insert h₁ (Bool.eq_false_iff.2 h₂)) :=
|
||
Raw₀.Const.get_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get_insert_self [EquivBEq α] [LawfulHashable α] {k : α} {v : β} :
|
||
get (m.insert k v) k mem_insert_self = v :=
|
||
Raw₀.Const.get_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get_erase [EquivBEq α] [LawfulHashable α] {k a : α} {h'} :
|
||
get (m.erase k) a h' = get m a (mem_of_mem_erase h') :=
|
||
Raw₀.Const.get_erase ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_get [EquivBEq α] [LawfulHashable α] {a : α} {h} :
|
||
get? m a = some (get m a h) :=
|
||
Raw₀.Const.get?_eq_some_get ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_eq_get [LawfulBEq α] {a : α} {h} : get m a h = m.get a h :=
|
||
Raw₀.Const.get_eq_get ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_congr [LawfulBEq α] {a b : α} (hab : a == b) {h'} :
|
||
get m a h' = get m b ((mem_congr hab).1 h') :=
|
||
Raw₀.Const.get_congr ⟨m.1, _⟩ m.2 hab
|
||
|
||
end Const
|
||
|
||
@[simp]
|
||
theorem get!_empty [LawfulBEq α] {a : α} [Inhabited (β a)] {c} :
|
||
(empty c : DHashMap α β).get! a = default :=
|
||
Raw₀.get!_empty
|
||
|
||
@[simp]
|
||
theorem get!_emptyc [LawfulBEq α] {a : α} [Inhabited (β a)] :
|
||
(∅ : DHashMap α β).get! a = default :=
|
||
get!_empty
|
||
|
||
theorem get!_of_isEmpty [LawfulBEq α] {a : α} [Inhabited (β a)] :
|
||
m.isEmpty = true → m.get! a = default :=
|
||
Raw₀.get!_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_insert [LawfulBEq α] {k a : α} [Inhabited (β a)] {v : β k} :
|
||
(m.insert k v).get! a =
|
||
if h : k == a then cast (congrArg β (eq_of_beq h)) v else m.get! a :=
|
||
Raw₀.get!_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get!_insert_self [LawfulBEq α] {a : α} [Inhabited (β a)] {b : β a} :
|
||
(m.insert a b).get! a = b :=
|
||
Raw₀.get!_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_eq_default_of_contains_eq_false [LawfulBEq α] {a : α} [Inhabited (β a)] :
|
||
m.contains a = false → m.get! a = default :=
|
||
Raw₀.get!_eq_default ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_eq_default [LawfulBEq α] {a : α} [Inhabited (β a)] :
|
||
¬a ∈ m → m.get! a = default := by
|
||
simpa [mem_iff_contains] using get!_eq_default_of_contains_eq_false
|
||
|
||
theorem get!_erase [LawfulBEq α] {k a : α} [Inhabited (β a)] :
|
||
(m.erase k).get! a = if k == a then default else m.get! a :=
|
||
Raw₀.get!_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get!_erase_self [LawfulBEq α] {k : α} [Inhabited (β k)] :
|
||
(m.erase k).get! k = default :=
|
||
Raw₀.get!_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_get!_of_contains [LawfulBEq α] {a : α} [Inhabited (β a)] :
|
||
m.contains a = true → m.get? a = some (m.get! a) :=
|
||
Raw₀.get?_eq_some_get! ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_get! [LawfulBEq α] {a : α} [Inhabited (β a)] :
|
||
a ∈ m → m.get? a = some (m.get! a) := by
|
||
simpa [mem_iff_contains] using get?_eq_some_get!_of_contains
|
||
|
||
theorem get!_eq_get!_get? [LawfulBEq α] {a : α} [Inhabited (β a)] :
|
||
m.get! a = (m.get? a).get! :=
|
||
Raw₀.get!_eq_get!_get? ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_eq_get! [LawfulBEq α] {a : α} [Inhabited (β a)] {h} :
|
||
m.get a h = m.get! a :=
|
||
Raw₀.get_eq_get! ⟨m.1, _⟩ m.2
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
@[simp]
|
||
theorem get!_empty [Inhabited β] {a : α} {c} :
|
||
get! (empty c : DHashMap α (fun _ => β)) a = default :=
|
||
Raw₀.Const.get!_empty
|
||
|
||
@[simp]
|
||
theorem get!_emptyc [Inhabited β] {a : α} : get! (∅ : DHashMap α (fun _ => β)) a = default :=
|
||
get!_empty
|
||
|
||
theorem get!_of_isEmpty [EquivBEq α] [LawfulHashable α] [Inhabited β] {a : α} :
|
||
m.isEmpty = true → get! m a = default :=
|
||
Raw₀.Const.get!_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_insert [EquivBEq α] [LawfulHashable α] [Inhabited β] {k a : α} {v : β} :
|
||
get! (m.insert k v) a = if k == a then v else get! m a :=
|
||
Raw₀.Const.get!_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get!_insert_self [EquivBEq α] [LawfulHashable α] [Inhabited β] {k : α} {v : β} :
|
||
get! (m.insert k v) k = v :=
|
||
Raw₀.Const.get!_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_eq_default_of_contains_eq_false [EquivBEq α] [LawfulHashable α] [Inhabited β] {a : α} :
|
||
m.contains a = false → get! m a = default :=
|
||
Raw₀.Const.get!_eq_default ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_eq_default [EquivBEq α] [LawfulHashable α] [Inhabited β] {a : α} :
|
||
¬a ∈ m → get! m a = default := by
|
||
simpa [mem_iff_contains] using get!_eq_default_of_contains_eq_false
|
||
|
||
theorem get!_erase [EquivBEq α] [LawfulHashable α] [Inhabited β] {k a : α} :
|
||
get! (m.erase k) a = if k == a then default else get! m a :=
|
||
Raw₀.Const.get!_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get!_erase_self [EquivBEq α] [LawfulHashable α] [Inhabited β] {k : α} :
|
||
get! (m.erase k) k = default :=
|
||
Raw₀.Const.get!_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_get!_of_contains [EquivBEq α] [LawfulHashable α] [Inhabited β] {a : α} :
|
||
m.contains a = true → get? m a = some (get! m a) :=
|
||
Raw₀.Const.get?_eq_some_get! ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_get! [EquivBEq α] [LawfulHashable α] [Inhabited β] {a : α} :
|
||
a ∈ m → get? m a = some (get! m a) := by
|
||
simpa [mem_iff_contains] using get?_eq_some_get!_of_contains
|
||
|
||
theorem get!_eq_get!_get? [EquivBEq α] [LawfulHashable α] [Inhabited β] {a : α} :
|
||
get! m a = (get? m a).get! :=
|
||
Raw₀.Const.get!_eq_get!_get? ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_eq_get! [EquivBEq α] [LawfulHashable α] [Inhabited β] {a : α} {h} :
|
||
get m a h = get! m a :=
|
||
Raw₀.Const.get_eq_get! ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_eq_get! [LawfulBEq α] [Inhabited β] {a : α} :
|
||
get! m a = m.get! a :=
|
||
Raw₀.Const.get!_eq_get! ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_congr [EquivBEq α] [LawfulHashable α] [Inhabited β] {a b : α} (hab : a == b) :
|
||
get! m a = get! m b :=
|
||
Raw₀.Const.get!_congr ⟨m.1, _⟩ m.2 hab
|
||
|
||
end Const
|
||
|
||
@[simp]
|
||
theorem getD_empty [LawfulBEq α] {a : α} {fallback : β a} {c} :
|
||
(empty c : DHashMap α β).getD a fallback = fallback :=
|
||
Raw₀.getD_empty
|
||
|
||
@[simp]
|
||
theorem getD_emptyc [LawfulBEq α] {a : α} {fallback : β a} :
|
||
(∅ : DHashMap α β).getD a fallback = fallback :=
|
||
getD_empty
|
||
|
||
theorem getD_of_isEmpty [LawfulBEq α] {a : α} {fallback : β a} :
|
||
m.isEmpty = true → m.getD a fallback = fallback :=
|
||
Raw₀.getD_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_insert [LawfulBEq α] {k a : α} {fallback : β a} {v : β k} :
|
||
(m.insert k v).getD a fallback =
|
||
if h : k == a then cast (congrArg β (eq_of_beq h)) v else m.getD a fallback :=
|
||
Raw₀.getD_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getD_insert_self [LawfulBEq α] {k : α} {fallback v : β k} :
|
||
(m.insert k v).getD k fallback = v :=
|
||
Raw₀.getD_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_eq_fallback_of_contains_eq_false [LawfulBEq α] {a : α} {fallback : β a} :
|
||
m.contains a = false → m.getD a fallback = fallback :=
|
||
Raw₀.getD_eq_fallback ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_eq_fallback [LawfulBEq α] {a : α} {fallback : β a} :
|
||
¬a ∈ m → m.getD a fallback = fallback := by
|
||
simpa [mem_iff_contains] using getD_eq_fallback_of_contains_eq_false
|
||
|
||
theorem getD_erase [LawfulBEq α] {k a : α} {fallback : β a} :
|
||
(m.erase k).getD a fallback = if k == a then fallback else m.getD a fallback :=
|
||
Raw₀.getD_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getD_erase_self [LawfulBEq α] {k : α} {fallback : β k} :
|
||
(m.erase k).getD k fallback = fallback :=
|
||
Raw₀.getD_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_getD_of_contains [LawfulBEq α] {a : α} {fallback : β a} :
|
||
m.contains a = true → m.get? a = some (m.getD a fallback) :=
|
||
Raw₀.get?_eq_some_getD ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_getD [LawfulBEq α] {a : α} {fallback : β a} :
|
||
a ∈ m → m.get? a = some (m.getD a fallback) := by
|
||
simpa [mem_iff_contains] using get?_eq_some_getD_of_contains
|
||
|
||
theorem getD_eq_getD_get? [LawfulBEq α] {a : α} {fallback : β a} :
|
||
m.getD a fallback = (m.get? a).getD fallback :=
|
||
Raw₀.getD_eq_getD_get? ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_eq_getD [LawfulBEq α] {a : α} {fallback : β a} {h} :
|
||
m.get a h = m.getD a fallback :=
|
||
Raw₀.get_eq_getD ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_eq_getD_default [LawfulBEq α] {a : α} [Inhabited (β a)] :
|
||
m.get! a = m.getD a default :=
|
||
Raw₀.get!_eq_getD_default ⟨m.1, _⟩ m.2
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
@[simp]
|
||
theorem getD_empty {a : α} {fallback : β} {c} :
|
||
getD (empty c : DHashMap α (fun _ => β)) a fallback = fallback :=
|
||
Raw₀.Const.getD_empty
|
||
|
||
@[simp]
|
||
theorem getD_emptyc {a : α} {fallback : β} :
|
||
getD (∅ : DHashMap α (fun _ => β)) a fallback = fallback :=
|
||
getD_empty
|
||
|
||
theorem getD_of_isEmpty [EquivBEq α] [LawfulHashable α] {a : α} {fallback : β} :
|
||
m.isEmpty = true → getD m a fallback = fallback :=
|
||
Raw₀.Const.getD_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_insert [EquivBEq α] [LawfulHashable α] {k a : α} {fallback v : β} :
|
||
getD (m.insert k v) a fallback = if k == a then v else getD m a fallback :=
|
||
Raw₀.Const.getD_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getD_insert_self [EquivBEq α] [LawfulHashable α] {k : α} {fallback v : β} :
|
||
getD (m.insert k v) k fallback = v :=
|
||
Raw₀.Const.getD_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_eq_fallback_of_contains_eq_false [EquivBEq α] [LawfulHashable α] {a : α}
|
||
{fallback : β} : m.contains a = false → getD m a fallback = fallback :=
|
||
Raw₀.Const.getD_eq_fallback ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_eq_fallback [EquivBEq α] [LawfulHashable α] {a : α} {fallback : β} :
|
||
¬a ∈ m → getD m a fallback = fallback := by
|
||
simpa [mem_iff_contains] using getD_eq_fallback_of_contains_eq_false
|
||
|
||
theorem getD_erase [EquivBEq α] [LawfulHashable α] {k a : α} {fallback : β} :
|
||
getD (m.erase k) a fallback = if k == a then fallback else getD m a fallback :=
|
||
Raw₀.Const.getD_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getD_erase_self [EquivBEq α] [LawfulHashable α] {k : α} {fallback : β} :
|
||
getD (m.erase k) k fallback = fallback :=
|
||
Raw₀.Const.getD_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_getD_of_contains [EquivBEq α] [LawfulHashable α] {a : α} {fallback : β} :
|
||
m.contains a = true → get? m a = some (getD m a fallback) :=
|
||
Raw₀.Const.get?_eq_some_getD ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_eq_some_getD [EquivBEq α] [LawfulHashable α] {a : α} {fallback : β} :
|
||
a ∈ m → get? m a = some (getD m a fallback) := by
|
||
simpa [mem_iff_contains] using get?_eq_some_getD_of_contains
|
||
|
||
theorem getD_eq_getD_get? [EquivBEq α] [LawfulHashable α] {a : α} {fallback : β} :
|
||
getD m a fallback = (get? m a).getD fallback :=
|
||
Raw₀.Const.getD_eq_getD_get? ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_eq_getD [EquivBEq α] [LawfulHashable α] {a : α} {fallback : β} {h} :
|
||
get m a h = getD m a fallback :=
|
||
Raw₀.Const.get_eq_getD ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_eq_getD_default [EquivBEq α] [LawfulHashable α] [Inhabited β] {a : α} :
|
||
get! m a = getD m a default :=
|
||
Raw₀.Const.get!_eq_getD_default ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_eq_getD [LawfulBEq α] {a : α} {fallback : β} :
|
||
getD m a fallback = m.getD a fallback :=
|
||
Raw₀.Const.getD_eq_getD ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_congr [EquivBEq α] [LawfulHashable α] {a b : α} {fallback : β} (hab : a == b) :
|
||
getD m a fallback = getD m b fallback :=
|
||
Raw₀.Const.getD_congr ⟨m.1, _⟩ m.2 hab
|
||
|
||
end Const
|
||
|
||
@[simp]
|
||
theorem getKey?_empty {a : α} {c} : (empty c : DHashMap α β).getKey? a = none :=
|
||
Raw₀.getKey?_empty
|
||
|
||
@[simp]
|
||
theorem getKey?_emptyc {a : α} : (∅ : DHashMap α β).getKey? a = none :=
|
||
Raw₀.getKey?_empty
|
||
|
||
theorem getKey?_of_isEmpty [EquivBEq α] [LawfulHashable α] {a : α} :
|
||
m.isEmpty = true → m.getKey? a = none :=
|
||
Raw₀.getKey?_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_insert [EquivBEq α] [LawfulHashable α] {a k : α} {v : β k} :
|
||
(m.insert k v).getKey? a = if k == a then some k else m.getKey? a :=
|
||
Raw₀.getKey?_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKey?_insert_self [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insert k v).getKey? k = some k :=
|
||
Raw₀.getKey?_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem contains_eq_isSome_getKey? [EquivBEq α] [LawfulHashable α] {a : α} :
|
||
m.contains a = (m.getKey? a).isSome :=
|
||
Raw₀.contains_eq_isSome_getKey? ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_eq_none_of_contains_eq_false [EquivBEq α] [LawfulHashable α] {a : α} :
|
||
m.contains a = false → m.getKey? a = none :=
|
||
Raw₀.getKey?_eq_none ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_eq_none [EquivBEq α] [LawfulHashable α] {a : α} : ¬a ∈ m → m.getKey? a = none := by
|
||
simpa [mem_iff_contains] using getKey?_eq_none_of_contains_eq_false
|
||
|
||
theorem getKey?_erase [EquivBEq α] [LawfulHashable α] {k a : α} :
|
||
(m.erase k).getKey? a = if k == a then none else m.getKey? a :=
|
||
Raw₀.getKey?_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKey?_erase_self [EquivBEq α] [LawfulHashable α] {k : α} : (m.erase k).getKey? k = none :=
|
||
Raw₀.getKey?_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey_insert [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} {h₁} :
|
||
(m.insert k v).getKey a h₁ =
|
||
if h₂ : k == a then
|
||
k
|
||
else
|
||
m.getKey a (mem_of_mem_insert h₁ (Bool.eq_false_iff.2 h₂)) :=
|
||
Raw₀.getKey_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKey_insert_self [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insert k v).getKey k mem_insert_self = k :=
|
||
Raw₀.getKey_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKey_erase [EquivBEq α] [LawfulHashable α] {k a : α} {h'} :
|
||
(m.erase k).getKey a h' = m.getKey a (mem_of_mem_erase h') :=
|
||
Raw₀.getKey_erase ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_eq_some_getKey [EquivBEq α] [LawfulHashable α] {a : α}
|
||
{h} :
|
||
m.getKey? a = some (m.getKey a h) :=
|
||
Raw₀.getKey?_eq_some_getKey ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKey!_empty [Inhabited α] {a : α} {c} :
|
||
(empty c : DHashMap α β).getKey! a = default :=
|
||
Raw₀.getKey!_empty
|
||
|
||
@[simp]
|
||
theorem getKey!_emptyc [Inhabited α] {a : α} :
|
||
(∅ : DHashMap α β).getKey! a = default :=
|
||
getKey!_empty
|
||
|
||
theorem getKey!_of_isEmpty [EquivBEq α] [LawfulHashable α] [Inhabited α] {a : α} :
|
||
m.isEmpty = true → m.getKey! a = default :=
|
||
Raw₀.getKey!_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_insert [EquivBEq α] [LawfulHashable α] [Inhabited α] {k a : α} {v : β k} :
|
||
(m.insert k v).getKey! a =
|
||
if k == a then k else m.getKey! a :=
|
||
Raw₀.getKey!_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKey!_insert_self [EquivBEq α] [LawfulHashable α] [Inhabited α] {a : α} {b : β a} :
|
||
(m.insert a b).getKey! a = a :=
|
||
Raw₀.getKey!_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_eq_default_of_contains_eq_false [EquivBEq α] [LawfulHashable α] [Inhabited α]
|
||
{a : α} :
|
||
m.contains a = false → m.getKey! a = default :=
|
||
Raw₀.getKey!_eq_default ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_eq_default [EquivBEq α] [LawfulHashable α] [Inhabited α] {a : α} :
|
||
¬a ∈ m → m.getKey! a = default := by
|
||
simpa [mem_iff_contains] using getKey!_eq_default_of_contains_eq_false
|
||
|
||
theorem getKey!_erase [EquivBEq α] [LawfulHashable α] [Inhabited α] {k a : α} :
|
||
(m.erase k).getKey! a = if k == a then default else m.getKey! a :=
|
||
Raw₀.getKey!_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKey!_erase_self [EquivBEq α] [LawfulHashable α] [Inhabited α] {k : α} :
|
||
(m.erase k).getKey! k = default :=
|
||
Raw₀.getKey!_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_eq_some_getKey!_of_contains [EquivBEq α] [LawfulHashable α] [Inhabited α] {a : α} :
|
||
m.contains a = true → m.getKey? a = some (m.getKey! a) :=
|
||
Raw₀.getKey?_eq_some_getKey! ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_eq_some_getKey! [EquivBEq α] [LawfulHashable α] [Inhabited α] {a : α} :
|
||
a ∈ m → m.getKey? a = some (m.getKey! a) := by
|
||
simpa [mem_iff_contains] using getKey?_eq_some_getKey!_of_contains
|
||
|
||
theorem getKey!_eq_get!_getKey? [EquivBEq α] [LawfulHashable α] [Inhabited α] {a : α} :
|
||
m.getKey! a = (m.getKey? a).get! :=
|
||
Raw₀.getKey!_eq_get!_getKey? ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey_eq_getKey! [EquivBEq α] [LawfulHashable α] [Inhabited α] {a : α} {h} :
|
||
m.getKey a h = m.getKey! a :=
|
||
Raw₀.getKey_eq_getKey! ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKeyD_empty {a fallback : α} {c} :
|
||
(empty c : DHashMap α β).getKeyD a fallback = fallback :=
|
||
Raw₀.getKeyD_empty
|
||
|
||
@[simp]
|
||
theorem getKeyD_emptyc {a fallback : α} :
|
||
(∅ : DHashMap α β).getKeyD a fallback = fallback :=
|
||
getKeyD_empty
|
||
|
||
theorem getKeyD_of_isEmpty [EquivBEq α] [LawfulHashable α] {a fallback : α} :
|
||
m.isEmpty = true → m.getKeyD a fallback = fallback :=
|
||
Raw₀.getKeyD_of_isEmpty ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKeyD_insert [EquivBEq α] [LawfulHashable α] {k a fallback : α} {v : β k} :
|
||
(m.insert k v).getKeyD a fallback =
|
||
if k == a then k else m.getKeyD a fallback :=
|
||
Raw₀.getKeyD_insert ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKeyD_insert_self [EquivBEq α] [LawfulHashable α] {k fallback : α} {v : β k} :
|
||
(m.insert k v).getKeyD k fallback = k :=
|
||
Raw₀.getKeyD_insert_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKeyD_eq_fallback_of_contains_eq_false [EquivBEq α] [LawfulHashable α] {a : α}
|
||
{fallback : α} :
|
||
m.contains a = false → m.getKeyD a fallback = fallback :=
|
||
Raw₀.getKeyD_eq_fallback ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKeyD_eq_fallback [EquivBEq α] [LawfulHashable α] {a fallback : α} :
|
||
¬a ∈ m → m.getKeyD a fallback = fallback := by
|
||
simpa [mem_iff_contains] using getKeyD_eq_fallback_of_contains_eq_false
|
||
|
||
theorem getKeyD_erase [EquivBEq α] [LawfulHashable α] {k a fallback : α} :
|
||
(m.erase k).getKeyD a fallback = if k == a then fallback else m.getKeyD a fallback :=
|
||
Raw₀.getKeyD_erase ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKeyD_erase_self [EquivBEq α] [LawfulHashable α] {k fallback : α} :
|
||
(m.erase k).getKeyD k fallback = fallback :=
|
||
Raw₀.getKeyD_erase_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_eq_some_getKeyD_of_contains [EquivBEq α] [LawfulHashable α] {a fallback : α} :
|
||
m.contains a = true → m.getKey? a = some (m.getKeyD a fallback) :=
|
||
Raw₀.getKey?_eq_some_getKeyD ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_eq_some_getKeyD [EquivBEq α] [LawfulHashable α] {a fallback : α} :
|
||
a ∈ m → m.getKey? a = some (m.getKeyD a fallback) := by
|
||
simpa [mem_iff_contains] using getKey?_eq_some_getKeyD_of_contains
|
||
|
||
theorem getKeyD_eq_getD_getKey? [EquivBEq α] [LawfulHashable α] {a fallback : α} :
|
||
m.getKeyD a fallback = (m.getKey? a).getD fallback :=
|
||
Raw₀.getKeyD_eq_getD_getKey? ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey_eq_getKeyD [EquivBEq α] [LawfulHashable α] {a fallback : α} {h} :
|
||
m.getKey a h = m.getKeyD a fallback :=
|
||
Raw₀.getKey_eq_getKeyD ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_eq_getKeyD_default [EquivBEq α] [LawfulHashable α] [Inhabited α] {a : α} :
|
||
m.getKey! a = m.getKeyD a default :=
|
||
Raw₀.getKey!_eq_getKeyD_default ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_insertIfNew [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insertIfNew k v).isEmpty = false :=
|
||
Raw₀.isEmpty_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem contains_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
(m.insertIfNew k v).contains a = (k == a || m.contains a) :=
|
||
Raw₀.contains_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
a ∈ m.insertIfNew k v ↔ k == a ∨ a ∈ m := by
|
||
simp [mem_iff_contains, contains_insertIfNew]
|
||
|
||
theorem contains_insertIfNew_self [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insertIfNew k v).contains k :=
|
||
Raw₀.contains_insertIfNew_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem mem_insertIfNew_self [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
k ∈ m.insertIfNew k v := by
|
||
simpa [mem_iff_contains, -contains_insertIfNew] using contains_insertIfNew_self
|
||
|
||
theorem contains_of_contains_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
(m.insertIfNew k v).contains a → (k == a) = false → m.contains a :=
|
||
Raw₀.contains_of_contains_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem mem_of_mem_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
a ∈ m.insertIfNew k v → (k == a) = false → a ∈ m := by
|
||
simpa [mem_iff_contains, -contains_insertIfNew] using contains_of_contains_insertIfNew
|
||
|
||
/-- This is a restatement of `contains_of_contains_insertIfNew` that is written to exactly match the proof
|
||
obligation in the statement of `get_insertIfNew`. -/
|
||
theorem contains_of_contains_insertIfNew' [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
(m.insertIfNew k v).contains a → ¬((k == a) ∧ m.contains k = false) → m.contains a :=
|
||
Raw₀.contains_of_contains_insertIfNew' ⟨m.1, _⟩ m.2
|
||
|
||
/-- This is a restatement of `mem_of_mem_insertIfNew` that is written to exactly match the proof obligation
|
||
in the statement of `get_insertIfNew`. -/
|
||
theorem mem_of_mem_insertIfNew' [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
a ∈ m.insertIfNew k v → ¬((k == a) ∧ ¬k ∈ m) → a ∈ m := by
|
||
simpa [mem_iff_contains, -contains_insertIfNew] using contains_of_contains_insertIfNew'
|
||
|
||
theorem size_insertIfNew [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insertIfNew k v).size = if k ∈ m then m.size else m.size + 1 :=
|
||
Raw₀.size_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_le_size_insertIfNew [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
m.size ≤ (m.insertIfNew k v).size :=
|
||
Raw₀.size_le_size_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_insertIfNew_le [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} :
|
||
(m.insertIfNew k v).size ≤ m.size + 1 :=
|
||
Raw₀.size_insertIfNew_le _ m.2
|
||
|
||
theorem get?_insertIfNew [LawfulBEq α] {k a : α} {v : β k} : (m.insertIfNew k v).get? a =
|
||
if h : k == a ∧ ¬k ∈ m then some (cast (congrArg β (eq_of_beq h.1)) v) else m.get? a := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true]
|
||
exact Raw₀.get?_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_insertIfNew [LawfulBEq α] {k a : α} {v : β k} {h₁} : (m.insertIfNew k v).get a h₁ =
|
||
if h₂ : k == a ∧ ¬k ∈ m then cast (congrArg β (eq_of_beq h₂.1)) v else m.get a
|
||
(mem_of_mem_insertIfNew' h₁ h₂) := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true]
|
||
exact Raw₀.get_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_insertIfNew [LawfulBEq α] {k a : α} [Inhabited (β a)] {v : β k} :
|
||
(m.insertIfNew k v).get! a =
|
||
if h : k == a ∧ ¬k ∈ m then cast (congrArg β (eq_of_beq h.1)) v else m.get! a := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true]
|
||
exact Raw₀.get!_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_insertIfNew [LawfulBEq α] {k a : α} {fallback : β a} {v : β k} :
|
||
(m.insertIfNew k v).getD a fallback =
|
||
if h : k == a ∧ ¬k ∈ m then cast (congrArg β (eq_of_beq h.1)) v
|
||
else m.getD a fallback := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true]
|
||
exact Raw₀.getD_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
theorem get?_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {v : β} :
|
||
get? (m.insertIfNew k v) a = if k == a ∧ ¬k ∈ m then some v else get? m a := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true]
|
||
exact Raw₀.Const.get?_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {v : β} {h₁} :
|
||
get (m.insertIfNew k v) a h₁ =
|
||
if h₂ : k == a ∧ ¬k ∈ m then v else get m a (mem_of_mem_insertIfNew' h₁ h₂) := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true]
|
||
exact Raw₀.Const.get_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_insertIfNew [EquivBEq α] [LawfulHashable α] [Inhabited β] {k a : α} {v : β} :
|
||
get! (m.insertIfNew k v) a = if k == a ∧ ¬k ∈ m then v else get! m a := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true]
|
||
exact Raw₀.Const.get!_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {fallback v : β} :
|
||
getD (m.insertIfNew k v) a fallback =
|
||
if k == a ∧ ¬k ∈ m then v else getD m a fallback := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true]
|
||
exact Raw₀.Const.getD_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
end Const
|
||
|
||
theorem getKey?_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} :
|
||
getKey? (m.insertIfNew k v) a = if k == a ∧ ¬k ∈ m then some k else getKey? m a := by
|
||
simp [mem_iff_contains, contains_insertIfNew]
|
||
exact Raw₀.getKey?_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey_insertIfNew [EquivBEq α] [LawfulHashable α] {k a : α} {v : β k} {h₁} :
|
||
getKey (m.insertIfNew k v) a h₁ =
|
||
if h₂ : k == a ∧ ¬k ∈ m then k else getKey m a (mem_of_mem_insertIfNew' h₁ h₂) := by
|
||
simp [mem_iff_contains, contains_insertIfNew]
|
||
exact Raw₀.getKey_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_insertIfNew [EquivBEq α] [LawfulHashable α] [Inhabited α] {k a : α} {v : β k} :
|
||
getKey! (m.insertIfNew k v) a = if k == a ∧ ¬k ∈ m then k else getKey! m a := by
|
||
simp [mem_iff_contains, contains_insertIfNew]
|
||
exact Raw₀.getKey!_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKeyD_insertIfNew [EquivBEq α] [LawfulHashable α] {k a fallback : α} {v : β k} :
|
||
getKeyD (m.insertIfNew k v) a fallback =
|
||
if k == a ∧ ¬k ∈ m then k else getKeyD m a fallback := by
|
||
simp [mem_iff_contains, contains_insertIfNew]
|
||
exact Raw₀.getKeyD_insertIfNew ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getThenInsertIfNew?_fst [LawfulBEq α] {k : α} {v : β k} :
|
||
(m.getThenInsertIfNew? k v).1 = m.get? k :=
|
||
Raw₀.getThenInsertIfNew?_fst _
|
||
|
||
@[simp]
|
||
theorem getThenInsertIfNew?_snd [LawfulBEq α] {k : α} {v : β k} :
|
||
(m.getThenInsertIfNew? k v).2 = m.insertIfNew k v :=
|
||
Subtype.eq <| (congrArg Subtype.val (Raw₀.getThenInsertIfNew?_snd _ (k := k)) :)
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
@[simp]
|
||
theorem getThenInsertIfNew?_fst {k : α} {v : β} : (getThenInsertIfNew? m k v).1 = get? m k :=
|
||
Raw₀.Const.getThenInsertIfNew?_fst _
|
||
|
||
@[simp]
|
||
theorem getThenInsertIfNew?_snd {k : α} {v : β} :
|
||
(getThenInsertIfNew? m k v).2 = m.insertIfNew k v :=
|
||
Subtype.eq <| (congrArg Subtype.val (Raw₀.Const.getThenInsertIfNew?_snd _ (k := k)) :)
|
||
|
||
end Const
|
||
|
||
@[simp]
|
||
theorem length_keys [EquivBEq α] [LawfulHashable α] :
|
||
m.keys.length = m.size :=
|
||
Raw₀.length_keys ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_keys [EquivBEq α] [LawfulHashable α]:
|
||
m.keys.isEmpty = m.isEmpty :=
|
||
Raw₀.isEmpty_keys ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem contains_keys [EquivBEq α] [LawfulHashable α] {k : α} :
|
||
m.keys.contains k = m.contains k :=
|
||
Raw₀.contains_keys ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_keys [LawfulBEq α] {k : α} :
|
||
k ∈ m.keys ↔ k ∈ m := by
|
||
rw [mem_iff_contains]
|
||
exact Raw₀.mem_keys ⟨m.1, _⟩ m.2
|
||
|
||
theorem distinct_keys [EquivBEq α] [LawfulHashable α] :
|
||
m.keys.Pairwise (fun a b => (a == b) = false) :=
|
||
Raw₀.distinct_keys ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem map_sigma_fst_toList_eq_keys [EquivBEq α] [LawfulHashable α] :
|
||
m.1.toList.map Sigma.fst = m.1.keys :=
|
||
Raw₀.map_sigma_fst_toList_eq_keys ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
@[simp]
|
||
theorem length_toList [EquivBEq α] [LawfulHashable α] :
|
||
m.toList.length = m.size :=
|
||
Raw₀.length_toList ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_toList [EquivBEq α] [LawfulHashable α] :
|
||
m.toList.isEmpty = m.isEmpty :=
|
||
Raw₀.isEmpty_toList ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_toList_iff_get?_eq_some [LawfulBEq α]
|
||
{k : α} {v : β k} :
|
||
⟨k, v⟩ ∈ m.toList ↔ m.get? k = some v :=
|
||
Raw₀.mem_toList_iff_get?_eq_some ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
theorem find?_toList_eq_some_iff_get?_eq_some [LawfulBEq α]
|
||
{k : α} {v : β k} :
|
||
m.toList.find? (·.1 == k) = some ⟨k, v⟩ ↔ m.get? k = some v :=
|
||
Raw₀.find?_toList_eq_some_iff_get?_eq_some ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
theorem find?_toList_eq_none_iff_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{k : α} :
|
||
m.toList.find? (·.1 == k) = none ↔ m.contains k = false :=
|
||
Raw₀.find?_toList_eq_none_iff_contains_eq_false ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem find?_toList_eq_none_iff_not_mem [EquivBEq α] [LawfulHashable α]
|
||
{k : α} :
|
||
m.toList.find? (·.1 == k) = none ↔ ¬ k ∈ m := by
|
||
simp only [Bool.not_eq_true, mem_iff_contains]
|
||
apply Raw₀.find?_toList_eq_none_iff_contains_eq_false ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
theorem distinct_keys_toList [EquivBEq α] [LawfulHashable α] :
|
||
m.toList.Pairwise (fun a b => (a.1 == b.1) = false) :=
|
||
Raw₀.distinct_keys_toList ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
@[simp]
|
||
theorem map_prod_fst_toList_eq_keys [EquivBEq α] [LawfulHashable α] :
|
||
(toList m).map Prod.fst = m.keys :=
|
||
Raw₀.Const.map_prod_fst_toList_eq_keys ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
@[simp]
|
||
theorem length_toList [EquivBEq α] [LawfulHashable α] :
|
||
(toList m).length = m.size :=
|
||
Raw₀.Const.length_toList ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_toList [EquivBEq α] [LawfulHashable α] :
|
||
(toList m).isEmpty = m.isEmpty :=
|
||
Raw₀.Const.isEmpty_toList ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_toList_iff_get?_eq_some [LawfulBEq α]
|
||
{k : α} {v : β} :
|
||
(k, v) ∈ toList m ↔ get? m k = some v :=
|
||
Raw₀.Const.mem_toList_iff_get?_eq_some ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_toList_iff_getKey?_eq_some_and_get?_eq_some [EquivBEq α] [LawfulHashable α]
|
||
{k : α} {v : β} :
|
||
(k, v) ∈ toList m ↔ m.getKey? k = some k ∧ get? m k = some v :=
|
||
Raw₀.Const.mem_toList_iff_getKey?_eq_some_and_get?_eq_some ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
theorem get?_eq_some_iff_exists_beq_and_mem_toList [EquivBEq α] [LawfulHashable α]
|
||
{k : α} {v : β} :
|
||
get? m k = some v ↔ ∃ (k' : α), k == k' ∧ (k', v) ∈ toList m :=
|
||
Raw₀.Const.get?_eq_some_iff_exists_beq_and_mem_toList ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
theorem find?_toList_eq_some_iff_getKey?_eq_some_and_get?_eq_some
|
||
[EquivBEq α] [LawfulHashable α] {k k' : α} {v : β} :
|
||
(toList m).find? (fun a => a.1 == k) = some ⟨k', v⟩ ↔
|
||
m.getKey? k = some k' ∧ get? m k = some v :=
|
||
Raw₀.Const.find?_toList_eq_some_iff_getKey?_eq_some_and_get?_eq_some
|
||
⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
theorem find?_toList_eq_none_iff_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{k : α} :
|
||
(toList m).find? (·.1 == k) = none ↔ m.contains k = false :=
|
||
Raw₀.Const.find?_toList_eq_none_iff_contains_eq_false ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
@[simp]
|
||
theorem find?_toList_eq_none_iff_not_mem [EquivBEq α] [LawfulHashable α]
|
||
{k : α} :
|
||
(toList m).find? (·.1 == k) = none ↔ ¬ k ∈ m := by
|
||
simp only [Bool.not_eq_true, mem_iff_contains]
|
||
apply Raw₀.Const.find?_toList_eq_none_iff_contains_eq_false ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
theorem distinct_keys_toList [EquivBEq α] [LawfulHashable α] :
|
||
(toList m).Pairwise (fun a b => (a.1 == b.1) = false) :=
|
||
Raw₀.Const.distinct_keys_toList ⟨m.1, m.2.size_buckets_pos⟩ m.2
|
||
|
||
end Const
|
||
|
||
section monadic
|
||
|
||
variable {m : DHashMap α β} {δ : Type w} {m' : Type w → Type w}
|
||
|
||
theorem foldM_eq_foldlM_toList [Monad m'] [LawfulMonad m']
|
||
{f : δ → (a : α) → β a → m' δ} {init : δ} :
|
||
m.foldM f init = m.toList.foldlM (fun a b => f a b.1 b.2) init :=
|
||
Raw₀.foldM_eq_foldlM_toList ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
theorem fold_eq_foldl_toList {f : δ → (a : α) → β a → δ} {init : δ} :
|
||
m.fold f init = m.toList.foldl (fun a b => f a b.1 b.2) init :=
|
||
Raw₀.fold_eq_foldl_toList ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
@[simp]
|
||
theorem forM_eq_forM [Monad m'] [LawfulMonad m'] {f : (a : α) → β a → m' PUnit} :
|
||
DHashMap.forM f m = ForM.forM m (fun a => f a.1 a.2):= rfl
|
||
|
||
theorem forM_eq_forM_toList [Monad m'] [LawfulMonad m'] {f : (a : α) × β a → m' PUnit} :
|
||
ForM.forM m f = ForM.forM m.toList f :=
|
||
Raw₀.forM_eq_forM_toList ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
@[simp]
|
||
theorem forIn_eq_forIn [Monad m'] [LawfulMonad m']
|
||
{f : (a : α) → β a → δ → m' (ForInStep δ)} {init : δ} :
|
||
DHashMap.forIn f init m = ForIn.forIn m init (fun a b => f a.1 a.2 b) := rfl
|
||
|
||
theorem forIn_eq_forIn_toList [Monad m'] [LawfulMonad m']
|
||
{f : (a : α) × β a → δ → m' (ForInStep δ)} {init : δ} :
|
||
ForIn.forIn m init f = ForIn.forIn m.toList init f :=
|
||
Raw₀.forIn_eq_forIn_toList ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
theorem foldM_eq_foldlM_toList [Monad m'] [LawfulMonad m']
|
||
{f : δ → (a : α) → β → m' δ} {init : δ} :
|
||
m.foldM f init = (Const.toList m).foldlM (fun a b => f a b.1 b.2) init :=
|
||
Raw₀.Const.foldM_eq_foldlM_toList ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
theorem fold_eq_foldl_toList {f : δ → (a : α) → β → δ} {init : δ} :
|
||
m.fold f init = (Const.toList m).foldl (fun a b => f a b.1 b.2) init :=
|
||
Raw₀.Const.fold_eq_foldl_toList ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
theorem forM_eq_forM_toList [Monad m'] [LawfulMonad m'] {f : (a : α) → β → m' PUnit} :
|
||
m.forM f = (Const.toList m).forM (fun a => f a.1 a.2) :=
|
||
Raw₀.Const.forM_eq_forM_toList ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
theorem forIn_eq_forIn_toList [Monad m'] [LawfulMonad m']
|
||
{f : (a : α) → β → δ → m' (ForInStep δ)} {init : δ} :
|
||
m.forIn f init = ForIn.forIn (Const.toList m) init (fun a b => f a.1 a.2 b) :=
|
||
Raw₀.Const.forIn_eq_forIn_toList ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
variable {m : DHashMap α (fun _ => Unit)}
|
||
|
||
theorem foldM_eq_foldlM_keys [Monad m'] [LawfulMonad m']
|
||
{f : δ → α → m' δ} {init : δ} :
|
||
m.foldM (fun d a _ => f d a) init = m.keys.foldlM f init :=
|
||
Raw₀.Const.foldM_eq_foldlM_keys ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
theorem fold_eq_foldl_keys {f : δ → α → δ} {init : δ} :
|
||
m.fold (fun d a _ => f d a) init = m.keys.foldl f init :=
|
||
Raw₀.Const.fold_eq_foldl_keys ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
theorem forM_eq_forM_keys [Monad m'] [LawfulMonad m'] {f : α → m' PUnit} :
|
||
m.forM (fun a _ => f a) = m.keys.forM f :=
|
||
Raw₀.Const.forM_eq_forM_keys ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
theorem forIn_eq_forIn_keys [Monad m'] [LawfulMonad m']
|
||
{f : α → δ → m' (ForInStep δ)} {init : δ} :
|
||
m.forIn (fun a _ d => f a d) init = ForIn.forIn m.keys init f :=
|
||
Raw₀.Const.forIn_eq_forIn_keys ⟨m.1, m.2.size_buckets_pos⟩
|
||
|
||
end Const
|
||
|
||
end monadic
|
||
|
||
@[simp]
|
||
theorem insertMany_nil :
|
||
m.insertMany [] = m :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.insertMany_nil ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
@[simp]
|
||
theorem insertMany_list_singleton {k : α} {v : β k} :
|
||
m.insertMany [⟨k, v⟩] = m.insert k v :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.insertMany_list_singleton ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
theorem insertMany_cons {l : List ((a : α) × β a)} {k : α} {v : β k} :
|
||
m.insertMany (⟨k, v⟩ :: l) = (m.insert k v).insertMany l :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.insertMany_cons ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
@[simp]
|
||
theorem contains_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k : α} :
|
||
(m.insertMany l).contains k = (m.contains k || (l.map Sigma.fst).contains k) :=
|
||
Raw₀.contains_insertMany_list ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k : α} :
|
||
k ∈ m.insertMany l ↔ k ∈ m ∨ (l.map Sigma.fst).contains k := by
|
||
simp [mem_iff_contains]
|
||
|
||
theorem mem_of_mem_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k : α} (mem : k ∈ m.insertMany l)
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
k ∈ m :=
|
||
Raw₀.contains_of_contains_insertMany_list ⟨m.1, _⟩ m.2 mem contains_eq_false
|
||
|
||
theorem get?_insertMany_list_of_contains_eq_false [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(m.insertMany l).get? k = m.get? k :=
|
||
Raw₀.get?_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem get?_insertMany_list_of_mem [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k k' : α} (k_beq : k == k') {v : β k}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
(m.insertMany l).get? k' = some (cast (by congr; apply LawfulBEq.eq_of_beq k_beq) v) :=
|
||
Raw₀.get?_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem get_insertMany_list_of_contains_eq_false [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false)
|
||
{h} :
|
||
(m.insertMany l).get k h =
|
||
m.get k (mem_of_mem_insertMany_list h contains_eq_false) :=
|
||
Raw₀.get_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem get_insertMany_list_of_mem [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k k' : α} (k_beq : k == k') {v : β k}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l)
|
||
{h} :
|
||
(m.insertMany l).get k' h = cast (by congr; apply LawfulBEq.eq_of_beq k_beq) v :=
|
||
Raw₀.get_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem get!_insertMany_list_of_contains_eq_false [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k : α} [Inhabited (β k)]
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(m.insertMany l).get! k = m.get! k :=
|
||
Raw₀.get!_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem get!_insertMany_list_of_mem [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k k' : α} (k_beq : k == k') {v : β k} [Inhabited (β k')]
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
(m.insertMany l).get! k' = cast (by congr; apply LawfulBEq.eq_of_beq k_beq) v :=
|
||
Raw₀.get!_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getD_insertMany_list_of_contains_eq_false [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k : α} {fallback : β k}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(m.insertMany l).getD k fallback = m.getD k fallback :=
|
||
Raw₀.getD_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getD_insertMany_list_of_mem [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k k' : α} (k_beq : k == k') {v : β k} {fallback : β k'}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
(m.insertMany l).getD k' fallback = cast (by congr; apply LawfulBEq.eq_of_beq k_beq) v :=
|
||
Raw₀.getD_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getKey?_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(m.insertMany l).getKey? k = m.getKey? k :=
|
||
Raw₀.getKey?_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKey?_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Sigma.fst) :
|
||
(m.insertMany l).getKey? k' = some k :=
|
||
Raw₀.getKey?_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getKey_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false)
|
||
{h} :
|
||
(m.insertMany l).getKey k h =
|
||
m.getKey k (mem_of_mem_insertMany_list h contains_eq_false) :=
|
||
Raw₀.getKey_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKey_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Sigma.fst)
|
||
{h} :
|
||
(m.insertMany l).getKey k' h = k :=
|
||
Raw₀.getKey_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getKey!_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α] [Inhabited α]
|
||
{l : List ((a : α) × β a)} {k : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(m.insertMany l).getKey! k = m.getKey! k :=
|
||
Raw₀.getKey!_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKey!_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α] [Inhabited α]
|
||
{l : List ((a : α) × β a)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Sigma.fst) :
|
||
(m.insertMany l).getKey! k' = k :=
|
||
Raw₀.getKey!_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getKeyD_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k fallback : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(m.insertMany l).getKeyD k fallback = m.getKeyD k fallback :=
|
||
Raw₀.getKeyD_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKeyD_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)}
|
||
{k k' fallback : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Sigma.fst) :
|
||
(m.insertMany l).getKeyD k' fallback = k :=
|
||
Raw₀.getKeyD_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem size_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} (distinct : l.Pairwise (fun a b => (a.1 == b.1) = false)) :
|
||
(∀ (a : α), a ∈ m → (l.map Sigma.fst).contains a = false) →
|
||
(m.insertMany l).size = m.size + l.length :=
|
||
Raw₀.size_insertMany_list ⟨m.1, _⟩ m.2 distinct
|
||
|
||
theorem size_le_size_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} :
|
||
m.size ≤ (m.insertMany l).size :=
|
||
Raw₀.size_le_size_insertMany_list ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_insertMany_list_le [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} :
|
||
(m.insertMany l).size ≤ m.size + l.length :=
|
||
Raw₀.size_insertMany_list_le ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} :
|
||
(m.insertMany l).isEmpty = (m.isEmpty && l.isEmpty) :=
|
||
Raw₀.isEmpty_insertMany_list ⟨m.1, _⟩ m.2
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
@[simp]
|
||
theorem insertMany_nil :
|
||
insertMany m [] = m :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.Const.insertMany_nil ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
@[simp]
|
||
theorem insertMany_list_singleton {k : α} {v : β} :
|
||
insertMany m [⟨k, v⟩] = m.insert k v :=
|
||
Subtype.eq (congrArg Subtype.val
|
||
(Raw₀.Const.insertMany_list_singleton ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
theorem insertMany_cons {l : List (α × β)} {k : α} {v : β} :
|
||
insertMany m (⟨k, v⟩ :: l) = insertMany (m.insert k v) l :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.Const.insertMany_cons ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
@[simp]
|
||
theorem contains_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α} :
|
||
(Const.insertMany m l).contains k = (m.contains k || (l.map Prod.fst).contains k) :=
|
||
Raw₀.Const.contains_insertMany_list ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α} :
|
||
k ∈ insertMany m l ↔ k ∈ m ∨ (l.map Prod.fst).contains k := by
|
||
simp [mem_iff_contains]
|
||
|
||
theorem mem_of_mem_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α} (mem : k ∈ insertMany m l)
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
k ∈ m :=
|
||
Raw₀.Const.contains_of_contains_insertMany_list ⟨m.1, _⟩ m.2 mem contains_eq_false
|
||
|
||
theorem getKey?_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
(insertMany m l).getKey? k = m.getKey? k :=
|
||
Raw₀.Const.getKey?_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKey?_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Prod.fst) :
|
||
(insertMany m l).getKey? k' = some k :=
|
||
Raw₀.Const.getKey?_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getKey_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false)
|
||
{h} :
|
||
(insertMany m l).getKey k h =
|
||
m.getKey k (mem_of_mem_insertMany_list h contains_eq_false) :=
|
||
Raw₀.Const.getKey_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKey_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Prod.fst)
|
||
{h} :
|
||
(insertMany m l).getKey k' h = k :=
|
||
Raw₀.Const.getKey_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getKey!_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α] [Inhabited α]
|
||
{l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
(insertMany m l).getKey! k = m.getKey! k :=
|
||
Raw₀.Const.getKey!_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKey!_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α] [Inhabited α]
|
||
{l : List (α × β)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Prod.fst) :
|
||
(insertMany m l).getKey! k' = k :=
|
||
Raw₀.Const.getKey!_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getKeyD_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k fallback : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
(insertMany m l).getKeyD k fallback = m.getKeyD k fallback :=
|
||
Raw₀.Const.getKeyD_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKeyD_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)}
|
||
{k k' fallback : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Prod.fst) :
|
||
(insertMany m l).getKeyD k' fallback = k :=
|
||
Raw₀.Const.getKeyD_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem size_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false)) :
|
||
(∀ (a : α), a ∈ m → (l.map Prod.fst).contains a = false) →
|
||
(insertMany m l).size = m.size + l.length :=
|
||
Raw₀.Const.size_insertMany_list ⟨m.1, _⟩ m.2 distinct
|
||
|
||
theorem size_le_size_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} :
|
||
m.size ≤ (insertMany m l).size :=
|
||
Raw₀.Const.size_le_size_insertMany_list ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_insertMany_list_le [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} :
|
||
(insertMany m l).size ≤ m.size + l.length :=
|
||
Raw₀.Const.size_insertMany_list_le ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_insertMany_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} :
|
||
(insertMany m l).isEmpty = (m.isEmpty && l.isEmpty) :=
|
||
Raw₀.Const.isEmpty_insertMany_list ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
get? (insertMany m l) k = get? m k :=
|
||
Raw₀.Const.get?_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem get?_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k k' : α} (k_beq : k == k') {v : β}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false)) (mem : ⟨k, v⟩ ∈ l) :
|
||
get? (insertMany m l) k' = v :=
|
||
Raw₀.Const.get?_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem get_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false)
|
||
{h} :
|
||
get (insertMany m l) k h = get m k (mem_of_mem_insertMany_list h contains_eq_false) :=
|
||
Raw₀.Const.get_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem get_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k k' : α} (k_beq : k == k') {v : β}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false)) (mem : ⟨k, v⟩ ∈ l) {h} :
|
||
get (insertMany m l) k' h = v :=
|
||
Raw₀.Const.get_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem get!_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
[Inhabited β] {l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
get! (insertMany m l) k = get! m k :=
|
||
Raw₀.Const.get!_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem get!_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α] [Inhabited β]
|
||
{l : List (α × β)} {k k' : α} (k_beq : k == k') {v : β}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false)) (mem : ⟨k, v⟩ ∈ l) :
|
||
get! (insertMany m l) k' = v :=
|
||
Raw₀.Const.get!_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
theorem getD_insertMany_list_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α} {fallback : β}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
getD (insertMany m l) k fallback = getD m k fallback :=
|
||
Raw₀.Const.getD_insertMany_list_of_contains_eq_false ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getD_insertMany_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k k' : α} (k_beq : k == k') {v fallback : β}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false)) (mem : ⟨k, v⟩ ∈ l) :
|
||
getD (insertMany m l) k' fallback = v :=
|
||
Raw₀.Const.getD_insertMany_list_of_mem ⟨m.1, _⟩ m.2 k_beq distinct mem
|
||
|
||
variable {m : DHashMap α (fun _ => Unit)}
|
||
|
||
@[simp]
|
||
theorem insertManyIfNewUnit_nil :
|
||
insertManyIfNewUnit m [] = m :=
|
||
Subtype.eq (congrArg Subtype.val
|
||
(Raw₀.Const.insertManyIfNewUnit_nil ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
@[simp]
|
||
theorem insertManyIfNewUnit_list_singleton {k : α} :
|
||
insertManyIfNewUnit m [k] = m.insertIfNew k () :=
|
||
Subtype.eq (congrArg Subtype.val
|
||
(Raw₀.Const.insertManyIfNewUnit_list_singleton ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
theorem insertManyIfNewUnit_cons {l : List α} {k : α} :
|
||
insertManyIfNewUnit m (k :: l) = insertManyIfNewUnit (m.insertIfNew k ()) l :=
|
||
Subtype.eq (congrArg Subtype.val
|
||
(Raw₀.Const.insertManyIfNewUnit_cons ⟨m.1, m.2.size_buckets_pos⟩) :)
|
||
|
||
@[simp]
|
||
theorem contains_insertManyIfNewUnit_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} :
|
||
(insertManyIfNewUnit m l).contains k = (m.contains k || l.contains k) :=
|
||
Raw₀.Const.contains_insertManyIfNewUnit_list ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_insertManyIfNewUnit_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} :
|
||
k ∈ insertManyIfNewUnit m l ↔ k ∈ m ∨ l.contains k := by
|
||
simp [mem_iff_contains]
|
||
|
||
theorem mem_of_mem_insertManyIfNewUnit_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} (contains_eq_false : l.contains k = false) :
|
||
k ∈ insertManyIfNewUnit m l → k ∈ m :=
|
||
Raw₀.Const.contains_of_contains_insertManyIfNewUnit_list ⟨m.1, _⟩ m.2 contains_eq_false
|
||
|
||
theorem getKey?_insertManyIfNewUnit_list_of_not_mem_of_contains_eq_false
|
||
[EquivBEq α] [LawfulHashable α] {l : List α} {k : α}
|
||
(not_mem : ¬ k ∈ m) (contains_eq_false : l.contains k = false) :
|
||
getKey? (insertManyIfNewUnit m l) k = none := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true] at not_mem
|
||
exact Raw₀.Const.getKey?_insertManyIfNewUnit_list_of_contains_eq_false_of_contains_eq_false
|
||
⟨m.1, _⟩ m.2 not_mem contains_eq_false
|
||
|
||
theorem getKey?_insertManyIfNewUnit_list_of_not_mem_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k k' : α} (k_beq : k == k')
|
||
(not_mem : ¬ k ∈ m)
|
||
(distinct : l.Pairwise (fun a b => (a == b) = false)) (mem : k ∈ l) :
|
||
getKey? (insertManyIfNewUnit m l) k' = some k := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true] at not_mem
|
||
exact Raw₀.Const.getKey?_insertManyIfNewUnit_list_of_contains_eq_false_of_mem ⟨m.1, _⟩
|
||
m.2 k_beq not_mem distinct mem
|
||
|
||
theorem getKey?_insertManyIfNewUnit_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} (h' : k ∈ m) :
|
||
getKey? (insertManyIfNewUnit m l) k = getKey? m k :=
|
||
Raw₀.Const.getKey?_insertManyIfNewUnit_list_of_contains ⟨m.1, _⟩ m.2 h'
|
||
|
||
theorem getKey_insertManyIfNewUnit_list_of_not_mem_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α}
|
||
{k k' : α} (k_beq : k == k')
|
||
(not_mem : ¬ k ∈ m) (distinct : l.Pairwise (fun a b => (a == b) = false))
|
||
(mem : k ∈ l) {h} :
|
||
getKey (insertManyIfNewUnit m l) k' h = k := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true] at not_mem
|
||
exact Raw₀.Const.getKey_insertManyIfNewUnit_list_of_contains_eq_false_of_mem ⟨m.1, _⟩ m.2 k_beq
|
||
not_mem distinct mem
|
||
|
||
theorem getKey_insertManyIfNewUnit_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} (mem : k ∈ m) {h} :
|
||
getKey (insertManyIfNewUnit m l) k h = getKey m k mem :=
|
||
Raw₀.Const.getKey_insertManyIfNewUnit_list_of_contains ⟨m.1, _⟩ m.2 _
|
||
|
||
theorem getKey!_insertManyIfNewUnit_list_of_not_mem_of_contains_eq_false
|
||
[EquivBEq α] [LawfulHashable α] [Inhabited α] {l : List α} {k : α}
|
||
(not_mem : ¬ k ∈ m) (contains_eq_false : l.contains k = false) :
|
||
getKey! (insertManyIfNewUnit m l) k = default := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true] at not_mem
|
||
exact Raw₀.Const.getKey!_insertManyIfNewUnit_list_of_contains_eq_false_of_contains_eq_false
|
||
⟨m.1, _⟩ m.2 not_mem contains_eq_false
|
||
|
||
theorem getKey!_insertManyIfNewUnit_list_of_not_mem_of_mem [EquivBEq α] [LawfulHashable α]
|
||
[Inhabited α] {l : List α} {k k' : α} (k_beq : k == k')
|
||
(not_mem : ¬ k ∈ m) (distinct : l.Pairwise (fun a b => (a == b) = false))
|
||
(mem : k ∈ l) :
|
||
getKey! (insertManyIfNewUnit m l) k' = k := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true] at not_mem
|
||
exact Raw₀.Const.getKey!_insertManyIfNewUnit_list_of_contains_eq_false_of_mem ⟨m.1, _⟩ m.2 k_beq
|
||
not_mem distinct mem
|
||
|
||
theorem getKey!_insertManyIfNewUnit_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
[Inhabited α] {l : List α} {k : α} (mem : k ∈ m) :
|
||
getKey! (insertManyIfNewUnit m l) k = getKey! m k :=
|
||
Raw₀.Const.getKey!_insertManyIfNewUnit_list_of_contains ⟨m.1, _⟩ m.2 mem
|
||
|
||
theorem getKeyD_insertManyIfNewUnit_list_of_not_mem_of_contains_eq_false
|
||
[EquivBEq α] [LawfulHashable α] {l : List α} {k fallback : α}
|
||
(not_mem : ¬ k ∈ m) (contains_eq_false : l.contains k = false) :
|
||
getKeyD (insertManyIfNewUnit m l) k fallback = fallback := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true] at not_mem
|
||
exact Raw₀.Const.getKeyD_insertManyIfNewUnit_list_of_contains_eq_false_of_contains_eq_false
|
||
⟨m.1, _⟩ m.2 not_mem contains_eq_false
|
||
|
||
theorem getKeyD_insertManyIfNewUnit_list_of_not_mem_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k k' fallback : α} (k_beq : k == k')
|
||
(not_mem : ¬ k ∈ m)
|
||
(distinct : l.Pairwise (fun a b => (a == b) = false)) (mem : k ∈ l) :
|
||
getKeyD (insertManyIfNewUnit m l) k' fallback = k := by
|
||
simp only [mem_iff_contains, Bool.not_eq_true] at not_mem
|
||
exact Raw₀.Const.getKeyD_insertManyIfNewUnit_list_of_contains_eq_false_of_mem ⟨m.1, _⟩ m.2 k_beq
|
||
not_mem distinct mem
|
||
|
||
theorem getKeyD_insertManyIfNewUnit_list_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k fallback : α} (mem : k ∈ m) :
|
||
getKeyD (insertManyIfNewUnit m l) k fallback = getKeyD m k fallback :=
|
||
Raw₀.Const.getKeyD_insertManyIfNewUnit_list_of_contains ⟨m.1, _⟩ m.2 mem
|
||
|
||
theorem size_insertManyIfNewUnit_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List α}
|
||
(distinct : l.Pairwise (fun a b => (a == b) = false)) :
|
||
(∀ (a : α), a ∈ m → l.contains a = false) →
|
||
(insertManyIfNewUnit m l).size = m.size + l.length :=
|
||
Raw₀.Const.size_insertManyIfNewUnit_list ⟨m.1, _⟩ m.2 distinct
|
||
|
||
theorem size_le_size_insertManyIfNewUnit_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} :
|
||
m.size ≤ (insertManyIfNewUnit m l).size :=
|
||
Raw₀.Const.size_le_size_insertManyIfNewUnit_list ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_insertManyIfNewUnit_list_le [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} :
|
||
(insertManyIfNewUnit m l).size ≤ m.size + l.length :=
|
||
Raw₀.Const.size_insertManyIfNewUnit_list_le ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_insertManyIfNewUnit_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} :
|
||
(insertManyIfNewUnit m l).isEmpty = (m.isEmpty && l.isEmpty) :=
|
||
Raw₀.Const.isEmpty_insertManyIfNewUnit_list ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_insertManyIfNewUnit_list [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} :
|
||
get? (insertManyIfNewUnit m l) k =
|
||
if k ∈ m ∨ l.contains k then some () else none :=
|
||
Raw₀.Const.get?_insertManyIfNewUnit_list ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_insertManyIfNewUnit_list
|
||
{l : List α} {k : α} {h} :
|
||
get (insertManyIfNewUnit m l) k h = () :=
|
||
Raw₀.Const.get_insertManyIfNewUnit_list ⟨m.1, _⟩
|
||
|
||
theorem get!_insertManyIfNewUnit_list
|
||
{l : List α} {k : α} :
|
||
get! (insertManyIfNewUnit m l) k = () :=
|
||
Raw₀.Const.get!_insertManyIfNewUnit_list ⟨m.1, _⟩
|
||
|
||
theorem getD_insertManyIfNewUnit_list
|
||
{l : List α} {k : α} {fallback : Unit} :
|
||
getD (insertManyIfNewUnit m l) k fallback = () := by
|
||
simp
|
||
|
||
end Const
|
||
|
||
end DHashMap
|
||
|
||
namespace DHashMap
|
||
|
||
@[simp]
|
||
theorem ofList_nil :
|
||
ofList ([] : List ((a : α) × (β a))) = ∅ :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.insertMany_empty_list_nil (α := α)) :)
|
||
|
||
@[simp]
|
||
theorem ofList_singleton {k : α} {v : β k} :
|
||
ofList [⟨k, v⟩] = (∅: DHashMap α β).insert k v :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.insertMany_empty_list_singleton (α := α)) :)
|
||
|
||
theorem ofList_cons {k : α} {v : β k} {tl : List ((a : α) × (β a))} :
|
||
ofList (⟨k, v⟩ :: tl) = ((∅ : DHashMap α β).insert k v).insertMany tl :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.insertMany_empty_list_cons (α := α)) :)
|
||
|
||
@[simp]
|
||
theorem contains_ofList [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k : α} :
|
||
(ofList l).contains k = (l.map Sigma.fst).contains k :=
|
||
Raw₀.contains_insertMany_empty_list
|
||
|
||
@[simp]
|
||
theorem mem_ofList [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k : α} :
|
||
k ∈ ofList l ↔ (l.map Sigma.fst).contains k := by
|
||
simp [mem_iff_contains]
|
||
|
||
theorem get?_ofList_of_contains_eq_false [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(ofList l).get? k = none :=
|
||
Raw₀.get?_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem get?_ofList_of_mem [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k k' : α} (k_beq : k == k') {v : β k}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
(ofList l).get? k' = some (cast (by congr; apply LawfulBEq.eq_of_beq k_beq) v) :=
|
||
Raw₀.get?_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem get_ofList_of_mem [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k k' : α} (k_beq : k == k') {v : β k}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l)
|
||
{h} :
|
||
(ofList l).get k' h = cast (by congr; apply LawfulBEq.eq_of_beq k_beq) v :=
|
||
Raw₀.get_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem get!_ofList_of_contains_eq_false [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k : α} [Inhabited (β k)]
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(ofList l).get! k = default :=
|
||
Raw₀.get!_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem get!_ofList_of_mem [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k k' : α} (k_beq : k == k') {v : β k} [Inhabited (β k')]
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
(ofList l).get! k' = cast (by congr; apply LawfulBEq.eq_of_beq k_beq) v :=
|
||
Raw₀.get!_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getD_ofList_of_contains_eq_false [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k : α} {fallback : β k}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(ofList l).getD k fallback = fallback :=
|
||
Raw₀.getD_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getD_ofList_of_mem [LawfulBEq α]
|
||
{l : List ((a : α) × β a)} {k k' : α} (k_beq : k == k') {v : β k} {fallback : β k'}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
(ofList l).getD k' fallback = cast (by congr; apply LawfulBEq.eq_of_beq k_beq) v :=
|
||
Raw₀.getD_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKey?_ofList_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(ofList l).getKey? k = none :=
|
||
Raw₀.getKey?_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKey?_ofList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Sigma.fst) :
|
||
(ofList l).getKey? k' = some k :=
|
||
Raw₀.getKey?_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKey_ofList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Sigma.fst)
|
||
{h} :
|
||
(ofList l).getKey k' h = k :=
|
||
Raw₀.getKey_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKey!_ofList_of_contains_eq_false [EquivBEq α] [LawfulHashable α] [Inhabited α]
|
||
{l : List ((a : α) × β a)} {k : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(ofList l).getKey! k = default :=
|
||
Raw₀.getKey!_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKey!_ofList_of_mem [EquivBEq α] [LawfulHashable α] [Inhabited α]
|
||
{l : List ((a : α) × β a)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Sigma.fst) :
|
||
(ofList l).getKey! k' = k :=
|
||
Raw₀.getKey!_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKeyD_ofList_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} {k fallback : α}
|
||
(contains_eq_false : (l.map Sigma.fst).contains k = false) :
|
||
(ofList l).getKeyD k fallback = fallback :=
|
||
Raw₀.getKeyD_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKeyD_ofList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)}
|
||
{k k' fallback : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Sigma.fst) :
|
||
(ofList l).getKeyD k' fallback = k :=
|
||
Raw₀.getKeyD_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem size_ofList [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} (distinct : l.Pairwise (fun a b => (a.1 == b.1) = false)) :
|
||
(ofList l).size = l.length :=
|
||
Raw₀.size_insertMany_empty_list distinct
|
||
|
||
theorem size_ofList_le [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} :
|
||
(ofList l).size ≤ l.length :=
|
||
Raw₀.size_insertMany_empty_list_le
|
||
|
||
@[simp]
|
||
theorem isEmpty_ofList [EquivBEq α] [LawfulHashable α]
|
||
{l : List ((a : α) × β a)} :
|
||
(ofList l).isEmpty = l.isEmpty :=
|
||
Raw₀.isEmpty_insertMany_empty_list
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v}
|
||
|
||
@[simp]
|
||
theorem ofList_nil :
|
||
ofList ([] : List (α × β)) = ∅ :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.Const.insertMany_empty_list_nil (α:= α)) :)
|
||
|
||
@[simp]
|
||
theorem ofList_singleton {k : α} {v : β} :
|
||
ofList [⟨k, v⟩] = (∅ : DHashMap α (fun _ => β)).insert k v :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.Const.insertMany_empty_list_singleton (α:= α)) :)
|
||
|
||
theorem ofList_cons {k : α} {v : β} {tl : List (α × β)} :
|
||
ofList (⟨k, v⟩ :: tl) = insertMany ((∅ : DHashMap α (fun _ => β)).insert k v) tl :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.Const.insertMany_empty_list_cons (α:= α)) :)
|
||
|
||
@[simp]
|
||
theorem contains_ofList [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α} :
|
||
(ofList l).contains k = (l.map Prod.fst).contains k :=
|
||
Raw₀.Const.contains_insertMany_empty_list
|
||
|
||
@[simp]
|
||
theorem mem_ofList [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α} :
|
||
k ∈ ofList l ↔ (l.map Prod.fst).contains k := by
|
||
simp [mem_iff_contains]
|
||
|
||
theorem get?_ofList_of_contains_eq_false [LawfulBEq α]
|
||
{l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
get? (ofList l) k = none :=
|
||
Raw₀.Const.get?_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem get?_ofList_of_mem [LawfulBEq α]
|
||
{l : List (α × β)} {k k' : α} (k_beq : k == k') {v : β}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
get? (ofList l) k' = some v :=
|
||
Raw₀.Const.get?_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem get_ofList_of_mem [LawfulBEq α]
|
||
{l : List (α × β)} {k k' : α} (k_beq : k == k') {v : β}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l)
|
||
{h} :
|
||
get (ofList l) k' h = v :=
|
||
Raw₀.Const.get_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem get!_ofList_of_contains_eq_false [LawfulBEq α]
|
||
{l : List (α × β)} {k : α} [Inhabited β]
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
get! (ofList l) k = (default : β) :=
|
||
Raw₀.Const.get!_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem get!_ofList_of_mem [LawfulBEq α]
|
||
{l : List (α × β)} {k k' : α} (k_beq : k == k') {v : β} [Inhabited β]
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
get! (ofList l) k' = v :=
|
||
Raw₀.Const.get!_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getD_ofList_of_contains_eq_false [LawfulBEq α]
|
||
{l : List (α × β)} {k : α} {fallback : β}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
getD (ofList l) k fallback = fallback :=
|
||
Raw₀.Const.getD_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getD_ofList_of_mem [LawfulBEq α]
|
||
{l : List (α × β)} {k k' : α} (k_beq : k == k') {v : β} {fallback : β}
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : ⟨k, v⟩ ∈ l) :
|
||
getD (ofList l) k' fallback = v :=
|
||
Raw₀.Const.getD_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKey?_ofList_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
(ofList l).getKey? k = none :=
|
||
Raw₀.Const.getKey?_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKey?_ofList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Prod.fst) :
|
||
(ofList l).getKey? k' = some k :=
|
||
Raw₀.Const.getKey?_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKey_ofList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Prod.fst)
|
||
{h} :
|
||
(ofList l).getKey k' h = k :=
|
||
Raw₀.Const.getKey_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKey!_ofList_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
[Inhabited α] {l : List (α × β)} {k : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
(ofList l).getKey! k = default :=
|
||
Raw₀.Const.getKey!_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKey!_ofList_of_mem [EquivBEq α] [LawfulHashable α] [Inhabited α]
|
||
{l : List (α × β)}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Prod.fst) :
|
||
(ofList l).getKey! k' = k :=
|
||
Raw₀.Const.getKey!_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKeyD_ofList_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} {k fallback : α}
|
||
(contains_eq_false : (l.map Prod.fst).contains k = false) :
|
||
(ofList l).getKeyD k fallback = fallback :=
|
||
Raw₀.Const.getKeyD_insertMany_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKeyD_ofList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)}
|
||
{k k' fallback : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a.1 == b.1) = false))
|
||
(mem : k ∈ l.map Prod.fst) :
|
||
(ofList l).getKeyD k' fallback = k :=
|
||
Raw₀.Const.getKeyD_insertMany_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem size_ofList [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} (distinct : l.Pairwise (fun a b => (a.1 == b.1) = false)) :
|
||
(ofList l).size = l.length :=
|
||
Raw₀.Const.size_insertMany_empty_list distinct
|
||
|
||
theorem size_ofList_le [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} :
|
||
(ofList l).size ≤ l.length :=
|
||
Raw₀.Const.size_insertMany_empty_list_le
|
||
|
||
@[simp]
|
||
theorem isEmpty_ofList [EquivBEq α] [LawfulHashable α]
|
||
{l : List (α × β)} :
|
||
(ofList l).isEmpty = l.isEmpty :=
|
||
Raw₀.Const.isEmpty_insertMany_empty_list
|
||
|
||
@[simp]
|
||
theorem unitOfList_nil :
|
||
unitOfList ([] : List α) = ∅ :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.Const.insertManyIfNewUnit_empty_list_nil (α := α)) :)
|
||
|
||
@[simp]
|
||
theorem unitOfList_singleton {k : α} :
|
||
unitOfList [k] = (∅ : DHashMap α (fun _ => Unit)).insertIfNew k () :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.Const.insertManyIfNewUnit_empty_list_singleton (α := α)) :)
|
||
|
||
theorem unitOfList_cons {hd : α} {tl : List α} :
|
||
unitOfList (hd :: tl) =
|
||
insertManyIfNewUnit ((∅ : DHashMap α (fun _ => Unit)).insertIfNew hd ()) tl :=
|
||
Subtype.eq (congrArg Subtype.val (Raw₀.Const.insertManyIfNewUnit_empty_list_cons (α := α)) :)
|
||
|
||
@[simp]
|
||
theorem contains_unitOfList [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} :
|
||
(unitOfList l).contains k = l.contains k :=
|
||
Raw₀.Const.contains_insertManyIfNewUnit_empty_list
|
||
|
||
@[simp]
|
||
theorem mem_unitOfList [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} :
|
||
k ∈ unitOfList l ↔ l.contains k := by
|
||
simp [mem_iff_contains]
|
||
|
||
theorem getKey?_unitOfList_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} (contains_eq_false : l.contains k = false) :
|
||
getKey? (unitOfList l) k = none :=
|
||
Raw₀.Const.getKey?_insertManyIfNewUnit_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKey?_unitOfList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a == b) = false)) (mem : k ∈ l) :
|
||
getKey? (unitOfList l) k' = some k :=
|
||
Raw₀.Const.getKey?_insertManyIfNewUnit_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKey_unitOfList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α}
|
||
{k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a == b) = false))
|
||
(mem : k ∈ l) {h} :
|
||
getKey (unitOfList l) k' h = k :=
|
||
Raw₀.Const.getKey_insertManyIfNewUnit_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKey!_unitOfList_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
[Inhabited α] {l : List α} {k : α}
|
||
(contains_eq_false : l.contains k = false) :
|
||
getKey! (unitOfList l) k = default :=
|
||
Raw₀.Const.getKey!_insertManyIfNewUnit_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKey!_unitOfList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
[Inhabited α] {l : List α} {k k' : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a == b) = false))
|
||
(mem : k ∈ l) :
|
||
getKey! (unitOfList l) k' = k :=
|
||
Raw₀.Const.getKey!_insertManyIfNewUnit_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem getKeyD_unitOfList_of_contains_eq_false [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k fallback : α}
|
||
(contains_eq_false : l.contains k = false) :
|
||
getKeyD (unitOfList l) k fallback = fallback :=
|
||
Raw₀.Const.getKeyD_insertManyIfNewUnit_empty_list_of_contains_eq_false contains_eq_false
|
||
|
||
theorem getKeyD_unitOfList_of_mem [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k k' fallback : α} (k_beq : k == k')
|
||
(distinct : l.Pairwise (fun a b => (a == b) = false))
|
||
(mem : k ∈ l) :
|
||
getKeyD (unitOfList l) k' fallback = k :=
|
||
Raw₀.Const.getKeyD_insertManyIfNewUnit_empty_list_of_mem k_beq distinct mem
|
||
|
||
theorem size_unitOfList [EquivBEq α] [LawfulHashable α]
|
||
{l : List α}
|
||
(distinct : l.Pairwise (fun a b => (a == b) = false)) :
|
||
(unitOfList l).size = l.length :=
|
||
Raw₀.Const.size_insertManyIfNewUnit_empty_list distinct
|
||
|
||
theorem size_unitOfList_le [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} :
|
||
(unitOfList l).size ≤ l.length :=
|
||
Raw₀.Const.size_insertManyIfNewUnit_empty_list_le
|
||
|
||
@[simp]
|
||
theorem isEmpty_unitOfList [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} :
|
||
(unitOfList l).isEmpty = l.isEmpty :=
|
||
Raw₀.Const.isEmpty_insertManyIfNewUnit_empty_list
|
||
|
||
@[simp]
|
||
theorem get?_unitOfList [EquivBEq α] [LawfulHashable α]
|
||
{l : List α} {k : α} :
|
||
get? (unitOfList l) k =
|
||
if l.contains k then some () else none :=
|
||
Raw₀.Const.get?_insertManyIfNewUnit_empty_list
|
||
|
||
@[simp]
|
||
theorem get_unitOfList
|
||
{l : List α} {k : α} {h} :
|
||
get (unitOfList l) k h = () :=
|
||
Raw₀.Const.get_insertManyIfNewUnit_empty_list
|
||
|
||
@[simp]
|
||
theorem get!_unitOfList
|
||
{l : List α} {k : α} :
|
||
get! (unitOfList l) k = () :=
|
||
Raw₀.Const.get!_insertManyIfNewUnit_empty_list
|
||
|
||
@[simp]
|
||
theorem getD_unitOfList
|
||
{l : List α} {k : α} {fallback : Unit} :
|
||
getD (unitOfList l) k fallback = () := by
|
||
simp
|
||
|
||
end Const
|
||
|
||
variable {m : DHashMap α β}
|
||
|
||
section Alter
|
||
|
||
theorem isEmpty_alter_eq_isEmpty_erase [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).isEmpty = ((m.erase k).isEmpty && (f (m.get? k)).isNone) :=
|
||
Raw₀.isEmpty_alter_eq_isEmpty_erase _ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_alter [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
(alter m k f).isEmpty = ((m.isEmpty || (m.size == 1 && m.contains k)) && (f (get? m k)).isNone) :=
|
||
Raw₀.isEmpty_alter _ m.2
|
||
|
||
theorem contains_alter [LawfulBEq α] {k k': α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).contains k' = if k == k' then (f (m.get? k)).isSome else m.contains k' :=
|
||
Raw₀.contains_alter ⟨_, _⟩ m.2
|
||
|
||
theorem mem_alter [LawfulBEq α] {k k': α} {f : Option (β k) → Option (β k)} :
|
||
k' ∈ m.alter k f ↔ if k == k' then (f (m.get? k)).isSome = true else k' ∈ m := by
|
||
simp only [mem_iff_contains, contains_alter, beq_iff_eq, Bool.ite_eq_true_distrib]
|
||
|
||
theorem mem_alter_of_beq [LawfulBEq α] {k k': α} {f : Option (β k) → Option (β k)} (h : k == k') :
|
||
k' ∈ m.alter k f ↔ (f (m.get? k)).isSome := by
|
||
rw [mem_alter, if_pos h]
|
||
|
||
@[simp]
|
||
theorem contains_alter_self [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).contains k = (f (m.get? k)).isSome := by
|
||
simp only [contains_alter, beq_self_eq_true, reduceIte]
|
||
|
||
@[simp]
|
||
theorem mem_alter_self [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
k ∈ m.alter k f ↔ (f (m.get? k)).isSome := by
|
||
rw [mem_iff_contains, contains_alter_self]
|
||
|
||
theorem contains_alter_of_beq_eq_false [LawfulBEq α] {k k' : α} {f : Option (β k) → Option (β k)}
|
||
(h : (k == k') = false) : (m.alter k f).contains k' = m.contains k' := by
|
||
simp only [contains_alter, h, Bool.false_eq_true, reduceIte]
|
||
|
||
theorem mem_alter_of_beq_eq_false [LawfulBEq α] {k k' : α} {f : Option (β k) → Option (β k)}
|
||
(h : (k == k') = false) : k' ∈ m.alter k f ↔ k' ∈ m := by
|
||
simp only [mem_iff_contains, contains_alter_of_beq_eq_false, h]
|
||
|
||
theorem size_alter [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).size =
|
||
if m.contains k && (f (m.get? k)).isNone then
|
||
m.size - 1
|
||
else if !m.contains k && (f (m.get? k)).isSome then
|
||
m.size + 1
|
||
else
|
||
m.size :=
|
||
Raw₀.size_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_alter_eq_add_one [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)}
|
||
(h : k ∉ m) (h' : (f (m.get? k)).isSome) :
|
||
(m.alter k f).size = m.size + 1 := by
|
||
rw [mem_iff_contains, Bool.not_eq_true] at h
|
||
exact Raw₀.size_alter_eq_add_one ⟨m.1, _⟩ m.2 h h'
|
||
|
||
theorem size_alter_eq_sub_one [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)}
|
||
(h : k ∈ m) (h' : (f (m.get? k)).isNone) :
|
||
(m.alter k f).size = m.size - 1 :=
|
||
Raw₀.size_alter_eq_sub_one ⟨m.1, _⟩ m.2 h h'
|
||
|
||
theorem size_alter_eq_self_of_not_mem [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)}
|
||
(h : k ∉ m) (h' : (f (m.get? k)).isNone) : (m.alter k f).size = m.size := by
|
||
rw [mem_iff_contains, Bool.not_eq_true] at h
|
||
exact Raw₀.size_alter_eq_self_of_not_mem ⟨m.1, _⟩ m.2 h h'
|
||
|
||
theorem size_alter_eq_self_of_mem [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)}
|
||
(h : k ∈ m) (h' : (f (m.get? k)).isSome) : (m.alter k f).size = m.size :=
|
||
Raw₀.size_alter_eq_self_of_mem ⟨m.1, _⟩ m.2 h h'
|
||
|
||
theorem size_alter_le_size [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).size ≤ m.size + 1 :=
|
||
Raw₀.size_alter_le_size ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_le_size_alter [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
m.size - 1 ≤ (m.alter k f).size :=
|
||
Raw₀.size_le_size_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_alter [LawfulBEq α] {k k' : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).get? k' =
|
||
if h : k == k' then
|
||
(cast (congrArg (Option ∘ β) (eq_of_beq h)) (f (m.get? k)))
|
||
else
|
||
m.get? k' :=
|
||
Raw₀.get?_alter ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get?_alter_self [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).get? k = f (m.get? k) := by
|
||
simp only [get?_alter, beq_self_eq_true, reduceDIte, Function.comp_apply, cast_eq]
|
||
|
||
theorem get_alter [LawfulBEq α] {k k' : α} {f : Option (β k) → Option (β k)}
|
||
{h : k' ∈ m.alter k f} :
|
||
(m.alter k f).get k' h =
|
||
if heq : k == k' then
|
||
haveI h' : (f (m.get? k)).isSome := mem_alter_of_beq heq |>.mp h
|
||
cast (congrArg β (eq_of_beq heq)) <| (f (m.get? k)).get <| h'
|
||
else
|
||
haveI h' : k' ∈ m := mem_alter_of_beq_eq_false (Bool.not_eq_true _ ▸ heq) |>.mp h
|
||
m.get k' h' :=
|
||
Raw₀.get_alter ⟨m.1, _⟩ m.2 h
|
||
|
||
@[simp]
|
||
theorem get_alter_self [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)}
|
||
{h : k ∈ m.alter k f} :
|
||
haveI h' : (f (m.get? k)).isSome := mem_alter_self.mp h
|
||
(m.alter k f).get k h = (f (m.get? k)).get h' :=
|
||
Raw₀.get_alter_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_alter [LawfulBEq α] {k k' : α} [hi : Inhabited (β k')]
|
||
{f : Option (β k) → Option (β k)} : (m.alter k f).get! k' =
|
||
if heq : k == k' then
|
||
(f (m.get? k)).map (cast (congrArg β (eq_of_beq heq))) |>.get!
|
||
else
|
||
m.get! k' :=
|
||
Raw₀.get!_alter ⟨m.1, _⟩ m.2
|
||
|
||
private theorem Option.map_cast_apply {γ γ' : Type u} (h : γ = γ') (x : Option γ) :
|
||
Option.map (cast h) x = cast (congrArg Option h) x := by
|
||
cases h; cases x <;> simp
|
||
|
||
@[simp]
|
||
theorem get!_alter_self [LawfulBEq α] {k : α} [Inhabited (β k)] {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).get! k = (f (m.get? k)).get! := by
|
||
simp only [get!_alter, beq_self_eq_true, reduceDIte, cast_eq, Option.map_cast_apply]
|
||
|
||
theorem getD_alter [LawfulBEq α] {k k' : α} {fallback : β k'} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).getD k' fallback =
|
||
if heq : k == k' then
|
||
f (m.get? k) |>.map (cast (congrArg β <| eq_of_beq heq)) |>.getD fallback
|
||
else
|
||
m.getD k' fallback :=
|
||
Raw₀.getD_alter ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getD_alter_self [LawfulBEq α] {k : α} {fallback : β k} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).getD k fallback = (f (m.get? k)).getD fallback :=
|
||
Raw₀.getD_alter_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_alter [LawfulBEq α] {k k' : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).getKey? k' =
|
||
if k == k' then
|
||
if (f (m.get? k)).isSome then some k else none
|
||
else
|
||
m.getKey? k' :=
|
||
Raw₀.getKey?_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_alter_self [LawfulBEq α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).getKey? k = if (f (m.get? k)).isSome then some k else none := by
|
||
simp only [getKey?_alter, beq_self_eq_true, ↓reduceIte]
|
||
|
||
theorem getKey!_alter [LawfulBEq α] [Inhabited α] {k k' : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).getKey! k' =
|
||
if k == k' then
|
||
if (f (m.get? k)).isSome then k else default
|
||
else
|
||
m.getKey! k' := by
|
||
simp [getKey!_eq_get!_getKey?, getKey?_alter]
|
||
split
|
||
· next heq =>
|
||
cases eq_of_beq heq
|
||
split <;> rfl
|
||
· next heq =>
|
||
rfl
|
||
|
||
theorem getKey!_alter_self [LawfulBEq α] [Inhabited α] {k : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).getKey! k = if (f (m.get? k)).isSome then k else default := by
|
||
simp only [getKey!_alter, beq_self_eq_true, reduceIte]
|
||
|
||
theorem getKey_alter [LawfulBEq α] [Inhabited α] {k k' : α} {f : Option (β k) → Option (β k)}
|
||
{h : k' ∈ m.alter k f} :
|
||
(m.alter k f).getKey k' h =
|
||
if heq : k == k' then
|
||
k
|
||
else
|
||
haveI h' : k' ∈ m := mem_alter_of_beq_eq_false (Bool.not_eq_true _ ▸ heq) |>.mp h
|
||
m.getKey k' h' :=
|
||
Raw₀.getKey_alter ⟨m.1, _⟩ m.2 h
|
||
|
||
@[simp]
|
||
theorem getKey_alter_self [LawfulBEq α] [Inhabited α] {k : α} {f : Option (β k) → Option (β k)}
|
||
{h : k ∈ m.alter k f} : (m.alter k f).getKey k h = k := by
|
||
simp [getKey_alter]
|
||
|
||
theorem getKeyD_alter [LawfulBEq α] {k k' fallback : α} {f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).getKeyD k' fallback =
|
||
if k == k' then
|
||
if (f (m.get? k)).isSome then k else fallback
|
||
else
|
||
m.getKeyD k' fallback :=
|
||
Raw₀.getKeyD_alter ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getKeyD_alter_self [LawfulBEq α] [Inhabited α] {k : α} {fallback : α}
|
||
{f : Option (β k) → Option (β k)} :
|
||
(m.alter k f).getKeyD k fallback = if (f (m.get? k)).isSome then k else fallback := by
|
||
simp [getKeyD_alter]
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
theorem isEmpty_alter_eq_isEmpty_erase [EquivBEq α] [LawfulHashable α] {k : α}
|
||
{f : Option β → Option β} :
|
||
(Const.alter m k f).isEmpty = ((m.erase k).isEmpty && (f (Const.get? m k)).isNone) :=
|
||
Raw₀.Const.isEmpty_alter_eq_isEmpty_erase _ m.2
|
||
|
||
@[simp]
|
||
theorem isEmpty_alter [EquivBEq α] [LawfulHashable α] {k : α} {f : Option β → Option β} :
|
||
(Const.alter m k f).isEmpty = ((m.isEmpty || (m.size == 1 && m.contains k))
|
||
&& (f (Const.get? m k)).isNone) :=
|
||
Raw₀.Const.isEmpty_alter _ m.2
|
||
|
||
theorem contains_alter [EquivBEq α] [LawfulHashable α] {k k': α} {f : Option β → Option β} :
|
||
(Const.alter m k f).contains k' =
|
||
if k == k' then (f (Const.get? m k)).isSome else m.contains k' :=
|
||
Raw₀.Const.contains_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem mem_alter [EquivBEq α] [LawfulHashable α] {k k': α} {f : Option β → Option β} :
|
||
k' ∈ Const.alter m k f ↔ if k == k' then (f (Const.get? m k)).isSome = true else k' ∈ m := by
|
||
simp only [mem_iff_contains, contains_alter, Bool.ite_eq_true_distrib]
|
||
|
||
theorem mem_alter_of_beq [EquivBEq α] [LawfulHashable α] {k k': α} {f : Option β → Option β}
|
||
(h : k == k') : k' ∈ Const.alter m k f ↔ (f (Const.get? m k)).isSome := by
|
||
rw [mem_alter, if_pos h]
|
||
|
||
@[simp]
|
||
theorem contains_alter_self [EquivBEq α] [LawfulHashable α] {k : α} {f : Option β → Option β} :
|
||
(Const.alter m k f).contains k = (f (Const.get? m k)).isSome := by
|
||
simp only [contains_alter, BEq.refl, reduceIte]
|
||
|
||
@[simp]
|
||
theorem mem_alter_self [EquivBEq α] [LawfulHashable α] {k : α} {f : Option β → Option β} :
|
||
k ∈ Const.alter m k f ↔ (f (Const.get? m k)).isSome := by
|
||
rw [mem_iff_contains, contains_alter_self]
|
||
|
||
theorem contains_alter_of_beq_eq_false [EquivBEq α] [LawfulHashable α] {k k' : α}
|
||
{f : Option β → Option β} (h : (k == k') = false) :
|
||
(Const.alter m k f).contains k' = m.contains k' := by
|
||
simp only [contains_alter, h, Bool.false_eq_true, reduceIte]
|
||
|
||
theorem mem_alter_of_beq_eq_false [EquivBEq α] [LawfulHashable α] {k k' : α}
|
||
{f : Option β → Option β} (h : (k == k') = false) : k' ∈ Const.alter m k f ↔ k' ∈ m := by
|
||
simp only [mem_iff_contains, contains_alter_of_beq_eq_false, h]
|
||
|
||
theorem size_alter [LawfulBEq α] {k : α} {f : Option β → Option β} :
|
||
(Const.alter m k f).size =
|
||
if m.contains k && (f (Const.get? m k)).isNone then
|
||
m.size - 1
|
||
else if !m.contains k && (f (Const.get? m k)).isSome then
|
||
m.size + 1
|
||
else
|
||
m.size :=
|
||
Raw₀.Const.size_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_alter_eq_add_one [LawfulBEq α] {k : α} {f : Option β → Option β}
|
||
(h : k ∉ m) (h' : (f (Const.get? m k)).isSome) :
|
||
(Const.alter m k f).size = m.size + 1 := by
|
||
rw [mem_iff_contains, Bool.not_eq_true] at h
|
||
exact Raw₀.Const.size_alter_eq_add_one ⟨m.1, _⟩ m.2 h h'
|
||
|
||
theorem size_alter_eq_sub_one [LawfulBEq α] {k : α} {f : Option β → Option β}
|
||
(h : k ∈ m) (h' : (f (Const.get? m k)).isNone) :
|
||
(Const.alter m k f).size = m.size - 1 :=
|
||
Raw₀.Const.size_alter_eq_sub_one ⟨m.1, _⟩ m.2 h h'
|
||
|
||
theorem size_alter_eq_self_of_not_mem [LawfulBEq α] {k : α} {f : Option β → Option β}
|
||
(h : k ∉ m) (h' : (f (Const.get? m k)).isNone) : (Const.alter m k f).size = m.size := by
|
||
rw [mem_iff_contains, Bool.not_eq_true] at h
|
||
exact Raw₀.Const.size_alter_eq_self_of_not_mem ⟨m.1, _⟩ m.2 h h'
|
||
|
||
theorem size_alter_eq_self_of_mem [LawfulBEq α] {k : α} {f : Option β → Option β}
|
||
(h : k ∈ m) (h' : (f (Const.get? m k)).isSome) : (Const.alter m k f).size = m.size :=
|
||
Raw₀.Const.size_alter_eq_self_of_mem ⟨m.1, _⟩ m.2 h h'
|
||
|
||
theorem size_alter_le_size [LawfulBEq α] {k : α} {f : Option β → Option β} :
|
||
(Const.alter m k f).size ≤ m.size + 1 :=
|
||
Raw₀.Const.size_alter_le_size ⟨m.1, _⟩ m.2
|
||
|
||
theorem size_le_size_alter [LawfulBEq α] {k : α} {f : Option β → Option β} :
|
||
m.size - 1 ≤ (Const.alter m k f).size :=
|
||
Raw₀.Const.size_le_size_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_alter [EquivBEq α] [LawfulHashable α] {k k' : α} {f : Option β → Option β} :
|
||
Const.get? (Const.alter m k f) k' =
|
||
if k == k' then
|
||
f (Const.get? m k)
|
||
else
|
||
Const.get? m k' :=
|
||
Raw₀.Const.get?_alter ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get?_alter_self [EquivBEq α] [LawfulHashable α] {k : α} {f : Option β → Option β} :
|
||
Const.get? (Const.alter m k f) k = f (Const.get? m k) := by
|
||
simp [get?_alter]
|
||
|
||
theorem get_alter [EquivBEq α] [LawfulHashable α] {k k' : α} {f : Option β → Option β}
|
||
{h : k' ∈ Const.alter m k f} :
|
||
Const.get (Const.alter m k f) k' h =
|
||
if heq : k == k' then
|
||
haveI h' : (f (Const.get? m k)).isSome := mem_alter_of_beq heq |>.mp h
|
||
f (Const.get? m k) |>.get h'
|
||
else
|
||
haveI h' : k' ∈ m := mem_alter_of_beq_eq_false (Bool.not_eq_true _ ▸ heq) |>.mp h
|
||
Const.get m k' h' :=
|
||
Raw₀.Const.get_alter ⟨m.1, _⟩ m.2 h
|
||
|
||
@[simp]
|
||
theorem get_alter_self [EquivBEq α] [LawfulHashable α] {k : α} {f : Option β → Option β}
|
||
{h : k ∈ Const.alter m k f} :
|
||
haveI h' : (f (Const.get? m k)).isSome := mem_alter_self.mp h
|
||
Const.get (Const.alter m k f) k h = (f (Const.get? m k)).get h' := by
|
||
simp [get_alter]
|
||
|
||
theorem get!_alter [EquivBEq α] [LawfulHashable α] {k k' : α} [Inhabited β]
|
||
{f : Option β → Option β} : Const.get! (Const.alter m k f) k' =
|
||
if k == k' then
|
||
f (Const.get? m k) |>.get!
|
||
else
|
||
Const.get! m k' :=
|
||
Raw₀.Const.get!_alter ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get!_alter_self [EquivBEq α] [LawfulHashable α] {k : α} [Inhabited β]
|
||
{f : Option β → Option β} : Const.get! (Const.alter m k f) k = (f (Const.get? m k)).get! := by
|
||
simp [get!_alter]
|
||
|
||
theorem getD_alter [EquivBEq α] [LawfulHashable α] {k k' : α} {fallback : β}
|
||
{f : Option β → Option β} :
|
||
Const.getD (Const.alter m k f) k' fallback =
|
||
if k == k' then
|
||
f (Const.get? m k) |>.getD fallback
|
||
else
|
||
Const.getD m k' fallback :=
|
||
Raw₀.Const.getD_alter ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getD_alter_self [EquivBEq α] [LawfulHashable α] {k : α} {fallback : β}
|
||
{f : Option β → Option β} :
|
||
Const.getD (Const.alter m k f) k fallback = (f (Const.get? m k)).getD fallback := by
|
||
simp [getD_alter]
|
||
|
||
theorem getKey?_alter [EquivBEq α] [LawfulHashable α] {k k' : α} {f : Option β → Option β} :
|
||
(Const.alter m k f).getKey? k' =
|
||
if k == k' then
|
||
if (f (Const.get? m k)).isSome then some k else none
|
||
else
|
||
m.getKey? k' :=
|
||
Raw₀.Const.getKey?_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_alter_self [EquivBEq α] [LawfulHashable α] {k : α} {f : Option β → Option β} :
|
||
(Const.alter m k f).getKey? k = if (f (Const.get? m k)).isSome then some k else none := by
|
||
simp [getKey?_alter]
|
||
|
||
theorem getKey!_alter [EquivBEq α] [LawfulHashable α] [Inhabited α] {k k' : α}
|
||
{f : Option β → Option β} : (Const.alter m k f).getKey! k' =
|
||
if k == k' then
|
||
if (f (Const.get? m k)).isSome then k else default
|
||
else
|
||
m.getKey! k' :=
|
||
Raw₀.Const.getKey!_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_alter_self [EquivBEq α] [LawfulHashable α] [Inhabited α] {k : α}
|
||
{f : Option β → Option β} :
|
||
(Const.alter m k f).getKey! k = if (f (Const.get? m k)).isSome then k else default := by
|
||
simp [getKey!_alter]
|
||
|
||
theorem getKey_alter [EquivBEq α] [LawfulHashable α] [Inhabited α] {k k' : α}
|
||
{f : Option β → Option β} {h : k' ∈ Const.alter m k f} :
|
||
(Const.alter m k f).getKey k' h =
|
||
if heq : k == k' then
|
||
k
|
||
else
|
||
haveI h' : k' ∈ m := mem_alter_of_beq_eq_false (Bool.not_eq_true _ ▸ heq) |>.mp h
|
||
m.getKey k' h' :=
|
||
Raw₀.Const.getKey_alter ⟨m.1, _⟩ m.2 h
|
||
|
||
@[simp]
|
||
theorem getKey_alter_self [EquivBEq α] [LawfulHashable α] [Inhabited α] {k : α}
|
||
{f : Option β → Option β} {h : k ∈ Const.alter m k f} :
|
||
(Const.alter m k f).getKey k h = k := by
|
||
simp [getKey_alter]
|
||
|
||
theorem getKeyD_alter [EquivBEq α] [LawfulHashable α] {k k' fallback : α} {f : Option β → Option β} :
|
||
(Const.alter m k f).getKeyD k' fallback =
|
||
if k == k' then
|
||
if (f (Const.get? m k)).isSome then k else fallback
|
||
else
|
||
m.getKeyD k' fallback :=
|
||
Raw₀.Const.getKeyD_alter ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKeyD_alter_self [EquivBEq α] [LawfulHashable α] [Inhabited α] {k fallback : α}
|
||
{f : Option β → Option β} :
|
||
(Const.alter m k f).getKeyD k fallback =
|
||
if (f (Const.get? m k)).isSome then k else fallback := by
|
||
simp [getKeyD_alter]
|
||
|
||
end Const
|
||
|
||
end Alter
|
||
|
||
section Modify
|
||
|
||
@[simp]
|
||
theorem isEmpty_modify [LawfulBEq α] {k : α} {f : β k → β k} :
|
||
(m.modify k f).isEmpty = m.isEmpty :=
|
||
Raw₀.isEmpty_modify _ m.2
|
||
|
||
@[simp]
|
||
theorem contains_modify [LawfulBEq α] {k k': α} {f : β k → β k} :
|
||
(m.modify k f).contains k' = m.contains k' :=
|
||
Raw₀.contains_modify ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_modify [LawfulBEq α] {k k': α} {f : β k → β k} : k' ∈ m.modify k f ↔ k' ∈ m := by
|
||
simp only [mem_iff_contains, contains_modify]
|
||
|
||
@[simp]
|
||
theorem size_modify [LawfulBEq α] {k : α} {f : β k → β k} : (m.modify k f).size = m.size :=
|
||
Raw₀.size_modify ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_modify [LawfulBEq α] {k k' : α} {f : β k → β k} :
|
||
(m.modify k f).get? k' = if h : k == k' then
|
||
(cast (congrArg (Option ∘ β) (eq_of_beq h)) ((m.get? k).map f))
|
||
else
|
||
m.get? k' :=
|
||
Raw₀.get?_modify ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get?_modify_self [LawfulBEq α] {k : α} {f : β k → β k} :
|
||
(m.modify k f).get? k = (m.get? k).map f :=
|
||
Raw₀.get?_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_modify [LawfulBEq α] {k k' : α} {f : β k → β k}
|
||
(h : k' ∈ m.modify k f) :
|
||
(m.modify k f).get k' h =
|
||
if heq : k == k' then
|
||
haveI h' : k ∈ m := mem_congr heq |>.mpr <| mem_modify.mp h
|
||
cast (congrArg β (eq_of_beq heq)) <| f (m.get k h')
|
||
else
|
||
haveI h' : k' ∈ m := mem_modify.mp h
|
||
m.get k' h' :=
|
||
Raw₀.get_modify ⟨m.1, _⟩ m.2 h
|
||
|
||
@[simp]
|
||
theorem get_modify_self [LawfulBEq α] {k : α} {f : β k → β k} {h : k ∈ m.modify k f} :
|
||
haveI h' : k ∈ m := mem_modify.mp h
|
||
(m.modify k f).get k h = f (m.get k h') :=
|
||
Raw₀.get_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_modify [LawfulBEq α] {k k' : α} [hi : Inhabited (β k')] {f : β k → β k} :
|
||
(m.modify k f).get! k' =
|
||
if heq : k == k' then
|
||
m.get? k |>.map f |>.map (cast (congrArg β (eq_of_beq heq))) |>.get!
|
||
else
|
||
m.get! k' :=
|
||
Raw₀.get!_modify ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get!_modify_self [LawfulBEq α] {k : α} [Inhabited (β k)] {f : β k → β k} :
|
||
(m.modify k f).get! k = ((m.get? k).map f).get! :=
|
||
Raw₀.get!_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_modify [LawfulBEq α] {k k' : α} {fallback : β k'} {f : β k → β k} :
|
||
(m.modify k f).getD k' fallback =
|
||
if heq : k == k' then
|
||
m.get? k |>.map f |>.map (cast (congrArg β <| eq_of_beq heq)) |>.getD fallback
|
||
else
|
||
m.getD k' fallback :=
|
||
Raw₀.getD_modify ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getD_modify_self [LawfulBEq α] {k : α} {fallback : β k} {f : β k → β k} :
|
||
(m.modify k f).getD k fallback = ((m.get? k).map f).getD fallback :=
|
||
Raw₀.getD_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_modify [LawfulBEq α] {k k' : α} {f : β k → β k} :
|
||
(m.modify k f).getKey? k' =
|
||
if k == k' then
|
||
if k ∈ m then some k else none
|
||
else
|
||
m.getKey? k' :=
|
||
Raw₀.getKey?_modify ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_modify_self [LawfulBEq α] {k : α} {f : β k → β k} :
|
||
(m.modify k f).getKey? k = if k ∈ m then some k else none :=
|
||
Raw₀.getKey?_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_modify [LawfulBEq α] [Inhabited α] {k k' : α} {f : β k → β k} :
|
||
(m.modify k f).getKey! k' =
|
||
if k == k' then
|
||
if k ∈ m then k else default
|
||
else
|
||
m.getKey! k' :=
|
||
Raw₀.getKey!_modify ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_modify_self [LawfulBEq α] [Inhabited α] {k : α} {f : β k → β k} :
|
||
(m.modify k f).getKey! k = if k ∈ m then k else default :=
|
||
Raw₀.getKey!_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey_modify [LawfulBEq α] [Inhabited α] {k k' : α} {f : β k → β k}
|
||
{h : k' ∈ m.modify k f} :
|
||
(m.modify k f).getKey k' h =
|
||
if k == k' then
|
||
k
|
||
else
|
||
haveI h' : k' ∈ m := mem_modify.mp h
|
||
m.getKey k' h' :=
|
||
Raw₀.getKey_modify ⟨m.1, _⟩ m.2 h
|
||
|
||
@[simp]
|
||
theorem getKey_modify_self [LawfulBEq α] [Inhabited α] {k : α} {f : β k → β k}
|
||
{h : k ∈ m.modify k f} : (m.modify k f).getKey k h = k :=
|
||
Raw₀.getKey_modify_self ⟨m.1, _⟩ m.2 h
|
||
|
||
theorem getKeyD_modify [LawfulBEq α] {k k' fallback : α} {f : β k → β k} :
|
||
(m.modify k f).getKeyD k' fallback =
|
||
if k == k' then
|
||
if k ∈ m then k else fallback
|
||
else
|
||
m.getKeyD k' fallback :=
|
||
Raw₀.getKeyD_modify ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKeyD_modify_self [LawfulBEq α] [Inhabited α] {k fallback : α} {f : β k → β k} :
|
||
(m.modify k f).getKeyD k fallback = if k ∈ m then k else fallback :=
|
||
Raw₀.getKeyD_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
namespace Const
|
||
|
||
variable {β : Type v} {m : DHashMap α (fun _ => β)}
|
||
|
||
@[simp]
|
||
theorem isEmpty_modify [EquivBEq α] [LawfulHashable α] {k : α} {f : β → β} :
|
||
(Const.modify m k f).isEmpty = m.isEmpty :=
|
||
Raw₀.Const.isEmpty_modify _ m.2
|
||
|
||
@[simp]
|
||
theorem contains_modify [EquivBEq α] [LawfulHashable α] {k k': α} {f : β → β} :
|
||
(Const.modify m k f).contains k' = m.contains k' :=
|
||
Raw₀.Const.contains_modify ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem mem_modify [EquivBEq α] [LawfulHashable α] {k k': α} {f : β → β} :
|
||
k' ∈ Const.modify m k f ↔ k' ∈ m := by
|
||
simp only [mem_iff_contains, contains_modify]
|
||
|
||
@[simp]
|
||
theorem size_modify [EquivBEq α] [LawfulHashable α] {k : α} {f : β → β} :
|
||
(Const.modify m k f).size = m.size :=
|
||
Raw₀.Const.size_modify ⟨m.1, _⟩ m.2
|
||
|
||
theorem get?_modify [EquivBEq α] [LawfulHashable α] {k k' : α} {f : β → β} :
|
||
Const.get? (Const.modify m k f) k' = if k == k' then
|
||
Const.get? m k |>.map f
|
||
else
|
||
Const.get? m k' :=
|
||
Raw₀.Const.get?_modify ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get?_modify_self [EquivBEq α] [LawfulHashable α] {k : α} {f : β → β} :
|
||
Const.get? (Const.modify m k f) k = (Const.get? m k).map f :=
|
||
Raw₀.Const.get?_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get_modify [EquivBEq α] [LawfulHashable α] {k k' : α} {f : β → β}
|
||
{h : k' ∈ Const.modify m k f} :
|
||
Const.get (Const.modify m k f) k' h =
|
||
if heq : k == k' then
|
||
haveI h' : k ∈ m := mem_congr heq |>.mpr <| mem_modify.mp h
|
||
f (Const.get m k h')
|
||
else
|
||
haveI h' : k' ∈ m := mem_modify.mp h
|
||
Const.get m k' h' :=
|
||
Raw₀.Const.get_modify ⟨m.1, _⟩ m.2 h
|
||
|
||
@[simp]
|
||
theorem get_modify_self [EquivBEq α] [LawfulHashable α] {k : α} {f : β → β}
|
||
{h : k ∈ Const.modify m k f} :
|
||
haveI h' : k ∈ m := mem_modify.mp h
|
||
Const.get (Const.modify m k f) k h = f (Const.get m k h') :=
|
||
Raw₀.Const.get_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem get!_modify [EquivBEq α] [LawfulHashable α] {k k' : α} [Inhabited β] {f : β → β} :
|
||
Const.get! (Const.modify m k f) k' =
|
||
if k == k' then
|
||
Const.get? m k |>.map f |>.get!
|
||
else
|
||
Const.get! m k' :=
|
||
Raw₀.Const.get!_modify ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem get!_modify_self [EquivBEq α] [LawfulHashable α] {k : α} [Inhabited β] {f : β → β} :
|
||
Const.get! (Const.modify m k f) k = ((Const.get? m k).map f).get! :=
|
||
Raw₀.Const.get!_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getD_modify [EquivBEq α] [LawfulHashable α] {k k' : α} {fallback : β} {f : β → β} :
|
||
Const.getD (Const.modify m k f) k' fallback =
|
||
if k == k' then
|
||
Const.get? m k |>.map f |>.getD fallback
|
||
else
|
||
Const.getD m k' fallback :=
|
||
Raw₀.Const.getD_modify ⟨m.1, _⟩ m.2
|
||
|
||
@[simp]
|
||
theorem getD_modify_self [EquivBEq α] [LawfulHashable α] {k : α} {fallback : β} {f : β → β} :
|
||
Const.getD (Const.modify m k f) k fallback = ((Const.get? m k).map f).getD fallback :=
|
||
Raw₀.Const.getD_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_modify [EquivBEq α] [LawfulHashable α] {k k' : α} {f : β → β} :
|
||
(Const.modify m k f).getKey? k' =
|
||
if k == k' then
|
||
if k ∈ m then some k else none
|
||
else
|
||
m.getKey? k' :=
|
||
Raw₀.Const.getKey?_modify ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey?_modify_self [EquivBEq α] [LawfulHashable α] {k : α} {f : β → β} :
|
||
(Const.modify m k f).getKey? k = if k ∈ m then some k else none :=
|
||
Raw₀.Const.getKey?_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_modify [EquivBEq α] [LawfulHashable α] [Inhabited α] {k k' : α} {f : β → β} :
|
||
(Const.modify m k f).getKey! k' =
|
||
if k == k' then
|
||
if k ∈ m then k else default
|
||
else
|
||
m.getKey! k' :=
|
||
Raw₀.Const.getKey!_modify ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey!_modify_self [EquivBEq α] [LawfulHashable α] [Inhabited α] {k : α} {f : β → β} :
|
||
(Const.modify m k f).getKey! k = if k ∈ m then k else default :=
|
||
Raw₀.Const.getKey!_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKey_modify [EquivBEq α] [LawfulHashable α] [Inhabited α] {k k' : α} {f : β → β}
|
||
{h : k' ∈ Const.modify m k f} :
|
||
(Const.modify m k f).getKey k' h =
|
||
if k == k' then
|
||
k
|
||
else
|
||
haveI h' : k' ∈ m := mem_modify.mp h
|
||
m.getKey k' h' :=
|
||
Raw₀.Const.getKey_modify ⟨m.1, _⟩ m.2 h
|
||
|
||
@[simp]
|
||
theorem getKey_modify_self [EquivBEq α] [LawfulHashable α] [Inhabited α] {k : α} {f : β → β}
|
||
{h : k ∈ Const.modify m k f} : (Const.modify m k f).getKey k h = k :=
|
||
Raw₀.Const.getKey_modify_self ⟨m.1, _⟩ m.2 h
|
||
|
||
theorem getKeyD_modify [EquivBEq α] [LawfulHashable α] {k k' fallback : α} {f : β → β} :
|
||
(Const.modify m k f).getKeyD k' fallback =
|
||
if k == k' then
|
||
if k ∈ m then k else fallback
|
||
else
|
||
m.getKeyD k' fallback :=
|
||
Raw₀.Const.getKeyD_modify ⟨m.1, _⟩ m.2
|
||
|
||
theorem getKeyD_modify_self [EquivBEq α] [LawfulHashable α] [Inhabited α] {k fallback : α} {f : β → β} :
|
||
(Const.modify m k f).getKeyD k fallback = if k ∈ m then k else fallback :=
|
||
Raw₀.Const.getKeyD_modify_self ⟨m.1, _⟩ m.2
|
||
|
||
end Const
|
||
|
||
end Modify
|
||
|
||
end Std.DHashMap
|