Prove2Me
Navigate
DiscoverFormalpediaBlogsUsersMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

Theorem 1.38 (classification of covering spaces): path-connected covering spaces ↔\leftrightarrow↔ subgroups of π1(X,x0)\pi_1(X,x_0)π1​(X,x0​), up to conjugacy when basepoints are ignored

Proved
Hatcher.classification_of_covering_spaces

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

algebraic-topologycovering-spacesfundamental-grouphatcher

Throughout, a covering space of XXX is a space X~\tilde XX~ with a map p:X~→Xp:\tilde X\to Xp:X~→X such that each x∈Xx\in Xx∈X has an open neighborhood UUU whose preimage p−1(U)p^{-1}(U)p−1(U) is a disjoint union of open sets each mapped homeomorphically onto UUU by ppp (Hatcher, p. 56; Mathlib's IsCoveringMap). Given basepoints x~0∈X~\tilde x_0\in\tilde Xx~0​∈X~, x0=p(x~0)x_0=p(\tilde x_0)x0​=p(x~0​), we write p∗:π1(X~,x~0)→π1(X,x0)p_*:\pi_1(\tilde X,\tilde x_0)\to\pi_1(X,x_0)p∗​:π1​(X~,x~0​)→π1​(X,x0​) for the induced homomorphism (Hatcher.coverHom) and H=p∗(π1(X~,x~0))H=p_*\big(\pi_1(\tilde X,\tilde x_0)\big)H=p∗​(π1​(X~,x~0​)) for its image (Hatcher.coverSubgroup).

Theorem 1.38. Let XXX be path-connected, locally path-connected and semilocally simply-connected. Then there is a bijection between the set of basepoint-preserving isomorphism classes of path-connected covering spaces p:(X~,x~0)→(X,x0)p:(\tilde X,\tilde x_0)\to(X,x_0)p:(X~,x~0​)→(X,x0​) and the set of subgroups of π1(X,x0)\pi_1(X,x_0)π1​(X,x0​), obtained by associating the subgroup p∗(π1(X~,x~0))p_*\big(\pi_1(\tilde X,\tilde x_0)\big)p∗​(π1​(X~,x~0​)) to the covering space (X~,x~0)(\tilde X,\tilde x_0)(X~,x~0​). If basepoints are ignored, this correspondence gives a bijection between isomorphism classes of path-connected covering spaces p:X~→Xp:\tilde X\to Xp:X~→X and conjugacy classes of subgroups of π1(X,x0)\pi_1(X,x_0)π1​(X,x0​).

Formally the theorem is the conjunction of:

  1. (surjectivity) for every subgroup H≤π1(X,x0)H\le\pi_1(X,x_0)H≤π1​(X,x0​) there is a path-connected covering space with basepoint (X~,x~0)(\tilde X,\tilde x_0)(X~,x~0​) with p∗π1(X~,x~0)=Hp_*\pi_1(\tilde X,\tilde x_0)=Hp∗​π1​(X~,x~0​)=H;
  2. (well-definedness and injectivity on basepoint-preserving classes) two path-connected covering spaces with basepoints are basepoint-preservingly isomorphic iff their subgroups are equal;
  3. (basepoints ignored) two path-connected covering spaces are isomorphic iff, for some choice of basepoints x~1∈p1−1(x0)\tilde x_1\in p_1^{-1}(x_0)x~1​∈p1−1​(x0​), x~2∈p2−1(x0)\tilde x_2\in p_2^{-1}(x_0)x~2​∈p2−1​(x0​), the subgroups p1∗π1(X~1,x~1)p_{1*}\pi_1(\tilde X_1,\tilde x_1)p1∗​π1​(X~1​,x~1​) and p2∗π1(X~2,x~2)p_{2*}\pi_1(\tilde X_2,\tilde x_2)p2∗​π1​(X~2​,x~2​) are conjugate in π1(X,x0)\pi_1(X,x_0)π1​(X,x0​).

Together, 1 and 2 say that (X~,x~0)↦p∗π1(X~,x~0)(\tilde X,\tilde x_0)\mapsto p_*\pi_1(\tilde X,\tilde x_0)(X~,x~0​)↦p∗​π1​(X~,x~0​) induces a bijection from basepoint-preserving isomorphism classes onto the set of subgroups, and 3 (with the change-of-basepoint lemma, pp. 67–68) says it descends to a bijection from isomorphism classes onto conjugacy classes.

Formalization Note Covering spaces are CoveringSpace X structures with total space in the universe of XXX, which is where Hatcher's XHX_HXH​ live. "Isomorphic" is the existence of a homeomorphism over XXX (IsIsomorphic, IsPointedIsomorphic). Conjugacy is Subgroup.map (MulAut.conj g). Stating the theorem as this conjunction rather than as a bijection between quotient sets avoids forming the set of isomorphism classes of types and asserts the same content.

Preamble
import Definitions.Def_Hatcher_Covering
import Mathlib

open Hatcher unitInterval

universe u
Formal statement
namespace Hatcher
theorem classification_of_covering_spaces {X : Type u} [TopologicalSpace X]
    [PathConnectedSpace X] [LocallyPathConnectedSpace X] (hX : IsSemilocallySimplyConnected X)
    (x₀ : X) :
    (∀ H : Subgroup (FundamentalGroup X x₀),
        ∃ C : PointedCover X x₀, PathConnectedSpace C.E ∧ C.subgroup = H) ∧
      (∀ C₁ C₂ : PointedCover X x₀, PathConnectedSpace C₁.E → PathConnectedSpace C₂.E →
        (IsPointedIsomorphic C₁ C₂ ↔ C₁.subgroup = C₂.subgroup)) ∧
      ∀ C₁ C₂ : CoveringSpace X, PathConnectedSpace C₁.E → PathConnectedSpace C₂.E →
        (IsIsomorphic C₁ C₂ ↔
          ∃ (e₁ : C₁.E) (e₂ : C₂.E) (h₁ : C₁.p e₁ = x₀) (h₂ : C₂.p e₂ = x₀)
            (g : FundamentalGroup X x₀),
            (coverSubgroup C₁.p C₁.isCoveringMap.continuous h₁).map (MulAut.conj g).toMonoidHom =
              coverSubgroup C₂.p C₂.isCoveringMap.continuous h₂) := by sorry
end Hatcher
Source
A. Hatcher, Algebraic Topology, Cambridge University Press 2002, https://pi.math.cornell.edu/~hatcher/AT/AT.pdf, Section 1.3, p. 67, Theorem 1.38 (proof pp. 66–68, via Propositions 1.36 and 1.37)
Read-back

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

Read-back of Hatcher.classification_of_covering_spaces.

Setting and binders

  • X : Type u, [TopologicalSpace X] — a topological space in a fixed universe u.
  • [PathConnectedSpace X] — Mathlib's class: Nonempty X and any two points are joined by a continuous path Path x y (I → X, continuous, with prescribed endpoints).
  • [LocallyPathConnectedSpace X] — for every x, the filter 𝓝 x has a basis of sets s with s ∈ 𝓝 x and IsPathConnected s (nonempty, any two points joined by a path inside s).
  • hX : IsSemilocallySimplyConnected X — the bundle's definition: for every x there is a neighbourhood U ∈ 𝓝 x (not necessarily open) such that every loop γ : Path x x with ∀ t, γ t ∈ U is Path.Homotopic (homotopic rel endpoints, in X) to the constant loop Path.refl x. Equivalently, π1(U,x)→π1(X,x)\pi_1(U,x)\to\pi_1(X,x)π1​(U,x)→π1​(X,x) is trivial. This is Hatcher's definition.
  • x₀ : X — explicit basepoint.

Types from the bundle.

  • CoveringSpace X: a structure with E : Type u (same universe as X), [topE : TopologicalSpace E], p : E → X, isCoveringMap : IsCoveringMap p. Mathlib's IsCoveringMap p: for every x : X, IsEvenlyCovered p x (p⁻¹{x}), i.e. the fibre p⁻¹{x} is discrete and there exist an open U ∋ x with p⁻¹(U) open and a homeomorphism p⁻¹(U) ≃ₜ U × p⁻¹{x} whose first component is p. Surjectivity is not required; fibres may be empty and E may be empty.
  • PointedCover X x₀: a CoveringSpace X together with e₀ : E and p_e₀ : p e₀ = x₀.
  • C.subgroup (for C : PointedCover X x₀) =range⁡(FundamentalGroup.mapOfEq ⟨C.p,_⟩ C.p_e0)= \operatorname{range}(\texttt{FundamentalGroup.mapOfEq}\,\langle C.p, \_\rangle\, C.p\_e₀)=range(FundamentalGroup.mapOfEq⟨C.p,_⟩C.p_e0​). By mapOfEq_apply, the homomorphism sends a loop class [γ] at e₀ to [p ∘ γ] re-indexed as a loop at x₀ using p e₀ = x₀. So C.subgroup=p∗π1(E,e0)≤π1(X,x0)C.\texttt{subgroup} = p_*\pi_1(E,e_0)\le \pi_1(X,x_0)C.subgroup=p∗​π1​(E,e0​)≤π1​(X,x0​).
  • coverSubgroup C.p C.isCoveringMap.continuous h for any e and h : C.p e = x₀ — the same thing, p∗π1(E,e)p_*\pi_1(E,e)p∗​π1​(E,e), for an arbitrary point e of the fibre over x₀.
  • IsPointedIsomorphic C₁ C₂ (for pointed covers): ∃f:E1≃tE2\exists f : E_1\simeq_t E_2∃f:E1​≃t​E2​ (Mathlib Homeomorph: bijection, continuous both ways) with ∀e, p2(fe)=p1e\forall e,\ p_2(f e) = p_1 e∀e, p2​(fe)=p1​e and f(e0(1))=e0(2)f(e_0^{(1)}) = e_0^{(2)}f(e0(1)​)=e0(2)​.
  • IsIsomorphic C₁ C₂ (for unpointed covers): ∃f:E1≃tE2\exists f : E_1\simeq_t E_2∃f:E1​≃t​E2​ with ∀e, p2(fe)=p1e\forall e,\ p_2(f e) = p_1 e∀e, p2​(fe)=p1​e — a homeomorphism over X, no basepoint condition.
  • FundamentalGroup X x₀ is Mathlib's End (FundamentalGroupoid.mk x₀), homotopy classes of loops at x₀, with multiplication p * q = q.trans p (traverse q first, then p; reversed relative to Hatcher's concatenation order).
  • H.map (MulAut.conj g).toMonoidHom: MulAut.conj g is h ↦ g * h * g⁻¹ (MulAut.conj_apply, definitional), Subgroup.map φ H has carrier φ '' H. So this is {g∗h∗g−1:h∈H}=gHg−1\{g*h*g^{-1} : h\in H\} = gHg^{-1}{g∗h∗g−1:h∈H}=gHg−1 in Mathlib's product, which equals g−1Hgg^{-1}Hgg−1Hg in Hatcher's concatenation-order product. Wherever it appears below, g is existentially quantified over the whole group, so the convention does not alter the meaning.

