Theorem: Ordnode.Valid'.eraseMax_aux
File: Mathlib/Data/Ordmap/Ordset.lean

tactic: have := H.2.eq_node'
state_before: α : Type u_1
inst✝ : Preorder α
s : ℕ
l : Ordnode α
x : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
H : Valid' o₁ (Ordnode.node s l x r) o₂
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x r)) ↑(findMax' x r) ∧
    size (Ordnode.node' l x r) = size (eraseMax (Ordnode.node' l x r)) + 1

tactic: rw [this] at H
state_before: α : Type u_1
inst✝ : Preorder α
s : ℕ
l : Ordnode α
x : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
H : Valid' o₁ (Ordnode.node s l x r) o₂
this : Ordnode.node s l x r = Ordnode.node' l x r
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x r)) ↑(findMax' x r) ∧
    size (Ordnode.node' l x r) = size (eraseMax (Ordnode.node' l x r)) + 1

tactic: clear this
state_before: α : Type u_1
inst✝ : Preorder α
s : ℕ
l : Ordnode α
x : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
H : Valid' o₁ (Ordnode.node' l x r) o₂
this : Ordnode.node s l x r = Ordnode.node' l x r
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x r)) ↑(findMax' x r) ∧
    size (Ordnode.node' l x r) = size (eraseMax (Ordnode.node' l x r)) + 1

tactic: induction' r with rs rl rx rr _ IHrr generalizing l x o₁
state_before: α : Type u_1
inst✝ : Preorder α
s : ℕ
l : Ordnode α
x : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
H : Valid' o₁ (Ordnode.node' l x r) o₂
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x r)) ↑(findMax' x r) ∧
    size (Ordnode.node' l x r) = size (eraseMax (Ordnode.node' l x r)) + 1

tactic: have := H.2.2.2.eq_node'
state_before: case node
α : Type u_1
inst✝ : Preorder α
s : ℕ
l✝ : Ordnode α
x✝ : α
r : Ordnode α
o₁✝ : WithBot α
o₂ : WithTop α
H✝ : Valid' o₁✝ (Ordnode.node' l✝ x✝ r) o₂
rs : ℕ
rl : Ordnode α
rx : α
rr : Ordnode α
l_ih✝ :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rl) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rl)) ↑(findMax' x rl) ∧
        size (Ordnode.node' l x rl) = size (eraseMax (Ordnode.node' l x rl)) + 1
IHrr :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rr) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rr)) ↑(findMax' x rr) ∧
        size (Ordnode.node' l x rr) = size (eraseMax (Ordnode.node' l x rr)) + 1
l : Ordnode α
x : α
o₁ : WithBot α
H : Valid' o₁ (Ordnode.node' l x (Ordnode.node rs rl rx rr)) o₂
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x (Ordnode.node rs rl rx rr))) ↑(findMax' x (Ordnode.node rs rl rx rr)) ∧
    size (Ordnode.node' l x (Ordnode.node rs rl rx rr)) =
      size (eraseMax (Ordnode.node' l x (Ordnode.node rs rl rx rr))) + 1

tactic: rw [this] at H ⊢
state_before: case node
α : Type u_1
inst✝ : Preorder α
s : ℕ
l✝ : Ordnode α
x✝ : α
r : Ordnode α
o₁✝ : WithBot α
o₂ : WithTop α
H✝ : Valid' o₁✝ (Ordnode.node' l✝ x✝ r) o₂
rs : ℕ
rl : Ordnode α
rx : α
rr : Ordnode α
l_ih✝ :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rl) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rl)) ↑(findMax' x rl) ∧
        size (Ordnode.node' l x rl) = size (eraseMax (Ordnode.node' l x rl)) + 1
IHrr :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rr) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rr)) ↑(findMax' x rr) ∧
        size (Ordnode.node' l x rr) = size (eraseMax (Ordnode.node' l x rr)) + 1
