-- Lean 4 proof step from Mathlib.Algebra.Polynomial.Module.Basic (goal)
Goal:
R : Type u_1
M : Type u_2
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Module R M
R' : Type u_4
M' : Type u_5
inst_3 : CommRing R'
inst_4 : AddCommGroup M'
inst_5 : Module R' M'
inst_6 : Module R M'
inst_7 : Algebra R R'
inst_8 : IsScalarTower R R' M'
f : M →ₗ[R] M'
p : R[X]
q : PolynomialModule R M
zero :
  ((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
        (a : PolynomialModule R M) → PolynomialModule R' M')
      (HSMul.hSMul (β := PolynomialModule R M) p 0) =
    HSMul.hSMul (α := R'[X]) (β := PolynomialModule R' M') (Polynomial.map (algebraMap R R') p)
      (((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
          (a : PolynomialModule R M) → PolynomialModule R' M')
        0)
add :
  ∀ (f_1 g : PolynomialModule R M)
    (e₁ :
      ((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
            (a : PolynomialModule R M) → PolynomialModule R' M')
          (p • f_1) =
        HSMul.hSMul (α := R'[X]) (β := PolynomialModule R' M') (Polynomial.map (algebraMap R R') p)
          (((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
                (a : PolynomialModule R M) → PolynomialModule R' M')
              f_1 :
            PolynomialModule R' M'))
    (e₂ :
      ((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
            (a : PolynomialModule R M) → PolynomialModule R' M')
          (p • g) =
        HSMul.hSMul (α := R'[X]) (β := PolynomialModule R' M') (Polynomial.map (algebraMap R R') p)
          (((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
                (a : PolynomialModule R M) → PolynomialModule R' M')
              g :
            PolynomialModule R' M')),
    ((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
          (a : PolynomialModule R M) → PolynomialModule R' M')
        (p • (f_1 + g)) =
      HSMul.hSMul (α := R'[X]) (β := PolynomialModule R' M') (Polynomial.map (algebraMap R R') p)
        (((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
              (a : PolynomialModule R M) → PolynomialModule R' M')
            (f_1 + g) :
          PolynomialModule R' M')
⊢ ((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
        (a : PolynomialModule R M) → PolynomialModule R' M')
      (p • q) =
    HSMul.hSMul (α := R'[X]) (β := PolynomialModule R' M') (Polynomial.map (algebraMap R R') p)
      (((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
            (a : PolynomialModule R M) → PolynomialModule R' M')
          q :
        PolynomialModule R' M')
have single : ∀ (i : ℕ) (m : M),
  ((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
        (a : PolynomialModule R M) → PolynomialModule R' M')
      (HSMul.hSMul (β := PolynomialModule R M) p
        ((single R i : (a : M) → PolynomialModule R M) m : PolynomialModule R M)) =
    HSMul.hSMul (α := R'[X]) (β := PolynomialModule R' M') (Polynomial.map (algebraMap R R') p)
      (((map R' f : LinearMap.{u_1, u_1, u_2, u_5} (RingHom.id R) (PolynomialModule R M) (PolynomialModule R' M')) :
            (a : PolynomialModule R M) → PolynomialModule R' M')
          ((single R i : (a : M) → PolynomialModule R M) m) :
        PolynomialModule R' M')
Tactic: induction q using induction_linear with
  | zero => rw [smul_zero, map_zero, smul_zero]
  | add f g e₁ e₂ => rw [smul_add, map_add, e₁, e₂, map_add, smul_add]
  | single i m =>
    induction p using Polynomial.induction_on' with
    | add _ _ e₁ e₂ => rw [add_smul, map_add, e₁, e₂, Polynomial.map_add, add_smul]
    | monomial => rw [monomial_smul_single, map_single, Polynomial.map_monomial, map_single,
        monomial_smul_single, f.map_smul, algebraMap_smul]
Cleared hypotheses: q