Theorem: Ordnode.insertWith.valid_aux
File: Mathlib/Data/Ordmap/Ordset.lean

tactic: rw [insertWith, cmpLE]
state_before: α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
⊢ Valid' o₁ (insertWith f x (node sz l y r)) o₂ ∧ Raised (size (node sz l y r)) (size (insertWith f x (node sz l y r)))

tactic: split_ifs with h_1 h_2 <;> dsimp only
state_before: α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
⊢ Valid' o₁
      (match if x ≤ y then if y ≤ x then Ordering.eq else Ordering.lt else Ordering.gt with
      | Ordering.lt => balanceL (insertWith f x l) y r
      | Ordering.eq => node sz l (f y) r
      | Ordering.gt => balanceR l y (insertWith f x r))
      o₂ ∧
    Raised (size (node sz l y r))
      (size
        (match if x ≤ y then if y ≤ x then Ordering.eq else Ordering.lt else Ordering.gt with
        | Ordering.lt => balanceL (insertWith f x l) y r
        | Ordering.eq => node sz l (f y) r
        | Ordering.gt => balanceR l y (insertWith f x r)))

tactic: rcases h with ⟨⟨lx, xr⟩, hs, hb⟩
state_before: case inl.inl
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : y ≤ x
⊢ Valid' o₁ (node sz l (f y) r) o₂ ∧ Raised (size (node sz l y r)) (size (node sz l (f y) r))

tactic: rcases hf _ ⟨h_1, h_2⟩ with ⟨xf, fx⟩
state_before: case inl.inl.mk.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : y ≤ x
hs : Sized (node sz l y r)
hb : Balanced (node sz l y r)
lx : Bounded l o₁ ↑y
xr : Bounded r (↑y) o₂
⊢ Valid' o₁ (node sz l (f y) r) o₂ ∧ Raised (size (node sz l y r)) (size (node sz l (f y) r))

tactic: refine'
  ⟨⟨⟨lx.mono_right (le_trans h_2 xf), xr.mono_left (le_trans fx h_1)⟩, hs, hb⟩, Or.inl rfl⟩
state_before: case inl.inl.mk.intro.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : y ≤ x
hs : Sized (node sz l y r)
hb : Balanced (node sz l y r)
lx : Bounded l o₁ ↑y
xr : Bounded r (↑y) o₂
xf : x ≤ f y
fx : f y ≤ x
⊢ Valid' o₁ (node sz l (f y) r) o₂ ∧ Raised (size (node sz l y r)) (size (node sz l (f y) r))

tactic: rcases insertWith.valid_aux f x hf h.left bl (lt_of_le_not_le h_1 h_2) with ⟨vl, e⟩
state_before: case inl.inr
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : ¬y ≤ x
⊢ Valid' o₁ (balanceL (insertWith f x l) y r) o₂ ∧
    Raised (size (node sz l y r)) (size (balanceL (insertWith f x l) y r))

tactic: suffices H
state_before: case inl.inr.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : ¬y ≤ x
vl : Valid' o₁ (insertWith f x l) ↑y
e : Raised (size l) (size (insertWith f x l))
⊢ Valid' o₁ (balanceL (insertWith f x l) y r) o₂ ∧
    Raised (size (node sz l y r)) (size (balanceL (insertWith f x l) y r))

tactic: refine' ⟨vl.balanceL h.right H, _⟩
state_before: case inl.inr.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : ¬y ≤ x
vl : Valid' o₁ (insertWith f x l) ↑y
e : Raised (size l) (size (insertWith f x l))
H : ?m.370465
⊢ Valid' o₁ (balanceL (insertWith f x l) y r) o₂ ∧
    Raised (size (node sz l y r)) (size (balanceL (insertWith f x l) y r))

