feat: tree map lemmas for maxKey! (#7686)

This PR provides lemmas for the tree map function `maxKey!` and its
interactions with other functions for which lemmas already exist.

---------

Co-authored-by: Paul Reichert <datokrat@users.noreply.github.com>
This commit is contained in:
Paul Reichert 2025-03-26 17:13:15 +01:00 committed by GitHub
parent 5ad6edc8d0
commit e9fda1a3e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 1201 additions and 71 deletions

View file

@ -101,7 +101,8 @@ private def queryMap : Std.DHashMap Name (fun _ => Name × Array (MacroM (TSynta
⟨`minKey!, (``minKey!_eq_minKey!, #[``(minKey!_of_perm _)])⟩,
⟨`minKeyD, (``minKeyD_eq_minKeyD, #[``(minKeyD_of_perm _)])⟩,
⟨`maxKey?, (``maxKey?_eq_maxKey?, #[``(maxKey?_of_perm _)])⟩,
⟨`maxKey, (``maxKey_eq_maxKey, #[``(maxKey_of_perm _)])⟩]
⟨`maxKey, (``maxKey_eq_maxKey, #[``(maxKey_of_perm _)])⟩,
⟨`maxKey!, (``maxKey!_eq_maxKey!, #[``(maxKey!_of_perm _)])⟩]
/-- Internal implementation detail of the tree map -/
scoped syntax "simp_to_model" (" [" (ident,*) "]")? ("using" term)? : tactic
@ -4692,7 +4693,7 @@ theorem minKey!_insert [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
simp_to_model [minKey!, minKey?, insert] using List.minKey!_insertEntry
theorem minKey!_insert! [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
(t.insert! k v |>.minKey!) =
(t.insert! k v).minKey! =
(t.minKey?.elim k fun k' => if compare k k' |>.isLE then k else k') := by
simpa [insert_eq_insert!] using minKey!_insert h
@ -4703,7 +4704,7 @@ theorem minKey!_insert_le_minKey! [TransOrd α] [Inhabited α] (h : t.WF) :
theorem minKey!_insert!_le_minKey! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {k v},
compare (t.insert! k v |>.minKey!) t.minKey! |>.isLE := by
compare (t.insert! k v).minKey! t.minKey! |>.isLE := by
simpa only [insert_eq_insert!] using minKey!_insert_le_minKey! h
theorem minKey!_insert_le_self [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
@ -4711,7 +4712,7 @@ theorem minKey!_insert_le_self [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
simp_to_model [minKey!, insert] using List.minKey!_insertEntry_le_self
theorem minKey!_insert!_le_self [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
compare (t.insert! k v |>.minKey!) k |>.isLE := by
compare (t.insert! k v).minKey! k |>.isLE := by
simpa only [insert_eq_insert!] using minKey!_insert_le_self h
theorem contains_minKey! [TransOrd α] [Inhabited α] (h : t.WF) :
@ -4767,7 +4768,7 @@ theorem minKey!_erase_eq_iff_not_compare_minKey!_eq [TransOrd α] [Inhabited α]
theorem minKey!_erase!_eq_iff_not_compare_minKey!_eq [TransOrd α] [Inhabited α] (h : t.WF) {k} :
(he : (t.erase! k).isEmpty = false) →
(t.erase! k |>.minKey!) = t.minKey! ↔
(t.erase! k).minKey! = t.minKey! ↔
¬ compare k t.minKey! = .eq := by
simpa only [erase_eq_erase!] using minKey!_erase_eq_iff_not_compare_minKey!_eq h
@ -4779,7 +4780,7 @@ theorem minKey!_erase_eq_of_not_compare_minKey!_eq [TransOrd α] [Inhabited α]
theorem minKey!_erase!_eq_of_not_compare_minKey!_eq [TransOrd α] [Inhabited α] (h : t.WF) {k} :
(he : (t.erase! k).isEmpty = false) → (heq : ¬ compare k t.minKey! = .eq) →
(t.erase! k |>.minKey!) = t.minKey! := by
(t.erase! k).minKey! = t.minKey! := by
simpa only [erase_eq_erase!] using minKey!_erase_eq_of_not_compare_minKey!_eq h
theorem minKey!_le_minKey!_erase [TransOrd α] [Inhabited α] (h : t.WF) :
@ -4789,7 +4790,7 @@ theorem minKey!_le_minKey!_erase [TransOrd α] [Inhabited α] (h : t.WF) :
theorem minKey!_le_minKey!_erase! [TransOrd α] [Inhabited α] (h : t.WF) {k} :
(he : (t.erase! k).isEmpty = false) →
compare t.minKey! (t.erase! k |>.minKey!) |>.isLE := by
compare t.minKey! (t.erase! k).minKey! |>.isLE := by
simpa only [erase_eq_erase!] using minKey!_le_minKey!_erase h
theorem minKey!_insertIfNew [TransOrd α] [Inhabited α] (h : t.WF) : ∀ {k v},
@ -4798,7 +4799,7 @@ theorem minKey!_insertIfNew [TransOrd α] [Inhabited α] (h : t.WF) : ∀ {k v},
simp_to_model [minKey!, minKey?, insertIfNew] using List.minKey!_insertEntryIfNew
theorem minKey!_insertIfNew! [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
(t.insertIfNew! k v |>.minKey!) =
(t.insertIfNew! k v).minKey! =
t.minKey?.elim k fun k' => if compare k k' = .lt then k else k' := by
simpa only [insertIfNew_eq_insertIfNew!] using minKey!_insertIfNew h
@ -4809,7 +4810,7 @@ theorem minKey!_insertIfNew_le_minKey! [TransOrd α] [Inhabited α] (h : t.WF) :
theorem minKey!_insertIfNew!_le_minKey! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {k v},
compare (t.insertIfNew! k v |>.minKey!) t.minKey! |>.isLE := by
compare (t.insertIfNew! k v).minKey! t.minKey! |>.isLE := by
simpa only [insertIfNew_eq_insertIfNew!] using minKey!_insertIfNew_le_minKey! h
theorem minKey!_insertIfNew_le_self [TransOrd α] [Inhabited α] (h : t.WF) : ∀ {k v},
@ -4817,7 +4818,7 @@ theorem minKey!_insertIfNew_le_self [TransOrd α] [Inhabited α] (h : t.WF) :
simp_to_model [minKey!, insertIfNew] using List.minKey!_insertEntryIfNew_le_self
theorem minKey!_insertIfNew!_le_self [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
compare (t.insertIfNew! k v |>.minKey!) k |>.isLE := by
compare (t.insertIfNew! k v).minKey! k |>.isLE := by
simpa only [insertIfNew_eq_insertIfNew!] using minKey!_insertIfNew_le_self h
theorem minKey!_eq_head!_keys [TransOrd α] [Inhabited α] (h : t.WF) :
@ -4825,7 +4826,7 @@ theorem minKey!_eq_head!_keys [TransOrd α] [Inhabited α] (h : t.WF) :
simp_to_model [minKey!, keys] using List.minKey!_eq_head!_keys h.ordered
theorem minKey!_modify [TransOrd α] [LawfulEqOrd α] [Inhabited α] (h : t.WF) : ∀ {k f},
(t.modify k f |>.minKey!) = t.minKey! := by
(t.modify k f).minKey! = t.minKey! := by
simp_to_model [minKey!, modify] using List.minKey!_modifyKey
theorem minKey!_alter_eq_self [TransOrd α] [LawfulEqOrd α] [Inhabited α] (h : t.WF) :
@ -4836,7 +4837,7 @@ theorem minKey!_alter_eq_self [TransOrd α] [LawfulEqOrd α] [Inhabited α] (h :
theorem minKey!_alter!_eq_self [TransOrd α] [LawfulEqOrd α] [Inhabited α] (h : t.WF) {k f} :
(he : (t.alter! k f).isEmpty = false) →
(t.alter! k f |>.minKey!) = k ↔
(t.alter! k f).minKey! = k ↔
(f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (compare k k').isLE := by
simpa only [alter_eq_alter!] using minKey!_alter_eq_self h
@ -5495,6 +5496,217 @@ theorem maxKey_alter_eq_self [TransOrd α] (h : t.WF) {k f he} :
end Const
theorem maxKey_eq_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) {he} :
t.maxKey he = t.maxKey! := by
simp_to_model [maxKey, maxKey!] using List.maxKey_eq_maxKey!
theorem maxKey?_eq_some_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → t.maxKey? = some t.maxKey! := by
simp_to_model [maxKey?, maxKey!, isEmpty] using List.maxKey?_eq_some_maxKey!
theorem maxKey!_eq_default [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty) → t.maxKey! = default := by
simp_to_model [maxKey!, isEmpty] using List.maxKey!_eq_default
theorem maxKey!_eq_iff_getKey?_eq_self_and_forall [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {km},
t.maxKey! = km ↔ t.getKey? km = some km ∧ ∀ k, k ∈ t → (compare k km).isLE := by
simp_to_model [maxKey!, getKey?, contains, isEmpty] using
List.maxKey!_eq_iff_getKey?_eq_self_and_forall
theorem maxKey!_eq_some_iff_mem_and_forall [TransOrd α]
[LawfulEqOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {km},
t.maxKey! = km ↔ km ∈ t ∧ ∀ k, k ∈ t → (compare k km).isLE := by
simp_to_model [maxKey!, contains, isEmpty] using List.maxKey!_eq_some_iff_mem_and_forall
theorem maxKey!_insert [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
(t.insert k v h.balanced |>.impl.maxKey!) =
(t.maxKey?.elim k fun k' => if compare k' k |>.isLE then k else k') := by
simp_to_model [maxKey!, maxKey?, insert] using List.maxKey!_insertEntry
theorem maxKey!_insert! [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
(t.insert! k v).maxKey! =
(t.maxKey?.elim k fun k' => if compare k' k |>.isLE then k else k') := by
simpa [insert_eq_insert!] using maxKey!_insert h
theorem maxKey!_le_maxKey!_insert [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {k v},
compare t.maxKey! (t.insert k v h.balanced |>.impl.maxKey!) |>.isLE := by
simp_to_model [maxKey!, isEmpty, insert] using List.maxKey!_le_maxKey!_insertEntry
theorem maxKey!_le_maxKey!_insert! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {k v},
compare t.maxKey! (t.insert! k v).maxKey! |>.isLE := by
simpa only [insert_eq_insert!] using maxKey!_le_maxKey!_insert h
theorem self_le_maxKey!_insert [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
compare k (t.insert k v h.balanced |>.impl.maxKey!) |>.isLE := by
simp_to_model [maxKey!, insert] using List.self_le_maxKey!_insertEntry
theorem self_le_maxKey!_insert! [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
compare k (t.insert! k v).maxKey! |>.isLE := by
simpa only [insert_eq_insert!] using self_le_maxKey!_insert h
theorem contains_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → t.contains t.maxKey! := by
simp_to_model [maxKey!, isEmpty, contains] using List.containsKey_maxKey!
theorem maxKey!_mem [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → t.maxKey! ∈ t :=
contains_maxKey! h
theorem le_maxKey!_of_contains [TransOrd α] [Inhabited α] (h : t.WF) :
∀ {k}, (hc : t.contains k) →
compare k t.maxKey! |>.isLE := by
simp_to_model [maxKey!, contains] using List.le_maxKey!_of_containsKey
theorem le_maxKey!_of_mem [TransOrd α] [Inhabited α] (h : t.WF) :
∀ {k}, (hc : k ∈ t) →
compare k t.maxKey! |>.isLE :=
le_maxKey!_of_contains h
theorem maxKey!_le [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {k},
(compare t.maxKey! k).isLE ↔ (∀ k', k' ∈ t → (compare k' k).isLE) := by
simp_to_model [maxKey!, contains, isEmpty] using List.maxKey!_le
theorem getKey?_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) →
t.getKey? t.maxKey! = some t.maxKey! := by
simp_to_model [maxKey!, getKey?, isEmpty] using List.getKey?_maxKey!
theorem getKey_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) : ∀ {he},
t.getKey t.maxKey! he = t.maxKey! := by
simp_to_model [maxKey!, contains, isEmpty, getKey] using List.getKey_maxKey!
theorem getKey_maxKey!_eq_maxKey [TransOrd α] [Inhabited α] (h : t.WF) : ∀ {hc},
t.getKey t.maxKey! hc = t.maxKey (isEmpty_eq_false_of_contains h hc) := by
simp_to_model [maxKey!, maxKey, contains, isEmpty, getKey] using List.getKey_maxKey!_eq_maxKey
theorem getKey!_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → t.getKey! t.maxKey! = t.maxKey! := by
simp_to_model [maxKey!, isEmpty, getKey!] using List.getKey!_maxKey!
theorem getKeyD_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {fallback},
t.getKeyD t.maxKey! fallback = t.maxKey! := by
simp_to_model [maxKey!, getKeyD, isEmpty] using List.getKeyD_maxKey!
theorem maxKey!_erase_eq_iff_not_compare_maxKey!_eq [TransOrd α] [Inhabited α] (h : t.WF) :
∀ {k}, (he : (t.erase k h.balanced).impl.isEmpty = false) →
(t.erase k h.balanced |>.impl.maxKey!) = t.maxKey! ↔
¬ compare k t.maxKey! = .eq := by
simp_to_model [maxKey!, isEmpty, erase] using List.maxKey!_eraseKey_eq_iff_beq_maxKey!_eq_false
theorem maxKey!_erase!_eq_iff_not_compare_maxKey!_eq [TransOrd α] [Inhabited α] (h : t.WF) {k} :
(he : (t.erase! k).isEmpty = false) →
(t.erase! k).maxKey! = t.maxKey! ↔
¬ compare k t.maxKey! = .eq := by
simpa only [erase_eq_erase!] using maxKey!_erase_eq_iff_not_compare_maxKey!_eq h
theorem maxKey!_erase_eq_of_not_compare_maxKey!_eq [TransOrd α] [Inhabited α] (h : t.WF) :
∀ {k}, (he : (t.erase k h.balanced).impl.isEmpty = false) → (heq : ¬ compare k t.maxKey! = .eq) →
(t.erase k h.balanced |>.impl.maxKey!) = t.maxKey! := by
simp_to_model [maxKey!, isEmpty, erase] using
List.maxKey!_eraseKey_eq_of_beq_maxKey!_eq_false
theorem maxKey!_erase!_eq_of_not_compare_maxKey!_eq [TransOrd α] [Inhabited α] (h : t.WF) {k} :
(he : (t.erase! k).isEmpty = false) → (heq : ¬ compare k t.maxKey! = .eq) →
(t.erase! k).maxKey! = t.maxKey! := by
simpa only [erase_eq_erase!] using maxKey!_erase_eq_of_not_compare_maxKey!_eq h
theorem maxKey!_erase_le_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) :
∀ {k}, (he : (t.erase k h.balanced).impl.isEmpty = false) →
compare (t.erase k h.balanced |>.impl.maxKey!) t.maxKey! |>.isLE := by
simp_to_model [maxKey!, isEmpty, erase] using List.maxKey!_erase_le_maxKey!
theorem maxKey!_erase!_le_maxKey! [TransOrd α] [Inhabited α] (h : t.WF) {k} :
(he : (t.erase! k).isEmpty = false) →
compare (t.erase! k).maxKey! t.maxKey! |>.isLE := by
simpa only [erase_eq_erase!] using maxKey!_erase_le_maxKey! h
theorem maxKey!_insertIfNew [TransOrd α] [Inhabited α] (h : t.WF) : ∀ {k v},
(t.insertIfNew k v h.balanced |>.impl.maxKey!) =
t.maxKey?.elim k fun k' => if compare k' k = .lt then k else k' := by
simp_to_model [maxKey!, maxKey?, insertIfNew] using List.maxKey!_insertEntryIfNew
theorem maxKey!_insertIfNew! [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
(t.insertIfNew! k v).maxKey! =
t.maxKey?.elim k fun k' => if compare k' k = .lt then k else k' := by
simpa only [insertIfNew_eq_insertIfNew!] using maxKey!_insertIfNew h
theorem maxKey!_le_maxKey!_insertIfNew [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {k v},
compare t.maxKey! (t.insertIfNew k v h.balanced |>.impl.maxKey!) |>.isLE := by
simp_to_model [maxKey!, isEmpty, insertIfNew] using List.maxKey!_le_maxKey!_insertEntryIfNew
theorem maxKey!_le_maxKey!_insertIfNew! [TransOrd α] [Inhabited α] (h : t.WF) :
(he : t.isEmpty = false) → ∀ {k v},
compare t.maxKey! (t.insertIfNew! k v).maxKey! |>.isLE := by
simpa only [insertIfNew_eq_insertIfNew!] using maxKey!_le_maxKey!_insertIfNew h
theorem self_le_maxKey!_insertIfNew [TransOrd α] [Inhabited α] (h : t.WF) : ∀ {k v},
compare k (t.insertIfNew k v h.balanced |>.impl.maxKey!) |>.isLE := by
simp_to_model [maxKey!, insertIfNew] using List.self_le_maxKey!_insertEntryIfNew
theorem self_le_maxKey!_insertIfNew! [TransOrd α] [Inhabited α] (h : t.WF) {k v} :
compare k (t.insertIfNew! k v).maxKey! |>.isLE := by
simpa only [insertIfNew_eq_insertIfNew!] using self_le_maxKey!_insertIfNew h
theorem maxKey!_eq_getLast!_keys [TransOrd α] [Inhabited α] (h : t.WF) :
t.maxKey! = t.keys.getLast! := by
simp_to_model [maxKey!, keys] using List.maxKey!_eq_getLast!_keys h.ordered.distinctKeys h.ordered
theorem maxKey!_modify [TransOrd α] [LawfulEqOrd α] [Inhabited α] (h : t.WF) : ∀ {k f},
(t.modify k f).maxKey! = t.maxKey! := by
simp_to_model [maxKey!, modify] using List.maxKey!_modifyKey
theorem maxKey!_alter_eq_self [TransOrd α] [LawfulEqOrd α] [Inhabited α] (h : t.WF) :
∀ {k f}, (he : (t.alter k f h.balanced).impl.isEmpty = false) →
(t.alter k f h.balanced |>.impl.maxKey!) = k ↔
(f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (compare k' k).isLE := by
simp_to_model [maxKey!, alter, isEmpty, contains, get?] using List.maxKey!_alterKey_eq_self
theorem maxKey!_alter!_eq_self [TransOrd α] [LawfulEqOrd α] [Inhabited α] (h : t.WF) {k f} :
(he : (t.alter! k f).isEmpty = false) →
(t.alter! k f).maxKey! = k ↔
(f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (compare k' k).isLE := by
simpa only [alter_eq_alter!] using maxKey!_alter_eq_self h
namespace Const
variable {β : Type v} {t : Impl α β}
theorem maxKey!_modify [TransOrd α] [Inhabited α] (h : t.WF) :
∀ {k f}, (he : (modify k f t).isEmpty = false) →
(modify k f t |> maxKey!) = if compare t.maxKey! k = .eq then k else t.maxKey! := by
simp_to_model [maxKey!, maxKey, isEmpty, Const.modify] using List.Const.maxKey!_modifyKey
theorem maxKey!_modify_eq_maxKey! [TransOrd α] [LawfulEqOrd α] [Inhabited α] (h : t.WF) :
∀ {k f}, (modify k f t |> maxKey!) = t.maxKey! := by
simp_to_model [maxKey!, Const.modify] using List.Const.maxKey!_modifyKey_eq_maxKey!
theorem compare_maxKey!_modify_eq [TransOrd α] [Inhabited α] (h : t.WF) : ∀ {k f},
compare (Const.modify k f t |> maxKey!) t.maxKey! = .eq := by
simp_to_model [maxKey!, Const.modify] using List.Const.maxKey!_modifyKey_beq
theorem maxKey!_alter_eq_self [TransOrd α] [Inhabited α] (h : t.WF) :
∀ {k f}, (he : (alter k f t h.balanced).impl.isEmpty = false) →
(alter k f t h.balanced |>.impl.maxKey!) = k ↔
(f (get? t k)).isSome ∧ ∀ k', k' ∈ t → (compare k' k).isLE := by
simp_to_model [maxKey!, Const.alter, contains, isEmpty, Const.get?] using
List.Const.maxKey!_alterKey_eq_self
theorem maxKey!_alter!_eq_self [TransOrd α] [Inhabited α] (h : t.WF) {k f} :
(he : (alter! k f t).isEmpty = false) →
(alter! k f t |>.maxKey!) = k ↔
(f (get? t k)).isSome ∧ ∀ k', k' ∈ t → (compare k' k).isLE := by
simpa only [alter_eq_alter!] using maxKey!_alter_eq_self h
end Const
end Max

View file

@ -501,6 +501,10 @@ theorem maxKey_eq_get_maxKey? [Ord α] {l : Impl α β} {he} :
l.maxKey he = l.maxKey?.get (by simp [← some_maxKey_eq_maxKey? (he := he)]) := by
simp [← some_maxKey_eq_maxKey? (he := he)]
theorem maxKey!_eq_get!_maxKey? [Ord α] [Inhabited α] {l : Impl α β} :
l.maxKey! = l.maxKey?.get! := by
induction l using maxKey!.induct <;> simp_all only [maxKey!, maxKey?] <;> rfl
theorem balanceL_eq_balance {k : α} {v : β k} {l r : Impl α β} {hlb hrb hlr} :
balanceL k v l r hlb hrb hlr = balance k v l r hlb hrb (Or.inl hlr.erase) := by
rw [balanceL_eq_balanceLErase, balanceLErase_eq_balanceL!,

View file

@ -1860,4 +1860,8 @@ theorem maxKey_eq_maxKey [Ord α] [TransOrd α] {t : Impl α β} (hlo : t.Ordere
t.maxKey he = List.maxKey t.toListModel (isEmpty_eq_isEmpty ▸ he) := by
simp only [List.maxKey_eq_get_maxKey?, maxKey_eq_get_maxKey?, maxKey?_eq_maxKey? hlo]
theorem maxKey!_eq_maxKey! [Ord α] [TransOrd α] [Inhabited α] {t : Impl α β} (hlo : t.Ordered) :
t.maxKey! = List.maxKey! t.toListModel := by
simp only [List.maxKey!_eq_get!_maxKey?, maxKey!_eq_get!_maxKey?, maxKey?_eq_maxKey? hlo]
end Std.DTreeMap.Internal.Impl

View file

@ -3140,6 +3140,10 @@ theorem minKey?_eq_some_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty =
t.minKey? = some t.minKey! :=
Impl.minKey?_eq_some_minKey! t.wf he
theorem minKey_eq_minKey! [TransCmp cmp] [Inhabited α] {he : t.isEmpty = false} :
t.minKey he = t.minKey! :=
Impl.minKey_eq_minKey! t.wf
theorem minKey!_eq_default [TransCmp cmp] [Inhabited α] (he : t.isEmpty) :
t.minKey! = default :=
Impl.minKey!_eq_default t.wf he
@ -3155,16 +3159,16 @@ theorem minKey!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inh
Impl.minKey!_eq_some_iff_mem_and_forall t.wf he
theorem minKey!_insert [TransCmp cmp] [Inhabited α] {k v} :
(t.insert k v |>.minKey!) =
(t.insert k v).minKey! =
(t.minKey?.elim k fun k' => if cmp k k' |>.isLE then k else k') :=
Impl.minKey!_insert t.wf
theorem minKey!_insert_le_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k v} :
cmp (t.insert k v |>.minKey!) t.minKey! |>.isLE :=
cmp (t.insert k v).minKey! t.minKey! |>.isLE :=
Impl.minKey!_insert_le_minKey! t.wf he
theorem minKey!_insert_le_self [TransCmp cmp] [Inhabited α] {k v} :
cmp (t.insert k v |>.minKey!) k |>.isLE :=
cmp (t.insert k v).minKey! k |>.isLE :=
Impl.minKey!_insert_le_self t.wf
theorem contains_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
@ -3210,25 +3214,25 @@ theorem getKeyD_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {
theorem minKey!_erase_eq_of_not_compare_minKey!_eq [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.minKey! = .eq) :
(t.erase k |>.minKey!) = t.minKey! :=
(t.erase k).minKey! = t.minKey! :=
Impl.minKey!_erase_eq_of_not_compare_minKey!_eq t.wf he heq
theorem minKey!_le_minKey!_erase [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) :
cmp t.minKey! (t.erase k |>.minKey!) |>.isLE :=
cmp t.minKey! (t.erase k).minKey! |>.isLE :=
Impl.minKey!_le_minKey!_erase t.wf he
theorem minKey!_insertIfNew [TransCmp cmp] [Inhabited α] {k v} :
(t.insertIfNew k v |>.minKey!) =
(t.insertIfNew k v).minKey! =
t.minKey?.elim k fun k' => if cmp k k' = .lt then k else k' :=
Impl.minKey!_insertIfNew t.wf
theorem minKey!_insertIfNew_le_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k v} :
cmp (t.insertIfNew k v |>.minKey!) t.minKey! |>.isLE :=
cmp (t.insertIfNew k v).minKey! t.minKey! |>.isLE :=
Impl.minKey!_insertIfNew_le_minKey! t.wf he
theorem minKey!_insertIfNew_le_self [TransCmp cmp] [Inhabited α] {k v} :
cmp (t.insertIfNew k v |>.minKey!) k |>.isLE :=
cmp (t.insertIfNew k v).minKey! k |>.isLE :=
Impl.minKey!_insertIfNew_le_self t.wf
theorem minKey!_eq_head!_keys [TransCmp cmp] [Inhabited α] :
@ -3237,12 +3241,12 @@ theorem minKey!_eq_head!_keys [TransCmp cmp] [Inhabited α] :
@[simp]
theorem minKey!_modify [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] {k f} :
(t.modify k f |>.minKey!) = t.minKey! :=
(t.modify k f).minKey! = t.minKey! :=
Impl.minKey!_modify t.wf
theorem minKey!_alter_eq_self [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] {k f}
(he : (t.alter k f).isEmpty = false) :
(t.alter k f |>.minKey!) = k ↔ (f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (cmp k k').isLE :=
(t.alter k f).minKey! = k ↔ (f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (cmp k k').isLE :=
Impl.minKey!_alter_eq_self t.wf he
namespace Const
@ -3251,22 +3255,22 @@ variable {β : Type v} {t : DTreeMap α β cmp}
theorem minKey!_modify [TransCmp cmp] [Inhabited α] {k f}
(he : (modify t k f).isEmpty = false) :
(modify t k f |> minKey!) = if cmp t.minKey! k = .eq then k else t.minKey! :=
(modify t k f).minKey! = if cmp t.minKey! k = .eq then k else t.minKey! :=
Impl.Const.minKey!_modify t.wf he
@[simp]
theorem minKey!_modify_eq_minKey! [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] {k f} :
(modify t k f |>.minKey!) = t.minKey! :=
(modify t k f).minKey! = t.minKey! :=
Impl.Const.minKey!_modify_eq_minKey! t.wf
@[simp]
theorem compare_minKey!_modify_eq [TransCmp cmp] [Inhabited α] {k f} :
cmp (modify t k f |> minKey!) t.minKey! = .eq :=
cmp (modify t k f).minKey! t.minKey! = .eq :=
Impl.Const.compare_minKey!_modify_eq t.wf (instOrd := ⟨cmp⟩)
theorem minKey!_alter_eq_self [TransCmp cmp] [Inhabited α] {k f}
(he : (alter t k f).isEmpty = false) :
(alter t k f |>.minKey!) = k ↔
(alter t k f).minKey! = k ↔
(f (Const.get? t k)).isSome ∧ ∀ k', k' ∈ t → (cmp k k').isLE :=
Impl.Const.minKey!_alter_eq_self t.wf he
@ -3761,6 +3765,146 @@ theorem maxKey_alter_eq_self [TransCmp cmp] {k f he} :
end Const
theorem maxKey?_eq_some_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.maxKey? = some t.maxKey! :=
Impl.maxKey?_eq_some_maxKey! t.wf he
theorem maxKey_eq_maxKey! [TransCmp cmp] [Inhabited α] {he : t.isEmpty = false} :
t.maxKey he = t.maxKey! :=
Impl.maxKey_eq_maxKey! t.wf
theorem maxKey!_eq_default [TransCmp cmp] [Inhabited α] (he : t.isEmpty) :
t.maxKey! = default :=
Impl.maxKey!_eq_default t.wf he
theorem maxKey!_eq_iff_getKey?_eq_self_and_forall [TransCmp cmp] [Inhabited α]
(he : t.isEmpty = false) {km} :
t.maxKey! = km ↔ t.getKey? km = some km ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
Impl.maxKey!_eq_iff_getKey?_eq_self_and_forall t.wf he
theorem maxKey!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α]
(he : t.isEmpty = false) {km} :
t.maxKey! = km ↔ km ∈ t ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
Impl.maxKey!_eq_some_iff_mem_and_forall t.wf he
theorem maxKey!_insert [TransCmp cmp] [Inhabited α] {k v} :
(t.insert k v).maxKey! =
(t.maxKey?.elim k fun k' => if cmp k' k |>.isLE then k else k') :=
Impl.maxKey!_insert t.wf
theorem maxKey!_le_maxKey!_insert [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k v} :
cmp t.maxKey! (t.insert k v).maxKey! |>.isLE :=
Impl.maxKey!_le_maxKey!_insert t.wf he
theorem self_le_maxKey!_insert [TransCmp cmp] [Inhabited α] {k v} :
cmp k (t.insert k v).maxKey! |>.isLE :=
Impl.self_le_maxKey!_insert t.wf
theorem contains_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.contains t.maxKey! :=
Impl.contains_maxKey! t.wf he
theorem maxKey!_mem [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.maxKey! ∈ t :=
Impl.maxKey!_mem t.wf he
theorem le_maxKey!_of_contains [TransCmp cmp] [Inhabited α] {k} (hc : t.contains k) :
cmp k t.maxKey! |>.isLE :=
Impl.le_maxKey!_of_contains t.wf hc
theorem le_maxKey!_of_mem [TransCmp cmp] [Inhabited α] {k} (hc : k ∈ t) :
cmp k t.maxKey! |>.isLE :=
Impl.le_maxKey!_of_mem t.wf hc
theorem maxKey!_le [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k} :
(cmp t.maxKey! k).isLE ↔ (∀ k', k' ∈ t → (cmp k' k).isLE) :=
Impl.maxKey!_le t.wf he
theorem getKey?_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.getKey? t.maxKey! = some t.maxKey! :=
Impl.getKey?_maxKey! t.wf he
theorem getKey_maxKey! [TransCmp cmp] [Inhabited α] {hc} :
t.getKey t.maxKey! hc = t.maxKey! :=
Impl.getKey_maxKey! t.wf
@[simp]
theorem getKey_maxKey!_eq_maxKey [TransCmp cmp] [Inhabited α] {hc} :
t.getKey t.maxKey! hc = t.maxKey (isEmpty_eq_false_of_contains hc) :=
Impl.getKey_maxKey!_eq_maxKey t.wf
theorem getKey!_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.getKey! t.maxKey! = t.maxKey! :=
Impl.getKey!_maxKey! t.wf he
theorem getKeyD_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {fallback} :
t.getKeyD t.maxKey! fallback = t.maxKey! :=
Impl.getKeyD_maxKey! t.wf he
theorem maxKey!_erase_eq_of_not_compare_maxKey!_eq [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.maxKey! = .eq) :
(t.erase k).maxKey! = t.maxKey! :=
Impl.maxKey!_erase_eq_of_not_compare_maxKey!_eq t.wf he heq
theorem maxKey!_erase_le_maxKey! [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) :
cmp (t.erase k).maxKey! t.maxKey! |>.isLE :=
Impl.maxKey!_erase_le_maxKey! t.wf he
theorem maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] {k v} :
(t.insertIfNew k v).maxKey! =
t.maxKey?.elim k fun k' => if cmp k' k = .lt then k else k' :=
Impl.maxKey!_insertIfNew t.wf
theorem maxKey!_le_maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k v} :
cmp t.maxKey! (t.insertIfNew k v).maxKey! |>.isLE :=
Impl.maxKey!_le_maxKey!_insertIfNew t.wf he
theorem self_le_maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] {k v} :
cmp k (t.insertIfNew k v).maxKey! |>.isLE :=
Impl.self_le_maxKey!_insertIfNew t.wf
theorem maxKey!_eq_getLast!_keys [TransCmp cmp] [Inhabited α] :
t.maxKey! = t.keys.getLast! :=
Impl.maxKey!_eq_getLast!_keys t.wf
@[simp]
theorem maxKey!_modify [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] {k f} :
(t.modify k f).maxKey! = t.maxKey! :=
Impl.maxKey!_modify t.wf
theorem maxKey!_alter_eq_self [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] {k f}
(he : (t.alter k f).isEmpty = false) :
(t.alter k f).maxKey! = k ↔ (f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (cmp k' k).isLE :=
Impl.maxKey!_alter_eq_self t.wf he
namespace Const
variable {β : Type v} {t : DTreeMap α β cmp}
theorem maxKey!_modify [TransCmp cmp] [Inhabited α] {k f}
(he : (modify t k f).isEmpty = false) :
(modify t k f).maxKey! = if cmp t.maxKey! k = .eq then k else t.maxKey! :=
Impl.Const.maxKey!_modify t.wf he
@[simp]
theorem maxKey!_modify_eq_maxKey! [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] {k f} :
(modify t k f).maxKey! = t.maxKey! :=
Impl.Const.maxKey!_modify_eq_maxKey! t.wf
@[simp]
theorem compare_maxKey!_modify_eq [TransCmp cmp] [Inhabited α] {k f} :
cmp (modify t k f).maxKey! t.maxKey! = .eq :=
Impl.Const.compare_maxKey!_modify_eq t.wf (instOrd := ⟨cmp⟩)
theorem maxKey!_alter_eq_self [TransCmp cmp] [Inhabited α] {k f}
(he : (alter t k f).isEmpty = false) :
(alter t k f).maxKey! = k ↔
(f (Const.get? t k)).isSome ∧ ∀ k', k' ∈ t → (cmp k' k).isLE :=
Impl.Const.maxKey!_alter_eq_self t.wf he
end Const
end Max
end Std.DTreeMap

View file

@ -3015,17 +3015,17 @@ theorem minKey!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inh
Impl.minKey!_eq_some_iff_mem_and_forall h he
theorem minKey!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
(t.insert k v |>.minKey!) =
(t.insert k v).minKey! =
(t.minKey?.elim k fun k' => if cmp k k' |>.isLE then k else k') :=
Impl.minKey!_insert! h
theorem minKey!_insert_le_minKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false)
{k v} :
cmp (t.insert k v |>.minKey!) t.minKey! |>.isLE :=
cmp (t.insert k v).minKey! t.minKey! |>.isLE :=
Impl.minKey!_insert!_le_minKey! h he (instOrd := ⟨cmp⟩)
theorem minKey!_insert_le_self [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
cmp (t.insert k v |>.minKey!) k |>.isLE :=
cmp (t.insert k v).minKey! k |>.isLE :=
Impl.minKey!_insert!_le_self h (instOrd := ⟨cmp⟩)
theorem contains_minKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
@ -3066,26 +3066,26 @@ theorem getKeyD_minKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty
theorem minKey!_erase_eq_of_not_compare_minKey!_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.minKey! = .eq) :
(t.erase k |>.minKey!) = t.minKey! :=
(t.erase k).minKey! = t.minKey! :=
Impl.minKey!_erase!_eq_of_not_compare_minKey!_eq h he heq
theorem minKey!_le_minKey!_erase [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) :
cmp t.minKey! (t.erase k |>.minKey!) |>.isLE :=
cmp t.minKey! (t.erase k).minKey! |>.isLE :=
Impl.minKey!_le_minKey!_erase! h he
theorem minKey!_insertIfNew [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
(t.insertIfNew k v |>.minKey!) =
(t.insertIfNew k v).minKey! =
t.minKey?.elim k fun k' => if cmp k k' = .lt then k else k' :=
Impl.minKey!_insertIfNew! h
theorem minKey!_insertIfNew_le_minKey! [TransCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {k v} :
cmp (t.insertIfNew k v |>.minKey!) t.minKey! |>.isLE :=
cmp (t.insertIfNew k v).minKey! t.minKey! |>.isLE :=
Impl.minKey!_insertIfNew!_le_minKey! h he (instOrd := ⟨cmp⟩)
theorem minKey!_insertIfNew_le_self [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
cmp (t.insertIfNew k v |>.minKey!) k |>.isLE :=
cmp (t.insertIfNew k v).minKey! k |>.isLE :=
Impl.minKey!_insertIfNew!_le_self h (instOrd := ⟨cmp⟩)
theorem minKey!_eq_head!_keys [TransCmp cmp] [Inhabited α] (h : t.WF) :
@ -3094,12 +3094,12 @@ theorem minKey!_eq_head!_keys [TransCmp cmp] [Inhabited α] (h : t.WF) :
@[simp]
theorem minKey!_modify [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF) {k f} :
(t.modify k f |>.minKey!) = t.minKey! :=
(t.modify k f).minKey! = t.minKey! :=
Impl.minKey!_modify h
theorem minKey!_alter_eq_self [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (t.alter k f).isEmpty = false) :
(t.alter k f |>.minKey!) = k ↔ (f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (cmp k k').isLE :=
(t.alter k f).minKey! = k ↔ (f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (cmp k k').isLE :=
Impl.minKey!_alter!_eq_self h he
namespace Const
@ -3108,22 +3108,22 @@ variable {β : Type v} {t : Raw α β cmp}
theorem minKey!_modify [TransCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (modify t k f).isEmpty = false) :
(modify t k f |> minKey!) = if cmp t.minKey! k = .eq then k else t.minKey! :=
(modify t k f).minKey! = if cmp t.minKey! k = .eq then k else t.minKey! :=
Impl.Const.minKey!_modify h he
@[simp]
theorem minKey!_modify_eq_minKey! [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF) {k f} :
(modify t k f |>.minKey!) = t.minKey! :=
(modify t k f).minKey! = t.minKey! :=
Impl.Const.minKey!_modify_eq_minKey! h
@[simp]
theorem compare_minKey!_modify_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k f} :
cmp (modify t k f |> minKey!) t.minKey! = .eq :=
cmp (modify t k f).minKey! t.minKey! = .eq :=
Impl.Const.compare_minKey!_modify_eq h (instOrd := ⟨cmp⟩)
theorem minKey!_alter_eq_self [TransCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (alter t k f).isEmpty = false) :
(alter t k f |>.minKey!) = k ↔
(alter t k f).minKey! = k ↔
(f (Const.get? t k)).isSome ∧ ∀ k', k' ∈ t → (cmp k k').isLE :=
Impl.Const.minKey!_alter!_eq_self h he
@ -3472,6 +3472,139 @@ theorem maxKey?_alter_eq_self [TransCmp cmp] (h : t.WF) {k f} :
end Const
theorem maxKey?_eq_some_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.maxKey? = some t.maxKey! :=
Impl.maxKey?_eq_some_maxKey! h he (instOrd := ⟨cmp⟩)
theorem maxKey!_eq_default [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty) :
t.maxKey! = default :=
Impl.maxKey!_eq_default h he (instOrd := ⟨cmp⟩)
theorem maxKey!_eq_iff_getKey?_eq_self_and_forall [TransCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {km} :
t.maxKey! = km ↔ t.getKey? km = some km ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
Impl.maxKey!_eq_iff_getKey?_eq_self_and_forall h he
theorem maxKey!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {km} :
t.maxKey! = km ↔ km ∈ t ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
Impl.maxKey!_eq_some_iff_mem_and_forall h he
theorem maxKey!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
(t.insert k v).maxKey! =
(t.maxKey?.elim k fun k' => if cmp k' k |>.isLE then k else k') :=
Impl.maxKey!_insert! h
theorem maxKey!_le_maxKey!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false)
{k v} :
cmp t.maxKey! (t.insert k v).maxKey! |>.isLE :=
Impl.maxKey!_le_maxKey!_insert! h he (instOrd := ⟨cmp⟩)
theorem self_le_maxKey!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
cmp k (t.insert k v).maxKey! |>.isLE :=
Impl.self_le_maxKey!_insert! h (instOrd := ⟨cmp⟩)
theorem contains_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.contains t.maxKey! :=
Impl.contains_maxKey! h he
theorem maxKey!_mem [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.maxKey! ∈ t :=
Impl.maxKey!_mem h he
theorem le_maxKey!_of_contains [TransCmp cmp] [Inhabited α] (h : t.WF) {k} (hc : t.contains k) :
cmp k t.maxKey! |>.isLE :=
Impl.le_maxKey!_of_contains h hc
theorem le_maxKey!_of_mem [TransCmp cmp] [Inhabited α] (h : t.WF) {k} (hc : k ∈ t) :
cmp k t.maxKey! |>.isLE :=
Impl.le_maxKey!_of_mem h hc
theorem maxKey!_le [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) {k} :
(cmp t.maxKey! k).isLE ↔ (∀ k', k' ∈ t → (cmp k' k).isLE) :=
Impl.maxKey!_le h he (instOrd := ⟨cmp⟩)
theorem getKey?_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.getKey? t.maxKey! = some t.maxKey! :=
Impl.getKey?_maxKey! h he
theorem getKey_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) {hc} :
t.getKey t.maxKey! hc = t.maxKey! :=
Impl.getKey_maxKey! h
theorem getKey!_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.getKey! t.maxKey! = t.maxKey! :=
Impl.getKey!_maxKey! h he
theorem getKeyD_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) {fallback} :
t.getKeyD t.maxKey! fallback = t.maxKey! :=
Impl.getKeyD_maxKey! h he
theorem maxKey!_erase_eq_of_not_compare_maxKey!_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.maxKey! = .eq) :
(t.erase k).maxKey! = t.maxKey! :=
Impl.maxKey!_erase!_eq_of_not_compare_maxKey!_eq h he heq
theorem maxKey!_erase_le_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) :
cmp (t.erase k).maxKey! t.maxKey! |>.isLE :=
Impl.maxKey!_erase!_le_maxKey! h he
theorem maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
(t.insertIfNew k v).maxKey! =
t.maxKey?.elim k fun k' => if cmp k' k = .lt then k else k' :=
Impl.maxKey!_insertIfNew! h
theorem maxKey!_le_maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {k v} :
cmp t.maxKey! (t.insertIfNew k v).maxKey! |>.isLE :=
Impl.maxKey!_le_maxKey!_insertIfNew! h he (instOrd := ⟨cmp⟩)
theorem self_le_maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
cmp k (t.insertIfNew k v).maxKey! |>.isLE :=
Impl.self_le_maxKey!_insertIfNew! h (instOrd := ⟨cmp⟩)
theorem maxKey!_eq_getLast!_keys [TransCmp cmp] [Inhabited α] (h : t.WF) :
t.maxKey! = t.keys.getLast! :=
Impl.maxKey!_eq_getLast!_keys h (instOrd := ⟨cmp⟩)
@[simp]
theorem maxKey!_modify [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF) {k f} :
(t.modify k f).maxKey! = t.maxKey! :=
Impl.maxKey!_modify h
theorem maxKey!_alter_eq_self [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (t.alter k f).isEmpty = false) :
(t.alter k f).maxKey! = k ↔ (f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (cmp k' k).isLE :=
Impl.maxKey!_alter!_eq_self h he
namespace Const
variable {β : Type v} {t : Raw α β cmp}
theorem maxKey!_modify [TransCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (modify t k f).isEmpty = false) :
(modify t k f).maxKey! = if cmp t.maxKey! k = .eq then k else t.maxKey! :=
Impl.Const.maxKey!_modify h he
@[simp]
theorem maxKey!_modify_eq_maxKey! [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF) {k f} :
(modify t k f).maxKey! = t.maxKey! :=
Impl.Const.maxKey!_modify_eq_maxKey! h
@[simp]
theorem compare_maxKey!_modify_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k f} :
cmp (modify t k f).maxKey! t.maxKey! = .eq :=
Impl.Const.compare_maxKey!_modify_eq h (instOrd := ⟨cmp⟩)
theorem maxKey!_alter_eq_self [TransCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (alter t k f).isEmpty = false) :
(alter t k f).maxKey! = k ↔
(f (Const.get? t k)).isSome ∧ ∀ k', k' ∈ t → (cmp k' k).isLE :=
Impl.Const.maxKey!_alter!_eq_self h he
end Const
end Max
end Std.DTreeMap.Raw

View file

@ -5840,6 +5840,218 @@ theorem maxKey_alterKey_eq_self [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α
end Const
/-- Given a proof that the list is nonempty, returns the smallest key in an associative list. -/
def maxKey! [Ord α] [Inhabited α] (xs : List ((a : α) × β a)) : α :=
maxKey? xs |>.get!
theorem maxKey!_of_perm [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l l' : List ((a : α) × β a)} (hd : DistinctKeys l) (hp : l.Perm l') :
maxKey! l = maxKey! l' :=
letI : Ord α := .opposite inferInstance
minKey!_of_perm hd hp
theorem maxKey!_eq_get!_maxKey? [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} :
maxKey! l = (maxKey? l).get! :=
letI : Ord α := .opposite inferInstance
minKey!_eq_get!_minKey?
theorem maxKey_eq_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} {he} :
maxKey l he = maxKey! l :=
letI : Ord α := .opposite inferInstance
minKey_eq_minKey!
theorem maxKey?_eq_some_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (he : l.isEmpty = false) :
maxKey? l = some (maxKey! l) :=
letI : Ord α := .opposite inferInstance
minKey?_eq_some_minKey! he
theorem maxKey!_eq_default [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (h : l.isEmpty) :
maxKey! l = default :=
letI : Ord α := .opposite inferInstance
minKey!_eq_default h
theorem maxKey!_eq_iff_getKey?_eq_self_and_forall [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α]
[Inhabited α] {l : List ((a : α) × β a)} (hd : DistinctKeys l) (he : l.isEmpty = false) {km} :
maxKey! l = km ↔ getKey? km l = some km ∧ ∀ k, containsKey k l → (compare k km).isLE :=
letI : Ord α := .opposite inferInstance
minKey!_eq_iff_getKey?_eq_self_and_forall hd he
theorem maxKey!_eq_some_iff_mem_and_forall [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α]
[LawfulEqOrd α] [Inhabited α] {l : List ((a : α) × β a)} (hd : DistinctKeys l)
(he : l.isEmpty = false) {km} :
maxKey! l = km ↔ containsKey km l ∧ ∀ k, containsKey k l → (compare k km).isLE :=
letI : Ord α := .opposite inferInstance
minKey!_eq_some_iff_mem_and_forall hd he
theorem maxKey!_insertEntry [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) {k v} :
(insertEntry k v l |> maxKey!) =
((maxKey? l).elim k fun k' => if compare k' k |>.isLE then k else k') :=
letI : Ord α := .opposite inferInstance
minKey!_insertEntry hd
theorem maxKey!_le_maxKey!_insertEntry [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) (he : l.isEmpty = false) {k v} :
compare (maxKey! l) (insertEntry k v l |> maxKey!) |>.isLE :=
letI : Ord α := .opposite inferInstance
minKey!_insertEntry_le_minKey! hd he
theorem self_le_maxKey!_insertEntry [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) {k v} :
compare k (insertEntry k v l |> maxKey!) |>.isLE :=
letI : Ord α := .opposite inferInstance
minKey!_insertEntry_le_self hd
theorem containsKey_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) (he : l.isEmpty = false) :
containsKey (maxKey! l) l :=
letI : Ord α := .opposite inferInstance
containsKey_minKey! hd he
theorem le_maxKey!_of_containsKey [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) {k} (hc : containsKey k l) :
compare k (maxKey! l) |>.isLE :=
letI : Ord α := .opposite inferInstance
minKey!_le_of_containsKey hd hc
theorem maxKey!_le [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) (he : l.isEmpty = false) {k} :
(compare (maxKey! l) k).isLE ↔ (∀ k', containsKey k' l → (compare k' k).isLE) :=
letI : Ord α := .opposite inferInstance
le_minKey! hd he
theorem getKey?_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) (he : l.isEmpty = false) :
getKey? (maxKey! l) l = some (maxKey! l) :=
letI : Ord α := .opposite inferInstance
getKey?_minKey! hd he
theorem getKey_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) {he} :
getKey (maxKey! l) l he = maxKey! l :=
letI : Ord α := .opposite inferInstance
getKey_minKey! hd
theorem getKey_maxKey!_eq_maxKey [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) {he} :
getKey (maxKey! l) l he = maxKey l (isEmpty_eq_false_of_containsKey he) :=
letI : Ord α := .opposite inferInstance
getKey_minKey!_eq_minKey hd
theorem getKey!_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) (he : l.isEmpty = false) :
getKey! (maxKey! l) l = maxKey! l :=
letI : Ord α := .opposite inferInstance
getKey!_minKey! hd he
theorem getKeyD_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) (he : l.isEmpty = false) {fallback} :
getKeyD (maxKey! l) l fallback = maxKey! l :=
letI : Ord α := .opposite inferInstance
getKeyD_minKey! hd he
theorem maxKey!_eraseKey_eq_iff_beq_maxKey_eq_false [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α]
[Inhabited α] {l : List ((a : α) × β a)} (hd : DistinctKeys l) {k}
(he : (eraseKey k l).isEmpty = false) :
(eraseKey k l |> maxKey!) = maxKey! l ↔ (k == (maxKey! l)) = false :=
letI : Ord α := .opposite inferInstance
minKey!_eraseKey_eq_iff_beq_minKey_eq_false hd he
theorem maxKey!_eraseKey_eq_iff_beq_maxKey!_eq_false [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α]
[Inhabited α] {l : List ((a : α) × β a)} (hd : DistinctKeys l) {k}
(he : (eraseKey k l).isEmpty = false) :
(eraseKey k l |> maxKey!) = maxKey! l ↔ (k == (maxKey! l)) = false :=
letI : Ord α := .opposite inferInstance
minKey!_eraseKey_eq_iff_beq_minKey!_eq_false hd he
theorem maxKey!_eraseKey_eq_of_beq_maxKey!_eq_false [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α]
[Inhabited α] {l : List ((a : α) × β a)} (hd : DistinctKeys l) {k}
(he : (eraseKey k l).isEmpty = false) : (heq : (k == maxKey! l) = false) →
(eraseKey k l |> maxKey!) = maxKey! l :=
letI : Ord α := .opposite inferInstance
minKey!_eraseKey_eq_of_beq_minKey!_eq_false hd he
theorem maxKey!_erase_le_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) {k} (he : (eraseKey k l).isEmpty = false) :
compare (eraseKey k l |> maxKey!) (maxKey! l) |>.isLE :=
letI : Ord α := .opposite inferInstance
minKey!_le_minKey!_erase hd he
theorem maxKey!_insertEntryIfNew [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) {k v} :
(insertEntryIfNew k v l |> maxKey!) =
(maxKey? l).elim k fun k' => if compare k' k = .lt then k else k' :=
letI : Ord α := .opposite inferInstance
minKey!_insertEntryIfNew hd
theorem maxKey!_le_maxKey!_insertEntryIfNew [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α]
[Inhabited α] {l : List ((a : α) × β a)} (hd : DistinctKeys l) (he : l.isEmpty = false) {k v} :
compare (maxKey! l) (insertEntryIfNew k v l |> maxKey!) |>.isLE :=
letI : Ord α := .opposite inferInstance
minKey!_insertEntryIfNew_le_minKey! hd he
theorem self_le_maxKey!_insertEntryIfNew [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l) {k v} :
compare k (insertEntryIfNew k v l |> maxKey!) |>.isLE :=
letI : Ord α := .opposite inferInstance
minKey!_insertEntryIfNew_le_self hd
theorem maxKey!_eq_getLast!_keys [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((a : α) × β a)} (hd : DistinctKeys l)
(ho : l.Pairwise fun a b => compare a.1 b.1 = .lt) :
maxKey! l = (keys l).getLast! := by
simp only [List.getLast!_eq_getLast?_getD, maxKey!_eq_get!_maxKey?,
Option.get!_eq_getD, maxKey?_eq_getLast?_keys hd ho]
theorem maxKey!_modifyKey [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [LawfulEqOrd α]
[Inhabited α] {l : List ((a : α) × β a)} (hd : DistinctKeys l) {k f} :
(modifyKey k f l |> maxKey!) = maxKey! l :=
letI : Ord α := .opposite inferInstance
minKey!_modifyKey hd
theorem maxKey!_alterKey_eq_self [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [LawfulEqOrd α]
[Inhabited α] {l : List ((a : α) × β a)} (hd : DistinctKeys l) {k f}
(he : (alterKey k f l).isEmpty = false) :
(alterKey k f l |> maxKey!) = k ↔
(f (getValueCast? k l)).isSome ∧ ∀ k', containsKey k' l → (compare k' k).isLE :=
letI : Ord α := .opposite inferInstance
minKey!_alterKey_eq_self hd he
namespace Const
variable {β : Type v}
theorem maxKey!_modifyKey [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((_ : α) × β)} (hd : DistinctKeys l) {k f} (he : (modifyKey k f l).isEmpty = false) :
(modifyKey k f l |> maxKey!) = if (maxKey! l) == k then k else (maxKey! l) :=
letI : Ord α := .opposite inferInstance
minKey!_modifyKey hd he
theorem maxKey!_modifyKey_eq_maxKey! [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [LawfulEqOrd α]
[Inhabited α] {l : List ((_ : α) × β)} (hd : DistinctKeys l) {k f} :
(modifyKey k f l |> maxKey!) = maxKey! l :=
letI : Ord α := .opposite inferInstance
minKey!_modifyKey_eq_minKey! hd
theorem maxKey!_modifyKey_beq [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((_ : α) × β)} (hd : DistinctKeys l) {k f} :
(modifyKey k f l |> maxKey!) == (maxKey! l) :=
letI : Ord α := .opposite inferInstance
minKey!_modifyKey_beq hd
theorem maxKey!_alterKey_eq_self [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α]
{l : List ((_ : α) × β)} (hd : DistinctKeys l) {k f} (he : (alterKey k f l).isEmpty = false):
(alterKey k f l |> maxKey!) = k ↔
(f (getValue? k l)).isSome ∧ ∀ k', containsKey k' l → (compare k' k).isLE :=
letI : Ord α := .opposite inferInstance
minKey!_alterKey_eq_self hd he
end Const
end Max
end Std.Internal.List

View file

@ -2073,6 +2073,10 @@ theorem minKey?_eq_some_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty =
t.minKey? = some t.minKey! :=
DTreeMap.minKey?_eq_some_minKey! he
theorem minKey_eq_minKey! [TransCmp cmp] [Inhabited α] {he : t.isEmpty = false} :
t.minKey he = t.minKey! :=
DTreeMap.minKey_eq_minKey!
theorem minKey!_eq_default [TransCmp cmp] [Inhabited α] (he : t.isEmpty) :
t.minKey! = default :=
DTreeMap.minKey!_eq_default he
@ -2088,16 +2092,16 @@ theorem minKey!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inh
DTreeMap.minKey!_eq_some_iff_mem_and_forall he
theorem minKey!_insert [TransCmp cmp] [Inhabited α] {k v} :
(t.insert k v |>.minKey!) =
(t.insert k v).minKey! =
(t.minKey?.elim k fun k' => if cmp k k' |>.isLE then k else k') :=
DTreeMap.minKey!_insert
theorem minKey!_insert_le_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k v} :
cmp (t.insert k v |>.minKey!) t.minKey! |>.isLE :=
cmp (t.insert k v).minKey! t.minKey! |>.isLE :=
DTreeMap.minKey!_insert_le_minKey! he
theorem minKey!_insert_le_self [TransCmp cmp] [Inhabited α] {k v} :
cmp (t.insert k v |>.minKey!) k |>.isLE :=
cmp (t.insert k v).minKey! k |>.isLE :=
DTreeMap.minKey!_insert_le_self
theorem contains_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
@ -2143,25 +2147,25 @@ theorem getKeyD_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {
theorem minKey!_erase_eq_of_not_compare_minKey!_eq [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.minKey! = .eq) :
(t.erase k |>.minKey!) = t.minKey! :=
(t.erase k).minKey! = t.minKey! :=
DTreeMap.minKey!_erase_eq_of_not_compare_minKey!_eq he heq
theorem minKey!_le_minKey!_erase [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) :
cmp t.minKey! (t.erase k |>.minKey!) |>.isLE :=
cmp t.minKey! (t.erase k).minKey! |>.isLE :=
DTreeMap.minKey!_le_minKey!_erase he
theorem minKey!_insertIfNew [TransCmp cmp] [Inhabited α] {k v} :
(t.insertIfNew k v |>.minKey!) =
(t.insertIfNew k v).minKey! =
t.minKey?.elim k fun k' => if cmp k k' = .lt then k else k' :=
DTreeMap.minKey!_insertIfNew
theorem minKey!_insertIfNew_le_minKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k v} :
cmp (t.insertIfNew k v |>.minKey!) t.minKey! |>.isLE :=
cmp (t.insertIfNew k v).minKey! t.minKey! |>.isLE :=
DTreeMap.minKey!_insertIfNew_le_minKey! he
theorem minKey!_insertIfNew_le_self [TransCmp cmp] [Inhabited α] {k v} :
cmp (t.insertIfNew k v |>.minKey!) k |>.isLE :=
cmp (t.insertIfNew k v).minKey! k |>.isLE :=
DTreeMap.minKey!_insertIfNew_le_self
theorem minKey!_eq_head!_keys [TransCmp cmp] [Inhabited α] :
@ -2170,22 +2174,22 @@ theorem minKey!_eq_head!_keys [TransCmp cmp] [Inhabited α] :
theorem minKey!_modify [TransCmp cmp] [Inhabited α] {k f}
(he : (modify t k f).isEmpty = false) :
(modify t k f |> minKey!) = if cmp t.minKey! k = .eq then k else t.minKey! :=
(modify t k f).minKey! = if cmp t.minKey! k = .eq then k else t.minKey! :=
DTreeMap.Const.minKey!_modify he
@[simp]
theorem minKey!_modify_eq_minKey! [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] {k f} :
(modify t k f |>.minKey!) = t.minKey! :=
(modify t k f).minKey! = t.minKey! :=
DTreeMap.Const.minKey!_modify_eq_minKey!
@[simp]
theorem compare_minKey!_modify_eq [TransCmp cmp] [Inhabited α] {k f} :
cmp (modify t k f |> minKey!) t.minKey! = .eq :=
cmp (modify t k f).minKey! t.minKey! = .eq :=
DTreeMap.Const.compare_minKey!_modify_eq
theorem minKey!_alter_eq_self [TransCmp cmp] [Inhabited α] {k f}
(he : (alter t k f).isEmpty = false) :
(alter t k f |>.minKey!) = k ↔
(alter t k f).minKey! = k ↔
(f (get? t k)).isSome ∧ ∀ k', k' ∈ t → (cmp k k').isLE :=
DTreeMap.Const.minKey!_alter_eq_self he
@ -2624,6 +2628,129 @@ theorem maxKey_alter_eq_self [TransCmp cmp] {k f he} :
(f t[k]?).isSome ∧ ∀ k', k' ∈ t → (cmp k' k).isLE :=
DTreeMap.Const.maxKey_alter_eq_self
theorem maxKey?_eq_some_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.maxKey? = some t.maxKey! :=
DTreeMap.maxKey?_eq_some_maxKey! he
theorem maxKey_eq_maxKey! [TransCmp cmp] [Inhabited α] {he : t.isEmpty = false} :
t.maxKey he = t.maxKey! :=
DTreeMap.maxKey_eq_maxKey!
theorem maxKey!_eq_default [TransCmp cmp] [Inhabited α] (he : t.isEmpty) :
t.maxKey! = default :=
DTreeMap.maxKey!_eq_default he
theorem maxKey!_eq_iff_getKey?_eq_self_and_forall [TransCmp cmp] [Inhabited α]
(he : t.isEmpty = false) {km} :
t.maxKey! = km ↔ t.getKey? km = some km ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
DTreeMap.maxKey!_eq_iff_getKey?_eq_self_and_forall he
theorem maxKey!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α]
(he : t.isEmpty = false) {km} :
t.maxKey! = km ↔ km ∈ t ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
DTreeMap.maxKey!_eq_some_iff_mem_and_forall he
theorem maxKey!_insert [TransCmp cmp] [Inhabited α] {k v} :
(t.insert k v).maxKey! =
(t.maxKey?.elim k fun k' => if cmp k' k |>.isLE then k else k') :=
DTreeMap.maxKey!_insert
theorem maxKey!_le_maxKey!_insert [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k v} :
cmp t.maxKey! (t.insert k v).maxKey! |>.isLE :=
DTreeMap.maxKey!_le_maxKey!_insert he
theorem self_le_maxKey!_insert [TransCmp cmp] [Inhabited α] {k v} :
cmp k (t.insert k v).maxKey! |>.isLE :=
DTreeMap.self_le_maxKey!_insert
theorem contains_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.contains t.maxKey! :=
DTreeMap.contains_maxKey! he
theorem maxKey!_mem [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.maxKey! ∈ t :=
DTreeMap.maxKey!_mem he
theorem le_maxKey!_of_contains [TransCmp cmp] [Inhabited α] {k} (hc : t.contains k) :
cmp k t.maxKey! |>.isLE :=
DTreeMap.le_maxKey!_of_contains hc
theorem le_maxKey!_of_mem [TransCmp cmp] [Inhabited α] {k} (hc : k ∈ t) :
cmp k t.maxKey! |>.isLE :=
DTreeMap.le_maxKey!_of_mem hc
theorem maxKey!_le [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k} :
(cmp t.maxKey! k).isLE ↔ (∀ k', k' ∈ t → (cmp k' k).isLE) :=
DTreeMap.maxKey!_le he
theorem getKey?_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.getKey? t.maxKey! = some t.maxKey! :=
DTreeMap.getKey?_maxKey! he
theorem getKey_maxKey! [TransCmp cmp] [Inhabited α] {hc} :
t.getKey t.maxKey! hc = t.maxKey! :=
DTreeMap.getKey_maxKey!
@[simp]
theorem getKey_maxKey!_eq_maxKey [TransCmp cmp] [Inhabited α] {hc} :
t.getKey t.maxKey! hc = t.maxKey (isEmpty_eq_false_of_contains hc) :=
DTreeMap.getKey_maxKey!_eq_maxKey
theorem getKey!_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.getKey! t.maxKey! = t.maxKey! :=
DTreeMap.getKey!_maxKey! he
theorem getKeyD_maxKey! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {fallback} :
t.getKeyD t.maxKey! fallback = t.maxKey! :=
DTreeMap.getKeyD_maxKey! he
theorem maxKey!_erase_eq_of_not_compare_maxKey!_eq [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.maxKey! = .eq) :
(t.erase k).maxKey! = t.maxKey! :=
DTreeMap.maxKey!_erase_eq_of_not_compare_maxKey!_eq he heq
theorem maxKey!_erase_le_maxKey! [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) :
cmp (t.erase k).maxKey! t.maxKey! |>.isLE :=
DTreeMap.maxKey!_erase_le_maxKey! he
theorem maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] {k v} :
(t.insertIfNew k v).maxKey! =
t.maxKey?.elim k fun k' => if cmp k' k = .lt then k else k' :=
DTreeMap.maxKey!_insertIfNew
theorem maxKey!_le_maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k v} :
cmp t.maxKey! (t.insertIfNew k v).maxKey! |>.isLE :=
DTreeMap.maxKey!_le_maxKey!_insertIfNew he
theorem self_le_maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] {k v} :
cmp k (t.insertIfNew k v).maxKey! |>.isLE :=
DTreeMap.self_le_maxKey!_insertIfNew
theorem maxKey!_eq_getLast!_keys [TransCmp cmp] [Inhabited α] :
t.maxKey! = t.keys.getLast! :=
DTreeMap.maxKey!_eq_getLast!_keys
theorem maxKey!_modify [TransCmp cmp] [Inhabited α] {k f}
(he : (modify t k f).isEmpty = false) :
(modify t k f).maxKey! = if cmp t.maxKey! k = .eq then k else t.maxKey! :=
DTreeMap.Const.maxKey!_modify he
@[simp]
theorem maxKey!_modify_eq_maxKey! [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] {k f} :
(modify t k f).maxKey! = t.maxKey! :=
DTreeMap.Const.maxKey!_modify_eq_maxKey!
@[simp]
theorem compare_maxKey!_modify_eq [TransCmp cmp] [Inhabited α] {k f} :
cmp (modify t k f).maxKey! t.maxKey! = .eq :=
DTreeMap.Const.compare_maxKey!_modify_eq
theorem maxKey!_alter_eq_self [TransCmp cmp] [Inhabited α] {k f}
(he : (alter t k f).isEmpty = false) :
(alter t k f).maxKey! = k ↔
(f (get? t k)).isSome ∧ ∀ k', k' ∈ t → (cmp k' k).isLE :=
DTreeMap.Const.maxKey!_alter_eq_self he
end Max

View file

@ -1968,17 +1968,17 @@ theorem minKey!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inh
DTreeMap.Raw.minKey!_eq_some_iff_mem_and_forall h he
theorem minKey!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
(t.insert k v |>.minKey!) =
(t.insert k v).minKey! =
(t.minKey?.elim k fun k' => if cmp k k' |>.isLE then k else k') :=
DTreeMap.Raw.minKey!_insert h
theorem minKey!_insert_le_minKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false)
{k v} :
cmp (t.insert k v |>.minKey!) t.minKey! |>.isLE :=
cmp (t.insert k v).minKey! t.minKey! |>.isLE :=
DTreeMap.Raw.minKey!_insert_le_minKey! h he
theorem minKey!_insert_le_self [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
cmp (t.insert k v |>.minKey!) k |>.isLE :=
cmp (t.insert k v).minKey! k |>.isLE :=
DTreeMap.Raw.minKey!_insert_le_self h
theorem contains_minKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
@ -2019,26 +2019,26 @@ theorem getKeyD_minKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty
theorem minKey!_erase_eq_of_not_compare_minKey!_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.minKey! = .eq) :
(t.erase k |>.minKey!) = t.minKey! :=
(t.erase k).minKey! = t.minKey! :=
DTreeMap.Raw.minKey!_erase_eq_of_not_compare_minKey!_eq h he heq
theorem minKey!_le_minKey!_erase [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) :
cmp t.minKey! (t.erase k |>.minKey!) |>.isLE :=
cmp t.minKey! (t.erase k).minKey! |>.isLE :=
DTreeMap.Raw.minKey!_le_minKey!_erase h he
theorem minKey!_insertIfNew [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
(t.insertIfNew k v |>.minKey!) =
(t.insertIfNew k v).minKey! =
t.minKey?.elim k fun k' => if cmp k k' = .lt then k else k' :=
DTreeMap.Raw.minKey!_insertIfNew h
theorem minKey!_insertIfNew_le_minKey! [TransCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {k v} :
cmp (t.insertIfNew k v |>.minKey!) t.minKey! |>.isLE :=
cmp (t.insertIfNew k v).minKey! t.minKey! |>.isLE :=
DTreeMap.Raw.minKey!_insertIfNew_le_minKey! h he
theorem minKey!_insertIfNew_le_self [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
cmp (t.insertIfNew k v |>.minKey!) k |>.isLE :=
cmp (t.insertIfNew k v).minKey! k |>.isLE :=
DTreeMap.Raw.minKey!_insertIfNew_le_self h
theorem minKey!_eq_head!_keys [TransCmp cmp] [Inhabited α] (h : t.WF) :
@ -2047,22 +2047,22 @@ theorem minKey!_eq_head!_keys [TransCmp cmp] [Inhabited α] (h : t.WF) :
theorem minKey!_modify [TransCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (modify t k f).isEmpty = false) :
(modify t k f |> minKey!) = if cmp t.minKey! k = .eq then k else t.minKey! :=
(modify t k f).minKey! = if cmp t.minKey! k = .eq then k else t.minKey! :=
DTreeMap.Raw.Const.minKey!_modify h he
@[simp]
theorem minKey!_modify_eq_minKey! [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF) {k f} :
(modify t k f |>.minKey!) = t.minKey! :=
(modify t k f).minKey! = t.minKey! :=
DTreeMap.Raw.Const.minKey!_modify_eq_minKey! h
@[simp]
theorem compare_minKey!_modify_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k f} :
cmp (modify t k f |> minKey!) t.minKey! = .eq :=
cmp (modify t k f).minKey! t.minKey! = .eq :=
DTreeMap.Raw.Const.compare_minKey!_modify_eq h
theorem minKey!_alter_eq_self [TransCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (alter t k f).isEmpty = false) :
(alter t k f |>.minKey!) = k ↔
(alter t k f).minKey! = k ↔
(f (get? t k)).isSome ∧ ∀ k', k' ∈ t → (cmp k k').isLE :=
DTreeMap.Raw.Const.minKey!_alter_eq_self h he
@ -2372,6 +2372,123 @@ theorem maxKey?_alter_eq_self [TransCmp cmp] (h : t.WF) {k f} :
(f (t.get? k)).isSome ∧ ∀ k', k' ∈ t → (cmp k' k).isLE :=
DTreeMap.Raw.Const.maxKey?_alter_eq_self h
theorem maxKey?_eq_some_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.maxKey? = some t.maxKey! :=
DTreeMap.Raw.maxKey?_eq_some_maxKey! h he
theorem maxKey!_eq_default [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty) :
t.maxKey! = default :=
DTreeMap.Raw.maxKey!_eq_default h he
theorem maxKey!_eq_iff_getKey?_eq_self_and_forall [TransCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {km} :
t.maxKey! = km ↔ t.getKey? km = some km ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
DTreeMap.Raw.maxKey!_eq_iff_getKey?_eq_self_and_forall h he
theorem maxKey!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {km} :
t.maxKey! = km ↔ km ∈ t ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
DTreeMap.Raw.maxKey!_eq_some_iff_mem_and_forall h he
theorem maxKey!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
(t.insert k v).maxKey! =
(t.maxKey?.elim k fun k' => if cmp k' k |>.isLE then k else k') :=
DTreeMap.Raw.maxKey!_insert h
theorem maxKey!_le_maxKey!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false)
{k v} :
cmp t.maxKey! (t.insert k v).maxKey! |>.isLE :=
DTreeMap.Raw.maxKey!_le_maxKey!_insert h he
theorem self_le_maxKey!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
cmp k (t.insert k v).maxKey! |>.isLE :=
DTreeMap.Raw.self_le_maxKey!_insert h
theorem contains_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.contains t.maxKey! :=
DTreeMap.Raw.contains_maxKey! h he
theorem maxKey!_mem [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.maxKey! ∈ t :=
DTreeMap.Raw.maxKey!_mem h he
theorem le_maxKey!_of_contains [TransCmp cmp] [Inhabited α] (h : t.WF) {k} (hc : t.contains k) :
cmp k t.maxKey! |>.isLE :=
DTreeMap.Raw.le_maxKey!_of_contains h hc
theorem le_maxKey!_of_mem [TransCmp cmp] [Inhabited α] (h : t.WF) {k} (hc : k ∈ t) :
cmp k t.maxKey! |>.isLE :=
DTreeMap.Raw.le_maxKey!_of_mem h hc
theorem maxKey!_le [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) {k} :
(cmp t.maxKey! k).isLE ↔ (∀ k', k' ∈ t → (cmp k' k).isLE) :=
DTreeMap.Raw.maxKey!_le h he
theorem getKey?_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.getKey? t.maxKey! = some t.maxKey! :=
DTreeMap.Raw.getKey?_maxKey! h he
theorem getKey_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) {hc} :
t.getKey t.maxKey! hc = t.maxKey! :=
DTreeMap.Raw.getKey_maxKey! h
theorem getKey!_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.getKey! t.maxKey! = t.maxKey! :=
DTreeMap.Raw.getKey!_maxKey! h he
theorem getKeyD_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) {fallback} :
t.getKeyD t.maxKey! fallback = t.maxKey! :=
DTreeMap.Raw.getKeyD_maxKey! h he
theorem maxKey!_erase_eq_of_not_compare_maxKey!_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.maxKey! = .eq) :
(t.erase k).maxKey! = t.maxKey! :=
DTreeMap.Raw.maxKey!_erase_eq_of_not_compare_maxKey!_eq h he heq
theorem maxKey!_erase_le_maxKey! [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) :
cmp (t.erase k).maxKey! t.maxKey! |>.isLE :=
DTreeMap.Raw.maxKey!_erase_le_maxKey! h he
theorem maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
(t.insertIfNew k v).maxKey! =
t.maxKey?.elim k fun k' => if cmp k' k = .lt then k else k' :=
DTreeMap.Raw.maxKey!_insertIfNew h
theorem maxKey!_le_maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {k v} :
cmp t.maxKey! (t.insertIfNew k v).maxKey! |>.isLE :=
DTreeMap.Raw.maxKey!_le_maxKey!_insertIfNew h he
theorem self_le_maxKey!_insertIfNew [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} :
cmp k (t.insertIfNew k v).maxKey! |>.isLE :=
DTreeMap.Raw.self_le_maxKey!_insertIfNew h
theorem maxKey!_eq_getLast!_keys [TransCmp cmp] [Inhabited α] (h : t.WF) :
t.maxKey! = t.keys.getLast! :=
DTreeMap.Raw.maxKey!_eq_getLast!_keys h
theorem maxKey!_modify [TransCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (modify t k f).isEmpty = false) :
(modify t k f).maxKey! = if cmp t.maxKey! k = .eq then k else t.maxKey! :=
DTreeMap.Raw.Const.maxKey!_modify h he
@[simp]
theorem maxKey!_modify_eq_maxKey! [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF) {k f} :
(modify t k f).maxKey! = t.maxKey! :=
DTreeMap.Raw.Const.maxKey!_modify_eq_maxKey! h
@[simp]
theorem compare_maxKey!_modify_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k f} :
cmp (modify t k f).maxKey! t.maxKey! = .eq :=
DTreeMap.Raw.Const.compare_maxKey!_modify_eq h
theorem maxKey!_alter_eq_self [TransCmp cmp] [Inhabited α] (h : t.WF) {k f}
(he : (alter t k f).isEmpty = false) :
(alter t k f).maxKey! = k ↔
(f (get? t k)).isSome ∧ ∀ k', k' ∈ t → (cmp k' k).isLE :=
DTreeMap.Raw.Const.maxKey!_alter_eq_self h he
end Max
end Std.TreeMap.Raw

View file

@ -800,6 +800,10 @@ theorem min?_le_min?_erase [TransCmp cmp] {k km kme} :
cmp km kme |>.isLE :=
TreeMap.minKey?_le_minKey?_erase
theorem min?_eq_head?_toList [TransCmp cmp] :
t.min? = t.toList.head? :=
TreeMap.minKey?_eq_head?_keys
theorem min_eq_get_min? [TransCmp cmp] {he} :
t.min he = t.min?.get (isSome_min?_iff_isEmpty_eq_false.mpr he) :=
TreeMap.minKey_eq_get_minKey?
@ -888,14 +892,18 @@ theorem min_le_min_erase [TransCmp cmp] {k he} :
(t.erase k |>.min he) |>.isLE :=
DTreeMap.minKey_le_minKey_erase
theorem min?_eq_head?_toList [TransCmp cmp] :
t.min? = t.toList.head? :=
TreeMap.minKey?_eq_head?_keys
theorem min_eq_head_toList [TransCmp cmp] {he} :
t.min he = t.toList.head (List.isEmpty_eq_false_iff.mp <| isEmpty_toList ▸ he) :=
DTreeMap.minKey_eq_head_keys
theorem min?_eq_some_min! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.min? = some t.min! :=
DTreeMap.minKey?_eq_some_minKey! he
theorem min_eq_min! [TransCmp cmp] [Inhabited α] {he : t.isEmpty = false} :
t.min he = t.min! :=
DTreeMap.minKey_eq_minKey!
theorem min!_eq_default [TransCmp cmp] [Inhabited α] (he : t.isEmpty) :
t.min! = default :=
DTreeMap.minKey!_eq_default he
@ -1060,10 +1068,6 @@ theorem minD_le_minD_erase [TransCmp cmp] {k}
cmp (t.minD fallback) (t.erase k |>.minD fallback) |>.isLE :=
TreeMap.minKeyD_le_minKeyD_erase he
theorem min_eq_head_toList [TransCmp cmp] {he} :
t.min he = t.toList.head (List.isEmpty_eq_false_iff.mp <| isEmpty_toList ▸ he) :=
DTreeMap.minKey_eq_head_keys
theorem minD_eq_headD_toList [TransCmp cmp] {fallback} :
t.minD fallback = t.toList.headD fallback :=
TreeMap.minKeyD_eq_headD_keys
@ -1294,6 +1298,97 @@ theorem max_eq_getLast_toList [TransCmp cmp] {he} :
t.max he = t.toList.getLast (List.isEmpty_eq_false_iff.mp <| isEmpty_toList ▸ he) :=
TreeMap.maxKey_eq_getLast_keys
theorem max?_eq_some_max! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.max? = some t.max! :=
DTreeMap.maxKey?_eq_some_maxKey! he
theorem max_eq_max! [TransCmp cmp] [Inhabited α] {he : t.isEmpty = false} :
t.max he = t.max! :=
DTreeMap.maxKey_eq_maxKey!
theorem max!_eq_default [TransCmp cmp] [Inhabited α] (he : t.isEmpty) :
t.max! = default :=
DTreeMap.maxKey!_eq_default he
theorem max!_eq_iff_get?_eq_self_and_forall [TransCmp cmp] [Inhabited α]
(he : t.isEmpty = false) {km} :
t.max! = km ↔ t.get? km = some km ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
DTreeMap.maxKey!_eq_iff_getKey?_eq_self_and_forall he
theorem max!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α]
(he : t.isEmpty = false) {km} :
t.max! = km ↔ km ∈ t ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
DTreeMap.maxKey!_eq_some_iff_mem_and_forall he
theorem max!_insert [TransCmp cmp] [Inhabited α] {k} :
(t.insert k |>.max!) =
t.max?.elim k fun k' => if cmp k' k = .lt then k else k' :=
DTreeMap.maxKey!_insertIfNew
theorem max!_le_max!_insert [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k} :
cmp t.max! (t.insert k |>.max!) |>.isLE :=
DTreeMap.maxKey!_le_maxKey!_insertIfNew he
theorem self_le_max!_insert [TransCmp cmp] [Inhabited α] {k} :
cmp k (t.insert k |>.max!) |>.isLE :=
DTreeMap.self_le_maxKey!_insertIfNew
theorem contains_max! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.contains t.max! :=
DTreeMap.contains_maxKey! he
theorem max!_mem [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.max! ∈ t :=
DTreeMap.maxKey!_mem he
theorem le_max!_of_contains [TransCmp cmp] [Inhabited α] {k} (hc : t.contains k) :
cmp k t.max! |>.isLE :=
DTreeMap.le_maxKey!_of_contains hc
theorem le_max!_of_mem [TransCmp cmp] [Inhabited α] {k} (hc : k ∈ t) :
cmp k t.max! |>.isLE :=
DTreeMap.le_maxKey!_of_mem hc
theorem max!_le [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {k} :
(cmp t.max! k).isLE ↔ (∀ k', k' ∈ t → (cmp k' k).isLE) :=
DTreeMap.maxKey!_le he
theorem get?_max! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.get? t.max! = some t.max! :=
DTreeMap.getKey?_maxKey! he
theorem get_max! [TransCmp cmp] [Inhabited α] {hc} :
t.get t.max! hc = t.max! :=
DTreeMap.getKey_maxKey!
@[simp]
theorem get_max!_eq_max [TransCmp cmp] [Inhabited α] {hc} :
t.get t.max! hc = t.max (isEmpty_eq_false_of_contains hc) :=
DTreeMap.getKey_maxKey!_eq_maxKey
theorem get!_max! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) :
t.get! t.max! = t.max! :=
DTreeMap.getKey!_maxKey! he
theorem getD_max! [TransCmp cmp] [Inhabited α] (he : t.isEmpty = false) {fallback} :
t.getD t.max! fallback = t.max! :=
DTreeMap.getKeyD_maxKey! he
theorem max!_erase_eq_of_not_compare_max!_eq [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.max! = .eq) :
(t.erase k |>.max!) = t.max! :=
DTreeMap.maxKey!_erase_eq_of_not_compare_maxKey!_eq he heq
theorem max!_erase_le_max! [TransCmp cmp] [Inhabited α] {k}
(he : (t.erase k).isEmpty = false) :
cmp (t.erase k |>.max!) t.max! |>.isLE :=
DTreeMap.maxKey!_erase_le_maxKey! he
theorem max!_eq_getLast!_toList [TransCmp cmp] [Inhabited α] :
t.max! = t.toList.getLast! :=
TreeMap.maxKey!_eq_getLast!_keys
end Max
end Std.TreeSet

View file

@ -1104,6 +1104,88 @@ theorem max?_eq_head?_toList [TransCmp cmp] (h : t.WF) :
t.max? = t.toList.getLast? :=
TreeMap.Raw.maxKey?_eq_getLast?_keys h
theorem max?_eq_some_max! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.max? = some t.max! :=
DTreeMap.Raw.maxKey?_eq_some_maxKey! h he
theorem max!_eq_default [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty) :
t.max! = default :=
DTreeMap.Raw.maxKey!_eq_default h he
theorem max!_eq_iff_get?_eq_self_and_forall [TransCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {km} :
t.max! = km ↔ t.get? km = some km ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
DTreeMap.Raw.maxKey!_eq_iff_getKey?_eq_self_and_forall h he
theorem max!_eq_some_iff_mem_and_forall [TransCmp cmp] [LawfulEqCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {km} :
t.max! = km ↔ km ∈ t ∧ ∀ k, k ∈ t → (cmp k km).isLE :=
DTreeMap.Raw.maxKey!_eq_some_iff_mem_and_forall h he
theorem max!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) {k} :
(t.insert k |>.max!) =
t.max?.elim k fun k' => if cmp k' k = .lt then k else k' :=
DTreeMap.Raw.maxKey!_insertIfNew h
theorem max!_le_max!_insert [TransCmp cmp] [Inhabited α] (h : t.WF)
(he : t.isEmpty = false) {k} :
cmp t.max! (t.insert k |>.max!) |>.isLE :=
DTreeMap.Raw.maxKey!_le_maxKey!_insertIfNew h he
theorem self_le_max!_insert [TransCmp cmp] [Inhabited α] (h : t.WF) {k} :
cmp k (t.insert k |>.max!) |>.isLE :=
DTreeMap.Raw.self_le_maxKey!_insertIfNew h
theorem contains_max! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.contains t.max! :=
DTreeMap.Raw.contains_maxKey! h he
theorem max!_mem [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.max! ∈ t :=
DTreeMap.Raw.maxKey!_mem h he
theorem le_max!_of_contains [TransCmp cmp] [Inhabited α] (h : t.WF) {k} (hc : t.contains k) :
cmp k t.max! |>.isLE :=
DTreeMap.Raw.le_maxKey!_of_contains h hc
theorem le_max!_of_mem [TransCmp cmp] [Inhabited α] (h : t.WF) {k} (hc : k ∈ t) :
cmp k t.max! |>.isLE :=
DTreeMap.Raw.le_maxKey!_of_mem h hc
theorem max!_le [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) {k} :
(cmp t.max! k).isLE ↔ (∀ k', k' ∈ t → (cmp k' k).isLE) :=
DTreeMap.Raw.maxKey!_le h he
theorem get?_max! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.get? t.max! = some t.max! :=
DTreeMap.Raw.getKey?_maxKey! h he
theorem get_max! [TransCmp cmp] [Inhabited α] (h : t.WF) {hc} :
t.get t.max! hc = t.max! :=
DTreeMap.Raw.getKey_maxKey! h
theorem get!_max! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) :
t.get! t.max! = t.max! :=
DTreeMap.Raw.getKey!_maxKey! h he
theorem getD_max! [TransCmp cmp] [Inhabited α] (h : t.WF) (he : t.isEmpty = false) {fallback} :
t.getD t.max! fallback = t.max! :=
DTreeMap.Raw.getKeyD_maxKey! h he
theorem max!_erase_eq_of_not_compare_max!_eq [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) (heq : ¬ cmp k t.max! = .eq) :
(t.erase k |>.max!) = t.max! :=
DTreeMap.Raw.maxKey!_erase_eq_of_not_compare_maxKey!_eq h he heq
theorem max!_erase_le_max! [TransCmp cmp] [Inhabited α] (h : t.WF) {k}
(he : (t.erase k).isEmpty = false) :
cmp (t.erase k |>.max!) t.max! |>.isLE :=
DTreeMap.Raw.maxKey!_erase_le_maxKey! h he
theorem max!_eq_getLast!_toList [TransCmp cmp] [Inhabited α] (h : t.WF) :
t.max! = t.toList.getLast! :=
TreeMap.Raw.maxKey!_eq_getLast!_keys h
end Max
end Std.TreeSet.Raw