Skip to content

Commit 556e960

Browse files
wkrozowskiTwoFX
andauthored
feat: add lemmas relating getMin/getMin?/getMin!/getMinD and insertion to the empty (D)TreeMap/TreeSet (#11231)
This PR adds several lemmas that relate `getMin`/`getMin?`/`getMin!`/`getMinD` and insertion to the empty (D)TreeMap/TreeSet and their extensional variants. --------- Co-authored-by: Markus Himmel <[email protected]>
1 parent 649d0b4 commit 556e960

File tree

11 files changed

+354
-0
lines changed

11 files changed

+354
-0
lines changed

src/Std/Data/DTreeMap/Internal/Lemmas.lean

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5948,6 +5948,94 @@ theorem isSome_minKey?_insert! [TransOrd α] (h : t.WF) {k v} :
59485948
(t.insert! k v).minKey?.isSome := by
59495949
simpa only [insert_eq_insert!] using isSome_minKey?_insert h
59505950

5951+
theorem minKey_insert_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) :
5952+
(t.insert k v h.balanced).impl.minKey (isEmpty_insert h) = k := by
5953+
revert he
5954+
simp_to_model [isEmpty, insert, minKey] using List.minKey_insertEntry_of_isEmpty
5955+
5956+
theorem minKey_insert!_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) :
5957+
(t.insert! k v).minKey (isEmpty_insert! h) = k := by
5958+
simpa only [insert_eq_insert!] using minKey_insert_of_isEmpty h he
5959+
5960+
theorem minKey?_insert_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) :
5961+
(t.insert k v h.balanced).impl.minKey? = some k := by
5962+
revert he
5963+
simp_to_model [isEmpty, insert, minKey?] using List.minKey?_insertEntry_of_isEmpty
5964+
5965+
theorem minKey?_insert!_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) :
5966+
(t.insert! k v).minKey? = some k := by
5967+
simpa only [insert_eq_insert!] using minKey?_insert_of_isEmpty h he
5968+
5969+
theorem minKey!_insert_of_isEmpty [TransOrd α] [Inhabited α] (h : t.WF) {k v} (he : t.isEmpty) :
5970+
(t.insert k v h.balanced).impl.minKey! = k := by
5971+
revert he
5972+
simp_to_model [isEmpty, insert, minKey!]
5973+
intro he
5974+
apply List.minKey!_insertEntry_of_isEmpty
5975+
· wf_trivial
5976+
· exact he
5977+
5978+
theorem minKey!_insert!_of_isEmpty [TransOrd α] [Inhabited α] (h : t.WF) {k v} (he : t.isEmpty) :
5979+
(t.insert! k v).minKey! = k := by
5980+
simpa only [insert_eq_insert!] using minKey!_insert_of_isEmpty h he
5981+
5982+
theorem minKeyD_insert_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) {fallback : α} :
5983+
(t.insert k v h.balanced).impl.minKeyD fallback = k := by
5984+
revert he
5985+
simp_to_model [isEmpty, insert, minKeyD]
5986+
intro he
5987+
apply List.minKeyD_insertEntry_of_isEmpty
5988+
· wf_trivial
5989+
· exact he
5990+
5991+
theorem minKeyD_insert!_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) {fallback : α} :
5992+
(t.insert! k v).minKeyD fallback = k := by
5993+
simpa only [insert_eq_insert!] using minKeyD_insert_of_isEmpty h he
5994+
5995+
theorem minKey_insertIfNew_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) :
5996+
(t.insertIfNew k v h.balanced).impl.minKey (isEmpty_insertIfNew h) = k := by
5997+
revert he
5998+
simp_to_model [isEmpty, insertIfNew, minKey] using List.minKey_insertEntryIfNew_of_isEmpty
5999+
6000+
theorem minKey_insertIfNew!_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) :
6001+
(t.insertIfNew! k v).minKey (isEmpty_insertIfNew! h) = k := by
6002+
simpa only [insertIfNew_eq_insertIfNew!] using minKey_insertIfNew_of_isEmpty h he
6003+
6004+
theorem minKey?_insertIfNew_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) :
6005+
(t.insertIfNew k v h.balanced).impl.minKey? = some k := by
6006+
revert he
6007+
simp_to_model [isEmpty, insertIfNew, minKey?] using List.minKey?_insertEntryIfNew_of_isEmpty
6008+
6009+
theorem minKey?_insertIfNew!_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) :
6010+
(t.insertIfNew! k v).minKey? = some k := by
6011+
simpa only [insertIfNew_eq_insertIfNew!] using minKey?_insertIfNew_of_isEmpty h he
6012+
6013+
theorem minKey!_insertIfNew_of_isEmpty [TransOrd α] [Inhabited α] (h : t.WF) {k v} (he : t.isEmpty) :
6014+
(t.insertIfNew k v h.balanced).impl.minKey! = k := by
6015+
revert he
6016+
simp_to_model [isEmpty, insertIfNew, minKey!]
6017+
intro he
6018+
apply List.minKey!_insertEntryIfNew_of_isEmpty
6019+
· wf_trivial
6020+
· exact he
6021+
6022+
theorem minKey!_insertIfNew!_of_isEmpty [TransOrd α] [Inhabited α] (h : t.WF) {k v} (he : t.isEmpty) :
6023+
(t.insertIfNew! k v).minKey! = k := by
6024+
simpa only [insertIfNew_eq_insertIfNew!] using minKey!_insertIfNew_of_isEmpty h he
6025+
6026+
theorem minKeyD_insertIfNew_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) {fallback : α} :
6027+
(t.insertIfNew k v h.balanced).impl.minKeyD fallback = k := by
6028+
revert he
6029+
simp_to_model [isEmpty, insertIfNew, minKeyD]
6030+
intro he
6031+
apply List.minKeyD_insertEntryIfNew_of_isEmpty
6032+
· wf_trivial
6033+
· exact he
6034+
6035+
theorem minKeyD_insertIfNew!_of_isEmpty [TransOrd α] (h : t.WF) {k v} (he : t.isEmpty) {fallback : α} :
6036+
(t.insertIfNew! k v).minKeyD fallback = k := by
6037+
simpa only [insertIfNew_eq_insertIfNew!] using minKeyD_insertIfNew_of_isEmpty h he
6038+
59516039
theorem minKey?_insert_le_minKey? [TransOrd α] (h : t.WF) {k v km kmi} :
59526040
(hkm : t.minKey? = some km) →
59536041
(hkmi : (t.insert k v h.balanced |>.impl.minKey? |>.get <| isSome_minKey?_insert h) = kmi) →

