Theorem: RatFunc.liftMonoidWithZeroHom_injective
File: Mathlib/FieldTheory/RatFunc/Basic.lean

tactic: rintro ⟨x⟩ ⟨y⟩
state_before: K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
⊢ Function.Injective ⇑(liftMonoidWithZeroHom φ hφ')
state_after: case ofFractionRing.ofFractionRing
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
x y : FractionRing R[X]
⊢ (liftMonoidWithZeroHom φ hφ') { toFractionRing := x } = (liftMonoidWithZeroHom φ hφ') { toFractionRing := y } →
    { toFractionRing := x } = { toFractionRing := y }

tactic: induction' x using Localization.induction_on with a
state_before: case ofFractionRing.ofFractionRing
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
x y : FractionRing R[X]
⊢ (liftMonoidWithZeroHom φ hφ') { toFractionRing := x } = (liftMonoidWithZeroHom φ hφ') { toFractionRing := y } →
    { toFractionRing := x } = { toFractionRing := y }
state_after: case ofFractionRing.ofFractionRing.H
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
y : FractionRing R[X]
a : R[X] × ↥R[X]⁰
⊢ (liftMonoidWithZeroHom φ hφ') { toFractionRing := Localization.mk a.1 a.2 } =
      (liftMonoidWithZeroHom φ hφ') { toFractionRing := y } →
    { toFractionRing := Localization.mk a.1 a.2 } = { toFractionRing := y }

tactic: induction' y using Localization.induction_on with a'
state_before: case ofFractionRing.ofFractionRing.H
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
y : FractionRing R[X]
a : R[X] × ↥R[X]⁰
⊢ (liftMonoidWithZeroHom φ hφ') { toFractionRing := Localization.mk a.1 a.2 } =
      (liftMonoidWithZeroHom φ hφ') { toFractionRing := y } →
    { toFractionRing := Localization.mk a.1 a.2 } = { toFractionRing := y }
state_after: case ofFractionRing.ofFractionRing.H.H
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
⊢ (liftMonoidWithZeroHom φ hφ') { toFractionRing := Localization.mk a.1 a.2 } =
      (liftMonoidWithZeroHom φ hφ') { toFractionRing := Localization.mk a'.1 a'.2 } →
    { toFractionRing := Localization.mk a.1 a.2 } = { toFractionRing := Localization.mk a'.1 a'.2 }

tactic: simp_rw [liftMonoidWithZeroHom_apply_ofFractionRing_mk]
state_before: case ofFractionRing.ofFractionRing.H.H
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
⊢ (liftMonoidWithZeroHom φ hφ') { toFractionRing := Localization.mk a.1 a.2 } =
      (liftMonoidWithZeroHom φ hφ') { toFractionRing := Localization.mk a'.1 a'.2 } →
    { toFractionRing := Localization.mk a.1 a.2 } = { toFractionRing := Localization.mk a'.1 a'.2 }
state_after: case ofFractionRing.ofFractionRing.H.H
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
⊢ φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2 →
    { toFractionRing := Localization.mk a.1 a.2 } = { toFractionRing := Localization.mk a'.1 a'.2 }

tactic: intro h
state_before: case ofFractionRing.ofFractionRing.H.H
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
⊢ φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2 →
    { toFractionRing := Localization.mk a.1 a.2 } = { toFractionRing := Localization.mk a'.1 a'.2 }
state_after: case ofFractionRing.ofFractionRing.H.H
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ { toFractionRing := Localization.mk a.1 a.2 } = { toFractionRing := Localization.mk a'.1 a'.2 }

tactic: congr 1
state_before: case ofFractionRing.ofFractionRing.H.H
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ { toFractionRing := Localization.mk a.1 a.2 } = { toFractionRing := Localization.mk a'.1 a'.2 }
state_after: case ofFractionRing.ofFractionRing.H.H.e_toFractionRing
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ Localization.mk a.1 a.2 = Localization.mk a'.1 a'.2

tactic: refine Localization.mk_eq_mk_iff.mpr (Localization.r_of_eq (M := R[X]) ?_)
state_before: case ofFractionRing.ofFractionRing.H.H.e_toFractionRing
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ Localization.mk a.1 a.2 = Localization.mk a'.1 a'.2
state_after: case ofFractionRing.ofFractionRing.H.H.e_toFractionRing
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ ↑(a'.1, a'.2).2 * (a.1, a.2).1 = ↑(a.1, a.2).2 * (a'.1, a'.2).1

tactic: have := mul_eq_mul_of_div_eq_div _ _ ?_ ?_ h
state_before: case ofFractionRing.ofFractionRing.H.H.e_toFractionRing
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ ↑(a'.1, a'.2).2 * (a.1, a.2).1 = ↑(a.1, a.2).2 * (a'.1, a'.2).1
state_after: case ofFractionRing.ofFractionRing.H.H.e_toFractionRing.refine_3
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
this : φ a.1 * φ ↑a'.2 = φ a'.1 * φ ↑a.2
⊢ ↑(a'.1, a'.2).2 * (a.1, a.2).1 = ↑(a.1, a.2).2 * (a'.1, a'.2).1

case ofFractionRing.ofFractionRing.H.H.e_toFractionRing.refine_1
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ φ ↑a.2 ≠ 0

case ofFractionRing.ofFractionRing.H.H.e_toFractionRing.refine_2
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ φ ↑a'.2 ≠ 0

tactic: all_goals exact map_ne_zero_of_mem_nonZeroDivisors _ hφ (SetLike.coe_mem _)
state_before: case ofFractionRing.ofFractionRing.H.H.e_toFractionRing.refine_1
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ φ ↑a.2 ≠ 0

case ofFractionRing.ofFractionRing.H.H.e_toFractionRing.refine_2
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ φ ↑a'.2 ≠ 0
state_after: no goals

tactic: rwa [← map_mul, ← map_mul, hφ.eq_iff, mul_comm, mul_comm a'.fst] at this
state_before: case ofFractionRing.ofFractionRing.H.H.e_toFractionRing.refine_3
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
this : φ a.1 * φ ↑a'.2 = φ a'.1 * φ ↑a.2
⊢ ↑(a'.1, a'.2).2 * (a.1, a.2).1 = ↑(a.1, a.2).2 * (a'.1, a'.2).1
state_after: no goals

tactic: exact map_ne_zero_of_mem_nonZeroDivisors _ hφ (SetLike.coe_mem _)
state_before: case ofFractionRing.ofFractionRing.H.H.e_toFractionRing.refine_2
K : Type u
inst✝⁶ : CommRing K
G₀ : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
F : Type u_5
inst✝⁵ : CommGroupWithZero G₀
inst✝⁴ : Field L
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : FunLike F R[X] S[X]
inst✝ : Nontrivial R
φ : R[X] →*₀ G₀
hφ : Function.Injective ⇑φ
hφ' : optParam (R[X]⁰ ≤ Submonoid.comap φ G₀⁰) ⋯
a a' : R[X] × ↥R[X]⁰
h : φ a.1 / φ ↑a.2 = φ a'.1 / φ ↑a'.2
⊢ φ ↑a'.2 ≠ 0
state_after: no goals