[proofplan]
The induced-map construction is functorial: composition of chain maps induces composition on homology, and the identity chain map induces the identity on homology. Combined with the fact that chain homotopic maps induce equal maps on homology, a chain homotopy equivalence — that is, a pair of chain maps whose compositions are chain homotopic to the identity — induces maps on homology that compose to the identity. Hence $f_*$ is an isomorphism.
[/proofplan]
[step:Record two functoriality facts about the induced map on homology]
[claim:Functoriality of the induced map]
For any chain maps $\alpha_\bullet : A_\bullet \to B_\bullet$ and $\beta_\bullet : B_\bullet \to E_\bullet$ between chain complexes of abelian groups,
\begin{align*}
(\beta \circ \alpha)_* = \beta_* \circ \alpha_* : H_n(A) \to H_n(E), \qquad (\operatorname{id}_{A_\bullet})_* = \operatorname{id}_{H_n(A)}.
\end{align*}
[proof]
For composition: both $\beta \circ \alpha$ and $\beta_\bullet, \alpha_\bullet$ individually are chain maps, so by [Chain Maps Induce Maps on Homology](/theorems/1922) they have well-defined induced maps on homology. For any cycle $a \in Z_n(A)$,
\begin{align*}
(\beta \circ \alpha)_*([a]) = [(\beta_n \circ \alpha_n)(a)] = [\beta_n(\alpha_n(a))] = \beta_*([\alpha_n(a)]) = \beta_*(\alpha_*([a])) = (\beta_* \circ \alpha_*)([a]).
\end{align*}
Since the two homomorphisms $(\beta \circ \alpha)_*$ and $\beta_* \circ \alpha_*$ agree on every homology class $[a]$, they agree as maps $H_n(A) \to H_n(E)$.
For the identity: $\operatorname{id}_{A_\bullet}$ is trivially a chain map (it commutes with $d^A$). For any $[a] \in H_n(A)$,
\begin{align*}
(\operatorname{id}_{A_\bullet})_*([a]) = [\operatorname{id}_{A_n}(a)] = [a] = \operatorname{id}_{H_n(A)}([a]).
\end{align*}
[/proof]
[/claim]
[/step]
[step:Translate the chain homotopy equivalence into identities on homology]
Let $g_\bullet : D_\bullet \to C_\bullet$ be a chain homotopy inverse of $f_\bullet$, so by hypothesis
\begin{align*}
f_\bullet \circ g_\bullet &\simeq \operatorname{id}_{D_\bullet}, \\
g_\bullet \circ f_\bullet &\simeq \operatorname{id}_{C_\bullet}.
\end{align*}
Apply the induced-map functor $(\cdot)_* : H_n(\cdot)$ to each relation.
First, $f_\bullet \circ g_\bullet$ and $\operatorname{id}_{D_\bullet}$ are chain maps, and they are chain homotopic. By [Chain Homotopic Maps Induce Equal Maps on Homology](/theorems/1923),
\begin{align*}
(f \circ g)_* = (\operatorname{id}_{D_\bullet})_* : H_n(D) \to H_n(D).
\end{align*}
By the functoriality claim (step above), $(f \circ g)_* = f_* \circ g_*$ and $(\operatorname{id}_{D_\bullet})_* = \operatorname{id}_{H_n(D)}$. Hence
\begin{align*}
f_* \circ g_* = \operatorname{id}_{H_n(D)}.
\end{align*}
Symmetrically, $g_\bullet \circ f_\bullet \simeq \operatorname{id}_{C_\bullet}$ implies $(g \circ f)_* = (\operatorname{id}_{C_\bullet})_*$, which by functoriality becomes
\begin{align*}
g_* \circ f_* = \operatorname{id}_{H_n(C)}.
\end{align*}
[/step]
[step:Conclude that $f_*$ is an isomorphism with inverse $g_*$]
We have group homomorphisms
\begin{align*}
f_* : H_n(C) \to H_n(D), \qquad g_* : H_n(D) \to H_n(C),
\end{align*}
satisfying $f_* \circ g_* = \operatorname{id}_{H_n(D)}$ and $g_* \circ f_* = \operatorname{id}_{H_n(C)}$. By the definition of a two-sided inverse in the category of abelian groups, $f_*$ is bijective with inverse $g_*$, and both are group isomorphisms. This holds for every $n$.
[guided]
The strategy is entirely formal: we convert each of the given chain-level relations into a relation on homology and read off the conclusion.
**Step 1 — what "induce" means on homology.** The induced-map operation $(\cdot)_*$ is a functor from the category of chain complexes to the category of graded abelian groups. Functoriality has two ingredients: it respects composition ($(\beta \alpha)_* = \beta_* \alpha_*$) and it respects identities ($(\operatorname{id})_* = \operatorname{id}$). Both follow from the concrete formula $f_*[c] = [f_n c]$ on representatives.
**Step 2 — what "chain homotopic" contributes.** The relation $f \circ g \simeq \operatorname{id}_D$ on chain complexes is a **chain-level** equivalence, weaker than equality. But passing to homology collapses this weakening: two chain maps that are merely chain homotopic induce the **same** map on homology. This is precisely the content of [Theorem 1923](/theorems/1923).
**Combining.** Putting the two together: $f_* \circ g_* = (fg)_* = (\operatorname{id}_D)_* = \operatorname{id}_{H_n(D)}$, and symmetrically $g_* f_* = \operatorname{id}_{H_n(C)}$. So $f_*$ has a two-sided inverse, hence is an isomorphism.
The philosophical content of this theorem is that chain homotopy equivalence, though weaker than chain isomorphism, still suffices to produce isomorphisms of homology groups. This is why homology is a homotopy invariant: chain-level maps that are not isomorphisms but are only homotopy equivalences still give isomorphisms after passing to $H_*$.
[/guided]
[/step]