src/Std/Data/DTreeMap/Lemmas.lean

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3619,6 +3619,38 @@ theorem isSome_minKey?_iff_isEmpty_eq_false [TransCmp cmp] :
36193619
(t.insert k v).minKey?.isSome :=
36203620
Impl.isSome_minKey?_insert t.wf
36213621

3622+
theorem minKey_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
3623+
(t.insert k v).minKey isEmpty_insert = k :=
3624+
Impl.minKey_insert_of_isEmpty t.wf he
3625+
3626+
theorem minKey?_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
3627+
(t.insert k v).minKey? = some k :=
3628+
Impl.minKey?_insert_of_isEmpty t.wf he
3629+
3630+
theorem minKey!_insert_of_isEmpty [TransCmp cmp] [Inhabited α] {k v} (he : t.isEmpty) :
3631+
(t.insert k v).minKey! = k :=
3632+
Impl.minKey!_insert_of_isEmpty t.wf he
3633+
3634+
theorem minKeyD_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) {fallback : α} :
3635+
(t.insert k v).minKeyD fallback = k :=
3636+
Impl.minKeyD_insert_of_isEmpty t.wf he
3637+
3638+
theorem minKey_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
3639+
(t.insertIfNew k v).minKey isEmpty_insertIfNew = k :=
3640+
Impl.minKey_insertIfNew_of_isEmpty t.wf he
3641+
3642+
theorem minKey?_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
3643+
(t.insertIfNew k v).minKey? = some k :=
3644+
Impl.minKey?_insertIfNew_of_isEmpty t.wf he
3645+
3646+
theorem minKey!_insertIfNew_of_isEmpty [TransCmp cmp] [Inhabited α] {k v} (he : t.isEmpty) :
3647+
(t.insertIfNew k v).minKey! = k :=
3648+
Impl.minKey!_insertIfNew_of_isEmpty t.wf he
3649+
3650+
theorem minKeyD_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) {fallback : α} :
3651+
(t.insertIfNew k v).minKeyD fallback = k :=
3652+
Impl.minKeyD_insertIfNew_of_isEmpty t.wf he
3653+
36223654
theorem minKey?_insert_le_minKey? [TransCmp cmp] {k v km kmi} :
36233655
(hkm : t.minKey? = some km) →
36243656
(hkmi : (t.insert k v |>.minKey? |>.get isSome_minKey?_insert) = kmi) →

