Tree map lemmas #
This file contains lemmas about Std.Data.TreeMap.Raw.Basic
. Most of the lemmas require
TransCmp cmp
for the comparison function cmp
.
These proofs can be obtained from Std.Data.TreeMap.Raw.WF
.
theorem
Std.TreeMap.Raw.mem_of_mem_insertIfNew
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{k a : α}
{v : β}
:
a ∈ t.insertIfNew k v → cmp k a ≠ Ordering.eq → a ∈ t
theorem
Std.TreeMap.Raw.mem_of_mem_insertIfNew'
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{k a : α}
{v : β}
:
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.TreeMap.Raw.getKey_insertIfNew
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{k a : α}
{v : β}
{h₁ : a ∈ t.insertIfNew k v}
:
theorem
Std.TreeMap.Raw.distinct_keys
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
:
List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) t.keys
theorem
Std.TreeMap.Raw.ordered_keys
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
:
List.Pairwise (fun (a b : α) => cmp a b = Ordering.lt) t.keys
theorem
Std.TreeMap.Raw.ordered_keys_toList
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
:
List.Pairwise (fun (a b : α × β) => cmp a.fst b.fst = Ordering.lt) t.toList
theorem
Std.TreeMap.Raw.foldlM_eq_foldlM_toList
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
{δ : Type w}
{m : Type w → Type w'}
[Monad m]
[LawfulMonad m]
{f : δ → α → β → m δ}
{init : δ}
:
theorem
Std.TreeMap.Raw.foldrM_eq_foldrM_toList
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
{δ : Type w}
{m : Type w → Type w'}
[Monad m]
[LawfulMonad m]
{f : α → β → δ → m δ}
{init : δ}
:
@[simp]
theorem
Std.TreeMap.Raw.foldlM_eq_foldlM_keys
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
{δ : Type w}
{m : Type w → Type w'}
[Monad m]
[LawfulMonad m]
{f : δ → α → m δ}
{init : δ}
:
theorem
Std.TreeMap.Raw.foldrM_eq_foldrM_keys
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
{δ : Type w}
{m : Type w → Type w'}
[Monad m]
[LawfulMonad m]
{f : α → δ → m δ}
{init : δ}
:
@[simp]
theorem
Std.TreeMap.Raw.insertMany_nil
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
:
theorem
Std.TreeMap.Raw.getKey?_insertMany_list_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{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.TreeMap.Raw.getKey_insertMany_list_of_contains_eq_false
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
(h : t.WF)
{l : List (α × β)}
{k : α}
(contains_eq_false : (List.map Prod.fst l).contains k = false)
{h' : k ∈ t.insertMany l}
:
theorem
Std.TreeMap.Raw.getKey_insertMany_list_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{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' ∈ t.insertMany l}
:
theorem
Std.TreeMap.Raw.getKey!_insertMany_list_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
[Inhabited α]
(h : t.WF)
{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.TreeMap.Raw.getKeyD_insertMany_list_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{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.TreeMap.Raw.size_insertMany_list
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
(h : t.WF)
{l : List (α × β)}
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
:
theorem
Std.TreeMap.Raw.getElem?_insertMany_list_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
(h : t.WF)
{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.TreeMap.Raw.getElem_insertMany_list_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{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' ∈ t.insertMany l}
:
theorem
Std.TreeMap.Raw.getElem_insertMany_list
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
[BEq α]
[PartialEquivBEq α]
[LawfulBEqCmp cmp]
(h : t.WF)
{l : List (α × β)}
{k : α}
{h' : k ∈ t.insertMany l}
:
theorem
Std.TreeMap.Raw.getElem!_insertMany_list_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β}
[Inhabited β]
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
:
theorem
Std.TreeMap.Raw.getD_insertMany_list_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t : Raw α β cmp}
[TransCmp cmp]
(h : t.WF)
{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.TreeMap.Raw.insertManyIfNewUnit_nil
{α : Type u}
{cmp : α → α → Ordering}
{t : Raw α Unit cmp}
:
@[simp]
theorem
Std.TreeMap.Raw.insertManyIfNewUnit_list_singleton
{α : Type u}
{cmp : α → α → Ordering}
{t : Raw α Unit cmp}
{k : α}
:
theorem
Std.TreeMap.Raw.getKey?_insertManyIfNewUnit_list_of_not_mem_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : Raw α Unit cmp}
[TransCmp cmp]
(h : t.WF)
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(not_mem : ¬k ∈ t)
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
(mem : k ∈ l)
:
theorem
Std.TreeMap.Raw.getKey_insertManyIfNewUnit_list_of_not_mem_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : Raw α Unit cmp}
[TransCmp cmp]
(h : t.WF)
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{h' : k' ∈ t.insertManyIfNewUnit l}
(not_mem : ¬k ∈ t)
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
(mem : k ∈ l)
:
theorem
Std.TreeMap.Raw.getKey!_insertManyIfNewUnit_list_of_not_mem_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : Raw α Unit cmp}
[TransCmp cmp]
[Inhabited α]
(h : t.WF)
{l : List α}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
(not_mem : ¬k ∈ t)
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
(mem : k ∈ l)
:
theorem
Std.TreeMap.Raw.getKeyD_insertManyIfNewUnit_list_of_not_mem_of_mem
{α : Type u}
{cmp : α → α → Ordering}
{t : Raw α Unit cmp}
[TransCmp cmp]
(h : t.WF)
{l : List α}
{k k' fallback : α}
(k_eq : cmp k k' = Ordering.eq)
(not_mem : ¬k ∈ t)
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
(mem : k ∈ l)
:
theorem
Std.TreeMap.Raw.size_insertManyIfNewUnit_list
{α : Type u}
{cmp : α → α → Ordering}
{t : Raw α Unit cmp}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
(h : t.WF)
{l : List α}
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
:
@[simp]
theorem
Std.TreeMap.Raw.getElem_insertManyIfNewUnit_list
{α : Type u}
{cmp : α → α → Ordering}
{t : Raw α Unit cmp}
{l : List α}
{k : α}
{h' : k ∈ t.insertManyIfNewUnit l}
:
theorem
Std.TreeMap.Raw.getElem?_ofList_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
[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.TreeMap.Raw.getElem_ofList_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
[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.TreeMap.Raw.getElem!_ofList_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List (α × β)}
{k k' : α}
(k_eq : cmp k k' = Ordering.eq)
{v : β}
[Inhabited β]
(distinct : List.Pairwise (fun (a b : α × β) => ¬cmp a.fst b.fst = Ordering.eq) l)
(mem : (k, v) ∈ l)
:
theorem
Std.TreeMap.Raw.getD_ofList_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
[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.TreeMap.Raw.getKey?_ofList_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
[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.TreeMap.Raw.getKey_ofList_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
[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.TreeMap.Raw.getKey!_ofList_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
[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.TreeMap.Raw.getKeyD_ofList_of_mem
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
[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.TreeMap.Raw.unitOfList_cons
{α : Type u}
{cmp : α → α → Ordering}
{hd : α}
{tl : List α}
:
@[simp]
theorem
Std.TreeMap.Raw.contains_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
{k : α}
:
@[simp]
theorem
Std.TreeMap.Raw.mem_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
[BEq α]
[LawfulBEqCmp cmp]
{l : List α}
{k : α}
:
theorem
Std.TreeMap.Raw.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.TreeMap.Raw.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.TreeMap.Raw.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.TreeMap.Raw.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.TreeMap.Raw.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.TreeMap.Raw.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.TreeMap.Raw.size_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
(distinct : List.Pairwise (fun (a b : α) => ¬cmp a b = Ordering.eq) l)
:
theorem
Std.TreeMap.Raw.size_unitOfList_le
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
:
@[simp]
theorem
Std.TreeMap.Raw.isEmpty_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{l : List α}
:
@[simp]
theorem
Std.TreeMap.Raw.getElem_unitOfList
{α : Type u}
{cmp : α → α → Ordering}
{l : List α}
{k : α}
{h : k ∈ unitOfList l cmp}
:
theorem
Std.TreeMap.Raw.Equiv.insertIfNew
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t₁ t₂ : Raw α β cmp}
[TransCmp cmp]
(h₁ : t₁.WF)
(h₂ : t₂.WF)
(h : t₁.Equiv t₂)
(k : α)
(v : β)
:
(t₁.insertIfNew k v).Equiv (t₂.insertIfNew k v)
theorem
Std.TreeMap.Raw.Equiv.filter
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t₁ t₂ : Raw α β cmp}
(h₁ : t₁.WF)
(h₂ : t₂.WF)
(h : t₁.Equiv t₂)
(f : α → β → Bool)
:
(Raw.filter f t₁).Equiv (Raw.filter f t₂)
theorem
Std.TreeMap.Raw.Equiv.filterMap
{α : Type u}
{β : Type v}
{γ : Type w}
{cmp : α → α → Ordering}
{t₁ t₂ : Raw α β cmp}
(h₁ : t₁.WF)
(h₂ : t₂.WF)
(h : t₁.Equiv t₂)
(f : α → β → Option γ)
:
(Raw.filterMap f t₁).Equiv (Raw.filterMap f t₂)
theorem
Std.TreeMap.Raw.Equiv.insertMany_list
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t₁ t₂ : Raw α β cmp}
[TransCmp cmp]
(h₁ : t₁.WF)
(h₂ : t₂.WF)
(h : t₁.Equiv t₂)
(l : List (α × β))
:
(t₁.insertMany l).Equiv (t₂.insertMany l)
theorem
Std.TreeMap.Raw.Equiv.insertManyIfNewUnit_list
{α : Type u}
{cmp : α → α → Ordering}
[TransCmp cmp]
{t₁ t₂ : Raw α Unit cmp}
(h₁ : t₁.WF)
(h₂ : t₂.WF)
(h : t₁.Equiv t₂)
(l : List α)
:
(t₁.insertManyIfNewUnit l).Equiv (t₂.insertManyIfNewUnit l)
theorem
Std.TreeMap.Raw.Equiv.mergeWith
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t₁ t₂ t₃ t₄ : Raw α β cmp}
[TransCmp cmp]
[LawfulEqCmp cmp]
(h₁ : t₁.WF)
(h₂ : t₂.WF)
(h₃ : t₃.WF)
(h₄ : t₄.WF)
(f : α → β → β → β)
(h : t₁.Equiv t₂)
(h' : t₃.Equiv t₄)
:
(Raw.mergeWith f t₁ t₃).Equiv (Raw.mergeWith f t₂ t₄)
theorem
Std.TreeMap.Raw.Equiv.of_forall_getKey_eq_of_forall_getElem?_eq
{α : Type u}
{β : Type v}
{cmp : α → α → Ordering}
{t₁ t₂ : Raw α β cmp}
[TransCmp cmp]
(h₁ : t₁.WF)
(h₂ : t₂.WF)
(hk : ∀ (k : α) (hk : k ∈ t₁) (hk' : k ∈ t₂), t₁.getKey k hk = t₂.getKey k hk')
(hv : ∀ (k : α), t₁[k]? = t₂[k]?)
:
t₁.Equiv t₂