-- Mathlib/.lake/packages/batteries/Batteries/Data/RBMap/WF.lean
theorem Ordered.append {l : RBNode α} {v : α} {r : RBNode α}
    (lv : l.All (cmpLT cmp · v)) (vr : r.All (cmpLT cmp v ·))
    (hl : l.Ordered cmp) (hr : r.Ordered cmp) : (append l r).Ordered cmp

Proof state:
case h_3.h_2
α : Type u_1
cmp : α → α → Ordering
v : α
x✝³ x✝² a✝ : RBNode α
x✝¹ : α
b✝ c✝ : RBNode α
y✝ : α
d✝ : RBNode α
lv : All (fun x => cmpLT cmp x v) (node red a✝ x✝¹ b✝)
hl : Ordered cmp (node red a✝ x✝¹ b✝)
vr : All (fun x => cmpLT cmp v x) (node red c✝ y✝ d✝)
hr : Ordered cmp (node red c✝ y✝ d✝)
xv : (fun x => cmpLT cmp x v) x✝¹
left✝ : All (fun x => cmpLT cmp x v) a✝
bv : All (fun x => cmpLT cmp x v) b✝
ax : All (fun x => cmpLT cmp x x✝¹) a✝
xb : All (fun x => cmpLT cmp x✝¹ x) b✝
ha : Ordered cmp a✝
hb : Ordered cmp b✝
vy : (fun x => cmpLT cmp v x) y✝
vc : All (fun x => cmpLT cmp v x) c✝
right✝ : All (fun x => cmpLT cmp v x) d✝
cy : All (fun x => cmpLT cmp x y✝) c✝
yd : All (fun x => cmpLT cmp y✝ x) d✝
hc : Ordered cmp c✝
hd : Ordered cmp d✝
this :
  Ordered cmp (b✝.append c✝) ∧
    All (fun x => cmpLT cmp x✝¹ x) (b✝.append c✝) ∧ All (fun x => cmpLT cmp x y✝) (b✝.append c✝)
l✝ : RBNode α
x✝ : ∀ (a : RBNode α) (x : α) (b : RBNode α), b✝.append c✝ = node red a x b → False
hbc : Ordered cmp (b✝.append c✝)
xbc : All (fun x => cmpLT cmp x✝¹ x) (b✝.append c✝)
bcy : All (fun x => cmpLT cmp x y✝) (b✝.append c✝)
⊢ Ordered cmp (node red a✝ x✝¹ (node red (b✝.append c✝) y✝ d✝))

Tactic:
have xy := xv.trans vy

Result:
case h_3.h_2
α : Type u_1
cmp : α → α → Ordering
v : α
x✝³ x✝² a✝ : RBNode α
x✝¹ : α
b✝ c✝ : RBNode α
y✝ : α
d✝ : RBNode α
lv : All (fun x => cmpLT cmp x v) (node red a✝ x✝¹ b✝)
hl : Ordered cmp (node red a✝ x✝¹ b✝)
vr : All (fun x => cmpLT cmp v x) (node red c✝ y✝ d✝)
hr : Ordered cmp (node red c✝ y✝ d✝)
xv : (fun x => cmpLT cmp x v) x✝¹
left✝ : All (fun x => cmpLT cmp x v) a✝
bv : All (fun x => cmpLT cmp x v) b✝
ax : All (fun x => cmpLT cmp x x✝¹) a✝
xb : All (fun x => cmpLT cmp x✝¹ x) b✝
ha : Ordered cmp a✝
hb : Ordered cmp b✝
vy : (fun x => cmpLT cmp v x) y✝
vc : All (fun x => cmpLT cmp v x) c✝
right✝ : All (fun x => cmpLT cmp v x) d✝
cy : All (fun x => cmpLT cmp x y✝) c✝
yd : All (fun x => cmpLT cmp y✝ x) d✝
hc : Ordered cmp c✝
hd : Ordered cmp d✝
this :
  Ordered cmp (b✝.append c✝) ∧
    All (fun x => cmpLT cmp x✝¹ x) (b✝.append c✝) ∧ All (fun x => cmpLT cmp x y✝) (b✝.append c✝)
