Theorem: isLocalRingHom_of_le_jacobson_bot
File: Mathlib/RingTheory/Henselian.lean

tactic: constructor
state_before: R : Type u_1
inst✝ : CommRing R
I : Ideal R
h : I ≤ Ideal.jacobson ⊥
⊢ IsLocalRingHom (Ideal.Quotient.mk I)

tactic: intro a h
state_before: case map_nonunit
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h : I ≤ Ideal.jacobson ⊥
⊢ ∀ (a : R), IsUnit (↑(Ideal.Quotient.mk I) a) → IsUnit a

tactic: have : IsUnit (Ideal.Quotient.mk (Ideal.jacobson ⊥) a) := by
  rw [isUnit_iff_exists_inv] at *
  obtain ⟨b, hb⟩ := h
  obtain ⟨b, rfl⟩ := Ideal.Quotient.mk_surjective b
  use Ideal.Quotient.mk _ b
  rw [← (Ideal.Quotient.mk _).map_one, ← (Ideal.Quotient.mk _).map_mul, Ideal.Quotient.eq] at hb⊢
  exact h hb
state_before: case map_nonunit
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : IsUnit (↑(Ideal.Quotient.mk I) a)
⊢ IsUnit a

tactic: obtain ⟨⟨x, y, h1, h2⟩, rfl : x = _⟩ := this
state_before: case map_nonunit
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : IsUnit (↑(Ideal.Quotient.mk I) a)
this : IsUnit (↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a)
⊢ IsUnit a

tactic: obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective y
state_before: case map_nonunit.intro.mk
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : IsUnit (↑(Ideal.Quotient.mk I) a)
y : R ⧸ Ideal.jacobson ⊥
h1 : ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a * y = 1
h2 : y * ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a = 1
⊢ IsUnit a

tactic: rw [← (Ideal.Quotient.mk _).map_mul, ← (Ideal.Quotient.mk _).map_one, Ideal.Quotient.eq,
  Ideal.mem_jacobson_bot] at h1 h2
state_before: case map_nonunit.intro.mk.intro
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : IsUnit (↑(Ideal.Quotient.mk I) a)
y : R
h1 : ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a * ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) y = 1
h2 : ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) y * ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a = 1
⊢ IsUnit a

tactic: specialize h1 1
state_before: case map_nonunit.intro.mk.intro
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : IsUnit (↑(Ideal.Quotient.mk I) a)
y : R
h1 : ∀ (y_1 : R), IsUnit ((a * y - 1) * y_1 + 1)
h2 : ∀ (y_1 : R), IsUnit ((y * a - 1) * y_1 + 1)
⊢ IsUnit a

tactic: simp at h1
state_before: case map_nonunit.intro.mk.intro
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : IsUnit (↑(Ideal.Quotient.mk I) a)
y : R
h2 : ∀ (y_1 : R), IsUnit ((y * a - 1) * y_1 + 1)
h1 : IsUnit ((a * y - 1) * 1 + 1)
⊢ IsUnit a

tactic: exact h1.1
state_before: case map_nonunit.intro.mk.intro
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : IsUnit (↑(Ideal.Quotient.mk I) a)
y : R
h2 : ∀ (y_1 : R), IsUnit ((y * a - 1) * y_1 + 1)
h1 : IsUnit a ∧ IsUnit y
⊢ IsUnit a

tactic: rw [isUnit_iff_exists_inv] at *
state_before: R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : IsUnit (↑(Ideal.Quotient.mk I) a)
⊢ IsUnit (↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a)

tactic: obtain ⟨b, hb⟩ := h
state_before: R : Type u_1
inst✝ : CommRing R
I : Ideal R
h✝ : I ≤ Ideal.jacobson ⊥
a : R
h : ∃ b, ↑(Ideal.Quotient.mk I) a * b = 1
⊢ ∃ b, ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a * b = 1

tactic: obtain ⟨b, rfl⟩ := Ideal.Quotient.mk_surjective b
state_before: case intro
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h : I ≤ Ideal.jacobson ⊥
a : R
b : R ⧸ I
hb : ↑(Ideal.Quotient.mk I) a * b = 1
⊢ ∃ b, ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a * b = 1

tactic: use Ideal.Quotient.mk _ b
state_before: case intro.intro
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h : I ≤ Ideal.jacobson ⊥
a b : R
hb : ↑(Ideal.Quotient.mk I) a * ↑(Ideal.Quotient.mk I) b = 1
⊢ ∃ b, ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a * b = 1

tactic: rw [← (Ideal.Quotient.mk _).map_one, ← (Ideal.Quotient.mk _).map_mul, Ideal.Quotient.eq] at hb⊢
state_before: case intro.intro
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h : I ≤ Ideal.jacobson ⊥
a b : R
hb : ↑(Ideal.Quotient.mk I) a * ↑(Ideal.Quotient.mk I) b = 1
⊢ ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) a * ↑(Ideal.Quotient.mk (Ideal.jacobson ⊥)) b = 1

tactic: exact h hb
state_before: case intro.intro
R : Type u_1
inst✝ : CommRing R
I : Ideal R
h : I ≤ Ideal.jacobson ⊥
a b : R
hb : a * b - 1 ∈ I
⊢ a * b - 1 ∈ Ideal.jacobson ⊥