Theorem: AddMonoidAlgebra.opRingEquiv_symm_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✝ : AddCommMonoid G
⊢ ∀ (x y : 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✝ : AddCommMonoid G
⊢ ∀ (x y : 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✝ : AddCommMonoid G
⊢ ∀ (x y : 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✝ : AddCommMonoid G
⊢ ∀ (x y : 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✝ : AddCommMonoid G
⊢ ∀ (x y : 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✝ : AddCommMonoid G
⊢ ∀ (x y : 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✝ : AddCommMonoid G
⊢ ∀ (x y : 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✝ : AddCommMonoid G
⊢ AddMonoidHom.mul.compr₂ __src✝.toAddMonoidHom =
    (AddMonoidHom.mul.comp __src✝.toAddMonoidHom).compl₂ __src✝.toAddMonoidHom
tactic: refine Iff.mpr (AddMonoidHom.map_mul_iff (R := k[G]ᵐᵒᵖ) (S := kᵐᵒᵖ[G]) _) ?_
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddCommMonoid 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✝ : AddCommMonoid 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✝ : AddCommMonoid 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✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ ↑(opAddEquiv.symm.trans (mapRange.addEquiv opAddEquiv))
      (opAddEquiv (Finsupp.single i₁ r₁) * opAddEquiv (Finsupp.single i₂ r₂)) =
    ↑(opAddEquiv.symm.trans (mapRange.addEquiv opAddEquiv)) (opAddEquiv (Finsupp.single i₁ r₁)) *
      ↑(opAddEquiv.symm.trans (mapRange.addEquiv opAddEquiv)) (opAddEquiv (Finsupp.single i₂ r₂))
tactic: dsimp
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ ↑(opAddEquiv.symm.trans (mapRange.addEquiv opAddEquiv))
      (opAddEquiv (Finsupp.single i₁ r₁) * opAddEquiv (Finsupp.single i₂ r₂)) =
    ↑(opAddEquiv.symm.trans (mapRange.addEquiv opAddEquiv)) (opAddEquiv (Finsupp.single i₁ r₁)) *
      ↑(opAddEquiv.symm.trans (mapRange.addEquiv opAddEquiv)) (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✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁) * opAddEquiv (Finsupp.single i₂ r₂))) =
    (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁))) *
      (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₂ r₂)))
tactic: erw [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✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁) * opAddEquiv (Finsupp.single i₂ r₂))) =
    (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁))) *
      (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✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₂ r₂)) * unop (opAddEquiv (Finsupp.single i₁ r₁))) =
    (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁))) *
      (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₂ r₂)))
tactic: rw [MulOpposite.unop_mul (α := k[G])]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₂ r₂)) * unop (opAddEquiv (Finsupp.single i₁ r₁))) =
    (mapRange.addEquiv opAddEquiv) (unop (opAddEquiv (Finsupp.single i₁ r₁))) *
      (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✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ mapRange op ⋯ (unop (opAddEquiv (Finsupp.single i₂ r₂)) * unop (opAddEquiv (Finsupp.single i₁ r₁))) =
    mapRange op ⋯ (unop (opAddEquiv (Finsupp.single i₁ r₁))) * mapRange op ⋯ (unop (opAddEquiv (Finsupp.single i₂ r₂)))
tactic: dsimp
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ mapRange op ⋯ (unop (opAddEquiv (Finsupp.single i₂ r₂)) * unop (opAddEquiv (Finsupp.single i₁ r₁))) =
    mapRange op ⋯ (unop (opAddEquiv (Finsupp.single i₁ r₁))) * mapRange op ⋯ (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✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ Finsupp.single (i₂ + i₁) (op (r₂ * r₁)) = Finsupp.single i₁ (op r₁) * Finsupp.single i₂ (op r₂)
tactic: erw [mapRange_single, single_mul_single, mapRange_single, mapRange_single]
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddCommMonoid G
i₁ : G
r₁ : k
i₂ : G
r₂ : k
⊢ Finsupp.single (i₂ + i₁) (op (r₂ * r₁)) = Finsupp.single i₁ (op r₁) * Finsupp.single i₂ (op r₂)
state_after: no goals
tactic: simp only [mapRange_single, single_mul_single, ← op_mul, add_comm]