Skip to content

Commit 8b7cbe7

Browse files
authored
feat: add mem_of_get_eq and of_getElem_eq (#11452)
This PR adds lemmas stating that if a get operation returns a value, then the queried key must be contained in the collection. These lemmas are added for HashMap and TreeMap-based collections, with a similar lemma also added for `Init.getElem`.
1 parent a0c503c commit 8b7cbe7

File tree

13 files changed

+27
-0
lines changed

13 files changed

+27
-0
lines changed

src/Init/GetElem.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ theorem getElem_of_getElem? [GetElem? cont idx elem dom] [LawfulGetElem cont idx
240240
{c : cont} {i : idx} [Decidable (dom c i)] (h : c[i]? = some e) : Exists fun h : dom c i => c[i] = e :=
241241
getElem?_eq_some_iff.mp h
242242

243+
theorem of_getElem_eq [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
244+
{c : cont} {i : idx} [Decidable (dom c i)] {h} (_ : c[i] = e) : dom c i := h
245+
243246
@[simp] theorem some_getElem_eq_getElem?_iff [GetElem? cont idx elem dom] [LawfulGetElem cont idx elem dom]
244247
{c : cont} {i : idx} [Decidable (dom c i)] (h : dom c i):
245248
(some c[i] = c[i]?) ↔ True := by

src/Std/Data/DHashMap/Lemmas.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,8 @@ theorem getThenInsertIfNew?_snd [LawfulBEq α] {k : α} {v : β k} :
11151115
(m.getThenInsertIfNew? k v).2 = m.insertIfNew k v :=
11161116
ext <| congrArg Subtype.val (Raw₀.getThenInsertIfNew?_snd _ (k := k))
11171117

1118+
theorem mem_of_get_eq [LawfulBEq α] {k : α} {v : β k} {w} (_ : m.get k w = v) : k ∈ m := w
1119+
11181120
namespace Const
11191121

11201122
variable {β : Type v} {m : DHashMap α (fun _ => β)}

src/Std/Data/DHashMap/RawLemmas.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,8 @@ theorem getThenInsertIfNew?_snd [LawfulBEq α] (h : m.WF) {k : α} {v : β k} :
11811181
(m.getThenInsertIfNew? k v).2 = m.insertIfNew k v := by
11821182
simp_to_raw using congrArg Subtype.val (Raw₀.getThenInsertIfNew?_snd _)
11831183

1184+
theorem mem_of_get_eq [LawfulBEq α] {k : α} {v : β k} {w} (_ : m.get k w = v) : k ∈ m := w
1185+
11841186
namespace Const
11851187

11861188
variable {β : Type v} {m : DHashMap.Raw α (fun _ => β)} (h : m.WF)

src/Std/Data/DTreeMap/Lemmas.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,8 @@ theorem getThenInsertIfNew?_snd [TransCmp cmp] [LawfulEqCmp cmp] {k : α} {v :
10581058
(t.getThenInsertIfNew? k v).2 = t.insertIfNew k v :=
10591059
ext <| Impl.getThenInsertIfNew?_snd t.wf
10601060

1061+
theorem mem_of_get_eq [LawfulEqCmp cmp] {k : α} {v : β k} {w} (_ : t.get k w = v) : k ∈ t := w
1062+
10611063
namespace Const
10621064

10631065
variable {β : Type v} {t : DTreeMap α β cmp}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,8 @@ theorem getThenInsertIfNew?_snd [TransCmp cmp] [LawfulEqCmp cmp] (h : t.WF) {k :
10681068
(t.getThenInsertIfNew? k v).2 = t.insertIfNew k v :=
10691069
ext <| Impl.getThenInsertIfNew?!_snd h
10701070

1071+
theorem mem_of_get_eq [LawfulEqCmp cmp] {k : α} {v : β k} {w} (_ : t.get k w = v) : k ∈ t := w
1072+
10711073
namespace Const
10721074

10731075
variable {β : Type v} {t : Raw α β cmp}

src/Std/Data/ExtDHashMap/Lemmas.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,8 @@ theorem getThenInsertIfNew?_snd [LawfulBEq α] {k : α} {v : β k} :
951951
(m.getThenInsertIfNew? k v).2 = m.insertIfNew k v :=
952952
m.inductionOn fun _ => congrArg mk DHashMap.getThenInsertIfNew?_snd
953953

954+
theorem mem_of_get_eq [LawfulBEq α] {k : α} {v : β k} {w} (_ : m.get k w = v) : k ∈ m := w
955+
954956
namespace Const
955957

956958
variable {β : Type v} {m : ExtDHashMap α (fun _ => β)}

src/Std/Data/ExtDTreeMap/Lemmas.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,8 @@ theorem getThenInsertIfNew?_snd [TransCmp cmp] [LawfulEqCmp cmp] {k : α} {v :
10041004
(t.getThenInsertIfNew? k v).2 = t.insertIfNew k v :=
10051005
t.inductionOn fun _ => congrArg mk DTreeMap.getThenInsertIfNew?_snd
10061006

1007+
theorem mem_of_get_eq [TransCmp cmp] [LawfulEqCmp cmp] {k : α} {v : β k} {w} (_ : t.get k w = v) : k ∈ t := w
1008+
10071009
namespace Const
10081010

10091011
variable {β : Type v} {t : ExtDTreeMap α β cmp}

src/Std/Data/ExtHashSet/Lemmas.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ theorem mem_of_mem_insert' [EquivBEq α] [LawfulHashable α] {k a : α} :
123123
theorem contains_insert_self [EquivBEq α] [LawfulHashable α] {k : α} : (m.insert k).contains k := by
124124
simp
125125

126+
theorem mem_of_get_eq [LawfulBEq α] (m : ExtHashSet α) {k v : α} {w} (_ : m.get k w = v) : k ∈ m := w
127+
126128
theorem mem_insert_self [EquivBEq α] [LawfulHashable α] {k : α} : k ∈ m.insert k := by simp
127129

128130
@[simp, grind =]

src/Std/Data/ExtTreeSet/Lemmas.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ theorem contains_insert_self [TransCmp cmp] {k : α} :
107107
(t.insert k).contains k :=
108108
ExtTreeMap.contains_insertIfNew_self
109109

110+
theorem mem_of_get_eq [TransCmp cmp] {k v : α} {w} (_ : t.get k w = v) : k ∈ t := w
111+
110112
theorem mem_insert_self [TransCmp cmp] {k : α} :
111113
k ∈ t.insert k :=
112114
ExtTreeMap.mem_insertIfNew_self

src/Std/Data/HashSet/Lemmas.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ theorem contains_insert_self [EquivBEq α] [LawfulHashable α] {k : α} : (m.ins
140140

141141
theorem mem_insert_self [EquivBEq α] [LawfulHashable α] {k : α} : k ∈ m.insert k := by simp
142142

143+
theorem mem_of_get_eq {k v : α} {w} (_ : m.get k w = v) : k ∈ m := w
144+
143145
@[simp, grind =]
144146
theorem size_emptyWithCapacity {c} : (emptyWithCapacity c : HashSet α).size = 0 :=
145147
HashMap.size_emptyWithCapacity

0 commit comments

Comments
 (0)