[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
hdeg : c1.deg = c2.deg
hnum : ↑c1.num = ↑c2.num
hden : ↑c1.den = ↑c2.den
⊢ c1 = c2
[PROOFSTEP]
rcases c1 with ⟨i1, ⟨n1, hn1⟩, ⟨d1, hd1⟩, h1⟩
[GOAL]
case mk.mk.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c2 : NumDenSameDeg 𝒜 x
i1 : ι
n1 : A
hn1 : n1 ∈ 𝒜 i1
d1 : A
hd1 : d1 ∈ 𝒜 i1
h1 : ↑{ val := d1, property := hd1 } ∈ x
hdeg :
  { deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 }.deg =
    c2.deg
hnum :
  ↑{ deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 }.num =
    ↑c2.num
hden :
  ↑{ deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 }.den =
    ↑c2.den
⊢ { deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 } = c2
[PROOFSTEP]
rcases c2 with ⟨i2, ⟨n2, hn2⟩, ⟨d2, hd2⟩, h2⟩
[GOAL]
case mk.mk.mk.mk.mk.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
i1 : ι
n1 : A
hn1 : n1 ∈ 𝒜 i1
d1 : A
hd1 : d1 ∈ 𝒜 i1
h1 : ↑{ val := d1, property := hd1 } ∈ x
i2 : ι
n2 : A
hn2 : n2 ∈ 𝒜 i2
d2 : A
hd2 : d2 ∈ 𝒜 i2
h2 : ↑{ val := d2, property := hd2 } ∈ x
hdeg :
  { deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 }.deg =
    { deg := i2, num := { val := n2, property := hn2 }, den := { val := d2, property := hd2 }, den_mem := h2 }.deg
hnum :
  ↑{ deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 }.num =
    ↑{ deg := i2, num := { val := n2, property := hn2 }, den := { val := d2, property := hd2 }, den_mem := h2 }.num
hden :
  ↑{ deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 }.den =
    ↑{ deg := i2, num := { val := n2, property := hn2 }, den := { val := d2, property := hd2 }, den_mem := h2 }.den
⊢ { deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 } =
    { deg := i2, num := { val := n2, property := hn2 }, den := { val := d2, property := hd2 }, den_mem := h2 }
[PROOFSTEP]
dsimp only [Subtype.coe_mk] at *
[GOAL]
case mk.mk.mk.mk.mk.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
i1 : ι
n1 : A
hn1 : n1 ∈ 𝒜 i1
d1 : A
hd1 : d1 ∈ 𝒜 i1
h1 : ↑{ val := d1, property := hd1 } ∈ x
i2 : ι
n2 : A
hn2 : n2 ∈ 𝒜 i2
d2 : A
hd2 : d2 ∈ 𝒜 i2
h2 : ↑{ val := d2, property := hd2 } ∈ x
hdeg : i1 = i2
hnum : n1 = n2
hden : d1 = d2
⊢ { deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 } =
    { deg := i2, num := { val := n2, property := hn2 }, den := { val := d2, property := hd2 }, den_mem := h2 }
[PROOFSTEP]
subst hdeg hnum hden
[GOAL]
case mk.mk.mk.mk.mk.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
i1 : ι
n1 : A
hn1 : n1 ∈ 𝒜 i1
d1 : A
hd1 : d1 ∈ 𝒜 i1
h1 : ↑{ val := d1, property := hd1 } ∈ x
hn2 : n1 ∈ 𝒜 i1
hd2 : d1 ∈ 𝒜 i1
h2 : ↑{ val := d1, property := hd2 } ∈ x
⊢ { deg := i1, num := { val := n1, property := hn1 }, den := { val := d1, property := hd1 }, den_mem := h1 } =
    { deg := i1, num := { val := n1, property := hn2 }, den := { val := d1, property := hd2 }, den_mem := h2 }
[PROOFSTEP]
congr
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c : NumDenSameDeg 𝒜 x
n : ℕ
⊢ ↑(GradedMonoid.GMonoid.gnpow n c.den) ∈ x
[PROOFSTEP]
induction' n with n ih
[GOAL]
case zero
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c : NumDenSameDeg 𝒜 x
⊢ ↑(GradedMonoid.GMonoid.gnpow Nat.zero c.den) ∈ x
[PROOFSTEP]
simpa only [Nat.zero_eq, coe_gnpow, pow_zero] using Submonoid.one_mem _
[GOAL]
case succ
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c : NumDenSameDeg 𝒜 x
n : ℕ
ih : ↑(GradedMonoid.GMonoid.gnpow n c.den) ∈ x
⊢ ↑(GradedMonoid.GMonoid.gnpow (Nat.succ n) c.den) ∈ x
[PROOFSTEP]
simpa only [pow_succ', coe_gnpow] using x.mul_mem ih c.den_mem
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
z : HomogeneousLocalization 𝒜 x
n : ℕ
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Setoid.r ((fun x_1 => x_1 ^ n) c1) ((fun x_1 => x_1 ^ n) c2)
[PROOFSTEP]
change Localization.mk _ _ = Localization.mk _ _
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
z : HomogeneousLocalization 𝒜 x
n : ℕ
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk ↑((fun x_1 => x_1 ^ n) c1).num
      { val := ↑((fun x_1 => x_1 ^ n) c1).den, property := (_ : ↑((fun x_1 => x_1 ^ n) c1).den ∈ x) } =
    Localization.mk ↑((fun x_1 => x_1 ^ n) c2).num
      { val := ↑((fun x_1 => x_1 ^ n) c2).den, property := (_ : ↑((fun x_1 => x_1 ^ n) c2).den ∈ x) }
[PROOFSTEP]
simp only [num_pow, den_pow]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
z : HomogeneousLocalization 𝒜 x
n : ℕ
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk (↑c1.num ^ n) { val := ↑c1.den ^ n, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den ^ n)) } =
    Localization.mk (↑c2.num ^ n) { val := ↑c2.den ^ n, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den ^ n)) }
