-- Lean 4 proof step from Mathlib.GroupTheory.FiniteAbelian.Basic (goal)
Goal:
ι : Type
inst : DecidableEq ι
p n : ι → ℕ
x : ⨁ (i : ι), ZMod (p i ^ n i)
zero :
  Eq (α := ⨁ (i : ι), ZMod (p i ^ n i))
    ((directSumNeZeroMulHom p n :
          (a : ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι))) → ⨁ (i : ι), ZMod (p i ^ n i))
        ((DirectSum.toAddMonoid (β := fun (i : ι) ↦ ZMod (p i ^ n i)) fun (i : ι) ↦
              if h : n i = 0 then 0
              else
                DirectSum.of (fun (j : { i : ι // n i ≠ 0 }) ↦ ZMod (p (↑j : ι) ^ n (↑j : ι)))
                  (Subtype.mk (p := fun (i : ι) ↦ n i ≠ 0) i h) :
            (a : ⨁ (i : ι), ZMod (p i ^ n i)) → ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι)))
          0) :
      ⨁ (i : ι), ZMod (p i ^ n i))
    (0 : ⨁ (i : ι), ZMod (p i ^ n i))
of :
  ∀ (i : ι) (x : ZMod (p i ^ n i)),
    Eq (α := ⨁ (i : ι), ZMod (p i ^ n i))
      ((directSumNeZeroMulHom p n :
            (a : ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι))) → ⨁ (i : ι), ZMod (p i ^ n i))
          ((DirectSum.toAddMonoid (β := fun (i : ι) ↦ ZMod (p i ^ n i)) fun (i : ι) ↦
                if h : n i = 0 then 0
                else
                  DirectSum.of (fun (j : { i : ι // n i ≠ 0 }) ↦ ZMod (p (↑j : ι) ^ n (↑j : ι)))
                    (Subtype.mk (p := fun (i : ι) ↦ n i ≠ 0) i h) :
              (a : ⨁ (i : ι), ZMod (p i ^ n i)) → ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι)))
            (((DirectSum.of (fun (i : ι) ↦ ZMod (p i ^ n i)) i : ZMod (p i ^ n i) →+ ⨁ (i : ι), ZMod (p i ^ n i)) :
                (a : ZMod (p i ^ n i)) → ⨁ (i : ι), ZMod (p i ^ n i))
              x)) :
        ⨁ (i : ι), ZMod (p i ^ n i))
      (((DirectSum.of (fun (i : ι) ↦ ZMod (p i ^ n i)) i : ZMod (p i ^ n i) →+ ⨁ (i : ι), ZMod (p i ^ n i)) :
            (a : ZMod (p i ^ n i)) → ⨁ (i : ι), ZMod (p i ^ n i))
          x :
        ⨁ (i : ι), ZMod (p i ^ n i))
⊢ (directSumNeZeroMulHom p n :
        (a : ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι))) → ⨁ (i : ι), ZMod (p i ^ n i))
      ((DirectSum.toAddMonoid (β := fun (i : ι) ↦ ZMod (p i ^ n i)) fun (i : ι) ↦
            if h : n i = 0 then 0
            else
              DirectSum.of (fun (j : { i : ι // n i ≠ 0 }) ↦ ZMod (p (↑j : ι) ^ n (↑j : ι)))
                (Subtype.mk (p := fun (i : ι) ↦ n i ≠ 0) i h) :
          (a : ⨁ (i : ι), ZMod (p i ^ n i)) → ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι)))
        x) =
    x
have add : ∀ (x y : ⨁ (i : ι), ZMod (p i ^ n i))
  (hx :
    (directSumNeZeroMulHom p n :
          (a : ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι))) → ⨁ (i : ι), ZMod (p i ^ n i))
        ((DirectSum.toAddMonoid (β := fun (i : ι) ↦ ZMod (p i ^ n i)) fun (i : ι) ↦
              if h : n i = 0 then 0
              else
                DirectSum.of (fun (j : { i : ι // n i ≠ 0 }) ↦ ZMod (p (↑j : ι) ^ n (↑j : ι)))
                  (Subtype.mk (p := fun (i : ι) ↦ n i ≠ 0) i h) :
            (a : ⨁ (i : ι), ZMod (p i ^ n i)) → ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι)))
          x) =
      x)
  (hy :
    (directSumNeZeroMulHom p n :
          (a : ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι))) → ⨁ (i : ι), ZMod (p i ^ n i))
        ((DirectSum.toAddMonoid (β := fun (i : ι) ↦ ZMod (p i ^ n i)) fun (i : ι) ↦
              if h : n i = 0 then 0
              else
                DirectSum.of (fun (j : { i : ι // n i ≠ 0 }) ↦ ZMod (p (↑j : ι) ^ n (↑j : ι)))
                  (Subtype.mk (p := fun (i : ι) ↦ n i ≠ 0) i h) :
            (a : ⨁ (i : ι), ZMod (p i ^ n i)) → ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι)))
          y) =
      y),
  (directSumNeZeroMulHom p n :
        (a : ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι))) → ⨁ (i : ι), ZMod (p i ^ n i))
      ((DirectSum.toAddMonoid (β := fun (i : ι) ↦ ZMod (p i ^ n i)) fun (i : ι) ↦
            if h : n i = 0 then 0
            else
              DirectSum.of (fun (j : { i : ι // n i ≠ 0 }) ↦ ZMod (p (↑j : ι) ^ n (↑j : ι)))
                (Subtype.mk (p := fun (i : ι) ↦ n i ≠ 0) i h) :
          (a : ⨁ (i : ι), ZMod (p i ^ n i)) → ⨁ (i : { i : ι // n i ≠ 0 }), ZMod (p (↑i : ι) ^ n (↑i : ι)))
        (x + y)) =
    x + y
Tactic: induction x using DirectSum.induction_on with
    | zero => rw [map_zero, map_zero]
    | of i x =>
      rw [DirectSum.toAddMonoid_of]
      split_ifs with h
      · simp [(ZMod.subsingleton_iff.2 <| by rw [h, pow_zero]).elim x 0]
      · simp_rw [directSumNeZeroMulHom, DirectSum.toAddMonoid_of]
    | add x y hx hy => rw [map_add, map_add, hx, hy]
Cleared hypotheses: x