tactic: rw [size_balanceL vl.3 h.3.2.2 vl.2 h.2.2.2 H, h.2.size_eq]
state_before: case inl.inr.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : ¬y ≤ x
vl : Valid' o₁ (insertWith f x l) ↑y
e : Raised (size l) (size (insertWith f x l))
H :
  (∃ l', Raised l' (size (insertWith f x l)) ∧ BalancedSz l' (size r)) ∨
    ∃ r', Raised (size r) r' ∧ BalancedSz (size (insertWith f x l)) r'
⊢ Raised (size (node sz l y r)) (size (balanceL (insertWith f x l) y r))

tactic: refine' (e.add_right _).add_right _
state_before: case inl.inr.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : ¬y ≤ x
vl : Valid' o₁ (insertWith f x l) ↑y
e : Raised (size l) (size (insertWith f x l))
H :
  (∃ l', Raised l' (size (insertWith f x l)) ∧ BalancedSz l' (size r)) ∨
    ∃ r', Raised (size r) r' ∧ BalancedSz (size (insertWith f x l)) r'
⊢ Raised (size l + size r + 1) (size (insertWith f x l) + size r + 1)

tactic: exact Or.inl ⟨_, e, h.3.1⟩
state_before: case H
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : x ≤ y
h_2 : ¬y ≤ x
vl : Valid' o₁ (insertWith f x l) ↑y
e : Raised (size l) (size (insertWith f x l))
⊢ (∃ l', Raised l' (size (insertWith f x l)) ∧ BalancedSz l' (size r)) ∨
    ∃ r', Raised (size r) r' ∧ BalancedSz (size (insertWith f x l)) r'

tactic: rcases insertWith.valid_aux f x hf h.right this br with ⟨vr, e⟩
state_before: case inr
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : ¬x ≤ y
this : y < x
⊢ Valid' o₁ (balanceR l y (insertWith f x r)) o₂ ∧
    Raised (size (node sz l y r)) (size (balanceR l y (insertWith f x r)))

tactic: suffices H
state_before: case inr.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : ¬x ≤ y
this : y < x
vr : Valid' (↑y) (insertWith f x r) o₂
e : Raised (size r) (size (insertWith f x r))
⊢ Valid' o₁ (balanceR l y (insertWith f x r)) o₂ ∧
    Raised (size (node sz l y r)) (size (balanceR l y (insertWith f x r)))

tactic: refine' ⟨h.left.balanceR vr H, _⟩
state_before: case inr.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : ¬x ≤ y
this : y < x
vr : Valid' (↑y) (insertWith f x r) o₂
e : Raised (size r) (size (insertWith f x r))
H : ?m.370972
⊢ Valid' o₁ (balanceR l y (insertWith f x r)) o₂ ∧
    Raised (size (node sz l y r)) (size (balanceR l y (insertWith f x r)))

tactic: rw [size_balanceR h.3.2.1 vr.3 h.2.2.1 vr.2 H, h.2.size_eq]
state_before: case inr.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : ¬x ≤ y
this : y < x
vr : Valid' (↑y) (insertWith f x r) o₂
e : Raised (size r) (size (insertWith f x r))
H :
  (∃ l', Raised (size l) l' ∧ BalancedSz l' (size (insertWith f x r))) ∨
    ∃ r', Raised r' (size (insertWith f x r)) ∧ BalancedSz (size l) r'
⊢ Raised (size (node sz l y r)) (size (balanceR l y (insertWith f x r)))

tactic: refine' (e.add_left _).add_right _
state_before: case inr.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : ¬x ≤ y
this : y < x
vr : Valid' (↑y) (insertWith f x r) o₂
e : Raised (size r) (size (insertWith f x r))
H :
  (∃ l', Raised (size l) l' ∧ BalancedSz l' (size (insertWith f x r))) ∨
    ∃ r', Raised r' (size (insertWith f x r)) ∧ BalancedSz (size l) r'
⊢ Raised (size l + size r + 1) (size l + size (insertWith f x r) + 1)

tactic: exact Or.inr ⟨_, e, h.3.1⟩
state_before: case H
α : Type u_1
inst✝² : Preorder α
inst✝¹ : IsTotal α fun x x_1 => x ≤ x_1
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : α → α
x : α
hf : ∀ (y : α), x ≤ y ∧ y ≤ x → x ≤ f y ∧ f y ≤ x
sz : ℕ
l : Ordnode α
y : α
r : Ordnode α
o₁ : WithBot α
o₂ : WithTop α
h : Valid' o₁ (node sz l y r) o₂
bl : Bounded nil o₁ ↑x
br : Bounded nil (↑x) o₂
h_1 : ¬x ≤ y
this : y < x
vr : Valid' (↑y) (insertWith f x r) o₂
e : Raised (size r) (size (insertWith f x r))
⊢ (∃ l', Raised (size l) l' ∧ BalancedSz l' (size (insertWith f x r))) ∨
    ∃ r', Raised r' (size (insertWith f x r)) ∧ BalancedSz (size l) r'