[PROOFSTEP]
convert congr_arg (fun z : at x => z ^ n) h
[GOAL]
case h.e'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
z : HomogeneousLocalization 𝒜 x
n : ℕ
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk (↑c1.num ^ n) { val := ↑c1.den ^ n, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den ^ n)) } =
    Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } ^ n
[PROOFSTEP]
erw [Localization.mk_pow]
[GOAL]
case h.e'_3
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
z : HomogeneousLocalization 𝒜 x
n : ℕ
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk (↑c2.num ^ n) { val := ↑c2.den ^ n, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den ^ n)) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) } ^ n
[PROOFSTEP]
erw [Localization.mk_pow]
[GOAL]
case h.e'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
z : HomogeneousLocalization 𝒜 x
n : ℕ
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk (↑c1.num ^ n) { val := ↑c1.den ^ n, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den ^ n)) } =
    Localization.mk (↑c1.num ^ n) ({ val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } ^ n)
[PROOFSTEP]
rfl
[GOAL]
case h.e'_3
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
z : HomogeneousLocalization 𝒜 x
n : ℕ
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk (↑c2.num ^ n) { val := ↑c2.den ^ n, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den ^ n)) } =
    Localization.mk (↑c2.num ^ n) ({ val := ↑c2.den, property := (_ : ↑c2.den ∈ x) } ^ n)
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
m : α
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Setoid.r ((fun x_1 => m • x_1) c1) ((fun x_1 => m • x_1) c2)
[PROOFSTEP]
change Localization.mk _ _ = Localization.mk _ _
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
m : α
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk ↑((fun x_1 => m • x_1) c1).num
      { val := ↑((fun x_1 => m • x_1) c1).den, property := (_ : ↑((fun x_1 => m • x_1) c1).den ∈ x) } =
    Localization.mk ↑((fun x_1 => m • x_1) c2).num
      { val := ↑((fun x_1 => m • x_1) c2).den, property := (_ : ↑((fun x_1 => m • x_1) c2).den ∈ x) }
[PROOFSTEP]
simp only [num_smul, den_smul]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
m : α
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk ↑(m • c1.num) { val := ↑c1.den, property := (_ : (fun x_1 => x_1 ∈ x) ↑c1.den) } =
    Localization.mk ↑(m • c2.num) { val := ↑c2.den, property := (_ : (fun x_1 => x_1 ∈ x) ↑c2.den) }
[PROOFSTEP]
convert congr_arg (fun z : at x => m • z) h
[GOAL]
case h.e'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
m : α
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk ↑(m • c1.num) { val := ↑c1.den, property := (_ : (fun x_1 => x_1 ∈ x) ↑c1.den) } =
    m • Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) }
[PROOFSTEP]
rw [Localization.smul_mk]
[GOAL]
case h.e'_3
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
m : α
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk ↑(m • c2.num) { val := ↑c2.den, property := (_ : (fun x_1 => x_1 ∈ x) ↑c2.den) } =
    m • Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
[PROOFSTEP]
rw [Localization.smul_mk]
[GOAL]
case h.e'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
m : α
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk ↑(m • c1.num) { val := ↑c1.den, property := (_ : (fun x_1 => x_1 ∈ x) ↑c1.den) } =
    Localization.mk (m • ↑c1.num) { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) }
[PROOFSTEP]
rfl
[GOAL]
case h.e'_3
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
m : α
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk ↑(m • c2.num) { val := ↑c2.den, property := (_ : (fun x_1 => x_1 ∈ x) ↑c2.den) } =
    Localization.mk (m • ↑c2.num) { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
y : HomogeneousLocalization 𝒜 x
n : α
⊢ val (n • y) = n • val y
[PROOFSTEP]
induction y using Quotient.inductionOn
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
n : α
a✝ : NumDenSameDeg 𝒜 x
⊢ val (n • Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝) = n • val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝)
[PROOFSTEP]
change Localization.mk _ _ = n • Localization.mk _ _
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
n : α
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑((fun x_1 => n • x_1) a✝).num
      { val := ↑((fun x_1 => n • x_1) a✝).den, property := (_ : ↑((fun x_1 => n • x_1) a✝).den ∈ x) } =
    n • Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
dsimp only
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
n : α
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(n • a✝).num { val := ↑(n • a✝).den, property := (_ : ↑(n • a✝).den ∈ x) } =
    n • Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
rw [Localization.smul_mk]
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁹ : AddCommMonoid ι
inst✝⁸ : DecidableEq ι
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
𝒜 : ι → Submodule R A
inst✝⁴ : GradedAlgebra 𝒜
x : Submonoid A
α : Type u_4
inst✝³ : SMul α R
inst✝² : SMul α A
inst✝¹ : IsScalarTower α R A
inst✝ : IsScalarTower α A A
n : α
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(n • a✝).num { val := ↑(n • a✝).den, property := (_ : ↑(n • a✝).den ∈ x) } =
    Localization.mk (n • ↑a✝.num) { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
congr 1
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Setoid.r (-c1) (-c2)
[PROOFSTEP]
change Localization.mk _ _ = Localization.mk _ _
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ Localization.mk ↑(-c1).num { val := ↑(-c1).den, property := (_ : ↑(-c1).den ∈ x) } =
    Localization.mk ↑(-c2).num { val := ↑(-c2).den, property := (_ : ↑(-c2).den ∈ x) }
[PROOFSTEP]
simp only [num_neg, den_neg, ← Localization.neg_mk]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
⊢ -Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : (fun x_1 => x_1 ∈ x) ↑c1.den) } =
    -Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : (fun x_1 => x_1 ∈ x) ↑c2.den) }
