Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
d28319d
push work so far
wkrozowski Nov 19, 2025
fc9c400
Sublemma works
wkrozowski Nov 19, 2025
26bffd8
Sublemma now works
wkrozowski Nov 19, 2025
d586c3f
Main lemma goes through
wkrozowski Nov 19, 2025
ae7a4ac
Add first user-facing lemmas
wkrozowski Nov 19, 2025
54f89f9
Add working model lemma
wkrozowski Nov 20, 2025
9b0035c
Work on the train
wkrozowski Nov 20, 2025
a560481
Lemmas go through
wkrozowski Nov 20, 2025
44f9398
Progress with the const BEq
wkrozowski Nov 26, 2025
f4bce74
push
wkrozowski Nov 26, 2025
4d63159
Add const lemma
wkrozowski Nov 26, 2025
09452de
Add perm lemmas
wkrozowski Nov 26, 2025
fa88c40
Congruence lemmas continued
wkrozowski Nov 26, 2025
fcad743
fix scoping issue
wkrozowski Nov 26, 2025
bd7dca5
Remove unit variant and add the raw variant
wkrozowski Nov 26, 2025
f37ad5f
Add lemmas to DHashMap
wkrozowski Nov 26, 2025
9ce4b8c
Add Raw DHashMapLemmas
wkrozowski Nov 26, 2025
3afdb45
Done with lemmas
wkrozowski Nov 26, 2025
d985064
ExtHashMap done
wkrozowski Nov 26, 2025
7ed80a9
Add BEq to ExtHashSet
wkrozowski Nov 27, 2025
99b62eb
Merge branch 'master' into wojciech/hashmap_beq2
wkrozowski Nov 27, 2025
4a93e11
Fix merge issue
wkrozowski Nov 27, 2025
59a0ec6
Remove unnecessary hashable instance
wkrozowski Nov 27, 2025
53e4653
Remove unnecessary hashable
wkrozowski Nov 27, 2025
cea11fe
Continue removing useless Hashable instance
wkrozowski Nov 27, 2025
a87d1e0
Remove whitespace
wkrozowski Nov 27, 2025
59738d1
Fix formatting
wkrozowski Nov 27, 2025
396efbd
Merge branch 'master' into wojciech/hashmap_beq2
wkrozowski Nov 27, 2025
8a84316
Remove unused code
wkrozowski Nov 27, 2025
ba95c26
Initial work
wkrozowski Nov 28, 2025
109af27
Add import
wkrozowski Nov 28, 2025
b928c86
Refactor ExtDHashMap code
wkrozowski Nov 28, 2025
483f612
One more refactor
wkrozowski Nov 28, 2025
3461806
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Nov 28, 2025
c777360
Finish decidableEq instance for ExtDHashMap
wkrozowski Nov 28, 2025
4d23872
Merge branch 'master' into wojciech/hashmap_beq2
wkrozowski Dec 1, 2025
4364811
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 1, 2025
d1f18b9
First part of addressing Markus' comments
wkrozowski Dec 2, 2025
dbc9784
Proof golfing
wkrozowski Dec 2, 2025
40ef92e
Fix notation
wkrozowski Dec 2, 2025
b3b2f97
Apply Markus' suggestions
wkrozowski Dec 2, 2025
eb83bb2
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 2, 2025
2b3820f
Resolve semantic merge conflict
wkrozowski Dec 2, 2025
c2738a7
Fist portion of Markus' suggestions
wkrozowski Dec 2, 2025
748a879
Second part of refactor
wkrozowski Dec 2, 2025
0089a8f
Finish adding the extensional variants
wkrozowski Dec 2, 2025
84b1bd7
Try refactoring `ExtDHashMap`
wkrozowski Dec 2, 2025
8f59aa7
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 2, 2025
9ef0843
Put the code I have so far
wkrozowski Dec 2, 2025
efdb7ab
Forgotten instance
wkrozowski Dec 2, 2025
55b3d02
Refactor
wkrozowski Dec 2, 2025
1a93a9f
cleanup extensional variants
wkrozowski Dec 2, 2025
57e1453
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 2, 2025
4e012a6
further renaming
wkrozowski Dec 2, 2025
640a5da
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 2, 2025
befc92b
Refactor Decidable Equiv
wkrozowski Dec 3, 2025
8bd5295
chore: fix orphaned modules issue
wkrozowski Dec 3, 2025
e8d3749
Respond to Markus' comments
wkrozowski Dec 3, 2025
3785fa8
Resolve Markus' comments
wkrozowski Dec 3, 2025
3bd07be
Refactor
wkrozowski Dec 4, 2025
7ef173e
Further refactor
wkrozowski Dec 4, 2025
6a8b212
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 4, 2025
c04f684
Resolve Markus' comment
wkrozowski Dec 4, 2025
3b281d5
Remove `beqUnit`
wkrozowski Dec 4, 2025
d264dea
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 4, 2025
c47995a
Weaken the instances for the Const variant
wkrozowski Dec 5, 2025
8adfa66
Cleanup
wkrozowski Dec 5, 2025
81ca6a5
Further cleanup
wkrozowski Dec 5, 2025
b1ed589
Further cleanup
wkrozowski Dec 5, 2025
06c5d1d
One more round of cleanup
wkrozowski Dec 5, 2025
9927009
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 5, 2025
4afd191
Further cleanup
wkrozowski Dec 5, 2025
ea94efb
Fix whitespace
wkrozowski Dec 5, 2025
9c78a3a
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 5, 2025
085187c
chore: change `letI` to `let`
wkrozowski Dec 5, 2025
3079fa6
Further cleanup
wkrozowski Dec 5, 2025
f59e2a8
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 5, 2025
f353aea
Proof golf
wkrozowski Dec 5, 2025
e94e818
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 5, 2025
fb951bf
Add names for instances
wkrozowski Dec 5, 2025
3074be8
Add `any_eq`
wkrozowski Dec 8, 2025
02434df
Minor cleanup
wkrozowski Dec 8, 2025
a269546
chore: proof golf
wkrozowski Dec 8, 2025
851d4e7
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 8, 2025
7e9771b
chore: cleanup
wkrozowski Dec 8, 2025
b2c392f
chore: docstrings
wkrozowski Dec 8, 2025
4ced8f0
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 8, 2025
d0e16d9
chore: cleanup
wkrozowski Dec 8, 2025
e1b4565
Merge branch 'wojciech/hashmap_beq2' into wojciech/hashmap_deceq
wkrozowski Dec 8, 2025
24d77ba
Merge branch 'master' into wojciech/hashmap_deceq
wkrozowski Dec 10, 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
3 changes: 3 additions & 0 deletions src/Std/Data.lean
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,11 @@ public import Std.Data.ExtTreeSet
-- the well-formedness invariant, so we need to additionally import the files that deal with the
-- unbundled version
public import Std.Data.DHashMap.RawLemmas
public import Std.Data.DHashMap.RawDecidableEquiv
public import Std.Data.HashMap.RawLemmas
public import Std.Data.HashMap.RawDecidableEquiv
public import Std.Data.HashSet.RawLemmas
public import Std.Data.HashSet.RawDecidableEquiv
public import Std.Data.DTreeMap.Raw
public import Std.Data.TreeMap.Raw
public import Std.Data.TreeSet.Raw
Expand Down
1 change: 1 addition & 0 deletions src/Std/Data/DHashMap.lean
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ public import Std.Data.DHashMap.AdditionalOperations
public import Std.Data.DHashMap.Iterator
public import Std.Data.DHashMap.Lemmas
public import Std.Data.DHashMap.IteratorLemmas
public import Std.Data.DHashMap.DecidableEquiv
25 changes: 25 additions & 0 deletions src/Std/Data/DHashMap/DecidableEquiv.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/-
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Wojciech Różowski
-/
module