src/Std/Data/DTreeMap/Raw/Lemmas.lean

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3780,6 +3780,30 @@ theorem isSome_minKey?_insert [TransCmp cmp] (h : t.WF) {k v} :
37803780
(t.insert k v).minKey?.isSome :=
37813781
Impl.isSome_minKey?_insert! h
37823782

3783+
theorem minKey?_insert_of_isEmpty [TransCmp cmp] (h : t.WF) {k v} (he : t.isEmpty) :
3784+
(t.insert k v).minKey? = some k :=
3785+
Impl.minKey?_insert!_of_isEmpty h he
3786+
3787+
theorem minKey!_insert_of_isEmpty [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} (he : t.isEmpty) :
3788+
(t.insert k v).minKey! = k :=
3789+
Impl.minKey!_insert!_of_isEmpty h he
3790+
3791+
theorem minKeyD_insert_of_isEmpty [TransCmp cmp] (h : t.WF) {k v} (he : t.isEmpty) {fallback : α} :
3792+
(t.insert k v).minKeyD fallback = k :=
3793+
Impl.minKeyD_insert!_of_isEmpty h he
3794+
3795+
theorem minKey?_insertIfNew_of_isEmpty [TransCmp cmp] (h : t.WF) {k v} (he : t.isEmpty) :
3796+
(t.insertIfNew k v).minKey? = some k :=
3797+
Impl.minKey?_insertIfNew!_of_isEmpty h he
3798+
3799+
theorem minKey!_insertIfNew_of_isEmpty [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} (he : t.isEmpty) :
3800+
(t.insertIfNew k v).minKey! = k :=
3801+
Impl.minKey!_insertIfNew!_of_isEmpty h he
3802+
3803+
theorem minKeyD_insertIfNew_of_isEmpty [TransCmp cmp] (h : t.WF) {k v} (he : t.isEmpty) {fallback : α} :
3804+
(t.insertIfNew k v).minKeyD fallback = k :=
3805+
Impl.minKeyD_insertIfNew!_of_isEmpty h he
3806+
37833807
theorem minKey?_insert_le_minKey? [TransCmp cmp] (h : t.WF) {k v km kmi} :
37843808
(hkm : t.minKey? = some km) →
37853809
(hkmi : (t.insert k v |>.minKey? |>.get <| isSome_minKey?_insert h) = kmi) →

src/Std/Data/ExtDTreeMap/Lemmas.lean

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3407,6 +3407,42 @@ theorem isSome_minKey?_iff_ne_empty [TransCmp cmp] :
34073407
(t.insert k v).minKey?.isSome :=
34083408
t.inductionOn fun _ => DTreeMap.isSome_minKey?_insert
34093409