[PROOFSTEP]
exact congr_arg Neg.neg h
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Setoid.r ((fun x_1 x_2 => x_1 + x_2) c1 c3) ((fun x_1 x_2 => x_1 + x_2) c2 c4)
[PROOFSTEP]
change Localization.mk _ _ = Localization.mk _ _
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk ↑((fun x_1 x_2 => x_1 + x_2) c1 c3).num
      { val := ↑((fun x_1 x_2 => x_1 + x_2) c1 c3).den,
        property := (_ : ↑((fun x_1 x_2 => x_1 + x_2) c1 c3).den ∈ x) } =
    Localization.mk ↑((fun x_1 x_2 => x_1 + x_2) c2 c4).num
      { val := ↑((fun x_1 x_2 => x_1 + x_2) c2 c4).den, property := (_ : ↑((fun x_1 x_2 => x_1 + x_2) c2 c4).den ∈ x) }
[PROOFSTEP]
simp only [num_add, den_add, ← Localization.add_mk]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c1.den * ↑c3.num + ↑c3.den * ↑c1.num)
      { val := ↑c1.den * ↑c3.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den * ↑c3.den)) } =
    Localization.mk (↑c2.den * ↑c4.num + ↑c4.den * ↑c2.num)
      { val := ↑c2.den * ↑c4.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den * ↑c4.den)) }
[PROOFSTEP]
convert congr_arg₂ (· + ·) h h'
[GOAL]
case h.e'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c1.den * ↑c3.num + ↑c3.den * ↑c1.num)
      { val := ↑c1.den * ↑c3.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den * ↑c3.den)) } =
    Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } +
      Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) }
[PROOFSTEP]
erw [Localization.add_mk]
[GOAL]
case h.e'_3
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c2.den * ↑c4.num + ↑c4.den * ↑c2.num)
      { val := ↑c2.den * ↑c4.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den * ↑c4.den)) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) } +
      Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
[PROOFSTEP]
erw [Localization.add_mk]
[GOAL]
case h.e'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c1.den * ↑c3.num + ↑c3.den * ↑c1.num)
      { val := ↑c1.den * ↑c3.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den * ↑c3.den)) } =
    Localization.mk
      (↑{ val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } * ↑c3.num +
        ↑{ val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } * ↑c1.num)
      ({ val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } * { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) })
[PROOFSTEP]
rfl
[GOAL]
case h.e'_3
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c2.den * ↑c4.num + ↑c4.den * ↑c2.num)
      { val := ↑c2.den * ↑c4.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den * ↑c4.den)) } =
    Localization.mk
      (↑{ val := ↑c2.den, property := (_ : ↑c2.den ∈ x) } * ↑c4.num +
        ↑{ val := ↑c4.den, property := (_ : ↑c4.den ∈ x) } * ↑c2.num)
      ({ val := ↑c2.den, property := (_ : ↑c2.den ∈ x) } * { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) })
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Setoid.r ((fun x_1 x_2 => x_1 * x_2) c1 c3) ((fun x_1 x_2 => x_1 * x_2) c2 c4)
[PROOFSTEP]
change Localization.mk _ _ = Localization.mk _ _
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk ↑((fun x_1 x_2 => x_1 * x_2) c1 c3).num
      { val := ↑((fun x_1 x_2 => x_1 * x_2) c1 c3).den,
        property := (_ : ↑((fun x_1 x_2 => x_1 * x_2) c1 c3).den ∈ x) } =
    Localization.mk ↑((fun x_1 x_2 => x_1 * x_2) c2 c4).num
      { val := ↑((fun x_1 x_2 => x_1 * x_2) c2 c4).den, property := (_ : ↑((fun x_1 x_2 => x_1 * x_2) c2 c4).den ∈ x) }
[PROOFSTEP]
simp only [num_mul, den_mul]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c1.num * ↑c3.num)
      { val := ↑c1.den * ↑c3.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den * ↑c3.den)) } =
    Localization.mk (↑c2.num * ↑c4.num)
      { val := ↑c2.den * ↑c4.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den * ↑c4.den)) }
[PROOFSTEP]
convert congr_arg₂ (· * ·) h h'
[GOAL]
case h.e'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c1.num * ↑c3.num)
      { val := ↑c1.den * ↑c3.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den * ↑c3.den)) } =
    Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } *
      Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) }
[PROOFSTEP]
erw [Localization.mk_mul]
[GOAL]
case h.e'_3
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c2.num * ↑c4.num)
      { val := ↑c2.den * ↑c4.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den * ↑c4.den)) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) } *
      Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
[PROOFSTEP]
erw [Localization.mk_mul]
[GOAL]
case h.e'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c1.num * ↑c3.num)
      { val := ↑c1.den * ↑c3.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c1.den * ↑c3.den)) } =
    Localization.mk (↑c1.num * ↑c3.num)
      ({ val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } * { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) })
[PROOFSTEP]
rfl
[GOAL]
case h.e'_3
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
c1 c2 : NumDenSameDeg 𝒜 x
h :
  Localization.mk ↑c1.num { val := ↑c1.den, property := (_ : ↑c1.den ∈ x) } =
    Localization.mk ↑c2.num { val := ↑c2.den, property := (_ : ↑c2.den ∈ x) }
