Theorem: Associated.separable
File: Mathlib/FieldTheory/Separable.lean

Proof steps:
state_before: R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g : R[X]
ha : Associated f g
h : f.Separable
⊢ g.Separable
state_after: case intro.mk
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g : R[X]
h : f.Separable
u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
⊢ g.Separable
tactic: obtain ⟨⟨u, v, h1, h2⟩, ha⟩ := ha
state_before: case intro.mk
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g : R[X]
h : f.Separable
u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
⊢ g.Separable
state_after: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : a * f + b * derivative f = 1
⊢ g.Separable
tactic: obtain ⟨a, b, h⟩ := h
state_before: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : a * f + b * derivative f = 1
⊢ g.Separable
state_after: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : a * f + b * derivative f = 1
⊢ (a * v + b * derivative v) * g + b * v * derivative g = 1
tactic: refine ⟨a * v + b * derivative v, b * v, ?_⟩
state_before: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : a * f + b * derivative f = 1
⊢ (a * v + b * derivative v) * g + b * v * derivative g = 1
state_after: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : (a * f + b * derivative f) * (u * v) = 1 * 1
⊢ (a * v + b * derivative v) * g + b * v * derivative g = 1
tactic: replace h := congr($h * $(h1))
state_before: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : (a * f + b * derivative f) * (u * v) = 1 * 1
⊢ (a * v + b * derivative v) * g + b * v * derivative g = 1
state_after: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : (a * f + b * derivative f) * (u * v) = 1 * 1
h3 : derivative (u * v) = derivative 1
⊢ (a * v + b * derivative v) * g + b * v * derivative g = 1
tactic: have h3 := congr(derivative $(h1))
state_before: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : (a * f + b * derivative f) * (u * v) = 1 * 1
h3 : derivative (u * v) = derivative 1
⊢ (a * v + b * derivative v) * g + b * v * derivative g = 1
state_after: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : (a * f + b * derivative f) * (u * v) = 1 * 1
h3 : derivative u * v + u * derivative v = 0
⊢ (a * v + b * derivative v) * (f * u) + b * v * (derivative f * u + f * derivative u) = 1
tactic: simp only [← ha, derivative_mul, derivative_one] at h3 ⊢
state_before: case intro.mk.intro.intro
R : Type u
inst✝¹ : CommSemiring R
S : Type v
inst✝ : CommSemiring S
f g u v : R[X]
h1 : u * v = 1
h2 : v * u = 1
ha : f * ↑{ val := u, inv := v, val_inv := h1, inv_val := h2 } = g
a b : R[X]
h : (a * f + b * derivative f) * (u * v) = 1 * 1
h3 : derivative u * v + u * derivative v = 0
⊢ (a * v + b * derivative v) * (f * u) + b * v * (derivative f * u + f * derivative u) = 1
state_after: no goals
tactic: calc
    _ = (a * f + b * derivative f) * (u * v)
      + (b * f) * (derivative u * v + u * derivative v) := by ring1
    _ = 1 := by rw [h, h3]; ring1