Skip to content

Commit 7628263

Browse files
committed
Add the remaining ExtHashSet lemmas
1 parent 87a1da9 commit 7628263

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

src/Std/Data/ExtHashMap/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ def inter [EquivBEq α] [LawfulHashable α] (m₁ m₂ : ExtHashMap α β) : Ext
254254

255255
instance [EquivBEq α] [LawfulHashable α] : Inter (ExtHashMap α β) := ⟨inter⟩
256256

257-
@[inline, inherit_doc ExtDHashMap.inter]
257+
@[inline, inherit_doc ExtDHashMap.diff]
258258
def diff [EquivBEq α] [LawfulHashable α] (m₁ m₂ : ExtHashMap α β) : ExtHashMap α β := ⟨ExtDHashMap.diff m₁.inner m₂.inner⟩
259259

260260
instance [EquivBEq α] [LawfulHashable α] : SDiff (ExtHashMap α β) := ⟨diff⟩

src/Std/Data/ExtHashSet/Basic.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,16 @@ def inter [EquivBEq α] [LawfulHashable α] (m₁ m₂ : ExtHashSet α) : ExtHas
214214

215215
instance [EquivBEq α] [LawfulHashable α] : Inter (ExtHashSet α) := ⟨inter⟩
216216

217+
/--
218+
Computes the difference of the given hash sets.
219+
220+
This function always iterates through the smaller set.
221+
-/
222+
@[inline]
223+
def diff [EquivBEq α] [LawfulHashable α] (m₁ m₂ : ExtHashSet α) : ExtHashSet α := ⟨ExtHashMap.diff m₁.inner m₂.inner⟩
224+
225+
instance [EquivBEq α] [LawfulHashable α] : SDiff (ExtHashSet α) := ⟨diff⟩
226+
217227
/--
218228
Creates a hash set from an array of elements. Note that unlike repeatedly calling `insert`, if the
219229
collection contains multiple elements that are equal (with regard to `==`), then the last element

src/Std/Data/ExtHashSet/Lemmas.lean

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,4 +1017,131 @@ theorem isEmpty_inter_iff [EquivBEq α] [LawfulHashable α] :
10171017

10181018
end Inter
10191019