c3 c4 : NumDenSameDeg 𝒜 x
h' :
  Localization.mk ↑c3.num { val := ↑c3.den, property := (_ : ↑c3.den ∈ x) } =
    Localization.mk ↑c4.num { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) }
⊢ Localization.mk (↑c2.num * ↑c4.num)
      { val := ↑c2.den * ↑c4.den, property := (_ : (fun x_1 => x_1 ∈ x) (↑c2.den * ↑c4.den)) } =
    Localization.mk (↑c2.num * ↑c4.num)
      ({ val := ↑c2.den, property := (_ : ↑c2.den ∈ x) } * { val := ↑c4.den, property := (_ : ↑c4.den ∈ x) })
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
y1 y2 : HomogeneousLocalization 𝒜 x
⊢ val (y1 + y2) = val y1 + val y2
[PROOFSTEP]
induction y1 using Quotient.inductionOn
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
y2 : HomogeneousLocalization 𝒜 x
a✝ : NumDenSameDeg 𝒜 x
⊢ val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝ + y2) = val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝) + val y2
[PROOFSTEP]
induction y2 using Quotient.inductionOn
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
⊢ val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝¹ + Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝) =
    val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝¹) + val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝)
[PROOFSTEP]
change Localization.mk _ _ = Localization.mk _ _ + Localization.mk _ _
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑((fun x_1 x_2 => x_1 + x_2) a✝¹ a✝).num
      { val := ↑((fun x_1 x_2 => x_1 + x_2) a✝¹ a✝).den,
        property := (_ : ↑((fun x_1 x_2 => x_1 + x_2) a✝¹ a✝).den ∈ x) } =
    Localization.mk ↑a✝¹.num { val := ↑a✝¹.den, property := (_ : ↑a✝¹.den ∈ x) } +
      Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
dsimp only
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(a✝¹ + a✝).num { val := ↑(a✝¹ + a✝).den, property := (_ : ↑(a✝¹ + a✝).den ∈ x) } =
    Localization.mk ↑a✝¹.num { val := ↑a✝¹.den, property := (_ : ↑a✝¹.den ∈ x) } +
      Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
rw [Localization.add_mk]
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(a✝¹ + a✝).num { val := ↑(a✝¹ + a✝).den, property := (_ : ↑(a✝¹ + a✝).den ∈ x) } =
    Localization.mk
      (↑{ val := ↑a✝¹.den, property := (_ : ↑a✝¹.den ∈ x) } * ↑a✝.num +
        ↑{ val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) } * ↑a✝¹.num)
      ({ val := ↑a✝¹.den, property := (_ : ↑a✝¹.den ∈ x) } * { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) })
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
y1 y2 : HomogeneousLocalization 𝒜 x
⊢ val (y1 * y2) = val y1 * val y2
[PROOFSTEP]
induction y1 using Quotient.inductionOn
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
y2 : HomogeneousLocalization 𝒜 x
a✝ : NumDenSameDeg 𝒜 x
⊢ val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝ * y2) = val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝) * val y2
[PROOFSTEP]
induction y2 using Quotient.inductionOn
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
⊢ val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝¹ * Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝) =
    val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝¹) * val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝)
[PROOFSTEP]
change Localization.mk _ _ = Localization.mk _ _ * Localization.mk _ _
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑((fun x_1 x_2 => x_1 * x_2) a✝¹ a✝).num
      { val := ↑((fun x_1 x_2 => x_1 * x_2) a✝¹ a✝).den,
        property := (_ : ↑((fun x_1 x_2 => x_1 * x_2) a✝¹ a✝).den ∈ x) } =
    Localization.mk ↑a✝¹.num { val := ↑a✝¹.den, property := (_ : ↑a✝¹.den ∈ x) } *
      Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
dsimp only
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(a✝¹ * a✝).num { val := ↑(a✝¹ * a✝).den, property := (_ : ↑(a✝¹ * a✝).den ∈ x) } =
    Localization.mk ↑a✝¹.num { val := ↑a✝¹.den, property := (_ : ↑a✝¹.den ∈ x) } *
      Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
rw [Localization.mk_mul]
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(a✝¹ * a✝).num { val := ↑(a✝¹ * a✝).den, property := (_ : ↑(a✝¹ * a✝).den ∈ x) } =
    Localization.mk (↑a✝¹.num * ↑a✝.num)
      ({ val := ↑a✝¹.den, property := (_ : ↑a✝¹.den ∈ x) } * { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) })
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
y : HomogeneousLocalization 𝒜 x
⊢ val (-y) = -val y
[PROOFSTEP]
induction y using Quotient.inductionOn
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝ : NumDenSameDeg 𝒜 x
⊢ val (-Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝) = -val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝)
[PROOFSTEP]
change Localization.mk _ _ = -Localization.mk _ _
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(-a✝).num { val := ↑(-a✝).den, property := (_ : ↑(-a✝).den ∈ x) } =
    -Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
dsimp only
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(-a✝).num { val := ↑(-a✝).den, property := (_ : ↑(-a✝).den ∈ x) } =
    -Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