l : Ordnode α
x : α
o₁ : WithBot α
H : Valid' o₁ (Ordnode.node' l x (Ordnode.node rs rl rx rr)) o₂
this : Ordnode.node rs rl rx rr = Ordnode.node' rl rx rr
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x (Ordnode.node rs rl rx rr))) ↑(findMax' x (Ordnode.node rs rl rx rr)) ∧
    size (Ordnode.node' l x (Ordnode.node rs rl rx rr)) =
      size (eraseMax (Ordnode.node' l x (Ordnode.node rs rl rx rr))) + 1

tactic: rcases IHrr H.right with ⟨h, e⟩
state_before: case node
α : Type u_1
inst✝ : Preorder α
s : ℕ
l✝ : Ordnode α
x✝ : α
r : Ordnode α
o₁✝ : WithBot α
o₂ : WithTop α
H✝ : Valid' o₁✝ (Ordnode.node' l✝ x✝ r) o₂
rs : ℕ
rl : Ordnode α
rx : α
rr : Ordnode α
l_ih✝ :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rl) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rl)) ↑(findMax' x rl) ∧
        size (Ordnode.node' l x rl) = size (eraseMax (Ordnode.node' l x rl)) + 1
IHrr :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rr) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rr)) ↑(findMax' x rr) ∧
        size (Ordnode.node' l x rr) = size (eraseMax (Ordnode.node' l x rr)) + 1
l : Ordnode α
x : α
o₁ : WithBot α
H : Valid' o₁ (Ordnode.node' l x (Ordnode.node' rl rx rr)) o₂
this : Ordnode.node rs rl rx rr = Ordnode.node' rl rx rr
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x (Ordnode.node' rl rx rr))) ↑(findMax' x (Ordnode.node' rl rx rr)) ∧
    size (Ordnode.node' l x (Ordnode.node' rl rx rr)) = size (eraseMax (Ordnode.node' l x (Ordnode.node' rl rx rr))) + 1

tactic: refine' ⟨Valid'.balanceL H.left h (Or.inr ⟨_, Or.inr e, H.3.1⟩), _⟩
state_before: case node.intro
α : Type u_1
inst✝ : Preorder α
s : ℕ
l✝ : Ordnode α
x✝ : α
r : Ordnode α
o₁✝ : WithBot α
o₂ : WithTop α
H✝ : Valid' o₁✝ (Ordnode.node' l✝ x✝ r) o₂
rs : ℕ
rl : Ordnode α
rx : α
rr : Ordnode α
l_ih✝ :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rl) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rl)) ↑(findMax' x rl) ∧
        size (Ordnode.node' l x rl) = size (eraseMax (Ordnode.node' l x rl)) + 1
IHrr :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rr) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rr)) ↑(findMax' x rr) ∧
        size (Ordnode.node' l x rr) = size (eraseMax (Ordnode.node' l x rr)) + 1
l : Ordnode α
x : α
o₁ : WithBot α
H : Valid' o₁ (Ordnode.node' l x (Ordnode.node' rl rx rr)) o₂
this : Ordnode.node rs rl rx rr = Ordnode.node' rl rx rr
h : Valid' (↑x) (eraseMax (Ordnode.node' rl rx rr)) ↑(findMax' rx rr)
e : size (Ordnode.node' rl rx rr) = size (eraseMax (Ordnode.node' rl rx rr)) + 1
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x (Ordnode.node' rl rx rr))) ↑(findMax' x (Ordnode.node' rl rx rr)) ∧
    size (Ordnode.node' l x (Ordnode.node' rl rx rr)) = size (eraseMax (Ordnode.node' l x (Ordnode.node' rl rx rr))) + 1

tactic: rw [eraseMax, size_balanceL H.3.2.1 h.3 H.2.2.1 h.2 (Or.inr ⟨_, Or.inr e, H.3.1⟩)]
state_before: case node.intro
α : Type u_1
inst✝ : Preorder α
s : ℕ
l✝ : Ordnode α
x✝ : α
r : Ordnode α
o₁✝ : WithBot α
o₂ : WithTop α
H✝ : Valid' o₁✝ (Ordnode.node' l✝ x✝ r) o₂
rs : ℕ
rl : Ordnode α
rx : α
rr : Ordnode α
l_ih✝ :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rl) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rl)) ↑(findMax' x rl) ∧
        size (Ordnode.node' l x rl) = size (eraseMax (Ordnode.node' l x rl)) + 1
IHrr :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rr) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rr)) ↑(findMax' x rr) ∧
        size (Ordnode.node' l x rr) = size (eraseMax (Ordnode.node' l x rr)) + 1
