/-- If `I` is an ideal of `R`, then the ring polynomials over the quotient ring `I.quotient` is
isomorphic to the quotient of `R[X]` by the ideal `map C I`,
where `map C I` contains exactly the polynomials whose coefficients all lie in `I`. -/
def polynomialQuotientEquivQuotientPolynomial (I : Ideal R) :
    (R ⧸ I)[X] ≃+* R[X] ⧸ (map C I : Ideal R[X]) where
  toFun :=
    eval₂RingHom
      (Quotient.lift I ((Quotient.mk (map C I : Ideal R[X])).comp C) quotient_map_C_eq_zero)
      (Quotient.mk (map C I : Ideal R[X]) X)
  invFun :=
    Quotient.lift (map C I : Ideal R[X]) (eval₂RingHom (C.comp (Quotient.mk I)) X)
      eval₂_C_mk_eq_zero
  map_mul' f g := by 

Proof state:
R : Type u_1
inst✝ : CommRing R
I : Ideal R
f g : (R ⧸ I)[X]
⊢ Equiv.toFun
      {
        toFun :=
          ⇑(eval₂RingHom
              (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
              ((Quotient.mk (map C I)) X)),
        invFun :=
          ⇑(Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
              (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0)),
        left_inv :=
          (_ :
            ∀ (f : (R ⧸ I)[X]),
              (Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
                    (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0))
                  ((eval₂RingHom
                      (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                        (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
                      ((Quotient.mk (map C I)) X))
                    f) =
                f),
        right_inv :=
          (_ :
            ∀ (x : R[X] ⧸ map C I),
              (eval₂RingHom
                    (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                      (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
                    ((Quotient.mk (map C I)) X))
                  ((Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
                      (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0))
                    x) =
                x) }
      (f * g) =
    Equiv.toFun
        {
          toFun :=
            ⇑(eval₂RingHom
                (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                  (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
                ((Quotient.mk (map C I)) X)),
          invFun :=
            ⇑(Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
                (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0)),
          left_inv :=
            (_ :
              ∀ (f : (R ⧸ I)[X]),
                (Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
                      (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0))
                    ((eval₂RingHom
                        (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                          (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
                        ((Quotient.mk (map C I)) X))
                      f) =
                  f),
          right_inv :=
            (_ :
              ∀ (x : R[X] ⧸ map C I),
                (eval₂RingHom
                      (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                        (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
                      ((Quotient.mk (map C I)) X))
                    ((Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
                        (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0))
                      x) =
                  x) }
        f *
      Equiv.toFun
        {
          toFun :=
            ⇑(eval₂RingHom
                (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                  (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
                ((Quotient.mk (map C I)) X)),
          invFun :=
            ⇑(Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
                (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0)),
          left_inv :=
            (_ :
              ∀ (f : (R ⧸ I)[X]),
                (Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
                      (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0))
                    ((eval₂RingHom
                        (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                          (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
                        ((Quotient.mk (map C I)) X))
                      f) =
                  f),
          right_inv :=
            (_ :
              ∀ (x : R[X] ⧸ map C I),
                (eval₂RingHom
                      (Quotient.lift I (RingHom.comp (Quotient.mk (map C I)) C)
                        (_ : ∀ a ∈ I, (RingHom.comp (Quotient.mk (map C I)) C) a = 0))
                      ((Quotient.mk (map C I)) X))
                    ((Quotient.lift (map C I) (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X)
                        (_ : ∀ f ∈ map C I, (eval₂RingHom (RingHom.comp C (Quotient.mk I)) X) f = 0))
                      x) =
                  x) }
        g

Next tactic:
simp only [coe_eval₂RingHom, eval₂_mul]