Prove2Me
Navigate
DiscoverFormalpediaBlogsUsersMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

Proposition 1.32: the number of sheets equals the index of p∗π1(X~,x~0)p_*\pi_1(\tilde X,\tilde x_0)p∗​π1​(X~,x~0​)

Proved
Hatcher.fiber_equiv_cosets

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).

Proposition 1.32. If XXX and X~\tilde XX~ are path-connected, the number of sheets of the covering space p:(X~,x~0)→(X,x0)p:(\tilde X,\tilde x_0)\to(X,x_0)p:(X~,x~0​)→(X,x0​) equals the index of H=p∗(π1(X~,x~0))H=p_*\big(\pi_1(\tilde X,\tilde x_0)\big)H=p∗​(π1​(X~,x~0​)) in π1(X,x0)\pi_1(X,x_0)π1​(X,x0​).

Formally: there is a bijection between the fibre p−1(x0)p^{-1}(x_0)p−1(x0​) and the coset space π1(X,x0)/H\pi_1(X,x_0)/Hπ1​(X,x0​)/H.

Formalization Note The number of sheets is the cardinality of a fibre, constant over a connected base (p. 56); a bijection of the fibre over x0x_0x0​ with the coset space is the cardinality-free form of "equals the index". Hatcher's bijection sends the coset of [g][g][g] to the endpoint of the lift of ggg starting at x~0\tilde x_0x~0​; the statement asserts only that some bijection exists.

Preamble
import Definitions.Def_Hatcher_Covering
import Mathlib