l : Ordnode α
x : α
o₁ : WithBot α
H : Valid' o₁ (Ordnode.node' l x (Ordnode.node' rl rx rr)) o₂
this : Ordnode.node rs rl rx rr = Ordnode.node' rl rx rr
h : Valid' (↑x) (eraseMax (Ordnode.node' rl rx rr)) ↑(findMax' rx rr)
e : size (Ordnode.node' rl rx rr) = size (eraseMax (Ordnode.node' rl rx rr)) + 1
⊢ size (Ordnode.node' l x (Ordnode.node' rl rx rr)) = size (eraseMax (Ordnode.node' l x (Ordnode.node' rl rx rr))) + 1

tactic: rw [size, e]
state_before: case node.intro
α : Type u_1
inst✝ : Preorder α
s : ℕ
l✝ : Ordnode α
x✝ : α
r : Ordnode α
o₁✝ : WithBot α
o₂ : WithTop α
H✝ : Valid' o₁✝ (Ordnode.node' l✝ x✝ r) o₂
rs : ℕ
rl : Ordnode α
rx : α
rr : Ordnode α
l_ih✝ :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rl) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rl)) ↑(findMax' x rl) ∧
        size (Ordnode.node' l x rl) = size (eraseMax (Ordnode.node' l x rl)) + 1
IHrr :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rr) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rr)) ↑(findMax' x rr) ∧
        size (Ordnode.node' l x rr) = size (eraseMax (Ordnode.node' l x rr)) + 1
l : Ordnode α
x : α
o₁ : WithBot α
H : Valid' o₁ (Ordnode.node' l x (Ordnode.node' rl rx rr)) o₂
this : Ordnode.node rs rl rx rr = Ordnode.node' rl rx rr
h : Valid' (↑x) (eraseMax (Ordnode.node' rl rx rr)) ↑(findMax' rx rr)
e : size (Ordnode.node' rl rx rr) = size (eraseMax (Ordnode.node' rl rx rr)) + 1
⊢ size (Ordnode.node' l x (Ordnode.node' rl rx rr)) = size l + size (eraseMax (Ordnode.node' rl rx rr)) + 1 + 1

tactic: rfl
state_before: case node.intro
α : Type u_1
inst✝ : Preorder α
s : ℕ
l✝ : Ordnode α
x✝ : α
r : Ordnode α
o₁✝ : WithBot α
o₂ : WithTop α
H✝ : Valid' o₁✝ (Ordnode.node' l✝ x✝ r) o₂
rs : ℕ
rl : Ordnode α
rx : α
rr : Ordnode α
l_ih✝ :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rl) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rl)) ↑(findMax' x rl) ∧
        size (Ordnode.node' l x rl) = size (eraseMax (Ordnode.node' l x rl)) + 1
IHrr :
  ∀ {l : Ordnode α} {x : α} {o₁ : WithBot α},
    Valid' o₁ (Ordnode.node' l x rr) o₂ →
      Valid' o₁ (eraseMax (Ordnode.node' l x rr)) ↑(findMax' x rr) ∧
        size (Ordnode.node' l x rr) = size (eraseMax (Ordnode.node' l x rr)) + 1
l : Ordnode α
x : α
o₁ : WithBot α
H : Valid' o₁ (Ordnode.node' l x (Ordnode.node' rl rx rr)) o₂
this : Ordnode.node rs rl rx rr = Ordnode.node' rl rx rr
h : Valid' (↑x) (eraseMax (Ordnode.node' rl rx rr)) ↑(findMax' rx rr)
e : size (Ordnode.node' rl rx rr) = size (eraseMax (Ordnode.node' rl rx rr)) + 1
⊢ size l + (size (eraseMax (Ordnode.node' rl rx rr)) + 1) + 1 =
    size l + size (eraseMax (Ordnode.node' rl rx rr)) + 1 + 1

tactic: exact ⟨H.left, rfl⟩
state_before: case nil
α : Type u_1
inst✝ : Preorder α
s : ℕ
l✝ : Ordnode α
x✝ : α
r : Ordnode α
o₁✝ : WithBot α
o₂ : WithTop α
H✝ : Valid' o₁✝ (Ordnode.node' l✝ x✝ r) o₂
l : Ordnode α
x : α
o₁ : WithBot α
H : Valid' o₁ (Ordnode.node' l x nil) o₂
⊢ Valid' o₁ (eraseMax (Ordnode.node' l x nil)) ↑(findMax' x nil) ∧
    size (Ordnode.node' l x nil) = size (eraseMax (Ordnode.node' l x nil)) + 1