3410+
theorem minKey_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
3411+
(t.insert k v).minKey insert_ne_empty = k := by
3412+
induction t
3413+
case mk a =>
3414+
exact DTreeMap.minKey_insert_of_isEmpty he
3415+
3416+
theorem minKey?_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
3417+
(t.insert k v).minKey? = some k :=
3418+
t.inductionOn (fun _ he => DTreeMap.minKey?_insert_of_isEmpty he) he
3419+
3420+
theorem minKey!_insert_of_isEmpty [TransCmp cmp] [Inhabited α] {k v} (he : t.isEmpty) :
3421+
(t.insert k v).minKey! = k :=
3422+
t.inductionOn (fun _ he => DTreeMap.minKey!_insert_of_isEmpty he) he
3423+
3424+
theorem minKeyD_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) {fallback : α} :
3425+
(t.insert k v).minKeyD fallback = k :=
3426+
t.inductionOn (fun _ he => DTreeMap.minKeyD_insert_of_isEmpty he) he
3427+
3428+
theorem minKey_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
3429+
(t.insertIfNew k v).minKey insertIfNew_ne_empty = k := by
3430+
induction t
3431+
case mk a =>
3432+
exact DTreeMap.minKey_insertIfNew_of_isEmpty he
3433+
3434+
theorem minKey?_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
3435+
(t.insertIfNew k v).minKey? = some k :=
3436+
t.inductionOn (fun _ he => DTreeMap.minKey?_insertIfNew_of_isEmpty he) he
3437+
3438+
theorem minKey!_insertIfNew_of_isEmpty [TransCmp cmp] [Inhabited α] {k v} (he : t.isEmpty) :
3439+
(t.insertIfNew k v).minKey! = k :=
3440+
t.inductionOn (fun _ he => DTreeMap.minKey!_insertIfNew_of_isEmpty he) he
3441+
3442+
theorem minKeyD_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) {fallback : α} :
3443+
(t.insertIfNew k v).minKeyD fallback = k := t.inductionOn
3444+
(fun _ he => DTreeMap.minKeyD_insertIfNew_of_isEmpty he) he
3445+
34103446
theorem minKey?_insert_le_minKey? [TransCmp cmp] {k v km kmi} :
34113447
(hkm : t.minKey? = some km) →
34123448
(hkmi : (t.insert k v |>.minKey? |>.get isSome_minKey?_insert) = kmi) →

src/Std/Data/ExtTreeMap/Lemmas.lean

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2081,6 +2081,38 @@ theorem isSome_minKey?_iff_ne_empty [TransCmp cmp] :
20812081
(t.insert k v).minKey?.isSome :=
20822082
ExtDTreeMap.isSome_minKey?_insert
20832083

2084+
theorem minKey_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
2085+
(t.insert k v).minKey insert_ne_empty = k :=
2086+
ExtDTreeMap.minKey_insert_of_isEmpty he
2087+
2088+
theorem minKey?_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
2089+
(t.insert k v).minKey? = some k :=
2090+
ExtDTreeMap.minKey?_insert_of_isEmpty he
2091+
2092+
theorem minKey!_insert_of_isEmpty [TransCmp cmp] [Inhabited α] {k v} (he : t.isEmpty) :
2093+
(t.insert k v).minKey! = k :=
2094+
ExtDTreeMap.minKey!_insert_of_isEmpty he
2095+
2096+
theorem minKeyD_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) {fallback : α} :
2097+
(t.insert k v).minKeyD fallback = k :=
2098+
ExtDTreeMap.minKeyD_insert_of_isEmpty he
2099+
2100+
theorem minKey_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
2101+
(t.insertIfNew k v).minKey insertIfNew_ne_empty = k :=
2102+
ExtDTreeMap.minKey_insertIfNew_of_isEmpty he
2103+
2104+
theorem minKey?_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
2105+
(t.insertIfNew k v).minKey? = some k :=
2106+
ExtDTreeMap.minKey?_insertIfNew_of_isEmpty he
2107+
2108+
theorem minKey!_insertIfNew_of_isEmpty [TransCmp cmp] [Inhabited α] {k v} (he : t.isEmpty) :
2109+
(t.insertIfNew k v).minKey! = k :=
2110+
ExtDTreeMap.minKey!_insertIfNew_of_isEmpty he
2111+
2112+
theorem minKeyD_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) {fallback : α} :
2113+
(t.insertIfNew k v).minKeyD fallback = k :=
2114+
ExtDTreeMap.minKeyD_insertIfNew_of_isEmpty he
2115+
20842116
theorem minKey?_insert_le_minKey? [TransCmp cmp] {k v km kmi} :
20852117
(hkm : t.minKey? = some km) →
20862118
(hkmi : (t.insert k v |>.minKey? |>.get isSome_minKey?_insert) = kmi) →

