Theorem: OreLocalization.add_assoc
File: Mathlib/RingTheory/OreLocalization/Basic.lean

tactic: induction' x using OreLocalization.ind with r₁ s₁
state_before: R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
x y z : OreLocalization R S
⊢ x + y + z = x + (y + z)

tactic: induction' y using OreLocalization.ind with r₂ s₂
state_before: case c
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
y z : OreLocalization R S
r₁ : R
s₁ : { x // x ∈ S }
⊢ r₁ /ₒ s₁ + y + z = r₁ /ₒ s₁ + (y + z)

tactic: induction' z using OreLocalization.ind with r₃ s₃
state_before: case c.c
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
z : OreLocalization R S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
⊢ r₁ /ₒ s₁ + r₂ /ₒ s₂ + z = r₁ /ₒ s₁ + (r₂ /ₒ s₂ + z)

tactic: rcases oreDivAddChar' r₁ r₂ s₁ s₂ with ⟨ra, sa, ha, ha'⟩
state_before: case c.c.c
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
⊢ r₁ /ₒ s₁ + r₂ /ₒ s₂ + r₃ /ₒ s₃ = r₁ /ₒ s₁ + (r₂ /ₒ s₂ + r₃ /ₒ s₃)

tactic: rw [ha']
state_before: case c.c.c.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
ha' : r₁ /ₒ s₁ + r₂ /ₒ s₂ = (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa)
⊢ r₁ /ₒ s₁ + r₂ /ₒ s₂ + r₃ /ₒ s₃ = r₁ /ₒ s₁ + (r₂ /ₒ s₂ + r₃ /ₒ s₃)

tactic: clear ha'
state_before: case c.c.c.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
ha' : r₁ /ₒ s₁ + r₂ /ₒ s₂ = (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa)
⊢ (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa) + r₃ /ₒ s₃ = r₁ /ₒ s₁ + (r₂ /ₒ s₂ + r₃ /ₒ s₃)

tactic: rcases oreDivAddChar' r₂ r₃ s₂ s₃ with ⟨rb, sb, hb, hb'⟩
state_before: case c.c.c.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
⊢ (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa) + r₃ /ₒ s₃ = r₁ /ₒ s₁ + (r₂ /ₒ s₂ + r₃ /ₒ s₃)

tactic: rw [hb']
state_before: case c.c.c.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
hb' : r₂ /ₒ s₂ + r₃ /ₒ s₃ = (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb)
⊢ (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa) + r₃ /ₒ s₃ = r₁ /ₒ s₁ + (r₂ /ₒ s₂ + r₃ /ₒ s₃)

tactic: clear hb'
state_before: case c.c.c.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
hb' : r₂ /ₒ s₂ + r₃ /ₒ s₃ = (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb)
⊢ (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa) + r₃ /ₒ s₃ = r₁ /ₒ s₁ + (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb)

tactic: rcases oreDivAddChar' (r₁ * sa + r₂ * ra) r₃ (s₁ * sa) s₃ with ⟨rc, sc, hc, q⟩
state_before: case c.c.c.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
⊢ (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa) + r₃ /ₒ s₃ = r₁ /ₒ s₁ + (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb)

tactic: rw [q]
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
q : (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa) + r₃ /ₒ s₃ = ((r₁ * ↑sa + r₂ * ra) * ↑sc + r₃ * rc) /ₒ (s₁ * sa * sc)
⊢ (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa) + r₃ /ₒ s₃ = r₁ /ₒ s₁ + (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb)

tactic: clear q
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
q : (r₁ * ↑sa + r₂ * ra) /ₒ (s₁ * sa) + r₃ /ₒ s₃ = ((r₁ * ↑sa + r₂ * ra) * ↑sc + r₃ * rc) /ₒ (s₁ * sa * sc)
⊢ ((r₁ * ↑sa + r₂ * ra) * ↑sc + r₃ * rc) /ₒ (s₁ * sa * sc) = r₁ /ₒ s₁ + (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb)

tactic: rcases oreDivAddChar' r₁ (r₂ * sb + r₃ * rb) s₁ (s₂ * sb) with ⟨rd, sd, hd, q⟩
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
⊢ ((r₁ * ↑sa + r₂ * ra) * ↑sc + r₃ * rc) /ₒ (s₁ * sa * sc) = r₁ /ₒ s₁ + (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb)

tactic: rw [q]
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
q : r₁ /ₒ s₁ + (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb) = (r₁ * ↑sd + (r₂ * ↑sb + r₃ * rb) * rd) /ₒ (s₁ * sd)
⊢ ((r₁ * ↑sa + r₂ * ra) * ↑sc + r₃ * rc) /ₒ (s₁ * sa * sc) = r₁ /ₒ s₁ + (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb)

tactic: clear q
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
q : r₁ /ₒ s₁ + (r₂ * ↑sb + r₃ * rb) /ₒ (s₂ * sb) = (r₁ * ↑sd + (r₂ * ↑sb + r₃ * rb) * rd) /ₒ (s₁ * sd)
⊢ ((r₁ * ↑sa + r₂ * ra) * ↑sc + r₃ * rc) /ₒ (s₁ * sa * sc) = (r₁ * ↑sd + (r₂ * ↑sb + r₃ * rb) * rd) /ₒ (s₁ * sd)

tactic: simp only [right_distrib, mul_assoc, add_assoc]
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
⊢ ((r₁ * ↑sa + r₂ * ra) * ↑sc + r₃ * rc) /ₒ (s₁ * sa * sc) = (r₁ * ↑sd + (r₂ * ↑sb + r₃ * rb) * rd) /ₒ (s₁ * sd)

tactic: simp only [← add_oreDiv]
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
⊢ (r₁ * (↑sa * ↑sc) + (r₂ * (ra * ↑sc) + r₃ * rc)) /ₒ (s₁ * (sa * sc)) =
    (r₁ * ↑sd + (r₂ * (↑sb * rd) + r₃ * (rb * rd))) /ₒ (s₁ * sd)

tactic: congr 1
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
⊢ r₁ * (↑sa * ↑sc) /ₒ (s₁ * (sa * sc)) + (r₂ * (ra * ↑sc) /ₒ (s₁ * (sa * sc)) + r₃ * rc /ₒ (s₁ * (sa * sc))) =
    r₁ * ↑sd /ₒ (s₁ * sd) + (r₂ * (↑sb * rd) /ₒ (s₁ * sd) + r₃ * (rb * rd) /ₒ (s₁ * sd))

tactic: congr 1
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
⊢ r₂ * (ra * ↑sc) /ₒ (s₁ * (sa * sc)) + r₃ * rc /ₒ (s₁ * (sa * sc)) =
    r₂ * (↑sb * rd) /ₒ (s₁ * sd) + r₃ * (rb * rd) /ₒ (s₁ * sd)

tactic: rw [← OreLocalization.expand', ← mul_assoc, ← mul_assoc, ← OreLocalization.expand', ←
  OreLocalization.expand']
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
⊢ r₁ * (↑sa * ↑sc) /ₒ (s₁ * (sa * sc)) = r₁ * ↑sd /ₒ (s₁ * sd)

tactic: simp_rw [← Submonoid.coe_mul] at ha hd
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a.e_a
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
⊢ r₂ * (ra * ↑sc) /ₒ (s₁ * (sa * sc)) = r₂ * (↑sb * rd) /ₒ (s₁ * sd)

tactic: rw [Subtype.coe_eq_of_eq_mk hd, ← mul_assoc, ← mul_assoc, ← mul_assoc, ← OreLocalization.expand,
  ← OreLocalization.expand', Subtype.coe_eq_of_eq_mk ha, ← OreLocalization.expand]
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a.e_a
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑(s₁ * sa) = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑(s₁ * sd) = ↑(s₂ * sb) * rd
⊢ r₂ * (ra * ↑sc) /ₒ (s₁ * (sa * sc)) = r₂ * (↑sb * rd) /ₒ (s₁ * sd)

tactic: apply OreLocalization.expand'
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a.e_a
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑(s₁ * sa) = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑(s₁ * sd) = ↑(s₂ * sb) * rd
⊢ r₂ /ₒ s₂ = r₂ * ↑sb /ₒ (s₂ * sb)

tactic: rcases oreCondition (sd : R) (sa * sc) with ⟨re, _, _⟩
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a.e_a
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
⊢ r₃ * rc /ₒ (s₁ * (sa * sc)) = r₃ * (rb * rd) /ₒ (s₁ * sd)

tactic: simp_rw [← Submonoid.coe_mul] at hb hc hd
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a.e_a.mk.mk
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑s₂ * ↑sb = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa) * ↑sc = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑s₁ * ↑sd = ↑(s₂ * sb) * rd
re : R
fst✝ : { x // x ∈ S }
snd✝ : ↑sd * ↑fst✝ = ↑(sa * sc) * re
⊢ r₃ * rc /ₒ (s₁ * (sa * sc)) = r₃ * (rb * rd) /ₒ (s₁ * sd)

tactic: rw [← mul_assoc, Subtype.coe_eq_of_eq_mk hc]
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a.e_a.mk.mk
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑(s₂ * sb) = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa * sc) = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑(s₁ * sd) = ↑(s₂ * sb) * rd
re : R
fst✝ : { x // x ∈ S }
snd✝ : ↑sd * ↑fst✝ = ↑(sa * sc) * re
⊢ r₃ * rc /ₒ (s₁ * (sa * sc)) = r₃ * (rb * rd) /ₒ (s₁ * sd)

tactic: rw [← OreLocalization.expand, Subtype.coe_eq_of_eq_mk hd, ← mul_assoc, ←
  OreLocalization.expand, Subtype.coe_eq_of_eq_mk hb]
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a.e_a.mk.mk
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑(s₂ * sb) = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa * sc) = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑(s₁ * sd) = ↑(s₂ * sb) * rd
re : R
fst✝ : { x // x ∈ S }
snd✝ : ↑sd * ↑fst✝ = ↑(sa * sc) * re
⊢ r₃ * rc /ₒ { val := ↑s₃ * rc, property := (_ : ↑s₃ * rc ∈ ↑S) } = r₃ * (rb * rd) /ₒ (s₁ * sd)

tactic: apply OreLocalization.expand
state_before: case c.c.c.mk.mk.intro.mk.mk.intro.mk.mk.intro.mk.mk.intro.e_a.e_a.mk.mk
R : Type u_1
inst✝¹ : Semiring R
S : Submonoid R
inst✝ : OreSet S
r₁ : R
s₁ : { x // x ∈ S }
r₂ : R
s₂ : { x // x ∈ S }
r₃ : R
s₃ : { x // x ∈ S }
ra : R
sa : { x // x ∈ S }
ha : ↑s₁ * ↑sa = ↑s₂ * ra
rb : R
sb : { x // x ∈ S }
hb : ↑(s₂ * sb) = ↑s₃ * rb
rc : R
sc : { x // x ∈ S }
hc : ↑(s₁ * sa * sc) = ↑s₃ * rc
rd : R
sd : { x // x ∈ S }
hd : ↑(s₁ * sd) = ↑(s₂ * sb) * rd
re : R
fst✝ : { x // x ∈ S }
snd✝ : ↑sd * ↑fst✝ = ↑(sa * sc) * re
⊢ r₃ /ₒ s₃ = r₃ * rb /ₒ { val := ↑s₃ * rb, property := (_ : ↑s₃ * rb ∈ ↑S) }