[proofplan]
We construct a chain homotopy between $f^{*}$ and $g^{*}$ at the level of differential forms. The construction proceeds in two stages. First, we treat the universal case of the boundary inclusions $\iota_{0}, \iota_{1} : M \to M \times [0,1]$ defined by $\iota_{s}(x) = (x, s)$, and build an operator $h : \Omega^{k}(M \times [0,1]) \to \Omega^{k-1}(M)$ by contracting with $\partial_{t}$ and integrating in $t$. Using [Cartan's magic formula](/theorems/1535) together with the identity $\frac{d}{dt}\iota_{t}^{*} = \iota_{t}^{*}\mathcal{L}_{\partial_{t}}$, we verify $\iota_{1}^{*} - \iota_{0}^{*} = dh + hd$. Composing with $F^{*}$ yields the desired chain homotopy $P := h \circ F^{*}$ satisfying $g^{*} - f^{*} = dP + Pd$, which forces $f^{*}$ and $g^{*}$ to coincide on closed forms modulo exact forms.
[/proofplan]
[step:Set up the slice inclusions and the candidate chain homotopy operator]
For each $s \in [0,1]$, define the slice inclusion
\begin{align*}
\iota_{s} : M &\to M \times [0,1] \\
x &\mapsto (x, s).
\end{align*}
These are smooth embeddings. The product $M \times [0,1]$ carries the canonical vector field $\partial_{t} \in \mathfrak{X}(M \times [0,1])$ — the coordinate vector field of the second factor, characterized by $dt(\partial_{t}) = 1$ and $\pi^{*}(\eta)(\partial_{t}) = 0$ for every $1$-form $\eta$ on $M$, where $\pi : M \times [0,1] \to M$ is the projection.
For $k \ge 1$, define the operator
\begin{align*}
h : \Omega^{k}(M \times [0,1]) &\to \Omega^{k-1}(M) \\
\omega &\mapsto \int_{0}^{1} \iota_{t}^{*}\bigl(\iota_{\partial_{t}}\omega\bigr)\, d\mathcal{L}^{1}(t),
\end{align*}
where $\iota_{\partial_{t}}\omega \in \Omega^{k-1}(M \times [0,1])$ denotes the interior product of $\omega$ with $\partial_{t}$. Explicitly, for $x \in M$ and tangent vectors $v_{1}, \dots, v_{k-1} \in T_{x}M$,
\begin{align*}
(h\omega)_{x}(v_{1}, \dots, v_{k-1}) = \int_{0}^{1} \omega_{(x,t)}\bigl(\partial_{t}, (d\iota_{t})_{x}v_{1}, \dots, (d\iota_{t})_{x}v_{k-1}\bigr)\, d\mathcal{L}^{1}(t).
\end{align*}
For $k = 0$, we set $h : \Omega^{0}(M \times [0,1]) \to 0$ to be the zero map (there are no $(-1)$-forms).
The integrand depends smoothly on $(x, t)$ because $\omega$ is smooth and $\iota_{t}$ depends smoothly on $t$; smoothness of $h\omega$ in $x$ follows from the [Leibniz Integral Rule](/theorems/831) (differentiation under the integral over the compact interval $[0,1]$).
[guided]
The strategy is to mimic the proof of the Poincaré lemma. There, one builds a homotopy operator on the cylinder $\mathbb{R}^{n} \times [0,1]$ that contracts the cylinder onto a slice. Here we use the same construction on $M \times [0,1]$: the operator $h$ is the "integrate-over-the-fibre" map associated with the projection $\pi : M \times [0,1] \to M$, applied to forms that have first been contracted with $\partial_{t}$ to extract their "$dt$-component".
Why contract with $\partial_{t}$ first? A $k$-form $\omega$ on $M \times [0,1]$ decomposes locally as
\begin{align*}
\omega = \alpha(x,t) + dt \wedge \beta(x,t),
\end{align*}
where $\alpha$ involves only horizontal $1$-forms (pullbacks from $M$) and $\beta$ is a horizontal $(k-1)$-form. The interior product $\iota_{\partial_{t}}\omega = \beta$ extracts exactly the $dt$-part. The map $\iota_{t}^{*}$ then evaluates the $M$-dependence at time $t$, yielding a smooth family of $(k-1)$-forms on $M$, which we integrate.
In the special case $k = 0$, the form $\omega$ is a smooth function on $M \times [0,1]$, and there is no $dt$-component to extract — hence $h$ is zero on functions. We must handle the $k = 0$ case slightly differently when we verify the chain homotopy identity below.
[/guided]
[/step]
[step:Express the difference $\iota_{1}^{*} - \iota_{0}^{*}$ via the time derivative of $\iota_{t}^{*}$]
Let $\omega \in \Omega^{k}(M \times [0,1])$. We claim that for every $x \in M$ and every $(v_{1}, \dots, v_{k}) \in (T_{x}M)^{k}$,
\begin{align*}
(\iota_{1}^{*}\omega)_{x}(v_{1}, \dots, v_{k}) - (\iota_{0}^{*}\omega)_{x}(v_{1}, \dots, v_{k}) = \int_{0}^{1} \frac{d}{dt}\bigl[(\iota_{t}^{*}\omega)_{x}(v_{1}, \dots, v_{k})\bigr]\, d\mathcal{L}^{1}(t).
\end{align*}
For fixed $x$ and $v_{1}, \dots, v_{k}$, the function
\begin{align*}
\varphi : [0,1] &\to \mathbb{R} \\
t &\mapsto (\iota_{t}^{*}\omega)_{x}(v_{1}, \dots, v_{k}) = \omega_{(x,t)}\bigl((d\iota_{t})_{x}v_{1}, \dots, (d\iota_{t})_{x}v_{k}\bigr)
\end{align*}
is smooth in $t$ since $\omega$ and the embedding $t \mapsto (x,t)$ are smooth. The identity above is then the [Fundamental Theorem of Calculus](/theorems/632) applied to $\varphi$.
[guided]
This is the key analytic step: we replace the discrete difference $\iota_{1}^{*}\omega - \iota_{0}^{*}\omega$ with the integral of an instantaneous rate of change. Pointwise evaluation reduces everything to the one-variable [Fundamental Theorem of Calculus](/theorems/632), which applies because the integrand $\varphi(t) = \omega_{(x,t)}((d\iota_{t})_{x}v_{1}, \dots, (d\iota_{t})_{x}v_{k})$ is smooth on $[0,1]$ — and in particular continuously differentiable, which is what FTC requires.
Note that $(d\iota_{t})_{x} : T_{x}M \to T_{(x,t)}(M \times [0,1])$ sends $v$ to $(v, 0)$ under the canonical splitting $T_{(x,t)}(M \times [0,1]) \cong T_{x}M \oplus T_{t}[0,1]$. So the vector $\partial_{t}$ at $(x,t)$ is **not** in the image of $(d\iota_{t})_{x}$ — the $\iota_{t}^{*}\omega$ never sees the $\partial_{t}$ slot of $\omega$, which is why the contraction $\iota_{\partial_{t}}\omega$ shows up in $h$ but does not show up in $\iota_{t}^{*}\omega$ itself.
[/guided]
[/step]
[step:Identify the time derivative with the Lie derivative pulled back along $\iota_{t}$]
We claim that for every smooth $\omega \in \Omega^{k}(M \times [0,1])$,
\begin{align*}
\frac{d}{dt}\bigl(\iota_{t}^{*}\omega\bigr) = \iota_{t}^{*}\bigl(\mathcal{L}_{\partial_{t}}\omega\bigr) \quad \text{in } \Omega^{k}(M),
\end{align*}
the derivative on the left being taken pointwise in $\Omega^{k}(M)$.
The flow $\Phi : \mathbb{R} \times (M \times [0,1]) \to M \times [0,1]$ of $\partial_{t}$ is the translation $\Phi(s, (x,t)) = (x, t+s)$, defined wherever $t + s \in [0,1]$ (or on the extension to $M \times (-\varepsilon, 1+\varepsilon)$). The slice inclusions satisfy $\iota_{t} = \Phi(t, \cdot) \circ \iota_{0}$. Therefore
\begin{align*}
\iota_{t}^{*}\omega = \iota_{0}^{*}\bigl(\Phi(t, \cdot)^{*}\omega\bigr).
\end{align*}
The fixed pullback $\iota_{0}^{*}$ commutes with the $t$-derivative (it is a pointwise linear operation independent of $t$), so
\begin{align*}
\frac{d}{dt}\iota_{t}^{*}\omega = \iota_{0}^{*}\frac{d}{dt}\bigl(\Phi(t, \cdot)^{*}\omega\bigr).
\end{align*}
By the definition of the Lie derivative via the flow,
\begin{align*}
\frac{d}{dt}\bigl(\Phi(t, \cdot)^{*}\omega\bigr) = \Phi(t, \cdot)^{*}\bigl(\mathcal{L}_{\partial_{t}}\omega\bigr).
\end{align*}
Substituting and using $\iota_{0}^{*} \circ \Phi(t, \cdot)^{*} = (\Phi(t, \cdot) \circ \iota_{0})^{*} = \iota_{t}^{*}$ gives the claim.
[guided]
The Lie derivative is **defined** as the infinitesimal generator of pullback along the flow: $\mathcal{L}_{X}\omega := \frac{d}{ds}\big|_{s=0} \Phi_{s}^{*}\omega$, and the same calculation at any time $t$ (rather than just $t = 0$) gives $\frac{d}{ds}\Phi_{s}^{*}\omega = \Phi_{s}^{*}\mathcal{L}_{X}\omega$. This is the standard "differentiate the cocycle property of pullback" identity.
What makes the computation clean here is that the flow of $\partial_{t}$ on $M \times [0,1]$ is literally translation in $t$: there is no curvature or nonlinear behaviour to track. The price is only that the flow is defined on a thin neighbourhood of $\{t\}$, not on all of $\mathbb{R}$ — but this is enough to differentiate at the time $t$ of interest, since differentiability is local. This is exactly why we required $F$ to extend smoothly to $M \times (-\varepsilon, 1+\varepsilon)$: the extension lets us treat $\partial_{t}$ as a genuine smooth vector field with a flow near every $t \in [0,1]$, including the endpoints.
[/guided]
[/step]
[step:Apply Cartan's magic formula to split the integrand]
By [Cartan's Magic Formula](/theorems/1535) applied to the vector field $\partial_{t}$ on $M \times [0,1]$,
\begin{align*}
\mathcal{L}_{\partial_{t}}\omega = d\bigl(\iota_{\partial_{t}}\omega\bigr) + \iota_{\partial_{t}}\bigl(d\omega\bigr) \quad \text{for every } \omega \in \Omega^{k}(M \times [0,1]).
\end{align*}
Combining this with the previous step and integrating in $t$:
\begin{align*}
\iota_{1}^{*}\omega - \iota_{0}^{*}\omega &= \int_{0}^{1} \iota_{t}^{*}\bigl(\mathcal{L}_{\partial_{t}}\omega\bigr)\, d\mathcal{L}^{1}(t) \\
&= \int_{0}^{1} \iota_{t}^{*}\bigl(d(\iota_{\partial_{t}}\omega)\bigr)\, d\mathcal{L}^{1}(t) + \int_{0}^{1} \iota_{t}^{*}\bigl(\iota_{\partial_{t}}(d\omega)\bigr)\, d\mathcal{L}^{1}(t).
\end{align*}
[guided]
[Cartan's magic formula](/theorems/1535) is the bridge between the Lie derivative (which we got from the FTC step) and the [exterior derivative](/theorems/1525) $d$ (which we ultimately want to factor out). Verifying its hypotheses: Cartan's formula holds for **any** smooth vector field on a smooth manifold acting on any smooth differential form, and $\partial_{t}$ is a smooth vector field on the smooth manifold-with-boundary $M \times [0,1]$ (smoothly extended to $M \times (-\varepsilon, 1+\varepsilon)$), while $\omega$ is smooth by assumption. So both hypotheses are met.
The reason the formula does the work we need is that it decomposes the action of $\mathcal{L}_{\partial_{t}}$ into a "$d$ of something" piece — which will pair with the chain-homotopy term $dh\omega$ — and a "interior product of $d\omega$" piece — which will pair with $hd\omega$. This is precisely the algebraic content of "$\partial_{t}$ acts as a chain homotopy at the form level".
[/guided]
[/step]
[step:Interchange $d$ with pullback and integration to extract $dh\omega + hd\omega$]
We treat the two integrals separately.
**First integral.** Since pullback commutes with the [exterior derivative](/theorems/1525) on smooth forms, $\iota_{t}^{*}(d(\iota_{\partial_{t}}\omega)) = d(\iota_{t}^{*}(\iota_{\partial_{t}}\omega))$. Therefore
\begin{align*}
\int_{0}^{1} \iota_{t}^{*}\bigl(d(\iota_{\partial_{t}}\omega)\bigr)\, d\mathcal{L}^{1}(t) = \int_{0}^{1} d\bigl(\iota_{t}^{*}(\iota_{\partial_{t}}\omega)\bigr)\, d\mathcal{L}^{1}(t).
\end{align*}
We now interchange $d$ (a differential operator in $x \in M$) with $\int_{0}^{1}\, d\mathcal{L}^{1}(t)$ (an integration over the disjoint variable $t \in [0,1]$). This interchange is justified by the [Leibniz Integral Rule](/theorems/831): the integrand $\iota_{t}^{*}(\iota_{\partial_{t}}\omega)$ is smooth in $(x,t)$ and the domain $[0,1]$ is compact, so each $M$-directional derivative may be pulled inside the integral. We obtain
\begin{align*}
\int_{0}^{1} d\bigl(\iota_{t}^{*}(\iota_{\partial_{t}}\omega)\bigr)\, d\mathcal{L}^{1}(t) = d\biggl(\int_{0}^{1} \iota_{t}^{*}(\iota_{\partial_{t}}\omega)\, d\mathcal{L}^{1}(t)\biggr) = d(h\omega).
\end{align*}
**Second integral.** By the definition of $h$,
\begin{align*}
\int_{0}^{1} \iota_{t}^{*}\bigl(\iota_{\partial_{t}}(d\omega)\bigr)\, d\mathcal{L}^{1}(t) = h(d\omega).
\end{align*}
Combining,
\begin{align*}
\iota_{1}^{*}\omega - \iota_{0}^{*}\omega = d(h\omega) + h(d\omega).
\end{align*}
This is the **chain homotopy identity** between $\iota_{0}^{*}$ and $\iota_{1}^{*}$ as maps $\Omega^{\bullet}(M \times [0,1]) \to \Omega^{\bullet}(M)$.
For $k = 0$, the identity reduces to $\iota_{1}^{*}\omega - \iota_{0}^{*}\omega = h(d\omega)$, since $h$ is zero on functions. Direct verification: for $\omega \in C^{\infty}(M \times [0,1])$,
\begin{align*}
h(d\omega)(x) = \int_{0}^{1} \iota_{t}^{*}(\iota_{\partial_{t}}d\omega)(x)\, d\mathcal{L}^{1}(t) = \int_{0}^{1} (\partial_{t}\omega)(x,t)\, d\mathcal{L}^{1}(t) = \omega(x,1) - \omega(x,0),
\end{align*}
the last equality by the [Fundamental Theorem of Calculus](/theorems/632) applied to $t \mapsto \omega(x,t)$.
[guided]
Two routine but non-trivial interchanges happen here. First, pulling $d$ outside of $\iota_{t}^{*}$ uses the naturality of the [exterior derivative](/theorems/1525): $\varphi^{*} d = d \varphi^{*}$ for any smooth map $\varphi$. This is one of the defining axioms of $d$ — it is the unique graded derivation of degree $+1$ on $\Omega^{\bullet}$ that squares to zero, extends $d : \Omega^{0} \to \Omega^{1}$, and is natural under pullback.
Second, pulling $d$ outside the integral uses the [Leibniz Integral Rule](/theorems/831). The hypotheses to verify are: (i) the integrand $(x,t) \mapsto \iota_{t}^{*}(\iota_{\partial_{t}}\omega)$ is jointly smooth in $(x,t)$ — true because all the operations involved (interior product, slice pullback) preserve smoothness; (ii) the domain of integration $[0,1]$ is compact — true. Under these conditions, any partial derivative in the $x$-variables can be moved inside the integral. Since $d$ in local coordinates is a finite sum of such partial derivatives wedged with coordinate $1$-forms, $d$ as a whole commutes with $\int_{0}^{1}\, d\mathcal{L}^{1}(t)$.
The $k = 0$ degenerate case is reassuring: the chain homotopy identity collapses to the ordinary one-variable FTC. This is no accident — the operator $h$ generalises FTC to higher-degree forms.
[/guided]
[/step]
[step:Transfer the chain homotopy to $M$ via the homotopy $F$]
Define
\begin{align*}
P : \Omega^{k}(N) &\to \Omega^{k-1}(M) \\
\omega &\mapsto h(F^{*}\omega).
\end{align*}
Then $P$ is $\mathbb{R}$-linear. We verify the chain homotopy identity
\begin{align*}
g^{*}\omega - f^{*}\omega = d(P\omega) + P(d\omega) \quad \text{for all } \omega \in \Omega^{k}(N).
\end{align*}
Since $F \circ \iota_{0} = f$ and $F \circ \iota_{1} = g$ by hypothesis, functoriality of pullback gives
\begin{align*}
f^{*}\omega = (F \circ \iota_{0})^{*}\omega = \iota_{0}^{*}(F^{*}\omega), \qquad g^{*}\omega = \iota_{1}^{*}(F^{*}\omega).
\end{align*}
Applying the chain homotopy identity from the previous step to the form $F^{*}\omega \in \Omega^{k}(M \times [0,1])$:
\begin{align*}
g^{*}\omega - f^{*}\omega = \iota_{1}^{*}(F^{*}\omega) - \iota_{0}^{*}(F^{*}\omega) = d\bigl(h(F^{*}\omega)\bigr) + h\bigl(d(F^{*}\omega)\bigr).
\end{align*}
By naturality of $d$, $d(F^{*}\omega) = F^{*}(d\omega)$, so $h(d(F^{*}\omega)) = h(F^{*}(d\omega)) = P(d\omega)$. Substituting,
\begin{align*}
g^{*}\omega - f^{*}\omega = d(P\omega) + P(d\omega).
\end{align*}
[guided]
Why does composing with $F^{*}$ work? Conceptually, $F$ pulls forms on $N$ back to forms on the cylinder $M \times [0,1]$, where the universal chain homotopy $h$ already lives. So $P = h \circ F^{*}$ is the natural composite.
Mechanically, two standard identities make the verification direct:
- Pullback is contravariantly functorial: $(F \circ \iota_{s})^{*} = \iota_{s}^{*} \circ F^{*}$, which lets us reinterpret $f^{*}$ and $g^{*}$ on $N$ as $\iota_{0}^{*}, \iota_{1}^{*}$ on the cylinder applied to $F^{*}\omega$.
- Pullback commutes with $d$: $F^{*}(d\omega) = d(F^{*}\omega)$, which lets us interchange the order in which $d$ and $F^{*}$ are applied inside $h$.
Both identities follow from the algebraic characterisation of the [exterior derivative](/theorems/1525) and pullback.
[/guided]
[/step]
[step:Conclude that $f^{*}$ and $g^{*}$ agree on cohomology]
Let $[\omega] \in H^{k}_{\mathrm{dR}}(N)$ be a de Rham cohomology class, represented by a closed $k$-form $\omega \in \Omega^{k}(N)$, i.e. $d\omega = 0$. By the previous step,
\begin{align*}
g^{*}\omega - f^{*}\omega = d(P\omega) + P(d\omega) = d(P\omega) + P(0) = d(P\omega).
\end{align*}
Thus $g^{*}\omega - f^{*}\omega \in \Omega^{k}(M)$ is exact, hence represents the zero cohomology class in $H^{k}_{\mathrm{dR}}(M)$:
\begin{align*}
[g^{*}\omega] - [f^{*}\omega] = [d(P\omega)] = 0 \quad \text{in } H^{k}_{\mathrm{dR}}(M).
\end{align*}
Since $f^{*}$ and $g^{*}$ on cohomology are by definition $[\omega] \mapsto [f^{*}\omega]$ and $[\omega] \mapsto [g^{*}\omega]$ (well-defined because pullback sends closed forms to closed forms and exact forms to exact forms), we conclude
\begin{align*}
f^{*} = g^{*} : H^{k}_{\mathrm{dR}}(N) \to H^{k}_{\mathrm{dR}}(M).
\end{align*}
This holds for every $k \ge 0$, completing the proof. $\blacksquare$
[guided]
The final step is a tautology once the chain homotopy identity is in hand: any pair of cochain maps that differ by a chain homotopy induce the same map on cohomology. We spell it out explicitly:
A class $[\omega] \in H^{k}_{\mathrm{dR}}(N)$ is an equivalence class of closed forms modulo exact forms. The pullback $f^{*}$ on cohomology is well-defined because (i) $f^{*}(d\eta) = d(f^{*}\eta)$ sends exact to exact, and (ii) $f^{*}\omega$ is closed if $\omega$ is closed (since $d(f^{*}\omega) = f^{*}(d\omega) = 0$). The same holds for $g^{*}$.
Given $\omega$ closed, the chain homotopy identity reduces to $g^{*}\omega - f^{*}\omega = d(P\omega)$ because the $P(d\omega)$ term vanishes. The right-hand side is exact, so $g^{*}\omega$ and $f^{*}\omega$ lie in the same cohomology class — which is exactly the statement $g^{*}[\omega] = f^{*}[\omega]$. Quantifying over all closed forms $\omega$, the induced maps on $H^{k}_{\mathrm{dR}}$ coincide.
[/guided]
[/step]