Theorem: Batteries.UnionFind.find_root_1
File: .lake/packages/batteries/Batteries/Data/UnionFind/Basic.lean

tactic: rw [rootD_eq_self.2 h]
state_before: self : UnionFind
x : Fin self.size
i : Nat
h : (self.find x).fst.parent i = i
⊢ (self.find x).fst.rootD i = self.rootD i
state_after: self : UnionFind
x : Fin self.size
i : Nat
h : (self.find x).fst.parent i = i
⊢ i = self.rootD i

tactic: obtain ⟨h1, _⟩ | h1 := find_parent_or self x i <;> rw [h1] at h
state_before: self : UnionFind
x : Fin self.size
i : Nat
h : (self.find x).fst.parent i = i
⊢ i = self.rootD i
state_after: case inl.intro
self : UnionFind
x : Fin self.size
i : Nat
h : self.rootD i = i
h1 : (self.find x).fst.parent i = self.rootD i
right✝ : self.rootD i = self.rootD ↑x
⊢ i = self.rootD i

case inr
self : UnionFind
x : Fin self.size
i : Nat
h : self.parent i = i
h1 : (self.find x).fst.parent i = self.parent i
⊢ i = self.rootD i

tactic: rw [h]
state_before: case inl.intro
self : UnionFind
x : Fin self.size
i : Nat
h : self.rootD i = i
h1 : (self.find x).fst.parent i = self.rootD i
right✝ : self.rootD i = self.rootD ↑x
⊢ i = self.rootD i
state_after: no goals

tactic: rw [rootD_eq_self.2 h]
state_before: case inr
self : UnionFind
x : Fin self.size
i : Nat
h : self.parent i = i
h1 : (self.find x).fst.parent i = self.parent i
⊢ i = self.rootD i
state_after: no goals

tactic: have := Nat.sub_lt_sub_left ((self.find x).1.lt_rankMax _) ((self.find x).1.rank_lt h)
state_before: self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
⊢ (self.find x).fst.rootD i = self.rootD i
state_after: self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
⊢ (self.find x).fst.rootD i = self.rootD i

tactic: rw [← rootD_parent, find_root_1 self x ((self.find x).1.parent i)]
state_before: self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
⊢ (self.find x).fst.rootD i = self.rootD i
state_after: self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
⊢ self.rootD ((self.find x).fst.parent i) = self.rootD i

tactic: obtain ⟨h1, _⟩ | h1 := find_parent_or self x i
state_before: self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
⊢ self.rootD ((self.find x).fst.parent i) = self.rootD i
state_after: case inl.intro
self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
h1 : (self.find x).fst.parent i = self.rootD i
right✝ : self.rootD i = self.rootD ↑x
⊢ self.rootD ((self.find x).fst.parent i) = self.rootD i

case inr
self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
h1 : (self.find x).fst.parent i = self.parent i
⊢ self.rootD ((self.find x).fst.parent i) = self.rootD i

tactic: rw [h1, rootD_rootD]
state_before: case inl.intro
self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
h1 : (self.find x).fst.parent i = self.rootD i
right✝ : self.rootD i = self.rootD ↑x
⊢ self.rootD ((self.find x).fst.parent i) = self.rootD i
state_after: no goals

tactic: rw [h1, rootD_parent]
state_before: case inr
self : UnionFind
x : Fin self.size
i : Nat
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
h1 : (self.find x).fst.parent i = self.parent i
⊢ self.rootD ((self.find x).fst.parent i) = self.rootD i
state_after: no goals

tactic: exact this
state_before: self : UnionFind
x : Fin self.size
i : Nat
a✝ :
  ∀ (y : Nat),
    (invImage (fun x_1 => (self.find x).fst.rankMax - (self.find x).fst.rank x_1) instWellFoundedRelationOfSizeOf).1 y
        i →
      (self.find x).fst.rootD y = self.rootD y
h : ¬(self.find x).fst.parent i = i
this :
  (self.find x).fst.rankMax - (self.find x).fst.rank ((self.find x).fst.parent i) <
    (self.find x).fst.rankMax - (self.find x).fst.rank i
⊢ (invImage (fun x_1 => (self.find x).fst.rankMax - (self.find x).fst.rank x_1) instWellFoundedRelationOfSizeOf).1
    ((self.find x).fst.parent i) i
state_after: no goals