prelude
public import Std.Data.DHashMap.Internal.RawLemmas

public section

/-!
# Decidable equivalence for `DHashMap`
-/

open Std.DHashMap.Internal

namespace Std.DHashMap

instance {α : Type u} {β : α → Type v} [DecidableEq α] [Hashable α] [∀ k, DecidableEq (β k)] (m₁ m₂ : DHashMap α β) : Decidable (m₁ ~m m₂) :=
let : Decidable (m₁.1.Equiv m₂.1) := Raw₀.decidableEquiv ⟨m₁.1, m₁.2.size_buckets_pos⟩ ⟨m₂.1, m₂.2.size_buckets_pos⟩ m₁.2 m₂.2;
decidable_of_iff _ ⟨fun h => ⟨h⟩, fun h => h.1⟩

end Std.DHashMap
8 changes: 8 additions & 0 deletions src/Std/Data/DHashMap/Internal/RawLemmas.lean
Original file line number Diff line number Diff line change
Expand Up @@ -5138,4 +5138,12 @@ end map

end Raw₀

namespace Raw₀

/-- Internal implementation detail -/
def decidableEquiv [DecidableEq α] [Hashable α] [∀ k, DecidableEq (β k)] (m₁ m₂ : Raw₀ α β) (h₁ : m₁.val.WF) (h₂ : m₂.val.WF) : Decidable (m₁.1.Equiv m₂.1) :=
decidable_of_iff _ ⟨Raw₀.equiv_of_beq h₁ h₂, Raw₀.Equiv.beq h₁ h₂⟩