rw [Localization.neg_mk]
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(-a✝).num { val := ↑(-a✝).den, property := (_ : ↑(-a✝).den ∈ x) } =
    Localization.mk (-↑a✝.num) { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) }
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
y1 y2 : HomogeneousLocalization 𝒜 x
⊢ val (y1 - y2) = val y1 - val y2
[PROOFSTEP]
rw [show y1 - y2 = y1 + -y2 from rfl, add_val, neg_val]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
y1 y2 : HomogeneousLocalization 𝒜 x
⊢ val y1 + -val y2 = val y1 - val y2
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
y : HomogeneousLocalization 𝒜 x
n : ℕ
⊢ val (y ^ n) = val y ^ n
[PROOFSTEP]
induction y using Quotient.inductionOn
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
n : ℕ
a✝ : NumDenSameDeg 𝒜 x
⊢ val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝ ^ n) = val (Quotient.mk (Setoid.ker (embedding 𝒜 x)) a✝) ^ n
[PROOFSTEP]
change Localization.mk _ _ = Localization.mk _ _ ^ n
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
n : ℕ
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑((fun x_1 => x_1 ^ n) a✝).num
      { val := ↑((fun x_1 => x_1 ^ n) a✝).den, property := (_ : ↑((fun x_1 => x_1 ^ n) a✝).den ∈ x) } =
    Localization.mk ↑a✝.num { val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) } ^ n
[PROOFSTEP]
rw [Localization.mk_pow]
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
n : ℕ
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑((fun x_1 => x_1 ^ n) a✝).num
      { val := ↑((fun x_1 => x_1 ^ n) a✝).den, property := (_ : ↑((fun x_1 => x_1 ^ n) a✝).den ∈ x) } =
    Localization.mk (↑a✝.num ^ n) ({ val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) } ^ n)
[PROOFSTEP]
dsimp only
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
n : ℕ
a✝ : NumDenSameDeg 𝒜 x
⊢ Localization.mk ↑(a✝ ^ n).num { val := ↑(a✝ ^ n).den, property := (_ : ↑(a✝ ^ n).den ∈ x) } =
    Localization.mk (↑a✝.num ^ n) ({ val := ↑a✝.den, property := (_ : ↑a✝.den ∈ x) } ^ n)
