Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
f59fa7d
Initial `getEntry` work
wkrozowski Oct 31, 2025
5911740
end of day push
wkrozowski Oct 31, 2025
e44545c
push intermediate changes
wkrozowski Nov 3, 2025
cb7ac1d
end of day push
wkrozowski Nov 3, 2025
b54f683
chore: push lemma about `getEntry`
wkrozowski Nov 4, 2025
037c5b8
foldl model
wkrozowski Nov 4, 2025
cd12c0a
chore: intermediate work
wkrozowski Nov 4, 2025
2239c23
Massive lemma is done
wkrozowski Nov 5, 2025
8b8f3bb
refactor
wkrozowski Nov 5, 2025
02226fc
WF lemma is now working
wkrozowski Nov 5, 2025
69669c6
chore : the wf variant works
wkrozowski Nov 5, 2025
439e242
chore add lemmas
wkrozowski Nov 5, 2025
a7c71fa
more lemmas
wkrozowski Nov 5, 2025
725689c
all get lemmas are done
wkrozowski Nov 6, 2025
64a7891
getKey? lemmas are done
wkrozowski Nov 6, 2025
9298608
Add const lemmas
wkrozowski Nov 6, 2025
c7d1e13
Remove sorried proof
wkrozowski Nov 6, 2025
3bf6ad4
push unfinished work
wkrozowski Nov 6, 2025
20bd320
Prove length lemma
wkrozowski Nov 7, 2025
8bf7034
push changes
wkrozowski Nov 7, 2025
db949a8
Finish sublemma
wkrozowski Nov 7, 2025
8c035db
add wf predicate
wkrozowski Nov 7, 2025
ad46950
Add getEntry?/getEntry lemmas
wkrozowski Nov 7, 2025
247fb58
Add getEntry! and getEntryD
wkrozowski Nov 10, 2025
5b6274d
fix naming
wkrozowski Nov 10, 2025
8a80729
push what i have
wkrozowski Nov 11, 2025
804fba0
Cleanup old fold
wkrozowski Nov 11, 2025
5411489
Add isEmpty lemma
wkrozowski Nov 12, 2025
86f2b74
add size lemma
wkrozowski Nov 12, 2025
bae20a2
fix simp_to_model
wkrozowski Nov 12, 2025
be0de57
cleanup
wkrozowski Nov 12, 2025
0228303
Further cleanup
wkrozowski Nov 12, 2025
d6253e8
add getEntry to publicly exposed DHashMap
wkrozowski Nov 12, 2025
3f011be
Merge branch 'wojciech/hashmap_getEntry' into wojciech/hashmap_inters…
wkrozowski Nov 12, 2025
fb2e980
Fix WF issues
wkrozowski Nov 12, 2025
05e9752
Fix comments
wkrozowski Nov 12, 2025
4d7e70e
Merge branch 'wojciech/hashmap_getEntry' into wojciech/hashmap_inters…
wkrozowski Nov 12, 2025
cfd6372
cleanup by applying Markus' suggestion
wkrozowski Nov 12, 2025
3b74c67
fix deleted code
wkrozowski Nov 12, 2025
8693512
renaming
wkrozowski Nov 12, 2025
dbfe831
rename size lemma
wkrozowski Nov 12, 2025
a6c2a75
Add Raw DHashMap inter lemmas
wkrozowski Nov 12, 2025
95fab3b
Add DHashMap lemmas
wkrozowski Nov 13, 2025
81efbee
Add basic support for HashMap raw
wkrozowski Nov 13, 2025
3bf6d39
reorganise things in the files
wkrozowski Nov 13, 2025
a6fcc76
Add const lemmas
wkrozowski Nov 13, 2025
2c2a986
Add inter lemmas
wkrozowski Nov 13, 2025
b5a421b
Add hashSet lemmas
wkrozowski Nov 13, 2025
8be273f
Slight reorganisation
wkrozowski Nov 13, 2025
8b7cfa1
Add `eraseMany` and `wf_eraseMany`
wkrozowski Nov 13, 2025
3766be5
Add Raw.erase
wkrozowski Nov 13, 2025
a9c0b35
Add further sublemmas
wkrozowski Nov 13, 2025
922beb5
add new correspondence lemma
wkrozowski Nov 14, 2025
b652b7b
add to list model
wkrozowski Nov 14, 2025
ed7b23a
add lemmas
wkrozowski Nov 14, 2025
7f45903
chore: add sublemmas
wkrozowski Nov 14, 2025
b1435c1
further progress on lemmas
wkrozowski Nov 14, 2025
002545f
push intermediate work
wkrozowski Nov 14, 2025
0b840ad
push
wkrozowski Nov 14, 2025
d33bb5f
Update src/Std/Data/Internal/List/Associative.lean
wkrozowski Nov 14, 2025
ae0385b
Update src/Std/Data/DHashMap/Basic.lean
wkrozowski Nov 14, 2025
7aa501b
Update src/Std/Data/DHashMap/Lemmas.lean
wkrozowski Nov 14, 2025
d3cb462
Fix WF
wkrozowski Nov 14, 2025
3bde3f9
Fix docstrings
wkrozowski Nov 14, 2025
66304f9
Fix simp attributes
wkrozowski Nov 14, 2025
75885a4
Remove unnecessary List prefix
wkrozowski Nov 14, 2025
6a0ddf9
resolve merge issues
wkrozowski Nov 15, 2025
dac309f
fixes
wkrozowski Nov 15, 2025
b56b1bb
fix compilation
wkrozowski Nov 15, 2025
6303bdc
chore: remove untrue lemma
wkrozowski Nov 15, 2025
fa51969
More set difference lemmas
wkrozowski Nov 17, 2025
07b32d6
Finish remaining intersection lemma
wkrozowski Nov 17, 2025
173a923
Merge branch 'master' into wojciech/hashmap_intersection4
wkrozowski Nov 17, 2025
3e6ed8d
Rename sublemmas
wkrozowski Nov 17, 2025
5e30864
Merge branch 'wojciech/hashmap_intersection4' into wojciech/hashmap_d…
wkrozowski Nov 17, 2025
1d45840
Rename `eraseMany` to `eraseManyEntries`
wkrozowski Nov 17, 2025
2944dfe
Add `eraseManyEntries`
wkrozowski Nov 17, 2025
7dbb6bb
Add wellformedness
wkrozowski Nov 17, 2025
46b33b1
Add user facing bits of the difference
wkrozowski Nov 17, 2025
ff2445c
Merge branch 'master' into wojciech/hashmap_diff2
wkrozowski Nov 18, 2025
6b5dba1
Apply Markus' suggestion
wkrozowski Nov 18, 2025
ac3049f
Untrack files added by accident
wkrozowski Nov 18, 2025
c19e2b7
Add lemmas
wkrozowski Nov 18, 2025
150f3cb
Add all lemmas
wkrozowski Nov 18, 2025
6b4b74d
Merge branch 'wojciech/hashmap_diff2' into wojciech/treemap_diff
wkrozowski Nov 18, 2025
bf4842a
Fix build errors after the merge
wkrozowski Nov 18, 2025
d6d5993
Add internal lemmas
wkrozowski Nov 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/Std/Data/DHashMap/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -346,8 +346,19 @@ This function always iterates through the smaller map, so the expected runtime i
inner := Raw₀.inter ⟨m₁.1, m₁.2.size_buckets_pos⟩ ⟨m₂.1, m₂.2.size_buckets_pos⟩
wf := Std.DHashMap.Raw.WF.inter₀ m₁.2 m₂.2

