Theorem: MonoidAlgebra.opRingEquiv_apply
File: Mathlib/Algebra/MonoidAlgebra/Basic.lean

Proof steps:
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ ∀ (x y : (MonoidAlgebra k G)ᵐᵒᵖ), __src✝.toFun (x * y) = __src✝.toFun x * __src✝.toFun y
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ ∀ (x y : (MonoidAlgebra k G)ᵐᵒᵖ), ↑__src✝ (x * y) = ↑__src✝ x * ↑__src✝ y
tactic: rw [Equiv.toFun_as_coe, AddEquiv.toEquiv_eq_coe]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ ∀ (x y : (MonoidAlgebra k G)ᵐᵒᵖ), ↑__src✝ (x * y) = ↑__src✝ x * ↑__src✝ y
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ ∀ (x y : (MonoidAlgebra k G)ᵐᵒᵖ), __src✝ (x * y) = __src✝ x * __src✝ y
tactic: erw [AddEquiv.coe_toEquiv]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ ∀ (x y : (MonoidAlgebra k G)ᵐᵒᵖ), __src✝ (x * y) = __src✝ x * __src✝ y
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ ∀ (x y : (MonoidAlgebra k G)ᵐᵒᵖ), __src✝.toAddMonoidHom (x * y) = __src✝.toAddMonoidHom x * __src✝.toAddMonoidHom y
tactic: rw [← AddEquiv.coe_toAddMonoidHom]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ ∀ (x y : (MonoidAlgebra k G)ᵐᵒᵖ), __src✝.toAddMonoidHom (x * y) = __src✝.toAddMonoidHom x * __src✝.toAddMonoidHom y
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ AddMonoidHom.mul.compr₂ __src✝.toAddMonoidHom =
    (AddMonoidHom.mul.comp __src✝.toAddMonoidHom).compl₂ __src✝.toAddMonoidHom
tactic: refine Iff.mpr (AddMonoidHom.map_mul_iff (R := (MonoidAlgebra k G)ᵐᵒᵖ)
        (S := MonoidAlgebra kᵐᵒᵖ Gᵐᵒᵖ) _) ?_
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
⊢ AddMonoidHom.mul.compr₂ __src✝.toAddMonoidHom =
    (AddMonoidHom.mul.comp __src✝.toAddMonoidHom).compl₂ __src✝.toAddMonoidHom
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ ((((((AddMonoidHom.mul.compr₂ __src✝.toAddMonoidHom).comp opAddEquiv.toAddMonoidHom).comp (singleAddHom i₁)) r₁).comp
            opAddEquiv.toAddMonoidHom).comp
        (singleAddHom i₂))
      r₂ =
    (((((((AddMonoidHom.mul.comp __src✝.toAddMonoidHom).compl₂ __src✝.toAddMonoidHom).comp
                      opAddEquiv.toAddMonoidHom).comp
                  (singleAddHom i₁))
                r₁).comp
            opAddEquiv.toAddMonoidHom).comp
        (singleAddHom i₂))
      r₂