[PROOFSTEP]
congr 1
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
n : ℕ
⊢ val (Nat.unaryCast n) = ↑n
[PROOFSTEP]
induction n
[GOAL]
case zero
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
⊢ val (Nat.unaryCast Nat.zero) = ↑Nat.zero
[PROOFSTEP]
simp [Nat.unaryCast, zero_val, one_val, *]
[GOAL]
case succ
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
n✝ : ℕ
n_ih✝ : val (Nat.unaryCast n✝) = ↑n✝
⊢ val (Nat.unaryCast (Nat.succ n✝)) = ↑(Nat.succ n✝)
[PROOFSTEP]
simp [Nat.unaryCast, zero_val, one_val, *]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
n : ℤ
⊢ val (Int.castDef n) = ↑n
[PROOFSTEP]
cases n
[GOAL]
case ofNat
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝ : ℕ
⊢ val (Int.castDef (Int.ofNat a✝)) = ↑(Int.ofNat a✝)
[PROOFSTEP]
simp [Int.castDef, zero_val, one_val, *]
[GOAL]
case negSucc
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝ : ℕ
⊢ val (Int.castDef (Int.negSucc a✝)) = ↑(Int.negSucc a✝)
[PROOFSTEP]
simp [Int.castDef, zero_val, one_val, *]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
f : HomogeneousLocalization 𝒜 x
⊢ val f = Localization.mk (num f) { val := den f, property := (_ : den f ∈ x) }
[PROOFSTEP]
have := Quotient.out_eq' f
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
f : HomogeneousLocalization 𝒜 x
this : Quotient.mk'' (Quotient.out' f) = f
⊢ val f = Localization.mk (num f) { val := den f, property := (_ : den f ∈ x) }
[PROOFSTEP]
apply_fun HomogeneousLocalization.val at this 
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
f : HomogeneousLocalization 𝒜 x
this : val (Quotient.mk'' (Quotient.out' f)) = val f
⊢ val f = Localization.mk (num f) { val := den f, property := (_ : den f ∈ x) }
[PROOFSTEP]
rw [← this]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
f : HomogeneousLocalization 𝒜 x
this : val (Quotient.mk'' (Quotient.out' f)) = val f
⊢ val (Quotient.mk'' (Quotient.out' f)) = Localization.mk (num f) { val := den f, property := (_ : den f ∈ x) }
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
f g : HomogeneousLocalization 𝒜 x
h : val f = val g
⊢ f = g
[PROOFSTEP]
induction f using Quotient.inductionOn'
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
g : HomogeneousLocalization 𝒜 x
a✝ : NumDenSameDeg 𝒜 x
h : val (Quotient.mk'' a✝) = val g
⊢ Quotient.mk'' a✝ = g
[PROOFSTEP]
induction g using Quotient.inductionOn'
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
h : val (Quotient.mk'' a✝¹) = val (Quotient.mk'' a✝)
⊢ Quotient.mk'' a✝¹ = Quotient.mk'' a✝
[PROOFSTEP]
rw [Quotient.eq'']
[GOAL]
case h.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁵ : AddCommMonoid ι
inst✝⁴ : DecidableEq ι
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ι → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : Submonoid A
a✝¹ a✝ : NumDenSameDeg 𝒜 x
h : val (Quotient.mk'' a✝¹) = val (Quotient.mk'' a✝)
⊢ Setoid.r a✝¹ a✝
[PROOFSTEP]
simpa only [Quotient.liftOn'_mk] using h
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
h1 : IsUnit (val f)
⊢ IsUnit f
[PROOFSTEP]
rcases h1 with ⟨⟨a, b, eq0, eq1⟩, eq2 : a = f.val⟩
[GOAL]
case intro.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
a b : at Ideal.primeCompl 𝔭
eq0 : a * b = 1
eq1 : b * a = 1
eq2 : a = val f
⊢ IsUnit f
[PROOFSTEP]
rw [eq2] at eq0 eq1 
[GOAL]
case intro.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
a b : at Ideal.primeCompl 𝔭
eq0 : val f * b = 1
eq1 : b * val f = 1
eq2 : a = val f
⊢ IsUnit f
[PROOFSTEP]
clear a eq2
[GOAL]
case intro.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b : at Ideal.primeCompl 𝔭
eq0 : val f * b = 1
eq1 : b * val f = 1
⊢ IsUnit f
[PROOFSTEP]
induction' b using Localization.induction_on with data
[GOAL]
case intro.mk.H
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b : at Ideal.primeCompl 𝔭
eq0✝ : val f * b = 1
eq1✝ : b * val f = 1
data : A × { x // x ∈ Ideal.primeCompl 𝔭 }
eq0 : val f * Localization.mk data.fst data.snd = 1
eq1 : Localization.mk data.fst data.snd * val f = 1
⊢ IsUnit f
[PROOFSTEP]
rcases data with ⟨a, ⟨b, hb⟩⟩
[GOAL]
case intro.mk.H.mk.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk (a, { val := b, property := hb }).fst (a, { val := b, property := hb }).snd = 1
eq1 : Localization.mk (a, { val := b, property := hb }).fst (a, { val := b, property := hb }).snd * val f = 1
⊢ IsUnit f
[PROOFSTEP]
dsimp only at eq0 eq1 
[GOAL]
case intro.mk.H.mk.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
eq1 : Localization.mk a { val := b, property := hb } * val f = 1
⊢ IsUnit f
[PROOFSTEP]
have b_f_den_not_mem : b * f.den ∈ 𝔭.primeCompl := fun r =>
  Or.elim (Ideal.IsPrime.mem_or_mem inferInstance r) (hb ·) (f.den_mem ·)
[GOAL]
case intro.mk.H.mk.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
eq1 : Localization.mk a { val := b, property := hb } * val f = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
⊢ IsUnit f
[PROOFSTEP]
rw [f.eq_num_div_den, Localization.mk_mul, show (⟨b, hb⟩ : 𝔭.primeCompl) * ⟨f.den, _⟩ = ⟨b * f.den, _⟩ from rfl,
  show (1 : Localization.AtPrime 𝔭) = Localization.mk 1 1 by erw [Localization.mk_self 1], Localization.mk_eq_mk',
  IsLocalization.eq] at eq1 
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
eq1 :
  Localization.mk (a * num f)
      { val := b * den f,
        property :=
          (_ :
            ↑{ val := b, property := hb } * ↑{ val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) } ∈
              Ideal.primeCompl 𝔭) } =
    1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
⊢ 1 = Localization.mk 1 1
[PROOFSTEP]
erw [Localization.mk_self 1]
[GOAL]
case intro.mk.H.mk.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
eq1 :
  ∃ c,
    ↑c * (↑1 * (a * num f)) =
      ↑c *
        (↑{ val := b * den f,
              property :=
                (_ :
                  ↑{ val := b, property := hb } * ↑{ val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) } ∈
                    Ideal.primeCompl 𝔭) } *
          1)
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
⊢ IsUnit f
[PROOFSTEP]
rcases eq1 with ⟨⟨c, hc⟩, eq1⟩
[GOAL]
case intro.mk.H.mk.mk.intro.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 :
  ↑{ val := c, property := hc } * (↑1 * (a * num f)) =
    ↑{ val := c, property := hc } *
      (↑{ val := b * den f,
            property :=
              (_ :
                ↑{ val := b, property := hb } * ↑{ val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) } ∈
                  Ideal.primeCompl 𝔭) } *
        1)
⊢ IsUnit f
[PROOFSTEP]
change c * (1 * (a * f.num)) = _ at eq1 
[GOAL]
case intro.mk.H.mk.mk.intro.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 :
  c * (1 * (a * num f)) =
    ↑{ val := c, property := hc } *
      (↑{ val := b * den f,
            property :=
              (_ :
                ↑{ val := b, property := hb } * ↑{ val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) } ∈
                  Ideal.primeCompl 𝔭) } *
        1)
⊢ IsUnit f
[PROOFSTEP]
simp only [one_mul, mul_one] at eq1 
[GOAL]
case intro.mk.H.mk.mk.intro.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
⊢ IsUnit f
[PROOFSTEP]
have mem1 : c * (a * f.num) ∈ 𝔭.primeCompl :=
  eq1.symm ▸ fun r => Or.elim (Ideal.IsPrime.mem_or_mem inferInstance r) (by tauto) (by tauto)
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
r : c * (b * den f) ∈ ↑𝔭
⊢ c ∈ 𝔭 → False
[PROOFSTEP]
tauto
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
r : c * (b * den f) ∈ ↑𝔭
⊢ b * den f ∈ 𝔭 → False
[PROOFSTEP]
tauto
[GOAL]
case intro.mk.H.mk.mk.intro.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
⊢ IsUnit f
[PROOFSTEP]
have mem2 : f.num ∉ 𝔭 := by
  contrapose! mem1
  erw [Classical.not_not]
  exact Ideal.mul_mem_left _ _ (Ideal.mul_mem_left _ _ mem1)
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
⊢ ¬num f ∈ 𝔭
[PROOFSTEP]
contrapose! mem1
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : num f ∈ 𝔭
⊢ ¬c * (a * num f) ∈ Ideal.primeCompl 𝔭
[PROOFSTEP]
erw [Classical.not_not]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : num f ∈ 𝔭
⊢ c * (a * num f) ∈ ↑𝔭
[PROOFSTEP]
exact Ideal.mul_mem_left _ _ (Ideal.mul_mem_left _ _ mem1)
[GOAL]
case intro.mk.H.mk.mk.intro.mk
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ IsUnit f
[PROOFSTEP]
refine' ⟨⟨f, Quotient.mk'' ⟨f.deg, ⟨f.den, f.den_mem_deg⟩, ⟨f.num, f.num_mem_deg⟩, mem2⟩, _, _⟩, rfl⟩
[GOAL]
case intro.mk.H.mk.mk.intro.mk.refine'_1
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ f *
      Quotient.mk''
        { deg := deg f, num := { val := den f, property := (_ : den f ∈ 𝒜 (deg f)) },
          den := { val := num f, property := (_ : num f ∈ 𝒜 (deg f)) }, den_mem := mem2 } =
    1
[PROOFSTEP]
simp only [ext_iff_val, mul_val, val_mk'', f.eq_num_div_den, Localization.mk_mul, one_val]
[GOAL]
case intro.mk.H.mk.mk.intro.mk.refine'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ Quotient.mk''
        { deg := deg f, num := { val := den f, property := (_ : den f ∈ 𝒜 (deg f)) },
          den := { val := num f, property := (_ : num f ∈ 𝒜 (deg f)) }, den_mem := mem2 } *
      f =
    1
[PROOFSTEP]
simp only [ext_iff_val, mul_val, val_mk'', f.eq_num_div_den, Localization.mk_mul, one_val]
[GOAL]
case intro.mk.H.mk.mk.intro.mk.refine'_1
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ Localization.mk (num f * den f)
      ({ val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) } *
        { val := num f,
          property :=
            (_ :
              ↑{ deg := deg f, num := { val := den f, property := (_ : den f ∈ 𝒜 (deg f)) },
                      den := { val := num f, property := (_ : num f ∈ 𝒜 (deg f)) }, den_mem := mem2 }.den ∈
                Ideal.primeCompl 𝔭) }) =
    1
[PROOFSTEP]
convert Localization.mk_self (M := A) _
[GOAL]
case intro.mk.H.mk.mk.intro.mk.refine'_2
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ Localization.mk (den f * num f)
      ({ val := num f,
          property :=
            (_ :
              ↑{ deg := deg f, num := { val := den f, property := (_ : den f ∈ 𝒜 (deg f)) },
                      den := { val := num f, property := (_ : num f ∈ 𝒜 (deg f)) }, den_mem := mem2 }.den ∈
                Ideal.primeCompl 𝔭) } *
        { val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) }) =
    1
[PROOFSTEP]
convert Localization.mk_self (M := A) _
[GOAL]
case h.e'_2.h.h.e'_4
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ num f * den f =
    ↑({ val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) } *
        { val := num f,
          property :=
            (_ :
              ↑{ deg := deg f, num := { val := den f, property := (_ : den f ∈ 𝒜 (deg f)) },
                      den := { val := num f, property := (_ : num f ∈ 𝒜 (deg f)) }, den_mem := mem2 }.den ∈
                Ideal.primeCompl 𝔭) })
[PROOFSTEP]
rw [mul_comm]
[GOAL]
case h.e'_2.h.h.e'_4
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ den f * num f =
    ↑({ val := num f,
          property :=
            (_ :
              ↑{ deg := deg f, num := { val := den f, property := (_ : den f ∈ 𝒜 (deg f)) },
                      den := { val := num f, property := (_ : num f ∈ 𝒜 (deg f)) }, den_mem := mem2 }.den ∈
                Ideal.primeCompl 𝔭) } *
        { val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
rw [mul_comm]
[GOAL]
case h.e'_2.h.h.e'_4
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ den f * num f =
    ↑({ val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) } *
        { val := num f,
          property :=
            (_ :
              ↑{ deg := deg f, num := { val := den f, property := (_ : den f ∈ 𝒜 (deg f)) },
                      den := { val := num f, property := (_ : num f ∈ 𝒜 (deg f)) }, den_mem := mem2 }.den ∈
                Ideal.primeCompl 𝔭) })
[PROOFSTEP]
rfl
[GOAL]
case h.e'_2.h.h.e'_4
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
b✝ : at Ideal.primeCompl 𝔭
eq0✝ : val f * b✝ = 1
eq1✝ : b✝ * val f = 1
a b : A
hb : b ∈ Ideal.primeCompl 𝔭
eq0 : val f * Localization.mk a { val := b, property := hb } = 1
b_f_den_not_mem : b * den f ∈ Ideal.primeCompl 𝔭
c : A
hc : c ∈ Ideal.primeCompl 𝔭
eq1 : c * (a * num f) = c * (b * den f)
mem1 : c * (a * num f) ∈ Ideal.primeCompl 𝔭
mem2 : ¬num f ∈ 𝔭
⊢ num f * den f =
    ↑({ val := num f,
          property :=
            (_ :
              ↑{ deg := deg f, num := { val := den f, property := (_ : den f ∈ 𝒜 (deg f)) },
                      den := { val := num f, property := (_ : num f ∈ 𝒜 (deg f)) }, den_mem := mem2 }.den ∈
                Ideal.primeCompl 𝔭) } *
        { val := den f, property := (_ : den f ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
x✝ : IsUnit f
b : AtPrime 𝒜 𝔭
eq1 : f * b = 1
eq2 : b * f = 1
⊢ IsUnit (val f)
[PROOFSTEP]
simp only [ext_iff_val, mul_val, one_val] at eq1 eq2 
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
f : AtPrime 𝒜 𝔭
x✝ : IsUnit f
b : AtPrime 𝒜 𝔭
eq1 : val f * val b = 1
eq2 : val b * val f = 1
⊢ IsUnit (val f)
[PROOFSTEP]
exact ⟨⟨f.val, b.val, eq1, eq2⟩, rfl⟩
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
r : 0 = 1
⊢ False
[PROOFSTEP]
simp [ext_iff_val, zero_val, one_val, zero_ne_one] at r 
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : AtPrime 𝒜 𝔭
⊢ IsUnit a ∨ IsUnit (1 - a)
[PROOFSTEP]
simp only [← isUnit_iff_isUnit_val, sub_val, one_val]
[GOAL]
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : AtPrime 𝒜 𝔭
⊢ IsUnit (val a) ∨ IsUnit (1 - val a)
[PROOFSTEP]
induction' a using Quotient.inductionOn' with a
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
⊢ IsUnit (val (Quotient.mk'' a)) ∨ IsUnit (1 - val (Quotient.mk'' a))
[PROOFSTEP]
simp only [HomogeneousLocalization.val_mk'']
[GOAL]
case h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
⊢ IsUnit (Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) }) ∨
    IsUnit (1 - Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
by_cases mem1 : a.num.1 ∈ 𝔭
[GOAL]
case pos
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ 𝔭
⊢ IsUnit (Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) }) ∨
    IsUnit (1 - Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
right
[GOAL]
case pos.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ 𝔭
⊢ IsUnit (1 - Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
have : a.den.1 - a.num.1 ∈ 𝔭.primeCompl := fun h =>
  a.den_mem (sub_add_cancel a.den.val a.num.val ▸ Ideal.add_mem _ h mem1 : a.den.1 ∈ 𝔭)
[GOAL]
case pos.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ 𝔭
this : ↑a.den - ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ IsUnit (1 - Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
apply isUnit_of_mul_eq_one _ (Localization.mk a.den.1 ⟨a.den.1 - a.num.1, this⟩)
[GOAL]
case pos.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ 𝔭
this : ↑a.den - ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ (1 - Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) }) *
      Localization.mk ↑a.den { val := ↑a.den - ↑a.num, property := this } =
    1
[PROOFSTEP]
simp only [sub_mul, Localization.mk_mul, one_mul, Localization.sub_mk, Submonoid.coe_mul]
[GOAL]
case pos.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ 𝔭
this : ↑a.den - ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ Localization.mk (↑a.den * (↑a.den - ↑a.num) * ↑a.den - (↑a.den * (↑a.num * ↑a.den) - ↑a.num * (↑a.num * ↑a.den)))
      ({ val := ↑a.den - ↑a.num, property := this } *
        ({ val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) } *
          { val := ↑a.den - ↑a.num, property := this })) =
    1
[PROOFSTEP]
convert Localization.mk_self (M := A) _
[GOAL]
case h.e'_2.h.h.e'_4
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ 𝔭
this : ↑a.den - ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ ↑a.den * (↑a.den - ↑a.num) * ↑a.den - (↑a.den * (↑a.num * ↑a.den) - ↑a.num * (↑a.num * ↑a.den)) =
    ↑({ val := ↑a.den - ↑a.num, property := this } *
        ({ val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) } *
          { val := ↑a.den - ↑a.num, property := this }))
[PROOFSTEP]
simp only [Submonoid.coe_mul]
[GOAL]
case h.e'_2.h.h.e'_4
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ 𝔭
this : ↑a.den - ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ ↑a.den * (↑a.den - ↑a.num) * ↑a.den - (↑a.den * (↑a.num * ↑a.den) - ↑a.num * (↑a.num * ↑a.den)) =
    (↑a.den - ↑a.num) * (↑a.den * (↑a.den - ↑a.num))
[PROOFSTEP]
ring
[GOAL]
case neg
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ¬↑a.num ∈ 𝔭
⊢ IsUnit (Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) }) ∨
    IsUnit (1 - Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
left
[GOAL]
case neg.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ¬↑a.num ∈ 𝔭
⊢ IsUnit (Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
change _ ∈ 𝔭.primeCompl at mem1 
[GOAL]
case neg.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ IsUnit (Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) })
[PROOFSTEP]
apply isUnit_of_mul_eq_one _ (Localization.mk a.den.1 ⟨a.num.1, mem1⟩)
[GOAL]
case neg.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ Localization.mk ↑a.num { val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) } *
      Localization.mk ↑a.den { val := ↑a.num, property := mem1 } =
    1
