Dependent tree map lemmas #
This file contains lemmas about Std.Data.DTreeMap
. Most of the lemmas require
TransCmp cmp
for the comparison function cmp
.
@[simp]
theorem
Std.DTreeMap.getD_emptyc
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
[LawfulEqCmp cmp]
{a : α}
{fallback : β a}
:
theorem
Std.DTreeMap.getD_insert
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k a : α}
{fallback : β a}
{v : β k}
:
theorem
Std.DTreeMap.mem_of_mem_insertIfNew
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
{k a : α}
{v : β k}
:
a ∈ t.insertIfNew k v → cmp k a ≠ Ordering.eq → a ∈ t
theorem
Std.DTreeMap.mem_of_mem_insertIfNew'
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
{k a : α}
{v : β k}
:
a ∈ t.insertIfNew k v → ¬(cmp k a = Ordering.eq ∧ ¬k ∈ t) → a ∈ t
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
Std.DTreeMap.get?_insertIfNew
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k a : α}
{v : β k}
:
theorem
Std.DTreeMap.get_insertIfNew
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k a : α}
{v : β k}
{h₁ : a ∈ t.insertIfNew k v}
:
theorem
Std.DTreeMap.get!_insertIfNew
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k a : α}
[Inhabited (β a)]
{v : β k}
:
theorem
Std.DTreeMap.getD_insertIfNew
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k a : α}
{fallback : β a}
{v : β k}
:
(t.insertIfNew k v).getD a fallback = if h : cmp k a = Ordering.eq ∧ ¬k ∈ t then cast ⋯ v else t.getD a fallback
theorem
Std.DTreeMap.Const.get_insertIfNew
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
{k a : α}
{v : β}
{h₁ : a ∈ t.insertIfNew k v}
:
theorem
Std.DTreeMap.getKey_insertIfNew
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
{k a : α}
{v : β k}
{h₁ : a ∈ t.insertIfNew k v}
:
@[simp]
theorem
Std.DTreeMap.getThenInsertIfNew?_fst
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
{v : β k}
:
@[simp]
theorem
Std.DTreeMap.getThenInsertIfNew?_snd
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
{v : β k}
:
theorem
Std.DTreeMap.distinct_keys
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
:
List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) t.keys
theorem
Std.DTreeMap.ordered_keys
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
:
List.Pairwise (fun (a b : α) => cmp a b = Ordering.lt) t.keys
theorem
Std.DTreeMap.find?_toList_eq_some_iff_get?_eq_some
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
{v : β k}
:
theorem
Std.DTreeMap.distinct_keys_toList
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
:
List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) t.toList
theorem
Std.DTreeMap.ordered_keys_toList
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
:
List.Pairwise (fun (a b : (a : α) × β a) => cmp a.fst b.fst = Ordering.lt) t.toList
theorem
Std.DTreeMap.Const.distinct_keys_toList
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
:
List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) (toList t)
theorem
Std.DTreeMap.Const.ordered_keys_toList
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
:
List.Pairwise (fun (a b : α × β) => cmp a.fst b.fst = Ordering.lt) (toList t)
theorem
Std.DTreeMap.foldlM_eq_foldlM_toList
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
{δ : Type w}
{m : Type w → Type w}
[Monad m]
[LawfulMonad m]
{f : δ → (a : α) → β a → m δ}
{init : δ}
:
theorem
Std.DTreeMap.foldrM_eq_foldrM_toList
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
{δ : Type w}
{m : Type w → Type w}
[Monad m]
[LawfulMonad m]
{f : (a : α) → β a → δ → m δ}
{init : δ}
:
theorem
Std.DTreeMap.foldlM_eq_foldlM_keys
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
{δ : Type w}
{m : Type w → Type w}
[Monad m]
[LawfulMonad m]
{f : δ → α → m δ}
{init : δ}
:
theorem
Std.DTreeMap.foldrM_eq_foldrM_keys
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
{δ : Type w}
{m : Type w → Type w}
[Monad m]
[LawfulMonad m]
{f : α → δ → m δ}
{init : δ}
:
theorem
Std.DTreeMap.Const.foldlM_eq_foldlM_toList
{α : Type u}
{cmp : α → α → Ordering}
{δ : Type w}
{m : Type w → Type w}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[Monad m]
[LawfulMonad m]
{f : δ → α → β → m δ}
{init : δ}
:
theorem
Std.DTreeMap.Const.foldrM_eq_foldrM_toList
{α : Type u}
{cmp : α → α → Ordering}
{δ : Type w}
{m : Type w → Type w}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[Monad m]
[LawfulMonad m]
{f : α → β → δ → m δ}
{init : δ}
:
@[deprecated Std.DTreeMap.Const.forMUncurried_eq_forM_toList (since := "2025-03-02")]
theorem
Std.DTreeMap.Const.forM_eq_forM_toList
{α : Type u}
{cmp : α → α → Ordering}
{m : Type w → Type w}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[Monad m]
[LawfulMonad m]
{f : α → β → m PUnit}
:
Deprecated, use forMUncurried_eq_forM_toList
together with forM_eq_forMUncurried
instead.
@[deprecated Std.DTreeMap.Const.forInUncurried_eq_forIn_toList (since := "2025-03-02")]
theorem
Std.DTreeMap.Const.forIn_eq_forIn_toList
{α : Type u}
{cmp : α → α → Ordering}
{δ : Type w}
{m : Type w → Type w}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[Monad m]
[LawfulMonad m]
{f : α → β → δ → m (ForInStep δ)}
{init : δ}
:
Deprecated, use forInUncurried_eq_forIn_toList
together with forIn_eq_forInUncurried
instead.
@[simp]
theorem
Std.DTreeMap.insertMany_nil
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
:
theorem
Std.DTreeMap.get?_insertMany_list_of_contains_eq_false
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
{k : α}
(contains_eq_false : (List.map Sigma.fst l).contains k = false)
:
theorem
Std.DTreeMap.get?_insertMany_list_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β k}
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : ⟨k, v⟩ ∈ l)
:
theorem
Std.DTreeMap.get_insertMany_list_of_contains_eq_false
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
{k : α}
(contains : (List.map Sigma.fst l).contains k = false)
{h' : k ∈ t.insertMany l}
:
theorem
Std.DTreeMap.get_insertMany_list_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β k}
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : ⟨k, v⟩ ∈ l)
{h' : k' ∈ t.insertMany l}
:
theorem
Std.DTreeMap.get!_insertMany_list_of_contains_eq_false
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
{k : α}
[Inhabited (β k)]
(contains_eq_false : (List.map Sigma.fst l).contains k = false)
:
theorem
Std.DTreeMap.get!_insertMany_list_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β k}
[Inhabited (β k')]
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : ⟨k, v⟩ ∈ l)
:
theorem
Std.DTreeMap.getD_insertMany_list_of_contains_eq_false
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
{k : α}
{fallback : β k}
(contains_eq_false : (List.map Sigma.fst l).contains k = false)
:
theorem
Std.DTreeMap.getD_insertMany_list_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β k}
{fallback : β k'}
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : ⟨k, v⟩ ∈ l)
:
theorem
Std.DTreeMap.getKey?_insertMany_list_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Sigma.fst l)
:
theorem
Std.DTreeMap.getKey_insertMany_list_of_contains_eq_false
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
{k : α}
(contains_eq_false : (List.map Sigma.fst l).contains k = false)
{h' : k ∈ t.insertMany l}
:
theorem
Std.DTreeMap.getKey_insertMany_list_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Sigma.fst l)
{h' : k' ∈ t.insertMany l}
:
theorem
Std.DTreeMap.getKey!_insertMany_list_of_contains_eq_false
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
[Inhabited α]
{l : List ((a : α) × β a)}
{k : α}
(contains_eq_false : (List.map Sigma.fst l).contains k = false)
:
theorem
Std.DTreeMap.getKey!_insertMany_list_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[Inhabited α]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Sigma.fst l)
:
theorem
Std.DTreeMap.getKeyD_insertMany_list_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
{l : List ((a : α) × β a)}
{k k' fallback : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Sigma.fst l)
:
theorem
Std.DTreeMap.size_insertMany_list
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
:
@[simp]
theorem
Std.DTreeMap.Const.insertMany_nil
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
:
@[simp]
theorem
Std.DTreeMap.Const.getKey?_insertMany_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Prod.fst l)
:
theorem
Std.DTreeMap.Const.getKey_insertMany_list_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List (α × β)}
{k : α}
(contains_eq_false : (List.map Prod.fst l).contains k = false)
{h' : k ∈ insertMany t l}
:
theorem
Std.DTreeMap.Const.getKey_insertMany_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Prod.fst l)
{h' : k' ∈ insertMany t l}
:
theorem
Std.DTreeMap.Const.getKey!_insertMany_list_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
[Inhabited α]
{l : List (α × β)}
{k : α}
(contains_eq_false : (List.map Prod.fst l).contains k = false)
:
theorem
Std.DTreeMap.Const.getKey!_insertMany_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[Inhabited α]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Prod.fst l)
:
theorem
Std.DTreeMap.Const.getKeyD_insertMany_list_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List (α × β)}
{k fallback : α}
(contains_eq_false : (List.map Prod.fst l).contains k = false)
:
theorem
Std.DTreeMap.Const.getKeyD_insertMany_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
{l : List (α × β)}
{k k' fallback : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Prod.fst l)
:
theorem
Std.DTreeMap.Const.size_insertMany_list
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List (α × β)}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
:
theorem
Std.DTreeMap.Const.get?_insertMany_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
:
theorem
Std.DTreeMap.Const.get_insertMany_list_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List (α × β)}
{k : α}
(contains_eq_false : (List.map Prod.fst l).contains k = false)
{h' : k ∈ insertMany t l}
:
theorem
Std.DTreeMap.Const.get_insertMany_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
{h' : k' ∈ insertMany t l}
:
theorem
Std.DTreeMap.Const.get!_insertMany_list_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
[Inhabited β]
{l : List (α × β)}
{k : α}
(contains_eq_false : (List.map Prod.fst l).contains k = false)
:
theorem
Std.DTreeMap.Const.get!_insertMany_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[Inhabited β]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
:
theorem
Std.DTreeMap.Const.getD_insertMany_list_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List (α × β)}
{k : α}
{fallback : β}
(contains_eq_false : (List.map Prod.fst l).contains k = false)
:
theorem
Std.DTreeMap.Const.getD_insertMany_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
{t : DTreeMap α (fun (x : α) => β) cmp}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v fallback : β}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
:
@[simp]
theorem
Std.DTreeMap.Const.insertManyIfNewUnit_nil
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
:
@[simp]
theorem
Std.DTreeMap.Const.insertManyIfNewUnit_list_singleton
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
{k : α}
:
theorem
Std.DTreeMap.Const.getKey?_insertManyIfNewUnit_list_of_not_mem_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
{k : α}
:
theorem
Std.DTreeMap.Const.getKey?_insertManyIfNewUnit_list_of_not_mem_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
:
¬k ∈ t →
List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l → k ∈ l → (insertManyIfNewUnit t l).getKey? k' = some k
theorem
Std.DTreeMap.Const.getKey_insertManyIfNewUnit_list_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
{l : List α}
{k : α}
{h' : k ∈ insertManyIfNewUnit t l}
(contains : k ∈ t)
:
theorem
Std.DTreeMap.Const.getKey_insertManyIfNewUnit_list_of_not_mem_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{h' : k' ∈ insertManyIfNewUnit t l}
:
¬k ∈ t → List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l → k ∈ l → (insertManyIfNewUnit t l).getKey k' h' = k
theorem
Std.DTreeMap.Const.getKey!_insertManyIfNewUnit_list_of_not_mem_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
[Inhabited α]
{l : List α}
{k : α}
:
theorem
Std.DTreeMap.Const.getKey!_insertManyIfNewUnit_list_of_not_mem_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
[Inhabited α]
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
:
¬k ∈ t → List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l → k ∈ l → (insertManyIfNewUnit t l).getKey! k' = k
theorem
Std.DTreeMap.Const.getKeyD_insertManyIfNewUnit_list_of_not_mem_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
{k fallback : α}
:
theorem
Std.DTreeMap.Const.getKeyD_insertManyIfNewUnit_list_of_not_mem_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
{l : List α}
{k k' fallback : α}
(k_eq : cmp k k' = Ordering.eq)
:
¬k ∈ t →
List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l → k ∈ l → (insertManyIfNewUnit t l).getKeyD k' fallback = k
theorem
Std.DTreeMap.Const.size_insertManyIfNewUnit_list
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
:
@[simp]
@[simp]
theorem
Std.DTreeMap.Const.get_insertManyIfNewUnit_list
{α : Type u}
{cmp : α → α → Ordering}
{t : DTreeMap α (fun (x : α) => Unit) cmp}
{l : List α}
{k : α}
{h' : k ∈ insertManyIfNewUnit t l}
:
theorem
Std.DTreeMap.get?_ofList_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
[LawfulEqCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β k}
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : ⟨k, v⟩ ∈ l)
:
theorem
Std.DTreeMap.get_ofList_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
[LawfulEqCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β k}
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : ⟨k, v⟩ ∈ l)
{h : k' ∈ ofList l cmp}
:
theorem
Std.DTreeMap.get!_ofList_of_contains_eq_false
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
[LawfulEqCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
{k : α}
[Inhabited (β k)]
(contains_eq_false : (List.map Sigma.fst l).contains k = false)
:
theorem
Std.DTreeMap.get!_ofList_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
[LawfulEqCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β k}
[Inhabited (β k')]
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : ⟨k, v⟩ ∈ l)
:
theorem
Std.DTreeMap.getD_ofList_of_contains_eq_false
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
[LawfulEqCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List ((a : α) × β a)}
{k : α}
{fallback : β k}
(contains_eq_false : (List.map Sigma.fst l).contains k = false)
:
theorem
Std.DTreeMap.getD_ofList_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
[LawfulEqCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β k}
{fallback : β k'}
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : ⟨k, v⟩ ∈ l)
:
theorem
Std.DTreeMap.getKey?_ofList_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Sigma.fst l)
:
theorem
Std.DTreeMap.getKey_ofList_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Sigma.fst l)
{h' : k' ∈ ofList l cmp}
:
theorem
Std.DTreeMap.getKey!_ofList_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
[Inhabited α]
{l : List ((a : α) × β a)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Sigma.fst l)
:
theorem
Std.DTreeMap.getKeyD_ofList_of_mem
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List ((a : α) × β a)}
{k k' fallback : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : (a : α) × β a) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Sigma.fst l)
:
theorem
Std.DTreeMap.Const.get?_ofList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
:
theorem
Std.DTreeMap.Const.get_ofList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
{h : k' ∈ ofList l cmp}
:
theorem
Std.DTreeMap.Const.getD_ofList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v fallback : β}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
:
theorem
Std.DTreeMap.Const.getKey?_ofList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Prod.fst l)
:
theorem
Std.DTreeMap.Const.getKey_ofList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Prod.fst l)
{h' : k' ∈ ofList l cmp}
:
theorem
Std.DTreeMap.Const.getKey!_ofList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
[TransCmp cmp]
[Inhabited α]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Prod.fst l)
:
theorem
Std.DTreeMap.Const.getKeyD_ofList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{β : Type v}
[TransCmp cmp]
{l : List (α × β)}
{k k' fallback : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : k ∈ List.map Prod.fst l)
:
@[simp]
@[simp]
theorem
Std.DTreeMap.Const.unitOfList_cons
{α : Type u}
{cmp : α → α → Ordering}
{hd : α}
{tl : List α}
:
@[simp]
theorem
Std.DTreeMap.Const.contains_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
{k : α}
:
@[simp]
theorem
Std.DTreeMap.Const.mem_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
{k : α}
:
theorem
Std.DTreeMap.Const.getKey?_unitOfList_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
{k : α}
(contains_eq_false : l.contains k = false)
:
theorem
Std.DTreeMap.Const.getKey?_unitOfList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
(mem : k ∈ l)
:
theorem
Std.DTreeMap.Const.getKey_unitOfList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
(mem : k ∈ l)
{h' : k' ∈ unitOfList l cmp}
:
theorem
Std.DTreeMap.Const.getKey!_unitOfList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
[Inhabited α]
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
(mem : k ∈ l)
:
theorem
Std.DTreeMap.Const.getKeyD_unitOfList_of_contains_eq_false
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
{k fallback : α}
(contains_eq_false : l.contains k = false)
:
theorem
Std.DTreeMap.Const.getKeyD_unitOfList_of_mem
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
{k k' fallback : α}
(k_eq : cmp k k' = Ordering.eq)
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
(mem : k ∈ l)
:
theorem
Std.DTreeMap.Const.size_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
:
theorem
Std.DTreeMap.Const.size_unitOfList_le
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
:
@[simp]
theorem
Std.DTreeMap.Const.isEmpty_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
:
@[simp]
theorem
Std.DTreeMap.Const.get_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
{l : List α}
{k : α}
{h : k ∈ unitOfList l cmp}
:
@[simp]
theorem
Std.DTreeMap.Const.get!_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
{l : List α}
{k : α}
:
theorem
Std.DTreeMap.size_alter
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
{f : Option (β k) → Option (β k)}
:
theorem
Std.DTreeMap.get!_alter
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k k' : α}
[Inhabited (β k')]
{f : Option (β k) → Option (β k)}
:
(t.alter k f).get! k' = if heq : cmp k k' = Ordering.eq then (Option.map (cast ⋯) (f (t.get? k))).get! else t.get! k'
theorem
Std.DTreeMap.getD_alter
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k k' : α}
{fallback : β k'}
{f : Option (β k) → Option (β k)}
:
(t.alter k f).getD k' fallback = if heq : cmp k k' = Ordering.eq then (Option.map (cast ⋯) (f (t.get? k))).getD fallback else t.getD k' fallback
theorem
Std.DTreeMap.getKey?_alter
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k k' : α}
{f : Option (β k) → Option (β k)}
:
theorem
Std.DTreeMap.getKey!_alter
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
[Inhabited α]
{k k' : α}
{f : Option (β k) → Option (β k)}
:
theorem
Std.DTreeMap.getKeyD_alter
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k k' fallback : α}
{f : Option (β k) → Option (β k)}
:
@[simp]
theorem
Std.DTreeMap.getKeyD_alter_self
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
[Inhabited α]
{k fallback : α}
{f : Option (β k) → Option (β k)}
:
@[simp]
theorem
Std.DTreeMap.get?_modify
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k k' : α}
{f : β k → β k}
:
(t.modify k f).get? k' = if h : cmp k k' = Ordering.eq then cast ⋯ (Option.map f (t.get? k)) else t.get? k'
@[simp]
theorem
Std.DTreeMap.get?_modify_self
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
{f : β k → β k}
:
theorem
Std.DTreeMap.get!_modify
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k k' : α}
[hi : Inhabited (β k')]
{f : β k → β k}
:
(t.modify k f).get! k' = if heq : cmp k k' = Ordering.eq then (Option.map (cast ⋯) (Option.map f (t.get? k))).get! else t.get! k'
@[simp]
theorem
Std.DTreeMap.get!_modify_self
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
[Inhabited (β k)]
{f : β k → β k}
:
theorem
Std.DTreeMap.getD_modify
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k k' : α}
{fallback : β k'}
{f : β k → β k}
:
(t.modify k f).getD k' fallback = if heq : cmp k k' = Ordering.eq then (Option.map (cast ⋯) (Option.map f (t.get? k))).getD fallback
else t.getD k' fallback
@[simp]
theorem
Std.DTreeMap.getD_modify_self
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
{fallback : β k}
{f : β k → β k}
:
theorem
Std.DTreeMap.getKeyD_modify
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k k' fallback : α}
{f : β k → β k}
:
theorem
Std.DTreeMap.minKey?_alter_eq_self
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
{f : Option (β k) → Option (β k)}
:
theorem
Std.DTreeMap.maxKey?_alter_eq_self
{α : Type u}
{β : α → Type v}
{cmp : α → α → Ordering}
{t : DTreeMap α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
{k : α}
{f : Option (β k) → Option (β k)}
: