Documentation

Std.Data.HashSet.Raw

structure Std.HashSet.Raw (α : Type u) :

Hash sets without a bundled well-formedness invariant, suitable for use in nested inductive types. The well-formedness invariant is called Raw.WF. When in doubt, prefer HashSet over HashSet.Raw. Lemmas about the operations on Std.Data.HashSet.Raw are available in the module Std.Data.HashSet.RawLemmas.

This is a simple separate-chaining hash table. The data of the hash set consists of a cached size and an array of buckets, where each bucket is a linked list of keys. The number of buckets is always a power of two. The hash set doubles its size upon inserting an element such that the number of elements is more than 75% of the number of buckets.

The hash table is backed by an Array. Users should make sure that the hash set is used linearly to avoid expensive copies.

The hash set uses == (provided by the BEq typeclass) to compare elements and hash (provided by the Hashable typeclass) to hash them. To ensure that the operations behave as expected, == should be an equivalence relation and a == b should imply hash a = hash b (see also the EquivBEq and LawfulHashable typeclasses). Both of these conditions are automatic if the BEq instance is lawful, i.e., if a == b implies a = b.

Instances For
    @[inline]
    def Std.HashSet.Raw.empty {α : Type u} (capacity : Nat := 8) :

    Creates a new empty hash set. The optional parameter capacity can be supplied to presize the set so that it can hold the given number of elements without reallocating. It is also possible to use the empty collection notations and {} to create an empty hash set with the default capacity.

    Equations
    Instances For
      Equations
      • Std.HashSet.Raw.instEmptyCollection = { emptyCollection := Std.HashSet.Raw.empty }
      Equations
      • Std.HashSet.Raw.instInhabited = { default := }
      @[inline]
      def Std.HashSet.Raw.insert {α : Type u} [BEq α] [Hashable α] (m : Std.HashSet.Raw α) (a : α) :

      Inserts the given element into the set. If the hash set already contains an element that is equal (with regard to ==) to the given element, then the hash set is returned unchanged.

      Equations
      • m.insert a = { inner := m.inner.insertIfNew a () }
      Instances For
        Equations
        • Std.HashSet.Raw.instSingletonOfBEqOfHashable = { singleton := fun (a : α) => Std.HashSet.Raw.empty.insert a }
        Equations
        • Std.HashSet.Raw.instInsertOfBEqOfHashable = { insert := fun (a : α) (s : Std.HashSet.Raw α) => s.insert a }
        Equations
        • =
        @[inline]

        Checks whether an element is present in a set and inserts the element if it was not found. If the hash set already contains an element that is equal (with regard to ==) to the given element, then the hash set is returned unchanged.

        Equivalent to (but potentially faster than) calling contains followed by insert.

        Equations
        • m.containsThenInsert a = match m.inner.containsThenInsertIfNew a () with | (replaced, r) => (replaced, { inner := r })
        Instances For
          @[inline]
          def Std.HashSet.Raw.contains {α : Type u} [BEq α] [Hashable α] (m : Std.HashSet.Raw α) (a : α) :

          Returns true if the given element is present in the set. There is also a Prop-valued version of this: a ∈ m is equivalent to m.contains a = true.

          Observe that this is different behavior than for lists: for lists, uses = and contains use == for comparisons, while for hash sets, both use ==.

          Equations
          • m.contains a = m.inner.contains a
          Instances For
            Equations
            • Std.HashSet.Raw.instMembershipOfBEqOfHashable = { mem := fun (m : Std.HashSet.Raw α) (a : α) => a m.inner }
            instance Std.HashSet.Raw.instDecidableMem {α : Type u} [BEq α] [Hashable α] {m : Std.HashSet.Raw α} {a : α} :
            Equations
            @[inline]
            def Std.HashSet.Raw.erase {α : Type u} [BEq α] [Hashable α] (m : Std.HashSet.Raw α) (a : α) :

            Removes the element if it exists.

            Equations
            • m.erase a = { inner := m.inner.erase a }
            Instances For
              @[inline]

              The number of elements present in the set

              Equations
              • m.size = m.inner.size
              Instances For
                @[inline]
                def Std.HashSet.Raw.get? {α : Type u} [BEq α] [Hashable α] (m : Std.HashSet.Raw α) (a : α) :

                Checks if given key is contained and returns the key if it is, otherwise none. The result in the some case is guaranteed to be pointer equal to the key in the map.

                Equations
                • m.get? a = m.inner.getKey? a
                Instances For
                  @[inline]
                  def Std.HashSet.Raw.get {α : Type u} [BEq α] [Hashable α] (m : Std.HashSet.Raw α) (a : α) (h : a m) :
                  α

                  Retrieves the key from the set that matches a. Ensures that such a key exists by requiring a proof of a ∈ m. The result is guaranteed to be pointer equal to the key in the set.

                  Equations
                  • m.get a h = m.inner.getKey a h
                  Instances For
                    @[inline]
                    def Std.HashSet.Raw.getD {α : Type u} [BEq α] [Hashable α] (m : Std.HashSet.Raw α) (a fallback : α) :
                    α

                    Checks if given key is contained and returns the key if it is, otherwise fallback. If they key is contained the result is guaranteed to be pointer equal to the key in the set.

                    Equations
                    • m.getD a fallback = m.inner.getKeyD a fallback
                    Instances For
                      @[inline]
                      def Std.HashSet.Raw.get! {α : Type u} [BEq α] [Hashable α] [Inhabited α] (m : Std.HashSet.Raw α) (a : α) :
                      α

                      Checks if given key is contained and returns the key if it is, otherwise panics. If no panic occurs the result is guaranteed to be pointer equal to the key in the set.

                      Equations
                      • m.get! a = m.inner.getKey! a
                      Instances For
                        @[inline]

                        Returns true if the hash set contains no elements.

                        Note that if your BEq instance is not reflexive or your Hashable instance is not lawful, then it is possible that this function returns false even though m.contains a = false for all a.

                        Equations
                        • m.isEmpty = m.inner.isEmpty
                        Instances For

                          We currently do not provide lemmas for the functions below.

                          We currently do not provide lemmas for the functions below.

                          @[inline]
                          def Std.HashSet.Raw.filter {α : Type u} [BEq α] [Hashable α] (f : αBool) (m : Std.HashSet.Raw α) :

                          Removes all elements from the hash set for which the given function returns false.

                          Equations
                          Instances For
                            @[inline]
                            def Std.HashSet.Raw.foldM {α : Type u} {m : Type v → Type v} [Monad m] {β : Type v} (f : βαm β) (init : β) (b : Std.HashSet.Raw α) :
                            m β

                            Monadically computes a value by folding the given function over the elements in the hash set in some order.

                            Equations
                            Instances For
                              @[inline]
                              def Std.HashSet.Raw.fold {α : Type u} {β : Type v} (f : βαβ) (init : β) (m : Std.HashSet.Raw α) :
                              β

                              Folds the given function over the elements of the hash set in some order.

                              Equations
                              Instances For
                                @[inline]
                                def Std.HashSet.Raw.forM {α : Type u} {m : Type v → Type v} [Monad m] (f : αm PUnit) (b : Std.HashSet.Raw α) :

                                Carries out a monadic action on each element in the hash set in some order.

                                Equations
                                Instances For
                                  @[inline]
                                  def Std.HashSet.Raw.forIn {α : Type u} {m : Type v → Type v} [Monad m] {β : Type v} (f : αβm (ForInStep β)) (init : β) (b : Std.HashSet.Raw α) :
                                  m β

                                  Support for the for loop construct in do blocks.

                                  Equations
                                  Instances For
                                    instance Std.HashSet.Raw.instForM {α : Type u} {m : Type v → Type v} :
                                    Equations
                                    instance Std.HashSet.Raw.instForIn {α : Type u} {m : Type v → Type v} :
                                    Equations
                                    @[inline]
                                    def Std.HashSet.Raw.all {α : Type u} (m : Std.HashSet.Raw α) (p : αBool) :

                                    Check if all elements satisfy the predicate, short-circuiting if a predicate fails.

                                    Equations
                                    • One or more equations did not get rendered due to their size.
                                    Instances For
                                      @[inline]
                                      def Std.HashSet.Raw.any {α : Type u} (m : Std.HashSet.Raw α) (p : αBool) :

                                      Check if any element satisfies the predicate, short-circuiting if a predicate succeeds.

                                      Equations
                                      • One or more equations did not get rendered due to their size.
                                      Instances For
                                        @[inline]

                                        Transforms the hash set into a list of elements in some order.

                                        Equations
                                        • m.toList = m.inner.keys
                                        Instances For
                                          @[inline]

                                          Transforms the hash set into an array of elements in some order.

                                          Equations
                                          • m.toArray = m.inner.keysArray
                                          Instances For
                                            @[inline]
                                            def Std.HashSet.Raw.insertMany {α : Type u} [BEq α] [Hashable α] {ρ : Type v} [ForIn Id ρ α] (m : Std.HashSet.Raw α) (l : ρ) :

                                            Inserts multiple elements into the hash set. Note that unlike repeatedly calling insert, if the collection contains multiple elements that are equal (with regard to ==), then the last element in the collection will be present in the returned hash set.

                                            Equations
                                            • m.insertMany l = { inner := m.inner.insertManyUnit l }
                                            Instances For
                                              @[inline]
                                              def Std.HashSet.Raw.ofList {α : Type u} [BEq α] [Hashable α] (l : List α) :

                                              Creates a hash set from a list of elements. Note that unlike repeatedly calling insert, if the collection contains multiple elements that are equal (with regard to ==), then the last element in the collection will be present in the returned hash set.

                                              Equations
                                              Instances For
                                                @[inline]
                                                def Std.HashSet.Raw.ofArray {α : Type u} [BEq α] [Hashable α] (l : Array α) :

                                                Creates a hash set from an array of elements. Note that unlike repeatedly calling insert, if the collection contains multiple elements that are equal (with regard to ==), then the last element in the collection will be present in the returned hash set.

                                                Equations
                                                Instances For
                                                  @[inline]
                                                  def Std.HashSet.Raw.union {α : Type u} [BEq α] [Hashable α] (m₁ m₂ : Std.HashSet.Raw α) :

                                                  Computes the union of the given hash sets, by traversing m₂ and inserting its elements into m₁.

                                                  Equations
                                                  Instances For
                                                    Equations
                                                    • Std.HashSet.Raw.instUnionOfBEqOfHashable = { union := Std.HashSet.Raw.union }

                                                    Returns the number of buckets in the internal representation of the hash set. This function may be useful for things like monitoring system health, but it should be considered an internal implementation detail.

                                                    Equations
                                                    Instances For
                                                      Equations
                                                      structure Std.HashSet.Raw.WF {α : Type u} [BEq α] [Hashable α] (m : Std.HashSet.Raw α) :

                                                      Well-formedness predicate for hash sets. Users of HashSet will not need to interact with this. Users of HashSet.Raw will need to provide proofs of WF to lemmas and should use lemmas like WF.empty and WF.insert (which are always named exactly like the operations they are about) to show that set operations preserve well-formedness.

                                                      • out : m.inner.WF

                                                        Internal implementation detail of the hash set

                                                      Instances For
                                                        theorem Std.HashSet.Raw.WF.empty {α : Type u} [BEq α] [Hashable α] {c : Nat} :
                                                        theorem Std.HashSet.Raw.WF.emptyc {α : Type u} [BEq α] [Hashable α] :
                                                        .WF
                                                        theorem Std.HashSet.Raw.WF.insert {α : Type u} [BEq α] [Hashable α] {m : Std.HashSet.Raw α} {a : α} (h : m.WF) :
                                                        (m.insert a).WF
                                                        theorem Std.HashSet.Raw.WF.containsThenInsert {α : Type u} [BEq α] [Hashable α] {m : Std.HashSet.Raw α} {a : α} (h : m.WF) :
                                                        (m.containsThenInsert a).snd.WF
                                                        theorem Std.HashSet.Raw.WF.erase {α : Type u} [BEq α] [Hashable α] {m : Std.HashSet.Raw α} {a : α} (h : m.WF) :
                                                        (m.erase a).WF
                                                        theorem Std.HashSet.Raw.WF.filter {α : Type u} [BEq α] [Hashable α] {m : Std.HashSet.Raw α} {f : αBool} (h : m.WF) :
                                                        theorem Std.HashSet.Raw.WF.insertMany {α : Type u} [BEq α] [Hashable α] {ρ : Type v} [ForIn Id ρ α] {m : Std.HashSet.Raw α} {l : ρ} (h : m.WF) :
                                                        (m.insertMany l).WF
                                                        theorem Std.HashSet.Raw.WF.ofList {α : Type u} [BEq α] [Hashable α] {l : List α} :