Documentation

Mathlib.Data.UnionFind

structure UFModel (n : ) :
  • parent : Fin nFin n
  • rank :
  • rank_lt : ∀ (i : Fin n), (self.parent i) iself.rank i < self.rank (self.parent i)
Instances For
    theorem UFModel.rank_lt {n : } (self : UFModel n) (i : Fin n) :
    (self.parent i) iself.rank i < self.rank (self.parent i)
    Equations
    Instances For
      def UFModel.push {n : } (m : UFModel n) (k : ) (le : n k) :
      Equations
      • One or more equations did not get rendered due to their size.
      Instances For
        def UFModel.setParent {n : } (m : UFModel n) (x : Fin n) (y : Fin n) (h : m.rank x < m.rank y) :
        Equations
        • m.setParent x y h = { parent := fun (i : Fin n) => if x = i then y else m.parent i, rank := m.rank, rank_lt := }
        Instances For
          def UFModel.setParentBump {n : } (m : UFModel n) (x : Fin n) (y : Fin n) (H : m.rank x m.rank y) (hroot : (m.parent y) = y) :
          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            structure UFNode (α : Type u_1) :
            Type u_1
            • parent :
            • value : α
            • rank :
            Instances For
              inductive UFModel.Agrees {α : Type u_1} {β : Sort u_2} (arr : Array α) (f : αβ) {n : } :
              (Fin nβ)Prop
              Instances For
                theorem UFModel.Agrees.mk' {α : Type u_1} {β : Sort u_2} {arr : Array α} {f : αβ} {n : } {g : Fin nβ} (e : n = arr.size) (H : ∀ (i : ) (h₁ : i < arr.size) (h₂ : i < n), f (arr.get i, h₁) = g i, h₂) :
                theorem UFModel.Agrees.size_eq {α : Type u_1} {n : } {β : Sort u_2} {f : αβ} {arr : Array α} {m : Fin nβ} (H : UFModel.Agrees arr f m) :
                n = arr.size
                theorem UFModel.Agrees.get_eq {α : Type u_1} {β : Sort u_2} {f : αβ} {arr : Array α} {n : } {m : Fin nβ} (H : UFModel.Agrees arr f m) (i : ) (h₁ : i < arr.size) (h₂ : i < n) :
                f (arr.get i, h₁) = m i, h₂
                theorem UFModel.Agrees.get_eq' {α : Type u_1} {β : Sort u_2} {f : αβ} {arr : Array α} {m : Fin arr.sizeβ} (H : UFModel.Agrees arr f m) (i : Fin arr.size) :
                f (arr.get i) = m i
                theorem UFModel.Agrees.empty {α : Type u_1} {β : Sort u_2} {f : αβ} {g : Fin 0β} :
                theorem UFModel.Agrees.push {α : Type u_1} {β : Sort u_2} {f : αβ} {arr : Array α} {n : } {m : Fin nβ} (H : UFModel.Agrees arr f m) (k : ) (hk : k = n + 1) (x : α) (m' : Fin kβ) (hm₁ : ∀ (i : Fin k) (h : i < n), m' i = m i, h) (hm₂ : ∀ (h : n < k), f x = m' n, h) :
                UFModel.Agrees (arr.push x) f m'
                theorem UFModel.Agrees.set {α : Type u_1} {β : Sort u_2} {f : αβ} {arr : Array α} {n : } {m : Fin nβ} (H : UFModel.Agrees arr f m) {i : Fin arr.size} {x : α} {m' : Fin nβ} (hm₁ : ∀ (j : Fin n), j im' j = m j) (hm₂ : ∀ (h : i < n), f x = m' i, h) :
                UFModel.Agrees (arr.set i x) f m'
                def UFModel.Models {α : Type u_1} (arr : Array (UFNode α)) {n : } (m : UFModel n) :
                Equations
                Instances For
                  theorem UFModel.Models.size_eq {α : Type u_1} {arr : Array (UFNode α)} {n : } {m : UFModel n} (H : UFModel.Models arr m) :
                  n = arr.size
                  theorem UFModel.Models.parent_eq {α : Type u_1} {arr : Array (UFNode α)} {n : } {m : UFModel n} (H : UFModel.Models arr m) (i : ) (h₁ : i < arr.size) (h₂ : i < n) :
                  arr[i].parent = (m.parent i, h₂)
                  theorem UFModel.Models.parent_eq' {α : Type u_1} {arr : Array (UFNode α)} {m : UFModel arr.size} (H : UFModel.Models arr m) (i : Fin arr.size) :
                  arr[i].parent = (m.parent i)
                  theorem UFModel.Models.rank_eq {α : Type u_1} {arr : Array (UFNode α)} {n : } {m : UFModel n} (H : UFModel.Models arr m) (i : ) (h : i < arr.size) :
                  arr[i].rank = m.rank i
                  theorem UFModel.Models.push {α : Type u_1} {arr : Array (UFNode α)} {n : } {m : UFModel n} (H : UFModel.Models arr m) (k : ) (hk : k = n + 1) (x : α) :
                  UFModel.Models (arr.push { parent := n, value := x, rank := 0 }) (m.push k )
                  theorem UFModel.Models.setParent {α : Type u_1} {arr : Array (UFNode α)} {n : } {m : UFModel n} (hm : UFModel.Models arr m) (i : Fin n) (j : Fin n) (H : m.rank i < m.rank j) (hi : i < arr.size) (x : UFNode α) (hp : x.parent = j) (hrk : x.rank = arr[i].rank) :
                  UFModel.Models (arr.set i, hi x) (m.setParent i j H)
                  structure UnionFind (α : Type u_1) :
                  Type u_1
                  Instances For
                    theorem UnionFind.model {α : Type u_1} (self : UnionFind α) :
                    ∃ (n : ), ∃ (m : UFModel n), UFModel.Models self.arr m
                    def UnionFind.size {α : Type u_1} (self : UnionFind α) :
                    Equations
                    • self.size = self.arr.size
                    Instances For
                      theorem UnionFind.model' {α : Type u_1} (self : UnionFind α) :
                      ∃ (m : UFModel self.arr.size), UFModel.Models self.arr m
                      def UnionFind.empty {α : Type u_1} :
                      Equations
                      • UnionFind.empty = { arr := #[], model := }
                      Instances For
                        def UnionFind.mkEmpty {α : Type u_1} (c : ) :
                        Equations
                        Instances For
                          def UnionFind.rank {α : Type u_1} (self : UnionFind α) (i : ) :
                          Equations
                          • self.rank i = if h : i < self.size then (self.arr.get i, h).rank else 0
                          Instances For
                            def UnionFind.rankMaxAux {α : Type u_1} (self : UnionFind α) (i : ) :
                            { k : // ∀ (j : ), j < i∀ (h : j < self.arr.size), (self.arr.get j, h).rank k }
                            Equations
                            • self.rankMaxAux 0 = 0,
                            • self.rankMaxAux i.succ = match self.rankMaxAux i with | k, H => max k (if h : i < self.arr.size then (self.arr.get i, h).rank else 0),
                            Instances For
                              def UnionFind.rankMax {α : Type u_1} (self : UnionFind α) :
                              Equations
                              • self.rankMax = (self.rankMaxAux self.size).val + 1
                              Instances For
                                theorem UnionFind.lt_rankMax' {α : Type u_1} (self : UnionFind α) (i : Fin self.size) :
                                (self.arr.get i).rank < self.rankMax
                                theorem UnionFind.lt_rankMax {α : Type u_1} (self : UnionFind α) (i : ) :
                                self.rank i < self.rankMax
                                theorem UnionFind.rank_eq {α : Type u_1} (self : UnionFind α) {n : } {m : UFModel n} (H : UFModel.Models self.arr m) {i : } (h : i < self.size) :
                                self.rank i = m.rank i
                                theorem UnionFind.rank_lt {α : Type u_1} (self : UnionFind α) {i : } (h : i < self.arr.size) :
                                self.arr[i].parent iself.rank i < self.rank self.arr[i].parent
                                theorem UnionFind.parent_lt {α : Type u_1} (self : UnionFind α) (i : ) (h : i < self.arr.size) :
                                self.arr[i].parent < self.size
                                def UnionFind.push {α : Type u_1} (self : UnionFind α) (x : α) :
                                Equations
                                • self.push x = { arr := self.arr.push { parent := self.arr.size, value := x, rank := 0 }, model := }
                                Instances For
                                  @[irreducible]
                                  def UnionFind.findAux {α : Type u_1} (self : UnionFind α) (x : Fin self.size) :
                                  (s : Array (UFNode α)) ×' (root : Fin s.size) ×' ∃ (n : ), ∃ (m : UFModel n), ∃ (m' : UFModel n), UFModel.Models self.arr m UFModel.Models s m' m'.rank = m.rank (∃ (hr : root < n), (m'.parent root, hr) = root) m.rank x m.rank root
                                  Equations
                                  • One or more equations did not get rendered due to their size.
                                  Instances For
                                    def UnionFind.find {α : Type u_1} (self : UnionFind α) (x : Fin self.size) :
                                    (s : UnionFind α) × (root : Fin s.size) ×' s.size = self.size (s.arr.get root).parent = root
                                    Equations
                                    • self.find x = match self.findAux x with | s, root, H => let_fun this := ; { arr := s, model := }, root,
                                    Instances For
                                      def UnionFind.union {α : Type u_1} (self : UnionFind α) (x : Fin self.size) (y : Fin self.size) :
                                      Equations
                                      • self.union x y = match self.find x with | self₁, rx, => match self₁.find y, with | self₂, ry, => self₂.link rx, ry hry
                                      Instances For