open Hatcher unitInterval
Formal statement
namespace Hatcher
theorem fiber_equiv_cosets {E X : Type*} [TopologicalSpace E] [TopologicalSpace X]
    [PathConnectedSpace E] [PathConnectedSpace X]
    {p : E → X} (hp : IsCoveringMap p) {e₀ : E} {x₀ : X} (he : p e₀ = x₀) :
    Nonempty (p ⁻¹' {x₀} ≃ FundamentalGroup X x₀ ⧸ coverSubgroup p hp.continuous he) := 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. 61, Proposition 1.32
Read-back

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

Read-back of Hatcher.fiber_equiv_cosets.

theorem fiber_equiv_cosets {E X : Type*} [TopologicalSpace E] [TopologicalSpace X]
    [PathConnectedSpace E] [PathConnectedSpace X]
    {p : E → X} (hp : IsCoveringMap p) {e₀ : E} {x₀ : X} (he : p e₀ = x₀) :
    Nonempty (p ⁻¹' {x₀} ≃ FundamentalGroup X x₀ ⧸ coverSubgroup p hp.continuous he)

Setting and binders

  • E X : Type* — two types in independent universes (Type u_1, Type u_2). There is no requirement that total space and base live in the same universe.
  • [TopologicalSpace E] [TopologicalSpace X] — arbitrary topologies; no separation, compactness, or local-connectedness axioms.
  • [PathConnectedSpace E] and [PathConnectedSpace X] — Mathlib's class has two fields: nonempty : Nonempty _ and joined : ∀ x y, Joined x y, where Joined x y := Nonempty (Path x y). So each of EEE and XXX is nonempty and any two of its points are the endpoints of some continuous path [0,1]→[0,1]\to[0,1]→ space.
  • {p : E → X} — a bare function (implicit; determined by hp).
  • hp : IsCoveringMap p — Mathlib's definition: ∀ x, IsEvenlyCovered p x (p ⁻¹' {x}), and IsEvenlyCovered p x I is
DiscreteTopology(I) ∧ ∃U⊆X, x∈U, U open, p−1(U) open, ∃H:p−1(U)≃tU×I, ∀z, π1(Hz)=p(z).\text{DiscreteTopology}(I)\ \wedge\ \exists U\subseteq X,\ x\in U,\ U\text{ open},\ p^{-1}(U)\text{ open},\ \exists H : p^{-1}(U)\simeq_t U\times I,\ \forall z,\ \pi_1(H z)=p(z).DiscreteTopology(I) ∧ ∃U⊆X, x∈U, U open, p−1(U) open, ∃H:p−1(U)≃t​U×I, ∀z, π1​(Hz)=p(z).

Here I=p−1({x})I = p^{-1}(\{x\})I=p−1({x}) with the subspace topology. Thus: every point of XXX has an open neighbourhood UUU over which ppp is a trivial bundle with discrete fibre p−1(x)p^{-1}(x)p−1(x). Mathlib does not require ppp to be surjective: the fibre may be empty (then p−1(U)=∅p^{-1}(U)=\emptysetp−1(U)=∅ for some open U∋xU\ni xU∋x). IsCoveringMap p implies Continuous p, which is what hp.continuous supplies to coverSubgroup.

  • {e₀ : E} {x₀ : X} and he : p e₀ = x₀ — a chosen basepoint in EEE and its image. In particular the fibre over x0x_0x0​ is nonempty (it contains e0e_0e0​).

Definitions from the bundle that occur:

  • coverHom p hp he : FundamentalGroup E e₀ →* FundamentalGroup X x₀ is FundamentalGroup.mapOfEq ⟨p, hp⟩ he. FundamentalGroup X x is (an abbreviation for) End (FundamentalGroupoid.mk x), i.e. the group of homotopy-rel-endpoints classes of loops at xxx, π1(X,x)\pi_1(X,x)π1​(X,x). mapOfEq f h is map f x (push-forward of loop classes along fff) composed with the group isomorphism π1(X,fe0)≅π1(X,x0)\pi_1(X, f e_0)\cong\pi_1(X,x_0)π1​(X,fe0​)≅π1​(X,x0​) induced by the equality h : f e₀ = x₀ (eqToIso … .conj). Mathematically this is just p∗:π1(E,e0)→π1(X,x0)p_*:\pi_1(E,e_0)\to\pi_1(X,x_0)p∗​:π1​(E,e0​)→π1​(X,x0​).
  • coverSubgroup p hp he : Subgroup (FundamentalGroup X x₀) is (coverHom p hp he).range, i.e. the image subgroup H:=p∗(π1(E,e0))≤π1(X,x0)H := p_*\big(\pi_1(E,e_0)\big)\le \pi_1(X,x_0)H:=p∗​(π1​(E,e0​))≤π1​(X,x0​).

Hypotheses

  1. EEE and XXX are nonempty path-connected topological spaces.
  2. p:E→Xp : E\to Xp:E→X is a covering map in Mathlib's sense (local triviality with discrete fibres; surjectivity not assumed).
  3. p(e0)=x0p(e_0)=x_0p(e0​)=x0​.

Conclusion

Nonempty (p ⁻¹' {x₀} ≃ FundamentalGroup X x₀ ⧸ coverSubgroup p hp.continuous he).

  • p ⁻¹' {x₀} is coerced to the subtype {e:E∣p(e)=x0}\{e : E \mid p(e)=x_0\}{e:E∣p(e)=x0​}, the fibre over x0x_0x0​ (as a bare type; its topology is irrelevant here).
  • FundamentalGroup X x₀ ⧸ coverSubgroup … is Mathlib's HasQuotient for a group by a Subgroup: the quotient of π1(X,x0)\pi_1(X,x_0)π1​(X,x0​) by QuotientGroup.leftRel H, where leftRel H a b ↔ a⁻¹ * b ∈ H. So it is the set of left cosets {gH:g∈π1(X,x0)}\{ gH : g\in\pi_1(X,x_0)\}{gH:g∈π1​(X,x0​)} — a plain type, with no group structure asserted (HHH is not assumed normal) and no topology.
  • ≃ is Equiv: a bijection with two-sided inverse. Nonempty (_ ≃ _) is the proposition "there exists some bijection".

In words: there exists a bijection between the fibre p−1(x0)p^{-1}(x_0)p−1(x0​) and the set of left cosets π1(X,x0)/p∗π1(E,e0)\pi_1(X,x_0)/p_*\pi_1(E,e_0)π1​(X,x0​)/p∗​π1​(E,e0​). Equivalently (cardinality form) the number of sheets over x0x_0x0​ equals the index [π1(X,x0):p∗π1(E,e0)][\pi_1(X,x_0) : p_*\pi_1(E,e_0)][π1​(X,x0​):p∗​π1​(E,e0​)], as cardinals.

Remarks

  • Compared with Hatcher, Prop. 1.32. Hatcher's hypotheses are exactly "p:(X~,x~0)→(X,x0)p:(\tilde X,\tilde x_0)\to(X,x_0)p:(X~,x~0​)→(X,x0​) a covering space with X~\tilde XX~ and XXX path-connected", and his conclusion is that the number of sheets equals the index of p∗π1(X~,x~0)p_*\pi_1(\tilde X,\tilde x_0)p∗​π1​(X~,x~0​) in π1(X,x0)\pi_1(X,x_0)π1​(X,x0​). The Lean statement matches these hypotheses. No local path-connectedness of XXX is assumed, consistent with Hatcher.
  • Only existence of a bijection is asserted. Hatcher's proof produces the specific bijection Φ:H[γ]↦γ~(1)\Phi : H[\gamma]\mapsto \tilde\gamma(1)Φ:H[γ]↦γ~​(1) (endpoint of the lift of γ\gammaγ starting at x~0\tilde x_0x~0​). The Lean statement does not name or characterise the bijection; it is a pure cardinality statement. A reader wanting "the canonical bijection" gets strictly less.
  • Surjectivity of ppp is not assumed but follows. Since Mathlib covering maps are open, and the set of points with empty fibre is open (an empty fibre over xxx yields an open U∋xU\ni xU∋x with p−1(U)=∅p^{-1}(U)=\emptysetp−1(U)=∅), the image of ppp is clopen; it is nonempty (contains x0x_0x0​) and XXX is connected, so ppp is onto. So no weakening arises from the missing surjectivity hypothesis in this theorem.
  • Nonempty-ness. Both PathConnectedSpace instances force E,X≠∅E,X\neq\emptysetE,X=∅; independently the fibre over x0x_0x0​ contains e0e_0e0​ and the coset space contains the class of 111. So neither side is empty and the statement is not vacuous.
  • Trivial instances. If E=XE = XE=X and p=idp=\mathrm{id}p=id, the fibre is a singleton and H=π1(X,x0)H=\pi_1(X,x_0)H=π1​(X,x0​) gives one coset: consistent. If EEE is simply connected, H=1H=1H=1 and the statement says ∣p−1(x0)∣=∣π1(X,x0)∣|p^{-1}(x_0)| = |\pi_1(X,x_0)|∣p−1(x0​)∣=∣π1​(X,x0​)∣ (as cardinals).
  • Group-law convention. End in Mathlib multiplies by f * g = g ≫ f, so the group law on FundamentalGroup is reverse concatenation relative to some textbooks. This does not affect the image subgroup as a set nor the coset count.
  • Universes. The fibre lives in Type u_1 and the coset type in Type u_2; Equiv between different universes is allowed, so no universe restriction is imposed.
  • Nothing is said about the fibre over other points x≠x0x\neq x_0x=x0​ (though by connectedness of XXX all fibres have the same cardinality; this is not part of the statement).
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