tactic: refine AddMonoidHom.mul_op_ext _ _ <| addHom_ext' fun i₁ => AddMonoidHom.ext fun r₁ =>
        AddMonoidHom.mul_op_ext _ _ <| addHom_ext' fun i₂ => AddMonoidHom.ext fun r₂ => ?_
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ ((((((AddMonoidHom.mul.compr₂ __src✝.toAddMonoidHom).comp opAddEquiv.toAddMonoidHom).comp (singleAddHom i₁)) r₁).comp
            opAddEquiv.toAddMonoidHom).comp
        (singleAddHom i₂))
      r₂ =
    (((((((AddMonoidHom.mul.comp __src✝.toAddMonoidHom).compl₂ __src✝.toAddMonoidHom).comp
                      opAddEquiv.toAddMonoidHom).comp
                  (singleAddHom i₁))
                r₁).comp
            opAddEquiv.toAddMonoidHom).comp
        (singleAddHom i₂))
      r₂
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (opAddEquiv.symm.trans ((mapRange.addEquiv opAddEquiv).trans (Finsupp.domCongr opEquiv))).toAddMonoidHom
      (opAddEquiv (Finsupp.single i₁ r₁) * opAddEquiv (Finsupp.single i₂ r₂)) =
    (opAddEquiv.symm.trans ((mapRange.addEquiv opAddEquiv).trans (Finsupp.domCongr opEquiv))).toAddMonoidHom
        (opAddEquiv (Finsupp.single i₁ r₁)) *
      (opAddEquiv.symm.trans ((mapRange.addEquiv opAddEquiv).trans (Finsupp.domCongr opEquiv))).toAddMonoidHom
        (opAddEquiv (Finsupp.single i₂ r₂))
tactic: simp only [AddMonoidHom.coe_comp, AddEquiv.coe_toAddMonoidHom, opAddEquiv_apply,
        Function.comp_apply, singleAddHom_apply, AddMonoidHom.compr₂_apply, AddMonoidHom.coe_mul,
        AddMonoidHom.coe_mulLeft, AddMonoidHom.compl₂_apply]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (opAddEquiv.symm.trans ((mapRange.addEquiv opAddEquiv).trans (Finsupp.domCongr opEquiv))).toAddMonoidHom
      (opAddEquiv (Finsupp.single i₁ r₁) * opAddEquiv (Finsupp.single i₂ r₂)) =
    (opAddEquiv.symm.trans ((mapRange.addEquiv opAddEquiv).trans (Finsupp.domCongr opEquiv))).toAddMonoidHom
        (opAddEquiv (Finsupp.single i₁ r₁)) *
      (opAddEquiv.symm.trans ((mapRange.addEquiv opAddEquiv).trans (Finsupp.domCongr opEquiv))).toAddMonoidHom
        (opAddEquiv (Finsupp.single i₂ r₂))
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (Finsupp.domCongr opEquiv)
      ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁) * opAddEquiv (Finsupp.single i₂ r₂)))) =
    (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁)))) *
      (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₂ r₂))))
tactic: erw [AddEquiv.trans_apply, AddEquiv.trans_apply, AddEquiv.trans_apply, AddEquiv.trans_apply,
        AddEquiv.trans_apply, AddEquiv.trans_apply, MulOpposite.opAddEquiv_symm_apply]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (Finsupp.domCongr opEquiv)
      ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁) * opAddEquiv (Finsupp.single i₂ r₂)))) =
    (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁)))) *
      (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₂ r₂))))
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (Finsupp.domCongr opEquiv)
      ((mapRange.addEquiv opAddEquiv)
        (unop (opAddEquiv (Finsupp.single i₂ r₂)) * unop (opAddEquiv (Finsupp.single i₁ r₁)))) =
    (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁)))) *
      (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₂ r₂))))
tactic: rw [MulOpposite.unop_mul (α := MonoidAlgebra k G)]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (Finsupp.domCongr opEquiv)
      ((mapRange.addEquiv opAddEquiv)
        (unop (opAddEquiv (Finsupp.single i₂ r₂)) * unop (opAddEquiv (Finsupp.single i₁ r₁)))) =
    (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁)))) *
      (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₂ r₂))))
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (single (i₂ * i₁) (r₂ * r₁))) =
    (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (Finsupp.single i₁ r₁)) *
      (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (Finsupp.single i₂ r₂))
tactic: erw [unop_op, unop_op, single_mul_single]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Monoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (single (i₂ * i₁) (r₂ * r₁))) =
    (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (Finsupp.single i₁ r₁)) *
      (Finsupp.domCongr opEquiv) ((mapRange.addEquiv opAddEquiv) (Finsupp.single i₂ r₂))
state_after: no goals
tactic: simp