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

tactic: obtain ⟨⟨u, v, h1, h2⟩, ha⟩ := ha
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 ⟨a, b, h⟩ := h
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: 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
⊢ 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: 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 = 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: 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
⊢ (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: 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) = 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: calc
  _ = (a * f + b * derivative f) * (u * v)
    + (b * f) * (derivative u * v + u * derivative v) := by ring1
  _ = 1 := by rw [h, h3]; ring1
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: ring1
state_before: 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) =
    (a * f + b * derivative f) * (u * v) + b * f * (derivative u * v + u * derivative v)
state_after: no goals

tactic: rw [h, h3]
state_before: 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 * f + b * derivative f) * (u * v) + b * f * (derivative u * v + u * derivative v) = 1
state_after: 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
⊢ 1 * 1 + b * f * 0 = 1

tactic: ring1
state_before: 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
⊢ 1 * 1 + b * f * 0 = 1
state_after: no goals