end Raw₀

end Std.DHashMap.Internal
24 changes: 24 additions & 0 deletions src/Std/Data/DHashMap/RawDecidableEquiv.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/-
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Wojciech Różowski
-/
module

prelude
public import Std.Data.DHashMap.Internal.RawLemmas

public section

/-!
# Decidable equivalence for `DHashMap.Raw`
-/

open Std.DHashMap.Internal

namespace Std.DHashMap.Raw

instance instDecidableEquiv {α : Type u} {β : α → Type v} [DecidableEq α] [Hashable α] [∀ k, DecidableEq (β k)] {m₁ m₂ : Raw α β} (h₁ : m₁.WF) (h₂ : m₂.WF) : Decidable (m₁ ~m m₂) :=
Raw₀.decidableEquiv ⟨m₁, h₁.size_buckets_pos⟩ ⟨m₂, h₂.size_buckets_pos⟩ h₁ h₂

end Std.DHashMap.Raw
3 changes: 3 additions & 0 deletions src/Std/Data/ExtDHashMap/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,9 @@ instance [LawfulBEq α] [∀ k, BEq (β k)] [∀ k, ReflBEq (β k)] : ReflBEq (E
instance [LawfulBEq α] [∀ k, BEq (β k)] [∀ k, LawfulBEq (β k)] : LawfulBEq (ExtDHashMap α β) where
eq_of_beq {m₁} {m₂} := m₁.inductionOn₂ m₂ fun _ _ hyp => sound <| DHashMap.equiv_of_beq hyp

instance {α : Type u} {β : α → Type v} [DecidableEq α] [Hashable α] [∀ k, DecidableEq (β k)] : DecidableEq (ExtDHashMap α β) :=
fun _ _ => decidable_of_iff _ beq_iff_eq

namespace Const

variable {β : Type v}
Expand Down
3 changes: 3 additions & 0 deletions src/Std/Data/ExtHashMap/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,9 @@ instance [LawfulBEq α] [BEq β] [LawfulBEq β] : LawfulBEq (ExtHashMap α β) w
simp only [mk.injEq] at |- hyp
exact ExtDHashMap.Const.eq_of_beq _ _ hyp

instance {α : Type u} {β : Type v} [DecidableEq α] [Hashable α] [DecidableEq β] : DecidableEq (ExtHashMap α β) :=
fun _ _ => decidable_of_iff _ beq_iff_eq

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

Expand Down
3 changes: 3 additions & 0 deletions src/Std/Data/ExtHashSet/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,9 @@ instance [LawfulBEq α] : LawfulBEq (ExtHashSet α) where
simp only [mk.injEq, ExtHashMap.mk.injEq] at |- hyp
exact ExtDHashMap.Const.eq_of_beq _ _ hyp

instance {α : Type u} [DecidableEq α] [Hashable α] : DecidableEq (ExtHashSet α) :=
fun _ _ => decidable_of_iff _ beq_iff_eq

/--
Computes the intersection of the given hash sets.

Expand Down
1 change: 1 addition & 0 deletions src/Std/Data/HashMap.lean
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ public import Std.Data.HashMap.AdditionalOperations
public import Std.Data.HashMap.Iterator
public import Std.Data.HashMap.Lemmas
public import Std.Data.HashMap.IteratorLemmas
public import Std.Data.HashMap.DecidableEquiv
23 changes: 23 additions & 0 deletions src/Std/Data/HashMap/DecidableEquiv.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/-
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Wojciech Różowski
-/
module

prelude
public import Std.Data.DHashMap.DecidableEquiv
public import Std.Data.HashMap.Basic

public section

/-!
# Decidable equivalence for `HashMap`
-/

namespace Std.HashMap

instance {α : Type u} {β : Type v} [DecidableEq α] [Hashable α] [DecidableEq β] (m₁ m₂ : HashMap α β) : Decidable (m₁ ~m m₂) :=
decidable_of_iff _ ⟨fun h => ⟨h⟩, fun h => h.1⟩

end Std.HashMap
26 changes: 26 additions & 0 deletions src/Std/Data/HashMap/RawDecidableEquiv.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/-
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Wojciech Różowski
-/
module

prelude
public import Std.Data.DHashMap.RawDecidableEquiv
public import Std.Data.HashMap.Raw

public section

/-!
# Decidable equivalence for `HashMap.Raw`
-/

open Std.DHashMap.Raw

namespace Std.HashMap.Raw

instance instDecidableEquiv {α : Type u} {β : Type v} [DecidableEq α] [Hashable α] [DecidableEq β] {m₁ m₂ : Raw α β} (h₁ : m₁.WF) (h₂ : m₂.WF) : Decidable (m₁ ~m m₂) :=
let : Decidable (m₁.1 ~m m₂.1) := DHashMap.Raw.instDecidableEquiv h₁.out h₂.out;
decidable_of_iff _ ⟨fun h => ⟨h⟩, fun h => h.1⟩

end Std.HashMap.Raw
1 change: 1 addition & 0 deletions src/Std/Data/HashSet.lean
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ public import Std.Data.HashSet.Basic
public import Std.Data.HashSet.Iterator
public import Std.Data.HashSet.Lemmas
public import Std.Data.HashSet.IteratorLemmas
public import Std.Data.HashSet.DecidableEquiv
23 changes: 23 additions & 0 deletions src/Std/Data/HashSet/DecidableEquiv.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/-
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Wojciech Różowski
-/
module

prelude
public import Std.Data.HashMap.DecidableEquiv
public import Std.Data.HashSet.Basic

public section

/-!
# Decidable equivalence for `HashSet`
-/

namespace Std.HashSet

instance {α : Type u} [DecidableEq α] [Hashable α] (m₁ m₂ : HashSet α) : Decidable (m₁ ~m m₂) :=
decidable_of_iff _ ⟨fun h => ⟨h⟩, fun h => h.1⟩

end Std.HashSet
26 changes: 26 additions & 0 deletions src/Std/Data/HashSet/RawDecidableEquiv.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/-
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Wojciech Różowski
-/
module

prelude
public import Std.Data.HashMap.RawDecidableEquiv
public import Std.Data.HashSet.Raw

public section

/-!
# Decidable equivalence for `HashSet.Raw`
-/

open Std.HashMap.Raw

namespace Std.HashSet.Raw

instance instDecidableEquiv {α : Type u} [DecidableEq α] [Hashable α] {m₁ m₂ : Raw α} (h₁ : m₁.WF) (h₂ : m₂.WF) : Decidable (m₁ ~m m₂) :=
let : Decidable (m₁.1 ~m m₂.1) := HashMap.Raw.instDecidableEquiv h₁.out h₂.out;
decidable_of_iff _ ⟨fun h => ⟨h⟩, fun h => h.1⟩

end Std.HashSet.Raw
Loading