Theorem: MulMemClass.mul_right_mem_add_closure
File: Mathlib/Algebra/Group/Submonoid/Membership.lean

tactic: revert b
state_before: M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
a b : R
ha : a ∈ AddSubmonoid.closure ↑S
hb : b ∈ S
⊢ a * b ∈ AddSubmonoid.closure ↑S
state_after: M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
a : R
ha : a ∈ AddSubmonoid.closure ↑S
⊢ ∀ {b : R}, b ∈ S → a * b ∈ AddSubmonoid.closure ↑S

tactic: apply @AddSubmonoid.closure_induction _ _ _
  (fun z => ∀ (b : R), b ∈ S → z * b ∈ AddSubmonoid.closure S) _ ha <;> clear ha a
state_before: M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
a : R
ha : a ∈ AddSubmonoid.closure ↑S
⊢ ∀ {b : R}, b ∈ S → a * b ∈ AddSubmonoid.closure ↑S
state_after: case mem
M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
⊢ ∀ x ∈ ↑S, ∀ b ∈ S, x * b ∈ AddSubmonoid.closure ↑S

case one
M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
⊢ ∀ b ∈ S, 0 * b ∈ AddSubmonoid.closure ↑S

case mul
M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
⊢ ∀ (x y : R),
    (∀ b ∈ S, x * b ∈ AddSubmonoid.closure ↑S) →
      (∀ b ∈ S, y * b ∈ AddSubmonoid.closure ↑S) → ∀ b ∈ S, (x + y) * b ∈ AddSubmonoid.closure ↑S

tactic: exact fun r hr b hb => AddSubmonoid.mem_closure.mpr fun y hy => hy (mul_mem hr hb)
state_before: case mem
M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
⊢ ∀ x ∈ ↑S, ∀ b ∈ S, x * b ∈ AddSubmonoid.closure ↑S
state_after: no goals

tactic: exact fun b _ => by simp only [zero_mul, (AddSubmonoid.closure (S : Set R)).zero_mem]
state_before: case one
M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
⊢ ∀ b ∈ S, 0 * b ∈ AddSubmonoid.closure ↑S
state_after: no goals

tactic: simp only [zero_mul, (AddSubmonoid.closure (S : Set R)).zero_mem]
state_before: M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
b : R
x✝ : b ∈ S
⊢ 0 * b ∈ AddSubmonoid.closure ↑S
state_after: no goals

tactic: simp_rw [add_mul]
state_before: case mul
M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
⊢ ∀ (x y : R),
    (∀ b ∈ S, x * b ∈ AddSubmonoid.closure ↑S) →
      (∀ b ∈ S, y * b ∈ AddSubmonoid.closure ↑S) → ∀ b ∈ S, (x + y) * b ∈ AddSubmonoid.closure ↑S
state_after: case mul
M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
⊢ ∀ (x y : R),
    (∀ b ∈ S, x * b ∈ AddSubmonoid.closure ↑S) →
      (∀ b ∈ S, y * b ∈ AddSubmonoid.closure ↑S) → ∀ b ∈ S, x * b + y * b ∈ AddSubmonoid.closure ↑S

tactic: exact fun r s hr hs b hb => (AddSubmonoid.closure (S : Set R)).add_mem (hr _ hb) (hs _ hb)
state_before: case mul
M : Type u_1
A : Type u_2
B : Type u_3
R : Type u_4
inst✝² : NonUnitalNonAssocSemiring R
inst✝¹ : SetLike M R
inst✝ : MulMemClass M R
S : M
⊢ ∀ (x y : R),
    (∀ b ∈ S, x * b ∈ AddSubmonoid.closure ↑S) →
      (∀ b ∈ S, y * b ∈ AddSubmonoid.closure ↑S) → ∀ b ∈ S, x * b + y * b ∈ AddSubmonoid.closure ↑S
state_after: no goals