src/Std/Data/ExtTreeSet/Lemmas.lean

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,22 @@ theorem isSome_min?_insert [TransCmp cmp] {k} :
887887
(t.insert k).min?.isSome :=
888888
ExtTreeMap.isSome_minKey?_insertIfNew
889889

890+
theorem min_insert_of_isEmpty [TransCmp cmp] {k} (he : t.isEmpty) :
891+
(t.insert k).min insert_ne_empty = k :=
892+
ExtTreeMap.minKey_insertIfNew_of_isEmpty he
893+
894+
theorem min?_insert_of_isEmpty [TransCmp cmp] {k} (he : t.isEmpty) :
895+
(t.insert k).min? = some k :=
896+
ExtTreeMap.minKey?_insertIfNew_of_isEmpty he
897+
898+
theorem min!_insert_of_isEmpty [TransCmp cmp] [Inhabited α] {k} (he : t.isEmpty) :
899+
(t.insert k).min! = k :=
900+
ExtTreeMap.minKey!_insertIfNew_of_isEmpty he
901+
902+
theorem minD_insert_of_isEmpty [TransCmp cmp] {k} (he : t.isEmpty) {fallback : α} :
903+
(t.insert k).minD fallback = k :=
904+
ExtTreeMap.minKeyD_insertIfNew_of_isEmpty he
905+
890906
theorem min?_insert_le_min? [TransCmp cmp] {k km kmi} :
891907
(hkm : t.min? = some km) →
892908
(hkmi : (t.insert k |>.min? |>.get isSome_min?_insert) = kmi) →