[PROOFSTEP]
rw [Localization.mk_mul]
[GOAL]
case neg.h
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ Localization.mk (↑a.num * ↑a.den)
      ({ val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) } * { val := ↑a.num, property := mem1 }) =
    1
[PROOFSTEP]
convert Localization.mk_self (M := A) _
[GOAL]
case h.e'_2.h.h.e'_4
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ ↑a.num * ↑a.den =
    ↑({ val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) } * { val := ↑a.num, property := mem1 })
[PROOFSTEP]
rw [mul_comm]
[GOAL]
case h.e'_2.h.h.e'_4
ι : Type u_1
R : Type u_2
A : Type u_3
inst✝⁶ : AddCommMonoid ι
inst✝⁵ : DecidableEq ι
inst✝⁴ : CommRing R
inst✝³ : CommRing A
inst✝² : Algebra R A
𝒜 : ι → Submodule R A
inst✝¹ : GradedAlgebra 𝒜
x : Submonoid A
𝔭 : Ideal A
inst✝ : Ideal.IsPrime 𝔭
a : NumDenSameDeg 𝒜 (Ideal.primeCompl 𝔭)
mem1 : ↑a.num ∈ Ideal.primeCompl 𝔭
⊢ ↑a.den * ↑a.num =
    ↑({ val := ↑a.den, property := (_ : ↑a.den ∈ Ideal.primeCompl 𝔭) } * { val := ↑a.num, property := mem1 })
[PROOFSTEP]
rfl
