Prove2Me
Navigate
DiscoverFormalpediaBlogsUsersMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

Lemma 1.15: every loop is homotopic to a product of loops each in a single AαA_\alphaAα​

Proved
Hatcher.loop_homotopic_prod_of_cover

by korbonits · Sep 8, 2026 · Mathlib 0df444a (Lean v4.33.1)

algebraic-topologyfundamental-grouphatchervan-kampen

Throughout, XXX is a topological space with basepoint x0x_0x0​, and (Aα)α∈ι(A_\alpha)_{\alpha\in\iota}(Aα​)α∈ι​ is a family of subsets of XXX, each containing x0x_0x0​, with the subspace topology. The standing hypotheses of Lemma 1.15 are: each AαA_\alphaAα​ is open and path-connected, X=⋃αAαX=\bigcup_\alpha A_\alphaX=⋃α​Aα​, and each intersection Aα∩AβA_\alpha\cap A_\betaAα​∩Aβ​ is path-connected.

Lemma 1.15. Under the standing hypotheses, every loop fff in XXX at x0x_0x0​ is homotopic to a product of loops each of which is contained in a single AαA_\alphaAα​: there is a finite list (α1,g1),…,(αm,gm)(\alpha_1,g_1),\dots,(\alpha_m,g_m)(α1​,g1​),…,(αm​,gm​) with gkg_kgk​ a loop in AαkA_{\alpha_k}Aαk​​ at x0x_0x0​ such that

f ≃ g1⋅g2⋯gmf\ \simeq\ g_1\cdot g_2\cdots g_mf ≃ g1​⋅g2​⋯gm​

as loops in XXX (the gkg_kgk​ regarded as loops in XXX via the inclusions; m=0m=0m=0 gives the constant loop).

This is the main step in Hatcher's proof that π1(Sn)=0\pi_1(S^n)=0π1​(Sn)=0 for n≥2n\ge 2n≥2 and is exactly the surjectivity half of van Kampen's theorem.

Formalization Note The list is a List of pairs (α,g)(\alpha,g)(α,g) with ggg a Mathlib Path in the subspace AαA_\alphaAα​; the product is formed by Hatcher.loopProd, concatenating from the right with the constant loop as empty product. Since concatenation is associative up to homotopy, the bracketing is immaterial.

Preamble
import Definitions.Def_Hatcher_VanKampen
import Mathlib

open Hatcher
Formal statement
namespace Hatcher
theorem loop_homotopic_prod_of_cover {X : Type*} [TopologicalSpace X] {ι : Type*}
    (A : ι → Set X) (x₀ : X) (hx₀ : ∀ α, x₀ ∈ A α)
    (hopen : ∀ α, IsOpen (A α)) (hpc : ∀ α, IsPathConnected (A α))
    (hcover : (⋃ α, A α) = Set.univ) (hinter : ∀ α β, IsPathConnected (A α ∩ A β))
    (f : Path x₀ x₀) :
    ∃ l : List (Σ α : ι, Path (basept A x₀ hx₀ α) (basept A x₀ hx₀ α)),
      f.Homotopic (loopProd x₀ (l.map fun p => loopIn A x₀ hx₀ p.1 p.2)) := by sorry
end Hatcher
Source
A. Hatcher, Algebraic Topology, Cambridge University Press 2002, https://pi.math.cornell.edu/~hatcher/AT/AT.pdf, Section 1.1, p. 35, Lemma 1.15
Read-back

What the Lean code literally says, in plain math · claude-fable-5-1

Read-back: Hatcher.loop_homotopic_prod_of_cover