src/Std/Data/Internal/List/Associative.lean

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7958,6 +7958,21 @@ theorem minKeyD_eq_getD_minKey? [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α
79587958
minKeyD l fallback = (minKey? l).getD fallback :=
79597959
(rfl)
79607960

7961+
theorem minKey_insertEntry_of_isEmpty [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {k : α} {v : β k}
7962+
{l : List ((a : α) × β a)} (hl : DistinctKeys l) (he : l.isEmpty) :
7963+
List.minKey (insertEntry k v l) isEmpty_insertEntry = k := by
7964+
simp [minKey, minKey?_insertEntry hl, minKey?_of_isEmpty he]
7965+
7966+
theorem minKey?_insertEntry_of_isEmpty [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {k : α} {v : β k}
7967+
{l : List ((a : α) × β a)} (hl : DistinctKeys l) (he : l.isEmpty) :
7968+
minKey? (insertEntry k v l) = some k := by
7969+
simp [minKey?_insertEntry hl, minKey?_of_isEmpty he]
7970+
7971+
theorem minKeyD_insertEntry_of_isEmpty [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {k : α} {v : β k}
7972+
{l : List ((a : α) × β a)} (hl : DistinctKeys l) (he : l.isEmpty) {fallback : α} :
7973+
minKeyD (insertEntry k v l) fallback = k := by
7974+
simp [minKeyD, minKey?_insertEntry hl, minKey?_of_isEmpty he]
7975+
79617976
theorem minKey_eq_minKeyD [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α]
79627977
{l : List ((a : α) × β a)} {he fallback} :
79637978
minKey l he = minKeyD l fallback := by
@@ -7973,6 +7988,33 @@ theorem minKey!_eq_minKeyD_default [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd
79737988
minKey! l = minKeyD l default := by
79747989
simp [minKey!_eq_get!_minKey?, minKeyD_eq_getD_minKey?, Option.get!_eq_getD]
79757990

7991+
theorem minKey!_insertEntry_of_isEmpty [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α] {k : α} {v : β k}
7992+
{l : List ((a : α) × β a)} (hl : DistinctKeys l) (he : l.isEmpty) :
7993+
minKey! (insertEntry k v l) = k := by
7994+
simp [minKey!_eq_minKeyD_default]
7995+
apply minKeyD_insertEntry_of_isEmpty hl he
7996+
7997+
theorem minKey_insertEntryIfNew_of_isEmpty [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {k : α} {v : β k}
7998+
{l : List ((a : α) × β a)} (hl : DistinctKeys l) (he : l.isEmpty) :
7999+
List.minKey (insertEntryIfNew k v l) isEmpty_insertEntryIfNew = k := by
8000+
simp [minKey, minKey?_insertEntryIfNew hl, minKey?_of_isEmpty he]
8001+
8002+
theorem minKey?_insertEntryIfNew_of_isEmpty [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {k : α} {v : β k}
8003+
{l : List ((a : α) × β a)} (hl : DistinctKeys l) (he : l.isEmpty) :
8004+
minKey? (insertEntryIfNew k v l) = some k := by
8005+
simp [minKey?_insertEntryIfNew hl, minKey?_of_isEmpty he]
8006+
8007+
theorem minKeyD_insertEntryIfNew_of_isEmpty [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {k : α} {v : β k}
8008+
{l : List ((a : α) × β a)} (hl : DistinctKeys l) (he : l.isEmpty) {fallback : α} :
8009+
minKeyD (insertEntryIfNew k v l) fallback = k := by
8010+
simp [minKeyD, minKey?_insertEntryIfNew hl, minKey?_of_isEmpty he]
8011+
8012+
theorem minKey!_insertEntryIfNew_of_isEmpty [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α] {k : α} {v : β k}
8013+
{l : List ((a : α) × β a)} (hl : DistinctKeys l) (he : l.isEmpty) :
8014+
minKey! (insertEntryIfNew k v l) = k := by
8015+
simp [minKey!_eq_minKeyD_default]
8016+
apply minKeyD_insertEntryIfNew_of_isEmpty hl he
8017+
79768018
theorem minKeyD_eq_fallback [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α]
79778019
{l : List ((a : α) × β a)} {fallback} (h : l.isEmpty) :
79788020
minKeyD l fallback = fallback := by

src/Std/Data/TreeMap/Lemmas.lean

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2330,6 +2330,38 @@ theorem isSome_minKey?_iff_isEmpty_eq_false [TransCmp cmp] :
23302330
some (t.minKey?.elim k fun k' => if cmp k k' |>.isLE then k else k') :=
23312331
DTreeMap.minKey?_insert
23322332

2333+
theorem minKey_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
2334+
(t.insert k v).minKey isEmpty_insert = k :=
2335+
DTreeMap.minKey_insert_of_isEmpty he
2336+
2337+
theorem minKey?_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
2338+
(t.insert k v).minKey? = some k :=
2339+
DTreeMap.minKey?_insert_of_isEmpty he
2340+
2341+
theorem minKey!_insert_of_isEmpty [TransCmp cmp] [Inhabited α] {k v} (he : t.isEmpty) :
2342+
(t.insert k v).minKey! = k :=
2343+
DTreeMap.minKey!_insert_of_isEmpty he
2344+
2345+
theorem minKeyD_insert_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) {fallback : α} :
2346+
(t.insert k v).minKeyD fallback = k :=
2347+
DTreeMap.minKeyD_insert_of_isEmpty he
2348+
2349+
theorem minKey_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
2350+
(t.insertIfNew k v).minKey isEmpty_insertIfNew = k :=
2351+
DTreeMap.minKey_insertIfNew_of_isEmpty he
2352+
2353+
theorem minKey?_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) :
2354+
(t.insertIfNew k v).minKey? = some k :=
2355+
DTreeMap.minKey?_insertIfNew_of_isEmpty he
2356+
2357+
theorem minKey!_insertIfNew_of_isEmpty [TransCmp cmp] [Inhabited α] {k v} (he : t.isEmpty) :
2358+
(t.insertIfNew k v).minKey! = k :=
2359+
DTreeMap.minKey!_insertIfNew_of_isEmpty he
2360+
2361+
theorem minKeyD_insertIfNew_of_isEmpty [TransCmp cmp] {k v} (he : t.isEmpty) {fallback : α} :
2362+
(t.insertIfNew k v).minKeyD fallback = k :=
2363+
DTreeMap.minKeyD_insertIfNew_of_isEmpty he
2364+
23332365
@[grind =] theorem isSome_minKey?_insert [TransCmp cmp] {k v} :
23342366
(t.insert k v).minKey?.isSome :=
23352367
DTreeMap.isSome_minKey?_insert

src/Std/Data/TreeMap/Raw/Lemmas.lean

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,6 +2380,30 @@ theorem minKey?_insert [TransCmp cmp] (h : t.WF) {k v} :
23802380
some (t.minKey?.elim k fun k' => if cmp k k' |>.isLE then k else k') :=
23812381
DTreeMap.Raw.minKey?_insert h
23822382

2383+
theorem minKey?_insert_of_isEmpty [TransCmp cmp] (h : t.WF) {k v} (he : t.isEmpty) :
2384+
(t.insert k v).minKey? = some k :=
2385+
DTreeMap.Raw.minKey?_insert_of_isEmpty h he
2386+
2387+
theorem minKey!_insert_of_isEmpty [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} (he : t.isEmpty) :
2388+
(t.insert k v).minKey! = k :=
2389+
DTreeMap.Raw.minKey!_insert_of_isEmpty h he
2390+
2391+
theorem minKeyD_insert_of_isEmpty [TransCmp cmp] (h : t.WF) {k v} (he : t.isEmpty) {fallback : α} :
2392+
(t.insert k v).minKeyD fallback = k :=
2393+
DTreeMap.Raw.minKeyD_insert_of_isEmpty h he
2394+
2395+
theorem minKey?_insertIfNew_of_isEmpty [TransCmp cmp] (h : t.WF) {k v} (he : t.isEmpty) :
2396+
(t.insertIfNew k v).minKey? = some k :=
2397+
DTreeMap.Raw.minKey?_insertIfNew_of_isEmpty h he
2398+
2399+
theorem minKey!_insertIfNew_of_isEmpty [TransCmp cmp] [Inhabited α] (h : t.WF) {k v} (he : t.isEmpty) :
2400+
(t.insertIfNew k v).minKey! = k :=
2401+
DTreeMap.Raw.minKey!_insertIfNew_of_isEmpty h he
2402+
2403+
theorem minKeyD_insertIfNew_of_isEmpty [TransCmp cmp] (h : t.WF) {k v} (he : t.isEmpty) {fallback : α} :
2404+
(t.insertIfNew k v).minKeyD fallback = k :=
2405+
DTreeMap.Raw.minKeyD_insertIfNew_of_isEmpty h he
2406+
23832407
@[grind =]
23842408
theorem isSome_minKey?_insert [TransCmp cmp] (h : t.WF) {k v} :
23852409
(t.insert k v).minKey?.isSome :=

0 commit comments

Comments
 (0)