Skip to content

Commit 361bfdb

Browse files
authored
refactor: HashMap/TreeMap and their extensional variants to use getElem instance (#11578)
This PR refactors the usage of `get` operation on `HashMap`/`TreeMap`/`ExtHashMap`/`ExtTreeMap` to `getElem` instace.
1 parent 2b25785 commit 361bfdb

File tree

6 files changed

+1030
-120
lines changed

6 files changed

+1030
-120
lines changed

src/Std/Data/ExtHashMap/Lemmas.lean

Lines changed: 109 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,27 +1409,58 @@ theorem union_insert_right_eq_insert_union [EquivBEq α] [LawfulHashable α] {p
14091409
simp only [union, insert, ExtDHashMap.union_eq, mk.injEq]
14101410
exact ExtDHashMap.union_insert_right_eq_insert_union
14111411

1412+
/- getElem? -/
1413+
theorem getElem?_union [EquivBEq α] [LawfulHashable α] {k : α} :
1414+
(m₁ ∪ m₂)[k]? = (m₂[k]?).or (m₁[k]?) :=
1415+
ExtDHashMap.Const.get?_union
1416+
1417+
theorem getElem?_union_of_not_mem_left [EquivBEq α] [LawfulHashable α]
1418+
{k : α} (not_mem : ¬k ∈ m₁) :
1419+
(m₁ ∪ m₂)[k]? = m₂[k]? :=
1420+
ExtDHashMap.Const.get?_union_of_not_mem_left not_mem
1421+
1422+
theorem getElem?_union_of_not_mem_right [EquivBEq α] [LawfulHashable α]
1423+
{k : α} (not_mem : ¬k ∈ m₂) :
1424+
(m₁ ∪ m₂)[k]? = m₁[k]? :=
1425+
ExtDHashMap.Const.get?_union_of_not_mem_right not_mem
1426+
14121427
/- get? -/
1428+
@[deprecated getElem?_union (since := "2025-12-10")]
14131429
theorem get?_union [EquivBEq α] [LawfulHashable α] {k : α} :
14141430
(m₁ ∪ m₂).get? k = (m₂.get? k).or (m₁.get? k) :=
14151431
ExtDHashMap.Const.get?_union
14161432

1433+
@[deprecated getElem?_union_of_not_mem_left (since := "2025-12-10")]
14171434
theorem get?_union_of_not_mem_left [EquivBEq α] [LawfulHashable α]
14181435
{k : α} (not_mem : ¬k ∈ m₁) :
14191436
(m₁ ∪ m₂).get? k = m₂.get? k :=
14201437
ExtDHashMap.Const.get?_union_of_not_mem_left not_mem
14211438

1439+
@[deprecated getElem?_union_of_not_mem_right (since := "2025-12-10")]
14221440
theorem get?_union_of_not_mem_right [EquivBEq α] [LawfulHashable α]
14231441
{k : α} (not_mem : ¬k ∈ m₂) :
14241442
(m₁ ∪ m₂).get? k = m₁.get? k :=
14251443
ExtDHashMap.Const.get?_union_of_not_mem_right not_mem
14261444

1445+
/- getElem -/
1446+
theorem getElem_union_of_mem_right [EquivBEq α] [LawfulHashable α]
1447+
{k : α} (mem : k ∈ m₂) :
1448+
(m₁ ∪ m₂)[k]'(mem_union_of_right mem) = m₂[k]'mem :=
1449+
ExtDHashMap.Const.get_union_of_mem_right mem
1450+
1451+
theorem getElem_union_of_not_mem_left [EquivBEq α] [LawfulHashable α]
1452+
{k : α} (not_mem : ¬k ∈ m₁) {h'} :
1453+
(m₁ ∪ m₂)[k]'h' = m₂[k]'(mem_of_mem_union_of_not_mem_left h' not_mem) :=
1454+
ExtDHashMap.Const.get_union_of_not_mem_left not_mem (h' := h')
1455+
14271456
/- get -/
1457+
@[deprecated getElem_union_of_mem_right (since := "2025-12-10")]
14281458
theorem get_union_of_mem_right [EquivBEq α] [LawfulHashable α]
14291459
{k : α} (mem : k ∈ m₂) :
14301460
(m₁ ∪ m₂).get k (mem_union_of_right mem) = m₂.get k mem :=
14311461
ExtDHashMap.Const.get_union_of_mem_right mem
14321462

1463+
@[deprecated getElem_union_of_not_mem_left (since := "2025-12-10")]
14331464
theorem get_union_of_not_mem_left [EquivBEq α] [LawfulHashable α]
14341465
{k : α} (not_mem : ¬k ∈ m₁) {h'} :
14351466
(m₁ ∪ m₂).get k h' = m₂.get k (mem_of_mem_union_of_not_mem_left h' not_mem) :=
@@ -1450,16 +1481,33 @@ theorem getD_union_of_not_mem_right [EquivBEq α] [LawfulHashable α]
14501481
(m₁ ∪ m₂).getD k fallback = m₁.getD k fallback :=
14511482
ExtDHashMap.Const.getD_union_of_not_mem_right not_mem
14521483

1484+
/- getElem! -/
1485+
theorem getElem!_union [EquivBEq α] [LawfulHashable α] {k : α} [Inhabited β] :
1486+
(m₁ ∪ m₂)[k]! = m₂.getD k (m₁[k]!) :=
1487+
ExtDHashMap.Const.get!_union
1488+
1489+
theorem getElem!_union_of_not_mem_left [EquivBEq α] [LawfulHashable α]
1490+
{k : α} [Inhabited β] (not_mem : ¬k ∈ m₁) :
1491+
(m₁ ∪ m₂)[k]! = m₂[k]! :=
1492+
ExtDHashMap.Const.get!_union_of_not_mem_left not_mem
1493+
1494+
theorem getElem!_union_of_not_mem_right [EquivBEq α] [LawfulHashable α] {k : α} [Inhabited β] (not_mem : ¬k ∈ m₂) :
1495+
(m₁ ∪ m₂)[k]! = m₁[k]! :=
1496+
ExtDHashMap.Const.get!_union_of_not_mem_right not_mem
1497+
14531498
/- get! -/
1499+
@[deprecated getElem!_union (since := "2025-12-10")]
14541500
theorem get!_union [EquivBEq α] [LawfulHashable α] {k : α} [Inhabited β] :
14551501
(m₁ ∪ m₂).get! k = m₂.getD k (m₁.get! k) :=
14561502
ExtDHashMap.Const.get!_union
14571503

1504+
@[deprecated getElem!_union_of_not_mem_left (since := "2025-12-10")]
14581505
theorem get!_union_of_not_mem_left [EquivBEq α] [LawfulHashable α]
14591506
{k : α} [Inhabited β] (not_mem : ¬k ∈ m₁) :
14601507
(m₁ ∪ m₂).get! k = m₂.get! k :=
14611508
ExtDHashMap.Const.get!_union_of_not_mem_left not_mem
14621509

1510+
@[deprecated getElem!_union_of_not_mem_right (since := "2025-12-10")]
14631511
theorem get!_union_of_not_mem_right [EquivBEq α] [LawfulHashable α] {k : α} [Inhabited β] (not_mem : ¬k ∈ m₂) :
14641512
(m₁ ∪ m₂).get! k = m₁.get! k :=
14651513
ExtDHashMap.Const.get!_union_of_not_mem_right not_mem
@@ -1579,33 +1627,62 @@ theorem not_mem_inter_of_not_mem_right [EquivBEq α] [LawfulHashable α] {k : α
15791627
k ∉ m₁ ∩ m₂ :=
15801628
ExtDHashMap.not_mem_inter_of_not_mem_right not_mem
15811629

1630+
/- getElem? -/
1631+
theorem getElem?_inter [EquivBEq α] [LawfulHashable α] {k : α} :
1632+
(m₁ ∩ m₂)[k]? = if k ∈ m₂ then m₁[k]? else none :=
1633+
ExtDHashMap.Const.get?_inter
1634+
1635+
theorem getElem?_inter_of_mem_right [EquivBEq α] [LawfulHashable α]
1636+
{k : α} (mem : k ∈ m₂) :
1637+
(m₁ ∩ m₂)[k]? = m₁[k]? :=
1638+
ExtDHashMap.Const.get?_inter_of_mem_right mem
1639+
1640+
theorem getElem?_inter_of_not_mem_left [EquivBEq α] [LawfulHashable α]
1641+
{k : α} (not_mem : k ∉ m₁) :
1642+
(m₁ ∩ m₂)[k]? = none :=
1643+
ExtDHashMap.Const.get?_inter_of_not_mem_left not_mem
1644+
1645+
theorem getElem?_inter_of_not_mem_right [EquivBEq α] [LawfulHashable α]
1646+
{k : α} (not_mem : k ∉ m₂) :
1647+
(m₁ ∩ m₂)[k]? = none :=
1648+
ExtDHashMap.Const.get?_inter_of_not_mem_right not_mem
1649+
15821650
/- get? -/
1651+
@[deprecated getElem?_inter (since := "2025-12-10")]
15831652
theorem get?_inter [EquivBEq α] [LawfulHashable α] {k : α} :
1584-
(m₁ ∩ m₂).get? k =
1585-
if k ∈ m₂ then m₁.get? k else none :=
1653+
(m₁ ∩ m₂).get? k = if k ∈ m₂ then m₁.get? k else none :=
15861654
ExtDHashMap.Const.get?_inter
15871655

1656+
@[deprecated getElem?_inter_of_mem_right (since := "2025-12-10")]
15881657
theorem get?_inter_of_mem_right [EquivBEq α] [LawfulHashable α]
15891658
{k : α} (mem : k ∈ m₂) :
15901659
(m₁ ∩ m₂).get? k = m₁.get? k :=
15911660
ExtDHashMap.Const.get?_inter_of_mem_right mem
15921661

1662+
@[deprecated getElem?_inter_of_not_mem_left (since := "2025-12-10")]
15931663
theorem get?_inter_of_not_mem_left [EquivBEq α] [LawfulHashable α]
15941664
{k : α} (not_mem : k ∉ m₁) :
15951665
(m₁ ∩ m₂).get? k = none :=
15961666
ExtDHashMap.Const.get?_inter_of_not_mem_left not_mem
15971667

1668+
@[deprecated getElem?_inter_of_not_mem_right (since := "2025-12-10")]
15981669
theorem get?_inter_of_not_mem_right [EquivBEq α] [LawfulHashable α]
15991670
{k : α} (not_mem : k ∉ m₂) :
16001671
(m₁ ∩ m₂).get? k = none :=
16011672
ExtDHashMap.Const.get?_inter_of_not_mem_right not_mem
16021673

1603-
/- get -/
1674+
/- getElem -/
16041675
@[simp]
1676+
theorem getElem_inter [EquivBEq α] [LawfulHashable α]
1677+
{k : α} {h_mem : k ∈ m₁ ∩ m₂} :
1678+
(m₁ ∩ m₂)[k]'h_mem = m₁[k]'(mem_inter_iff.1 h_mem).1 :=
1679+
ExtDHashMap.Const.get_inter (h_mem := h_mem)
1680+
1681+
/- get -/
1682+
@[deprecated getElem_inter (since := "2025-12-10")]
16051683
theorem get_inter [EquivBEq α] [LawfulHashable α]
16061684
{k : α} {h_mem : k ∈ m₁ ∩ m₂} :
1607-
(m₁ ∩ m₂).get k h_mem =
1608-
m₁.get k (mem_inter_iff.1 h_mem).1 :=
1685+
(m₁ ∩ m₂).get k h_mem = m₁.get k (mem_inter_iff.1 h_mem).1 :=
16091686
ExtDHashMap.Const.get_inter
16101687

16111688
/- getD -/
@@ -1629,22 +1706,45 @@ theorem getD_inter_of_not_mem_left [EquivBEq α] [LawfulHashable α]
16291706
(m₁ ∩ m₂).getD k fallback = fallback :=
16301707
ExtDHashMap.Const.getD_inter_of_not_mem_left not_mem
16311708

1709+
/- getElem! -/
1710+
theorem getElem!_inter [EquivBEq α] [LawfulHashable α] {k : α} [Inhabited β] :
1711+
(m₁ ∩ m₂)[k]! = if k ∈ m₂ then m₁[k]! else default :=
1712+
ExtDHashMap.Const.get!_inter
1713+
1714+
theorem getElem!_inter_of_mem_right [EquivBEq α] [LawfulHashable α]
1715+
{k : α} [Inhabited β] (mem : k ∈ m₂) :
1716+
(m₁ ∩ m₂)[k]! = m₁[k]! :=
1717+
ExtDHashMap.Const.get!_inter_of_mem_right mem
1718+
1719+
theorem getElem!_inter_of_not_mem_right [EquivBEq α] [LawfulHashable α]
1720+
{k : α} [Inhabited β] (not_mem : k ∉ m₂) :
1721+
(m₁ ∩ m₂)[k]! = default :=
1722+
ExtDHashMap.Const.get!_inter_of_not_mem_right not_mem
1723+
1724+
theorem getElem!_inter_of_not_mem_left [EquivBEq α] [LawfulHashable α]
1725+
{k : α} [Inhabited β] (not_mem : k ∉ m₁) :
1726+
(m₁ ∩ m₂)[k]! = default :=
1727+
ExtDHashMap.Const.get!_inter_of_not_mem_left not_mem
1728+
16321729
/- get! -/
1730+
@[deprecated getElem!_inter (since := "2025-12-10")]
16331731
theorem get!_inter [EquivBEq α] [LawfulHashable α] {k : α} [Inhabited β] :
1634-
(m₁ ∩ m₂).get! k =
1635-
if k ∈ m₂ then m₁.get! k else default :=
1732+
(m₁ ∩ m₂).get! k = if k ∈ m₂ then m₁.get! k else default :=
16361733
ExtDHashMap.Const.get!_inter
16371734

1735+
@[deprecated getElem!_inter_of_mem_right (since := "2025-12-10")]
16381736
theorem get!_inter_of_mem_right [EquivBEq α] [LawfulHashable α]
16391737
{k : α} [Inhabited β] (mem : k ∈ m₂) :
16401738
(m₁ ∩ m₂).get! k = m₁.get! k :=
16411739
ExtDHashMap.Const.get!_inter_of_mem_right mem
16421740

1741+
@[deprecated getElem!_inter_of_not_mem_right (since := "2025-12-10")]
16431742
theorem get!_inter_of_not_mem_right [EquivBEq α] [LawfulHashable α]
16441743
{k : α} [Inhabited β] (not_mem : k ∉ m₂) :
16451744
(m₁ ∩ m₂).get! k = default :=
16461745
ExtDHashMap.Const.get!_inter_of_not_mem_right not_mem
16471746

1747+
@[deprecated getElem!_inter_of_not_mem_left (since := "2025-12-10")]
16481748
theorem get!_inter_of_not_mem_left [EquivBEq α] [LawfulHashable α]
16491749
{k : α} [Inhabited β] (not_mem : k ∉ m₁) :
16501750
(m₁ ∩ m₂).get! k = default :=
@@ -2490,12 +2590,12 @@ grind_pattern size_filter_le_size => (m.filter f).size
24902590

24912591
theorem size_filter_eq_size_iff [EquivBEq α] [LawfulHashable α]
24922592
{f : α → β → Bool} :
2493-
(m.filter f).size = m.size ↔ ∀ k h, f (m.getKey k h) (m.get k h) :=
2593+
(m.filter f).size = m.size ↔ ∀ k h, f (m.getKey k h) (m[k]'h) :=
24942594
ExtDHashMap.Const.size_filter_eq_size_iff
24952595

24962596
theorem filter_eq_self_iff [EquivBEq α] [LawfulHashable α]
24972597
{f : α → β → Bool} :
2498-
m.filter f = m ↔ ∀ k h, f (m.getKey k h) (m.get k h) :=
2598+
m.filter f = m ↔ ∀ k h, f (m.getKey k h) (m[k]'h) :=
24992599
ext_iff.trans ExtDHashMap.Const.filter_eq_self_iff
25002600

25012601
theorem getElem?_filter [EquivBEq α] [LawfulHashable α]

0 commit comments

Comments
 (0)