l✝ : RBNode α
x✝ : ∀ (a : RBNode α) (x : α) (b : RBNode α), b✝.append c✝ = node red a x b → False
hbc : Ordered cmp (b✝.append c✝)
xbc : All (fun x => cmpLT cmp x✝¹ x) (b✝.append c✝)
bcy : All (fun x => cmpLT cmp x y✝) (b✝.append c✝)
xy : cmpLT cmp x✝¹ y✝
⊢ Ordered cmp (node red a✝ x✝¹ (node red (b✝.append c✝) y✝ d✝))

Proof state:
case h_6
α : Type u_1
cmp : α → α → Ordering
v : α
x✝² x✝¹ a✝ : RBNode α
x✝ : α
b✝ l✝ : RBNode α
v✝ : α
r✝ : RBNode α
lv : All (fun x => cmpLT cmp x v) (node red a✝ x✝ b✝)
hl : Ordered cmp (node red a✝ x✝ b✝)
vr : All (fun x => cmpLT cmp v x) (node black l✝ v✝ r✝)
hr : Ordered cmp (node black l✝ v✝ r✝)
⊢ Ordered cmp (node red a✝ x✝ (b✝.append (node black l✝ v✝ r✝)))

Tactic:
have ⟨xv, _, bv⟩ := lv

Result:
case h_6
α : Type u_1
cmp : α → α → Ordering
v : α
x✝² x✝¹ a✝ : RBNode α
x✝ : α
b✝ l✝ : RBNode α
v✝ : α
r✝ : RBNode α
lv : All (fun x => cmpLT cmp x v) (node red a✝ x✝ b✝)
hl : Ordered cmp (node red a✝ x✝ b✝)
vr : All (fun x => cmpLT cmp v x) (node black l✝ v✝ r✝)
hr : Ordered cmp (node black l✝ v✝ r✝)
xv : (fun x => cmpLT cmp x v) x✝
left✝ : All (fun x => cmpLT cmp x v) a✝
bv : All (fun x => cmpLT cmp x v) b✝
⊢ Ordered cmp (node red a✝ x✝ (b✝.append (node black l✝ v✝ r✝)))

Proof state:
α : Type u_1
cmp : α → α → Ordering
v : α
x✝³ x✝² a✝¹ : RBNode α
x✝¹ : α
b✝¹ c✝ : RBNode α
y✝ : α
d✝ : RBNode α
lv : All (fun x => cmpLT cmp x v) (node black a✝¹ x✝¹ b✝¹)
hl : Ordered cmp (node black a✝¹ x✝¹ b✝¹)
vr : All (fun x => cmpLT cmp v x) (node black c✝ y✝ d✝)
hr : Ordered cmp (node black c✝ y✝ d✝)
xv : (fun x => cmpLT cmp x v) x✝¹
left✝¹ : All (fun x => cmpLT cmp x v) a✝¹
bv : All (fun x => cmpLT cmp x v) b✝¹
ax : All (fun x => cmpLT cmp x x✝¹) a✝¹
xb : All (fun x => cmpLT cmp x✝¹ x) b✝¹
ha : Ordered cmp a✝¹
hb : Ordered cmp b✝¹
vy : (fun x => cmpLT cmp v x) y✝
vc : All (fun x => cmpLT cmp v x) c✝
right✝¹ : All (fun x => cmpLT cmp v x) d✝
cy : All (fun x => cmpLT cmp x y✝) c✝
yd : All (fun x => cmpLT cmp y✝ x) d✝
hc : Ordered cmp c✝
hd : Ordered cmp d✝
this :
  Ordered cmp (b✝¹.append c✝) ∧
    All (fun x => cmpLT cmp x✝¹ x) (b✝¹.append c✝) ∧ All (fun x => cmpLT cmp x y✝) (b✝¹.append c✝)