Setting and binders. Let XXX be a type (in an arbitrary universe) equipped with a topology; no separation, compactness, or other axiom is assumed. Let ι\iotaι be an arbitrary type (any universe, possibly empty, possibly infinite), and let A:ι→P(X)A : \iota \to \mathcal P(X)A:ι→P(X) assign to each index α\alphaα a subset Aα⊆XA_\alpha \subseteq XAα​⊆X. Let x0∈Xx_0 \in Xx0​∈X be a point. The theorem takes the following hypotheses, every one of which is assumed (whether or not it is used in the conclusion):

  • (hx0)(\mathrm{hx}_0)(hx0​) for every α∈ι\alpha \in \iotaα∈ι, x0∈Aαx_0 \in A_\alphax0​∈Aα​;
  • (hopen)(\mathrm{hopen})(hopen) for every α∈ι\alpha \in \iotaα∈ι, AαA_\alphaAα​ is an open subset of XXX;
  • (hpc)(\mathrm{hpc})(hpc) for every α∈ι\alpha \in \iotaα∈ι, AαA_\alphaAα​ is path-connected in the following exact sense: there exists a point x∈Aαx \in A_\alphax∈Aα​ such that for every y∈Aαy \in A_\alphay∈Aα​ there is a continuous map γ:[0,1]→X\gamma : [0,1] \to Xγ:[0,1]→X with γ(0)=x\gamma(0) = xγ(0)=x, γ(1)=y\gamma(1) = yγ(1)=y, and γ(t)∈Aα\gamma(t) \in A_\alphaγ(t)∈Aα​ for all t∈[0,1]t \in [0,1]t∈[0,1] (the distinguished point xxx is not required to be x0x_0x0​; the condition in particular forces Aα≠∅A_\alpha \neq \varnothingAα​=∅);
  • (hcover)(\mathrm{hcover})(hcover) ⋃α∈ιAα=X\bigcup_{\alpha \in \iota} A_\alpha = X⋃α∈ι​Aα​=X (equality of sets, i.e. the AαA_\alphaAα​ cover XXX);
  • (hinter)(\mathrm{hinter})(hinter) for every ordered pair α,β∈ι\alpha, \beta \in \iotaα,β∈ι — including α=β\alpha = \betaα=β, in which case this just says AαA_\alphaAα​ is path-connected again — the intersection Aα∩AβA_\alpha \cap A_\betaAα​∩Aβ​ is path-connected in the same sense as above (some point of Aα∩AβA_\alpha \cap A_\betaAα​∩Aβ​ is joined to every point of Aα∩AβA_\alpha \cap A_\betaAα​∩Aβ​ by a path whose whole image lies in Aα∩AβA_\alpha \cap A_\betaAα​∩Aβ​);
  • fff is a loop in XXX at x0x_0x0​: a continuous map f:[0,1]→Xf : [0,1] \to Xf:[0,1]→X with f(0)=x0f(0) = x_0f(0)=x0​ and f(1)=x0f(1) = x_0f(1)=x0​.

Nothing here requires ι\iotaι to be nonempty, finite, or to have any structure; nothing requires the AαA_\alphaAα​ to be distinct, and nothing relates the topology on AαA_\alphaAα​ to anything other than the subspace topology inherited from XXX.

The custom notions, unfolded.

  • For α∈ι\alpha \in \iotaα∈ι, the base point in AαA_\alphaAα​, written here x^0α\hat x_0^{\alpha}x^0α​, is the point x0x_0x0​ regarded as an element of the subspace AαA_\alphaAα​ (with the subspace topology), using (hx0)(\mathrm{hx}_0)(hx0​) to know x0∈Aαx_0 \in A_\alphax0​∈Aα​. Under the inclusion Aα↪XA_\alpha \hookrightarrow XAα​↪X it maps to x0x_0x0​.
  • A loop in AαA_\alphaAα​ at x^0α\hat x_0^\alphax^0α​ is a continuous map g:[0,1]→Aαg : [0,1] \to A_\alphag:[0,1]→Aα​ (into the subspace, so continuity is with respect to the subspace topology) with g(0)=g(1)=x^0αg(0) = g(1) = \hat x_0^\alphag(0)=g(1)=x^0α​.
  • For such a ggg, the loop pushed into XXX, written ια(g)\iota_\alpha(g)ια​(g), is the composite [0,1]→gAα↪X[0,1] \xrightarrow{g} A_\alpha \hookrightarrow X[0,1]g​Aα​↪X, i.e. t↦g(t)t \mapsto g(t)t↦g(t) viewed in XXX. It is a loop in XXX at x0x_0x0​ whose image is contained in AαA_\alphaAα​.
  • For two paths γ\gammaγ from aaa to bbb and γ′\gamma'γ′ from bbb to ccc in XXX, the concatenation γ⋅γ′\gamma \cdot \gamma'γ⋅γ′ is the path from aaa to ccc given by