/--
Computes the difference of the given hash maps.

This function always iterates through the smaller map, so the expected runtime is
`O(min(m₁.size, m₂.size))`.
-/
@[inline] def diff [BEq α] [Hashable α] (m₁ m₂ : DHashMap α β) : DHashMap α β where
inner := Raw₀.diff ⟨m₁.1, m₁.2.size_buckets_pos⟩ ⟨m₂.1, m₂.2.size_buckets_pos⟩
wf := Std.DHashMap.Raw.WF.diff₀ m₁.2 m₂.2

instance [BEq α] [Hashable α] : Union (DHashMap α β) := ⟨union⟩
instance [BEq α] [Hashable α] : Inter (DHashMap α β) := ⟨inter⟩
instance [BEq α] [Hashable α] : SDiff (DHashMap α β) := ⟨diff⟩

section Unverified

Expand Down
15 changes: 15 additions & 0 deletions src/Std/Data/DHashMap/Internal/Defs.lean
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,16 @@ def insertMany {ρ : Type w} [ForIn Id ρ ((a : α) × β a)] [BEq α] [Hashable
r := ⟨r.1.insert a b, fun _ h hm => h (r.2 _ h hm)⟩
return r

/-- Internal implementation detail of the hash map -/
def eraseManyEntries {ρ : Type w} [ForIn Id ρ ((a : α) × β a)] [BEq α] [Hashable α]
(m : Raw₀ α β) (l : ρ) : { m' : Raw₀ α β // ∀ (P : Raw₀ α β → Prop),
(∀ {m'' a}, P m'' → P (m''.erase a)) → P m → P m' } := Id.run do
let mut r : { m' : Raw₀ α β // ∀ (P : Raw₀ α β → Prop),
(∀ {m'' a}, P m'' → P (m''.erase a)) → P m → P m' } := ⟨m, fun _ _ => id⟩
for ⟨a, _⟩ in l do
r := ⟨r.1.erase a, fun _ h hm => h (r.2 _ h hm)⟩
return r

/-- Internal implementation detail of the hash map -/
@[inline] def insertManyIfNew {ρ : Type w} [ForIn Id ρ ((a : α) × β a)] [BEq α] [Hashable α]
(m : Raw₀ α β) (l : ρ) : { m' : Raw₀ α β // ∀ (P : Raw₀ α β → Prop),
Expand Down Expand Up @@ -480,6 +490,11 @@ def interSmaller [BEq α] [Hashable α] (m₁ : Raw₀ α β) (m₂ : Raw α β)
def inter [BEq α] [Hashable α] (m₁ m₂ : Raw₀ α β) : Raw₀ α β :=
if m₁.1.size ≤ m₂.1.size then m₁.filter fun k _ => m₂.contains k else interSmaller m₁ m₂

/-- Internal implementation detail of the hash map -/
@[inline] def diff [BEq α] [Hashable α] (m₁ m₂ : Raw₀ α β) : Raw₀ α β :=
if m₁.1.size ≤ m₂.1.size then m₁.filter (fun k _ => !m₂.contains k) else (eraseManyEntries m₁ m₂.1).1


section

variable {β : Type v}
Expand Down
27 changes: 27 additions & 0 deletions src/Std/Data/DHashMap/Internal/Model.lean
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,19 @@ def insertListₘ [BEq α] [Hashable α] (m : Raw₀ α β) (l : List ((a : α)
| .nil => m
| .cons hd tl => insertListₘ (m.insert hd.1 hd.2) tl

/-- Internal implementation detail of the hash map -/
def eraseListₘ [BEq α] [Hashable α] (m : Raw₀ α β) (l : List α) : Raw₀ α β :=
match l with
| .nil => m
| .cons hd tl => eraseListₘ (m.erase hd) tl

/-- Internal implementation detail of the hash map -/
def diffₘ [BEq α] [Hashable α] (m₁ m₂ : Raw₀ α β) : Raw₀ α β :=
if m₁.1.size ≤ m₂.1.size then
filterₘ m₁ (fun k _ => !containsₘ m₂ k)
else
eraseManyEntries m₁ (toListModel m₂.1.buckets)

/-- Internal implementation detail of the hash map -/
def insertListIfNewₘ [BEq α] [Hashable α] (m : Raw₀ α β) (l : List ((a : α) × β a)) : Raw₀ α β :=
match l with
Expand Down Expand Up @@ -656,6 +669,20 @@ theorem insertMany_eq_insertListₘ [BEq α] [Hashable α] (m : Raw₀ α β) (l
simp only [List.foldl_cons, insertListₘ]
apply ih

theorem eraseManyEntries_eq_eraseListₘ [BEq α] [Hashable α] (m : Raw₀ α β) (l : List ((a : α) × β a)) :
eraseManyEntries m l = eraseListₘ m (l.map (·.1)) := by
simp only [eraseManyEntries, Id.run_pure, pure_bind, List.forIn_pure_yield_eq_foldl]
suffices ∀ (t : { m' // ∀ (P : Raw₀ α β → Prop),
(∀ {m'' : Raw₀ α β} {a : α}, P m'' → P (m''.erase a)) → P m → P m' }),
(List.foldl (fun m' p => ⟨m'.val.erase p.1, fun P h₁ h₂ => h₁ (m'.2 _ h₁ h₂)⟩) t l).val =
t.val.eraseListₘ (l.map (·.1)) from this _
intro t
induction l generalizing m with
| nil => simp [eraseListₘ]
| cons hd tl ih =>
simp only [List.foldl_cons]
apply ih

theorem insertManyIfNew_eq_insertListIfNewₘ [BEq α] [Hashable α] (m : Raw₀ α β) (l : List ((a : α) × β a)) :
insertManyIfNew m l = insertListIfNewₘ m l := by
simp only [insertManyIfNew, Id.run_pure, pure_bind, List.forIn_pure_yield_eq_foldl]
Expand Down
4 changes: 4 additions & 0 deletions src/Std/Data/DHashMap/Internal/Raw.lean
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,10 @@ theorem inter_eq [BEq α] [Hashable α] {m₁ m₂ : Raw α β} (h₁ : m₁.WF)
m₁.inter m₂ = Raw₀.inter ⟨m₁, h₁.size_buckets_pos⟩ ⟨m₂, h₂.size_buckets_pos⟩ := by
simp [Raw.inter, h₁.size_buckets_pos, h₂.size_buckets_pos]

theorem diff_eq [BEq α] [Hashable α] {m₁ m₂ : Raw α β} (h₁ : m₁.WF) (h₂ : m₂.WF) :
m₁.diff m₂ = Raw₀.diff ⟨m₁, h₁.size_buckets_pos⟩ ⟨m₂, h₂.size_buckets_pos⟩ := by
simp [Raw.diff, h₁.size_buckets_pos, h₂.size_buckets_pos]

section

variable {β : Type v}
Expand Down
Loading
Loading