Hypotheses

Exactly the four listed above: X path-connected, locally path-connected, semilocally simply-connected, plus a basepoint. No Hausdorff, no compactness, no CW structure. (Hatcher's Theorem 1.38 has precisely these hypotheses.)

Conclusion

A conjunction of three statements, (1) ∧ ((2) ∧ (3)).

(1) Existence (surjectivity onto subgroups).

∀H≤π1(X,x0), ∃C:PointedCover X x0,EC is path-connected ∧ p∗π1(EC,e0)=H.\forall H\le\pi_1(X,x_0),\ \exists C : \texttt{PointedCover } X\ x_0,\quad E_C \text{ is path-connected}\ \wedge\ p_*\pi_1(E_C,e_0)=H.∀H≤π1​(X,x0​), ∃C:PointedCover X x0​,EC​ is path-connected ∧ p∗​π1​(EC​,e0​)=H.

Identical to exists_cover_of_subgroup: every subgroup is realised as p∗π1(E,e0)p_*\pi_1(E,e_0)p∗​π1​(E,e0​) for some path-connected pointed covering with total space in Type u.

(2) Pointed isomorphism ⇔ equal subgroups.

∀C1 C2:PointedCover X x0,  E1 path-conn.→E2 path-conn.→(IsPointedIsomorphic C1 C2  ⟺  (p1)∗π1(E1,e0(1))=(p2)∗π1(E2,e0(2))).\forall C_1\,C_2 : \texttt{PointedCover } X\ x_0,\ \ E_1 \text{ path-conn.}\to E_2 \text{ path-conn.}\to\Big(\texttt{IsPointedIsomorphic } C_1\ C_2 \iff (p_1)_*\pi_1(E_1,e_0^{(1)}) = (p_2)_*\pi_1(E_2,e_0^{(2)})\Big).∀C1​C2​:PointedCover X x0​,  E1​ path-conn.→E2​ path-conn.→(IsPointedIsomorphic C1​ C2​⟺(p1​)∗​π1​(E1​,e0(1)​)=(p2​)∗​π1​(E2​,e0(2)​)).

Identical to isPointedIsomorphic_iff with the two path-connectedness assumptions written as implications: for path-connected pointed covers, there is a homeomorphism over X carrying basepoint to basepoint iff the two image subgroups coincide.

(3) Unpointed isomorphism ⇔ conjugate subgroups.

∀C1 C2:CoveringSpace X,  E1 path-conn.→E2 path-conn.→(IsIsomorphic C1 C2  ⟺  ∃ e1∈E1, e2∈E2, (h1:p1e1=x0), (h2:p2e2=x0), g∈π1(X,x0):  g [(p1)∗π1(E1,e1)] g−1=(p2)∗π1(E2,e2)).\forall C_1\,C_2 : \texttt{CoveringSpace } X,\ \ E_1 \text{ path-conn.}\to E_2 \text{ path-conn.}\to\Big(\texttt{IsIsomorphic } C_1\ C_2 \iff \exists\, e_1\in E_1,\ e_2\in E_2,\ (h_1 : p_1 e_1 = x_0),\ (h_2 : p_2 e_2 = x_0),\ g\in\pi_1(X,x_0):\ \ g\,\big[(p_1)_*\pi_1(E_1,e_1)\big]\,g^{-1} = (p_2)_*\pi_1(E_2,e_2)\Big).∀C1​C2​:CoveringSpace X,  E1​ path-conn.→E2​ path-conn.→(IsIsomorphic C1​ C2​⟺∃e1​∈E1​, e2​∈E2​, (h1​:p1​e1​=x0​), (h2​:p2​e2​=x0​), g∈π1​(X,x0​):  g[(p1​)∗​π1​(E1​,e1​)]g−1=(p2​)∗​π1​(E2​,e2​)).

In words: two path-connected (unpointed) covering spaces of X are isomorphic over X iff there exist basepoints e1,e2e_1, e_2e1​,e2​ in the fibres over x0x_0x0​ whose image subgroups are conjugate in π1(X,x0)\pi_1(X,x_0)π1​(X,x0​). Note the quantifier: some choice of basepoints, not every choice. (By coverSubgroup_conj, the set of subgroups obtained as eie_iei​ varies in the fibre is a full conjugacy class, so "for some e1,e2e_1,e_2e1​,e2​ conjugate" is equivalent to "for all e1,e2e_1,e_2e1​,e2​ conjugate"; but that equivalence is not part of this statement.)

Remarks

Relation to Hatcher's Theorem 1.38 ("bijection" formulation). Hatcher states: (i) (X~,x~0)↦p∗π1(X~,x~0)(\tilde X,\tilde x_0)\mapsto p_*\pi_1(\tilde X,\tilde x_0)(X~,x~0​)↦p∗​π1​(X~,x~0​) is a bijection from basepoint-preserving isomorphism classes of path-connected pointed covers to subgroups of π1(X,x0)\pi_1(X,x_0)π1​(X,x0​); (ii) forgetting basepoints, a bijection from isomorphism classes of path-connected covers to conjugacy classes of subgroups. The Lean theorem never forms quotient sets or an Equiv; instead it gives the ingredients:

  • Well-definedness of (i) on isomorphism classes: the "⇒" of (2).
  • Injectivity of (i): the "⇐" of (2).
  • Surjectivity of (i): (1).
  • Well-definedness of (ii) (isomorphic covers have conjugate subgroups, for some/any basepoints): "⇒" of (3) (together with coverSubgroup_conj for the "any" version).
  • Injectivity of (ii): "⇐" of (3).
  • Surjectivity of (ii): not stated separately, but follows immediately from (1) by forgetting the basepoint (a subgroup HHH in a given conjugacy class is realised as p∗π1(E,e0)p_*\pi_1(E,e_0)p∗​π1​(E,e0​), and the conjugacy class of that is the class of HHH). A reader checking against the textbook should be aware this is a one-line consequence, not an explicit conjunct.

So the three parts are logically equivalent to Hatcher's two bijections restricted to covers with E : Type u, with the (i)/(ii) correspondence spelled out as "iff" conditions rather than as a bijection between quotient sets. Nothing weaker is asserted at the level of content, but the theorem is not literally a Bijective or Equiv statement.

Universe restriction. Every cover quantified over has total space E : Type u, the same universe as X. Hence "all covering spaces" in (2) and (3) means "all covering spaces whose total space lives in Type u", and (1) produces one in Type u. For path-connected covers this loses nothing up to isomorphism: with e₀ fixed, each point of E is the endpoint of a unique lift of some path in X from x₀, so ∣E∣≤∣{paths in X}∣|E|\le|\{\text{paths in }X\}|∣E∣≤∣{paths in X}∣, and any such cover is homeomorphic over X to one in Type u. But the theorem as stated does not say anything about a cover E : Type v, v ≠ u.

Non-vacuity, non-triviality. The hypotheses are satisfiable (circle, torus, any connected manifold). None of (1)–(3) is trivially true: (1) for H = ⊥ is existence of a universal cover; (2) "⇐" is Hatcher's Prop. 1.37; (3) "⇐" is the unpointed classification. The only automatically true pieces are the "⇒" directions of (2) and (3), which are standard functoriality (in (3), given the iso f take any e₁, e₂ := f e₁, g := 1).

Surjectivity of p not stated. IsCoveringMap does not force surjectivity, but in (1)–(3) every relevant E is path-connected hence nonempty, X is connected, and fibre cardinality is locally constant for a covering map, so every pᵢ is in fact onto X. Consequently the existential over e₁, e₂ in (3) is never blocked by empty fibres. The theorem does not mention this; it is a consequence, not an assumption.

Hypothesis hX is used only for (1). Parts (2) and (3) hold for any path-connected, locally path-connected X. Bundling them under the stronger hypotheses matches Hatcher's Theorem 1.38 but makes (2),(3) formally weaker than the standalone isPointedIsomorphic_iff / coverSubgroup_conj.

Isomorphism notion. Both IsIsomorphic and IsPointedIsomorphic demand a Homeomorph (continuous inverse included) with p2∘f=p1p_2\circ f = p_1p2​∘f=p1​. This is the standard notion of isomorphism of covering spaces over X. The direction C₁ → C₂ is fixed in the definition; symmetry follows via Homeomorph.symm but is not asserted.

Which conjugate. In (3), the Lean condition is g H1 g−1=H2g\,H_1\,g^{-1}=H_2gH1​g−1=H2​ with Mathlib's product, i.e. g−1H1g=H2g^{-1}H_1g = H_2g−1H1​g=H2​ in Hatcher's convention. Because g ranges over the whole group, "H1H_1H1​ and H2H_2H2​ are conjugate" is what is asserted either way.

Absent from the formal statement, present in textbooks: (a) the explicit bijection/quotient-set language; (b) surjectivity onto conjugacy classes as a separate clause; (c) uniqueness of the basepoint-preserving isomorphism; (d) the remark that the total spaces are themselves locally path-connected; (e) the normal-cover/deck-group refinement (Prop. 1.39/1.40), which is not part of Theorem 1.38 either. None of these absences weakens the assertions actually made; (a) and (b) are recoverable from (1)–(3) plus coverSubgroup_conj.

Degenerate instantiations. If π1(X,x0)=1\pi_1(X,x_0)=1π1​(X,x0​)=1 (e.g. X contractible): (1) is only about H = ⊤, satisfied by E = X; (2) and (3) say every two path-connected covers of X are (pointed-)isomorphic — correct. If E₁ = E₂ as covers, (3)'s right side is witnessed by any e₁, e₂ := e₁, g := 1. No instantiation makes the theorem vacuous.

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