l✝ a✝ : RBNode α
x✝ : α
b✝ : RBNode α
H : b✝¹.append c✝ = node red a✝ x✝ b✝
b'z : All (fun x => cmpLT cmp x x✝) a✝
c'z : All (fun x => cmpLT cmp x✝ x) b✝
hb' : Ordered cmp a✝
hc' : Ordered cmp b✝
xz : (fun x => cmpLT cmp x✝¹ x) x✝
xb' : All (fun x => cmpLT cmp x✝¹ x) a✝
right✝ : All (fun x => cmpLT cmp x✝¹ x) b✝
zy : (fun x => cmpLT cmp x y✝) x✝
left✝ : All (fun x => cmpLT cmp x y✝) a✝
c'y : All (fun x => cmpLT cmp x y✝) b✝
az : All (fun x => cmpLT cmp x x✝) a✝¹
⊢ Ordered cmp (node red (node black a✝¹ x✝¹ a✝) x✝ (node black b✝ y✝ d✝))

Tactic:
have zd := zy.trans_l yd

Result:
α : Type u_1
cmp : α → α → Ordering
v : α
x✝³ x✝² a✝¹ : RBNode α
x✝¹ : α
b✝¹ c✝ : RBNode α
y✝ : α
d✝ : RBNode α
lv : All (fun x => cmpLT cmp x v) (node black a✝¹ x✝¹ b✝¹)
hl : Ordered cmp (node black a✝¹ x✝¹ b✝¹)
vr : All (fun x => cmpLT cmp v x) (node black c✝ y✝ d✝)
hr : Ordered cmp (node black c✝ y✝ d✝)
xv : (fun x => cmpLT cmp x v) x✝¹
left✝¹ : All (fun x => cmpLT cmp x v) a✝¹
bv : All (fun x => cmpLT cmp x v) b✝¹
ax : All (fun x => cmpLT cmp x x✝¹) a✝¹
xb : All (fun x => cmpLT cmp x✝¹ x) b✝¹
ha : Ordered cmp a✝¹
hb : Ordered cmp b✝¹
vy : (fun x => cmpLT cmp v x) y✝
vc : All (fun x => cmpLT cmp v x) c✝
right✝¹ : All (fun x => cmpLT cmp v x) d✝
cy : All (fun x => cmpLT cmp x y✝) c✝
yd : All (fun x => cmpLT cmp y✝ x) d✝
hc : Ordered cmp c✝
hd : Ordered cmp d✝
this :
  Ordered cmp (b✝¹.append c✝) ∧
    All (fun x => cmpLT cmp x✝¹ x) (b✝¹.append c✝) ∧ All (fun x => cmpLT cmp x y✝) (b✝¹.append c✝)
l✝ a✝ : RBNode α
x✝ : α
b✝ : RBNode α
H : b✝¹.append c✝ = node red a✝ x✝ b✝
b'z : All (fun x => cmpLT cmp x x✝) a✝
c'z : All (fun x => cmpLT cmp x✝ x) b✝
hb' : Ordered cmp a✝
hc' : Ordered cmp b✝
xz : (fun x => cmpLT cmp x✝¹ x) x✝
xb' : All (fun x => cmpLT cmp x✝¹ x) a✝
right✝ : All (fun x => cmpLT cmp x✝¹ x) b✝
zy : (fun x => cmpLT cmp x y✝) x✝
left✝ : All (fun x => cmpLT cmp x y✝) a✝
c'y : All (fun x => cmpLT cmp x y✝) b✝
az : All (fun x => cmpLT cmp x x✝) a✝¹
zd : All (fun x => cmpLT cmp x✝ x) d✝
⊢ Ordered cmp (node red (node black a✝¹ x✝¹ a✝) x✝ (node black b✝ y✝ d✝))