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

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

tactic: rw [OreLocalization.expand r₂ s₂ ra (by rw [← ha]; apply SetLike.coe_mem)]
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₁ * ↑sa /ₒ (s₁ * sa) * (r₃ /ₒ s₃) + r₂ /ₒ s₂ * (r₃ /ₒ s₃)

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

tactic: repeat' rw [oreDiv_mul_oreDiv]; simp only [add_mul, add_oreDiv]
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₁ * ↑sa /ₒ (s₁ * sa) * (r₃ /ₒ s₃) + r₂ * ra /ₒ (s₁ * sa) * (r₃ /ₒ s₃)

tactic: rw [← 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
⊢ ↑s₂ * ra ∈ 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
⊢ ↑(s₁ * sa) ∈ S

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

tactic: simp only [add_mul, add_oreDiv]
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 * oreNum r₃ (s₁ * sa) + r₂ * ra * oreNum r₃ (s₁ * sa)) /ₒ (s₃ * oreDenom r₃ (s₁ * sa)) =
    r₁ * ↑sa * oreNum r₃ (s₁ * sa) /ₒ (s₃ * oreDenom r₃ (s₁ * sa)) +
      r₂ * ra * oreNum r₃ (s₁ * sa) /ₒ (s₃ * oreDenom r₃ (s₁ * sa))