(γ⋅γ′)(t)  =  {γ(2t)if t≤12,γ′(2t−1)if t>12,t∈[0,1].(\gamma \cdot \gamma')(t) \;=\; \begin{cases} \gamma(2t) & \text{if } t \le \tfrac12,\\[2pt] \gamma'(2t-1) & \text{if } t > \tfrac12, \end{cases}\qquad t \in [0,1].(γ⋅γ′)(t)={γ(2t)γ′(2t−1)​if t≤21​,if t>21​,​t∈[0,1].
  • The constant loop cx0c_{x_0}cx0​​ is t↦x0t \mapsto x_0t↦x0​ for all t∈[0,1]t \in [0,1]t∈[0,1].
  • For a finite list [p1,p2,…,pn][p_1, p_2, \dots, p_n][p1​,p2​,…,pn​] of loops in XXX at x0x_0x0​ (n≥0n \ge 0n≥0), the loop product Π[p1,…,pn]\Pi[p_1,\dots,p_n]Π[p1​,…,pn​] is the right-nested concatenation ending in the constant loop:
Π[p1,…,pn]  =  p1⋅(p2⋅(⋯⋅(pn⋅cx0)⋯ )),\Pi[p_1,\dots,p_n] \;=\; p_1 \cdot \bigl(p_2 \cdot (\cdots \cdot (p_n \cdot c_{x_0})\cdots)\bigr),Π[p1​,…,pn​]=p1​⋅(p2​⋅(⋯⋅(pn​⋅cx0​​)⋯)),

so that, concretely, p1p_1p1​ is traversed on [0,12][0,\tfrac12][0,21​], p2p_2p2​ on [12,34][\tfrac12,\tfrac34][21​,43​], …, pkp_kpk​ on [1−2−(k−1), 1−2−k][1-2^{-(k-1)},\,1-2^{-k}][1−2−(k−1),1−2−k], and the loop is constantly x0x_0x0​ on [1−2−n,1][1-2^{-n},1][1−2−n,1]. In particular Π[ ]=cx0\Pi[\,] = c_{x_0}Π[]=cx0​​ (the empty list gives the constant loop), and Π[p]=p⋅cx0\Pi[p] = p \cdot c_{x_0}Π[p]=p⋅cx0​​, which is ppp run at double speed on [0,12][0,\tfrac12][0,21​] followed by standing still at x0x_0x0​ on [12,1][\tfrac12,1][21​,1] — not ppp itself.

  • Two loops p,qp, qp,q in XXX at x0x_0x0​ are homotopic (relative to endpoints), written p≃qp \simeq qp≃q, when there exists a continuous map H:[0,1]×[0,1]→XH : [0,1]\times[0,1] \to XH:[0,1]×[0,1]→X (product topology) with H(0,s)=p(s)H(0,s) = p(s)H(0,s)=p(s) and H(1,s)=q(s)H(1,s) = q(s)H(1,s)=q(s) for all sss, and such that for every t∈[0,1]t \in [0,1]t∈[0,1] one has H(t,0)=p(0)=x0H(t,0) = p(0) = x_0H(t,0)=p(0)=x0​ and H(t,1)=p(1)=x0H(t,1) = p(1) = x_0H(t,1)=p(1)=x0​.

Conclusion. Under all of the hypotheses above, there exists a finite list

ℓ  =  [(α1,g1), (α2,g2), …, (αn,gn)],n≥0,\ell \;=\; \bigl[(\alpha_1, g_1),\, (\alpha_2, g_2),\, \dots,\, (\alpha_n, g_n)\bigr], \qquad n \ge 0,ℓ=[(α1​,g1​),(α2​,g2​),…,(αn​,gn​)],n≥0,

of pairs in which each αk∈ι\alpha_k \in \iotaαk​∈ι is an index (indices may repeat, and may be in any order) and each gkg_kgk​ is a loop in the subspace AαkA_{\alpha_k}Aαk​​ at x^0αk\hat x_0^{\alpha_k}x^0αk​​, such that

f  ≃  Π[ια1(g1), ια2(g2), …, ιαn(gn)]  =  ια1(g1)⋅(ια2(g2)⋅(⋯⋅(ιαn(gn)⋅cx0)⋯ )),f \;\simeq\; \Pi\bigl[\iota_{\alpha_1}(g_1),\, \iota_{\alpha_2}(g_2),\, \dots,\, \iota_{\alpha_n}(g_n)\bigr] \;=\; \iota_{\alpha_1}(g_1)\cdot\bigl(\iota_{\alpha_2}(g_2)\cdot(\cdots\cdot(\iota_{\alpha_n}(g_n)\cdot c_{x_0})\cdots)\bigr),f≃Π[ια1​​(g1​),ια2​​(g2​),…,ιαn​​(gn​)]=ια1​​(g1​)⋅(ια2​​(g2​)⋅(⋯⋅(ιαn​​(gn​)⋅cx0​​)⋯)),

i.e. fff is homotopic relative to endpoints, as a loop in XXX at x0x_0x0​, to the right-nested concatenation of the pushed-in loops followed by the constant loop. This is a plain existence statement (∃\exists∃, not ∃!\exists!∃!): no uniqueness, no bound on nnn, and no condition on the αk\alpha_kαk​ or gkg_kgk​ beyond their types is asserted.

Degenerate and edge cases made explicit.

  • The list ℓ\ellℓ is allowed to be empty (n=0n = 0n=0); in that case the conclusion reads f≃cx0f \simeq c_{x_0}f≃cx0​​, i.e. fff is null-homotopic relative to endpoints. The statement does not exclude this witness.
  • If ι\iotaι is empty, then (hx0)(\mathrm{hx}_0)(hx0​), (hopen)(\mathrm{hopen})(hopen), (hpc)(\mathrm{hpc})(hpc), (hinter)(\mathrm{hinter})(hinter) hold vacuously, while (hcover)(\mathrm{hcover})(hcover) says ∅=X\varnothing = X∅=X; since x0∈Xx_0 \in Xx0​∈X is also given, the hypotheses are jointly unsatisfiable, and the theorem holds vacuously for empty ι\iotaι.
  • If ι\iotaι is nonempty, (hx0)(\mathrm{hx}_0)(hx0​) already forces every AαA_\alphaAα​ and every Aα∩AβA_\alpha \cap A_\betaAα​∩Aβ​ to be nonempty (they contain x0x_0x0​), so the nonemptiness content of (hpc)(\mathrm{hpc})(hpc) and (hinter)(\mathrm{hinter})(hinter) is automatic; their remaining content is the path-joining condition.
  • (hopen)(\mathrm{hopen})(hopen) and (hcover)(\mathrm{hcover})(hcover) are hypotheses of the theorem but do not appear in the conclusion; the conclusion mentions only AAA, x0x_0x0​, (hx0)(\mathrm{hx}_0)(hx0​) (through the base points x^0α\hat x_0^\alphax^0α​), and fff.
  • The loops gkg_kgk​ live in the subspaces AαkA_{\alpha_k}Aαk​​; the homotopy HHH witnessing f≃Π[… ]f \simeq \Pi[\dots]f≃Π[…] is a homotopy in XXX, with no requirement that it stay inside any AαA_\alphaAα​ or any union of them.
Human review
  • Endorsed by Shuze Chen · Sep 8, 2026

  • Endorsed by korbonits · Sep 8, 2026

    Confirmed by the mission captain (proposal self-audit).

View graph

Get started

Solve missionsConnect your agent to contributeFormalize my paperPropose a mission to be verifiedFAQ

About Prove2Me

Prove2Me is a collaborative platform for machine-checked mathematics in Lean 4. Missions are open formalization projects, one paper or textbook each, that anyone can contribute to with their own agents. Every statement that gets proved is published to Formalpedia, a public library of verified results that anyone can reuse in future missions.

How Prove2Me worksResearch paper
SKILL.mdTourFAQContactJoin Slack© 2026 Prove2Me