1020+
section Diff
1021+
1022+
variable {m₁ m₂ : ExtHashSet α}
1023+
1024+
@[simp]
1025+
theorem diff_eq [EquivBEq α] [LawfulHashable α] : m₁.diff m₂ = m₁ \ m₂ := by
1026+
simp only [SDiff.sdiff]
1027+
1028+
/- contains -/
1029+
@[simp]
1030+
theorem contains_diff [EquivBEq α] [LawfulHashable α] {k : α} :
1031+
(m₁ \ m₂).contains k = (m₁.contains k && !m₂.contains k) :=
1032+
ExtHashMap.contains_diff
1033+
1034+
/- mem -/
1035+
@[simp]
1036+
theorem mem_diff_iff [EquivBEq α] [LawfulHashable α] {k : α} :
1037+
k ∈ m₁ \ m₂ ↔ k ∈ m₁ ∧ k ∉ m₂ :=
1038+
ExtHashMap.mem_diff_iff
1039+
1040+
theorem not_mem_diff_of_not_mem_left [EquivBEq α] [LawfulHashable α] {k : α}
1041+
(not_mem : k ∉ m₁) :
1042+
k ∉ m₁ \ m₂ :=
1043+
ExtHashMap.not_mem_diff_of_not_mem_left not_mem
1044+
1045+
theorem not_mem_diff_of_mem_right [EquivBEq α] [LawfulHashable α] {k : α}
1046+
(mem : k ∈ m₂) :
1047+
k ∉ m₁ \ m₂ :=
1048+
ExtHashMap.not_mem_diff_of_mem_right mem
1049+
1050+
/- get? -/
1051+
theorem get?_diff [EquivBEq α] [LawfulHashable α] {k : α} :
1052+
(m₁ \ m₂).get? k =
1053+
if k ∈ m₂ then none else m₁.get? k :=
1054+
ExtHashMap.getKey?_diff
1055+
1056+
theorem get?_diff_of_not_mem_right [EquivBEq α] [LawfulHashable α]
1057+
{k : α} (not_mem : k ∉ m₂) :
1058+
(m₁ \ m₂).get? k = m₁.get? k :=
1059+
ExtHashMap.getKey?_diff_of_not_mem_right not_mem
1060+
1061+
theorem get?_diff_of_not_mem_left [EquivBEq α] [LawfulHashable α]
1062+
{k : α} (not_mem : k ∉ m₁) :
1063+
(m₁ \ m₂).get? k = none :=
1064+
ExtHashMap.getKey?_diff_of_not_mem_left not_mem
1065+
1066+
theorem get?_diff_of_mem_right [EquivBEq α] [LawfulHashable α]
1067+
{k : α} (mem : k ∈ m₂) :
1068+
(m₁ \ m₂).get? k = none :=
1069+
ExtHashMap.getKey?_diff_of_mem_right mem
1070+
1071+
/- get -/
1072+
@[simp]
1073+
theorem get_diff [EquivBEq α] [LawfulHashable α]
1074+
{k : α} {h_mem : k ∈ m₁ \ m₂} :
1075+
(m₁ \ m₂).get k h_mem =
1076+
m₁.get k (mem_diff_iff.1 h_mem).1 :=
1077+
ExtHashMap.getKey_diff
1078+
1079+
/- getD -/
1080+
theorem getD_diff [EquivBEq α] [LawfulHashable α] {k fallback : α} :
1081+
(m₁ \ m₂).getD k fallback =
1082+
if k ∈ m₂ then fallback else m₁.getD k fallback :=
1083+
ExtHashMap.getKeyD_diff
1084+
1085+
theorem getD_diff_of_not_mem_right [EquivBEq α] [LawfulHashable α]
1086+
{k fallback : α} (not_mem : k ∉ m₂) :
1087+
(m₁ \ m₂).getD k fallback = m₁.getD k fallback :=
1088+
ExtHashMap.getKeyD_diff_of_not_mem_right not_mem
1089+
1090+
theorem getD_diff_of_mem_right [EquivBEq α] [LawfulHashable α]
1091+
{k fallback : α} (mem : k ∈ m₂) :
1092+
(m₁ \ m₂).getD k fallback = fallback :=
1093+
ExtHashMap.getKeyD_diff_of_mem_right mem
1094+
1095+
theorem getD_diff_of_not_mem_left [EquivBEq α] [LawfulHashable α]
1096+
{k fallback : α} (not_mem : k ∉ m₁) :
1097+
(m₁ \ m₂).getD k fallback = fallback :=
1098+
ExtHashMap.getKeyD_diff_of_not_mem_left not_mem
1099+
1100+
/- get! -/
1101+
theorem get!_diff [EquivBEq α] [LawfulHashable α] [Inhabited α] {k : α} :
1102+
(m₁ \ m₂).get! k =
1103+
if k ∈ m₂ then default else m₁.get! k :=
1104+
ExtHashMap.getKey!_diff
1105+
1106+
theorem get!_diff_of_not_mem_right [EquivBEq α] [LawfulHashable α] [Inhabited α]
1107+
{k : α} (not_mem : k ∉ m₂) :
1108+
(m₁ \ m₂).get! k = m₁.get! k :=
1109+
ExtHashMap.getKey!_diff_of_not_mem_right not_mem
1110+
1111+
theorem get!_diff_of_mem_right [EquivBEq α] [LawfulHashable α] [Inhabited α]
1112+
{k : α} (mem : k ∈ m₂) :
1113+
(m₁ \ m₂).get! k = default :=
1114+
ExtHashMap.getKey!_diff_of_mem_right mem
1115+
1116+
theorem get!_diff_of_not_mem_left [EquivBEq α] [LawfulHashable α] [Inhabited α]
1117+
{k : α} (not_mem : k ∉ m₁) :
1118+
(m₁ \ m₂).get! k = default :=
1119+
ExtHashMap.getKey!_diff_of_not_mem_left not_mem
1120+
1121+
/- size -/
1122+
theorem size_diff_le_size_left [EquivBEq α] [LawfulHashable α] :
1123+
(m₁ \ m₂).size ≤ m₁.size :=
1124+
ExtHashMap.size_diff_le_size_left
1125+
1126+
theorem size_diff_eq_size_left [EquivBEq α] [LawfulHashable α]
1127+
(h : ∀ (a : α), a ∈ m₁ → a ∉ m₂) :
1128+
(m₁ \ m₂).size = m₁.size :=
1129+
ExtHashMap.size_diff_eq_size_left h
1130+
1131+
theorem size_diff_add_size_inter_eq_size_left [EquivBEq α] [LawfulHashable α] :
1132+
(m₁ \ m₂).size + (m₁ ∩ m₂).size = m₁.size :=
1133+
ExtHashMap.size_diff_add_size_inter_eq_size_left
1134+
1135+
/- isEmpty -/
1136+
@[simp]
1137+
theorem isEmpty_diff_left [EquivBEq α] [LawfulHashable α] (h : m₁.isEmpty) :
1138+
(m₁ \ m₂).isEmpty = true :=
1139+
ExtHashMap.isEmpty_diff_left h
1140+
1141+
theorem isEmpty_diff_iff [EquivBEq α] [LawfulHashable α] :
1142+
(m₁ \ m₂).isEmpty ↔ ∀ k, k ∈ m₁ → k ∈ m₂ :=
1143+
ExtHashMap.isEmpty_diff_iff
1144+
1145+
end Diff
1146+
10201147
end Std.ExtHashSet

0 commit comments

Comments
 (0)