Theorem: OreLocalization.left_distrib
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 + x * 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 + r₁ /ₒ s₁ * 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₂) + r₁ /ₒ s₁ * z

tactic: rcases oreDivAddChar' r₂ r₃ s₂ s₃ with ⟨ra, sa, ha, q⟩
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₁ * (r₃ /ₒ s₃)

tactic: rw [q]
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
q : r₂ /ₒ s₂ + r₃ /ₒ s₃ = (r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)
⊢ r₁ /ₒ s₁ * (r₂ /ₒ s₂ + r₃ /ₒ s₃) = r₁ /ₒ s₁ * (r₂ /ₒ s₂) + r₁ /ₒ s₁ * (r₃ /ₒ s₃)

tactic: clear q
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
q : r₂ /ₒ s₂ + r₃ /ₒ s₃ = (r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = r₁ /ₒ s₁ * (r₂ /ₒ s₂) + r₁ /ₒ s₁ * (r₃ /ₒ s₃)

tactic: rw [OreLocalization.expand' r₂ s₂ sa]
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₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = r₁ /ₒ s₁ * (r₂ /ₒ s₂) + r₁ /ₒ s₁ * (r₃ /ₒ s₃)

tactic: rcases oreDivMulChar' r₁ (r₂ * sa) s₁ (s₂ * sa) with ⟨rb, sb, hb, q⟩
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₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = r₁ /ₒ s₁ * (r₂ * ↑sa /ₒ (s₂ * sa)) + r₁ /ₒ s₁ * (r₃ /ₒ s₃)

tactic: rw [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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
q : r₁ /ₒ s₁ * (r₂ * ↑sa /ₒ (s₂ * sa)) = r₁ * rb /ₒ (s₂ * sa * sb)
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = r₁ /ₒ s₁ * (r₂ * ↑sa /ₒ (s₂ * sa)) + r₁ /ₒ s₁ * (r₃ /ₒ s₃)

tactic: clear 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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
q : r₁ /ₒ s₁ * (r₂ * ↑sa /ₒ (s₂ * sa)) = r₁ * rb /ₒ (s₂ * sa * sb)
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = r₁ * rb /ₒ (s₂ * sa * sb) + r₁ /ₒ s₁ * (r₃ /ₒ s₃)

tactic: have hs₃rasb : ↑s₃ * (ra * sb) ∈ S := by
  rw [← mul_assoc, ← ha]
  norm_cast
  apply SetLike.coe_mem
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = r₁ * rb /ₒ (s₂ * sa * sb) + r₁ /ₒ s₁ * (r₃ /ₒ s₃)

tactic: rw [OreLocalization.expand _ _ _ hs₃rasb]
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = r₁ * rb /ₒ (s₂ * sa * sb) + r₁ /ₒ s₁ * (r₃ /ₒ s₃)

tactic: have ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * sb) := by simp [ha, ← mul_assoc]
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) =
    r₁ * rb /ₒ (s₂ * sa * sb) + r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ { val := ↑s₃ * (ra * ↑sb), property := hs₃rasb })

tactic: rw [← Subtype.coe_eq_of_eq_mk ha']
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) =
    r₁ * rb /ₒ (s₂ * sa * sb) + r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ { val := ↑s₃ * (ra * ↑sb), property := hs₃rasb })

tactic: rcases oreDivMulChar' r₁ (r₃ * (ra * sb)) s₁ (s₂ * sa * sb) with ⟨rc, sc, hc, hc'⟩
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) =
    r₁ * rb /ₒ (s₂ * sa * sb) + r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ (s₂ * sa * sb))

tactic: rw [hc']
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)
rc : R
sc : { x // x ∈ S }
hc : r₃ * (ra * ↑sb) * ↑sc = ↑s₁ * rc
hc' : r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ (s₂ * sa * sb)) = r₁ * rc /ₒ (s₂ * sa * sb * sc)
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) =
    r₁ * rb /ₒ (s₂ * sa * sb) + r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ (s₂ * sa * sb))

tactic: rw [oreDiv_add_char (s₂ * sa * sb) (s₂ * sa * sb * sc) 1 sc (by simp)]
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)
rc : R
sc : { x // x ∈ S }
hc : r₃ * (ra * ↑sb) * ↑sc = ↑s₁ * rc
hc' : r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ (s₂ * sa * sb)) = r₁ * rc /ₒ (s₂ * sa * sb * sc)
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = r₁ * rb /ₒ (s₂ * sa * sb) + r₁ * rc /ₒ (s₂ * sa * sb * sc)

tactic: rw [OreLocalization.expand' (r₂ * ↑sa + r₃ * ra) (s₂ * sa) (sb * sc)]
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)
rc : R
sc : { x // x ∈ S }
hc : r₃ * (ra * ↑sb) * ↑sc = ↑s₁ * rc
hc' : r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ (s₂ * sa * sb)) = r₁ * rc /ₒ (s₂ * sa * sb * sc)
⊢ r₁ /ₒ s₁ * ((r₂ * ↑sa + r₃ * ra) /ₒ (s₂ * sa)) = (r₁ * rb * ↑sc + r₁ * rc * 1) /ₒ (s₂ * sa * sb * sc)

tactic: rw [OreLocalization.mul_cancel']
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)
rc : R
sc : { x // x ∈ S }
hc : r₃ * (ra * ↑sb) * ↑sc = ↑s₁ * rc
hc' : r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ (s₂ * sa * sb)) = r₁ * rc /ₒ (s₂ * sa * sb * sc)
⊢ r₁ /ₒ s₁ * (↑s₁ * (rb * ↑sc + rc) /ₒ (s₂ * sa * (sb * sc))) = (r₁ * rb * ↑sc + r₁ * rc * 1) /ₒ (s₂ * sa * sb * sc)

tactic: simp only [mul_one, Submonoid.coe_mul, mul_add, ← mul_assoc]
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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)
rc : R
sc : { x // x ∈ S }
hc : r₃ * (ra * ↑sb) * ↑sc = ↑s₁ * rc
hc' : r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ (s₂ * sa * sb)) = r₁ * rc /ₒ (s₂ * sa * sb * sc)
⊢ r₁ * (rb * ↑sc + rc) /ₒ (s₂ * sa * (sb * sc)) = (r₁ * rb * ↑sc + r₁ * rc * 1) /ₒ (s₂ * sa * sb * sc)

tactic: rw [← mul_assoc, ← ha]
state_before: 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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
⊢ ↑s₃ * (ra * ↑sb) ∈ S

tactic: norm_cast
state_before: 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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
⊢ ↑s₂ * ↑sa * ↑sb ∈ S

tactic: apply SetLike.coe_mem
state_before: 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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
⊢ ↑(s₂ * sa * sb) ∈ S

tactic: simp [ha, ← mul_assoc]
state_before: 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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
⊢ ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)

tactic: simp
state_before: 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 : r₂ * ↑sa * ↑sb = ↑s₁ * rb
hs₃rasb : ↑s₃ * (ra * ↑sb) ∈ S
ha' : ↑(s₂ * sa * sb) = ↑s₃ * (ra * ↑sb)
rc : R
sc : { x // x ∈ S }
hc : r₃ * (ra * ↑sb) * ↑sc = ↑s₁ * rc
hc' : r₁ /ₒ s₁ * (r₃ * (ra * ↑sb) /ₒ (s₂ * sa * sb)) = r₁ * rc /ₒ (s₂ * sa * sb * sc)
⊢ ↑(s₂ * sa * sb) * ↑sc = ↑(s₂ * sa * sb * sc) * 1