Hatcher §1.3: covering spaces, and , isomorphisms, deck transformations, normal covers, covering space actions
DefinitionHatcher_CoveringThis bundle fixes the objects of Hatcher, Section 1.3 (pp. 56–72), in the book-wide namespace Hatcher. A covering space of is a map satisfying Mathlib's IsCoveringMap (each has an evenly covered open neighborhood; may be empty, so need not be surjective, as on p. 56).
-
IsSemilocallySimplyConnected X(p. 63): each has a neighborhood such that every loop at with image in is null-homotopic in , i.e. the inclusion-induced map is trivial. -
coverHom p hp heis for a continuous with , andcoverSubgroup p hp heis its image (p. 61). -
deckGroup pis the group of deck transformations (p. 70): the homeomorphisms with , as a subgroup of the group of self-homeomorphisms of under composition.IsNormalCover p(p. 70): for every pair with there is a deck transformation taking to . -
CoveringSpace Xis a covering space of as a structure: a total space (in the same universe as ), its topology, the map and the proof that is a covering map.PointedCover X x₀adds a basepoint with , andPointedCover.subgroupis the associated subgroup of Theorem 1.38. -
IsIsomorphic C₁ C₂(p. 67): there is a homeomorphism with .IsPointedIsomorphic C₁ C₂: such an with moreover . -
IsCoveringSpaceAction G Yis Hatcher's condition (p. 72) for an action of a group on a space : each acts continuously (so by a homeomorphism), and each has a neighborhood with only for , i.e. the translates are pairwise disjoint. -
OrbitSpace G Yis the orbit space (p. 72), the quotient of by the orbit relation with the quotient topology, andorbitProj G Yis the quotient map , , with the (trivial) lemma that it is continuous.
Formalization Note Path-connectedness of covering spaces is not built into the structures; it is assumed where Hatcher assumes it. The subgroup depends on the choice of basepoint in the fibre, and is recorded through the proof he : p e₀ = x₀. The group law on E ≃ₜ E is composition, (f * g) e = f (g e).
import Mathlib
/-!
Hatcher, *Algebraic Topology*, Section 1.3 "Covering Spaces" (pp. 56–72).
Objects appearing in the classification of covering spaces and in the theory of deck
transformations: semilocal simple connectivity (p. 63), the induced homomorphism
`p_* : π₁(X̃, x̃₀) → π₁(X, x₀)` and its image subgroup `H = p_*(π₁(X̃, x̃₀))` (p. 61),
covering spaces of `X` with and without basepoints and their isomorphisms (p. 67),
the deck transformation group `G(X̃)` and normal covering spaces (p. 70), and covering
space actions with their orbit spaces `Y/G` (p. 72).
-/
noncomputable section
namespace Hatcher
universe u
section SpaceProperties
variable (X : Type*) [TopologicalSpace X]
/-- Hatcher, p. 63: `X` is **semilocally simply-connected** if each point `x ∈ X` has a
neighborhood `U` such that the inclusion-induced map `π₁(U, x) → π₁(X, x)` is trivial, i.e.
every loop at `x` contained in `U` is null-homotopic in `X`. -/
def IsSemilocallySimplyConnected : Prop :=
∀ x : X, ∃ U ∈ nhds x, ∀ γ : Path x x, (∀ t, γ t ∈ U) → γ.Homotopic (Path.refl x)
end SpaceProperties
section CoveringMap
variable {E X : Type*} [TopologicalSpace E] [TopologicalSpace X] (p : E → X)
/-- `p_* : π₁(X̃, x̃₀) → π₁(X, x₀)`, the homomorphism induced by a covering space
`p : (X̃, x̃₀) → (X, x₀)` (Hatcher, p. 61). -/
def coverHom (hp : Continuous p) {e₀ : E} {x₀ : X} (he : p e₀ = x₀) :
FundamentalGroup E e₀ →* FundamentalGroup X x₀ :=
FundamentalGroup.mapOfEq ⟨p, hp⟩ he
/-- The image subgroup `H = p_*(π₁(X̃, x̃₀)) ⊆ π₁(X, x₀)` of a covering space
`p : (X̃, x̃₀) → (X, x₀)` (Hatcher, p. 61). -/
def coverSubgroup (hp : Continuous p) {e₀ : E} {x₀ : X} (he : p e₀ = x₀) :
Subgroup (FundamentalGroup X x₀) :=
(coverHom p hp he).range
/-- The group `G(X̃)` of **deck transformations** of `p : X̃ → X` (Hatcher, p. 70): the
homeomorphisms `f : X̃ → X̃` with `p ∘ f = p`, a subgroup of the group of all
self-homeomorphisms of `X̃` under composition. -/
def deckGroup : Subgroup (E ≃ₜ E) where
carrier := {f | ∀ e, p (f e) = p e}
mul_mem' {f g} hf hg e := by
change p (f (g e)) = p e
rw [hf, hg]
one_mem' _ := rfl
inv_mem' {f} hf e := by
change p (f.symm e) = p e
rw [← hf (f.symm e), f.apply_symm_apply]
/-- `p : X̃ → X` is a **normal** covering space (Hatcher, p. 70): for each `x ∈ X` and each
pair of lifts `x̃, x̃'` of `x` there is a deck transformation taking `x̃` to `x̃'`. -/
def IsNormalCover : Prop :=
∀ e e' : E, p e = p e' → ∃ f ∈ deckGroup p, f e = e'
end CoveringMap
section Classification
variable (X : Type u) [TopologicalSpace X]
/-- A **covering space** of `X` (Hatcher, p. 56): a space `X̃` together with a covering map
`p : X̃ → X`. -/
structure CoveringSpace where
/-- The total space `X̃`. -/
E : Type u
[topE : TopologicalSpace E]
/-- The covering map `p : X̃ → X`. -/
p : E → X
isCoveringMap : IsCoveringMap p
attribute [instance] CoveringSpace.topE
/-- A covering space `p : (X̃, x̃₀) → (X, x₀)` with a chosen basepoint `x̃₀ ∈ p⁻¹(x₀)`
(Hatcher, p. 61). -/
structure PointedCover (x₀ : X) extends CoveringSpace X where
/-- The basepoint `x̃₀ ∈ X̃`. -/
e₀ : E
p_e₀ : p e₀ = x₀
variable {X}
/-- Two covering spaces `p₁ : X̃₁ → X`, `p₂ : X̃₂ → X` are **isomorphic** (Hatcher, p. 67) if there
is a homeomorphism `f : X̃₁ → X̃₂` with `p₁ = p₂ ∘ f`. -/
def IsIsomorphic (C₁ C₂ : CoveringSpace X) : Prop :=
∃ f : C₁.E ≃ₜ C₂.E, ∀ e, C₂.p (f e) = C₁.p e
/-- The subgroup `p_*(π₁(X̃, x̃₀)) ⊆ π₁(X, x₀)` associated to a covering space with basepoint
(Hatcher, Theorem 1.38, p. 67). -/
def PointedCover.subgroup {x₀ : X} (C : PointedCover X x₀) : Subgroup (FundamentalGroup X x₀) :=
coverSubgroup C.p C.isCoveringMap.continuous C.p_e₀
/-- Two covering spaces with basepoints are **isomorphic preserving basepoints** (Hatcher,
Proposition 1.37, p. 67): there is an isomorphism `f : X̃₁ → X̃₂` of covering spaces
taking `x̃₁` to `x̃₂`. -/
def IsPointedIsomorphic {x₀ : X} (C₁ C₂ : PointedCover X x₀) : Prop :=
∃ f : C₁.E ≃ₜ C₂.E, (∀ e, C₂.p (f e) = C₁.p e) ∧ f C₁.e₀ = C₂.e₀
end Classification
section GroupActions
variable (G : Type*) [Group G] (Y : Type*) [TopologicalSpace Y] [MulAction G Y]
/-- Hatcher's condition `(∗)` (p. 72): an action of `G` on `Y` by homeomorphisms is a
**covering space action** if each `y ∈ Y` has a neighborhood `U` such that the images `g(U)`,
`g ∈ G`, are pairwise disjoint; equivalently, `U ∩ g(U) ≠ ∅` only for `g = 1`. -/
def IsCoveringSpaceAction : Prop :=
(∀ g : G, Continuous fun y : Y => g • y) ∧
∀ y : Y, ∃ U ∈ nhds y, ∀ g : G, ((fun z => g • z) '' U ∩ U).Nonempty → g = 1
/-- The **orbit space** `Y/G` (Hatcher, p. 72): the quotient of `Y` identifying each `y` with
all its images `g(y)`, `g ∈ G`, with the quotient topology. -/
abbrev OrbitSpace : Type _ := MulAction.orbitRel.Quotient G Y
/-- The quotient map `p : Y → Y/G`, `p(y) = Gy` (Hatcher, Proposition 1.40, p. 72). -/
def orbitProj : Y → OrbitSpace G Y := Quotient.mk _
theorem continuous_orbitProj : Continuous (orbitProj G Y) := continuous_quotient_mk'
end GroupActions
end Hatcher
end
Read-back
What the Lean code literally says, in plain math · claude-fable-5-1
Read-back of the definition bundle Def_Hatcher_Covering (namespace Hatcher)
Everything below is a literal transcription of what the Lean declarations assert, with the relevant Mathlib definitions unpacked. The whole file is inside noncomputable section and namespace Hatcher; one universe variable u is declared.
Mathlib background used throughout
Path x y(forx y : X,Xa topological space) is a continuous map (domainunitInterval, the subtype ) with , .γ tis function application after coercion.Path.Homotopic γ γ'isNonempty (γ.Homotopy γ'), andPath.HomotopyisContinuousMap.HomotopyRel γ γ' {0,1}: a continuous with , and for . So it is homotopy relative to the endpoints (a homotopy of paths in the textbook sense), taking place in the ambient space .Path.Homotopic.Quotient x yisQuotient (Path.Homotopic.setoid x y), the set of path-homotopy classes of paths from to .FundamentalGroup X xis the abbreviationEnd (FundamentalGroupoid.mk x). Since the Hom-sets ofFundamentalGroupoid XarePath.Homotopic.Quotient x.as y.asand composition isPath.Homotopic.Quotient.trans, the underlying set is exactly = path-homotopy classes of loops at . The group law is the endomorphism-monoid law,p * q = q ≫ p, i.e.p * q = q.trans p(Mathlib'sFundamentalGroup.mul_def): "" traverses first and then . This is the opposite of Hatcher's convention (traverse first). The two groups are anti-isomorphic, hence isomorphic via ; images/subgroups/normality are unaffected as sets, but any statement involving specific products must be read with the reversed order.1 = ⟦Path.refl x⟧,p⁻¹ = p.symm.FundamentalGroup.mapOfEq (f : C(X,Y)) (h : f x = y) : π₁(X,x) →* π₁(Y,y)satisfies (Mathlib'smapOfEq_apply)mapOfEq f h p = (Path.Homotopic.Quotient.map p f).cast h.symm h.symm, i.e. , with the endpoints of (which are ) re-labelled as using . It is the induced homomorphism .IsCoveringMap p(Mathlib,Topology/Covering/Basic.lean) is∀ x, IsEvenlyCovered p x (p ⁻¹' {x}), whereIsEvenlyCovered f x IisDiscreteTopology I ∧ ∃ U : Set X, x ∈ U ∧ IsOpen U ∧ IsOpen (f ⁻¹' U) ∧ ∃ H : f ⁻¹' U ≃ₜ U × I, ∀ z, (H z).1.1 = f z. So: every has an open neighbourhood such that is open and there is a homeomorphism over , with discrete. Surjectivity is not required; the fibre may be empty (Mathlib's own file comment says so explicitly), in which case . Such apis automatically continuous (IsCoveringMap.continuous). No connectedness, Hausdorffness, or local-connectedness is imposed on or .nhds x(𝓝 x) is the neighbourhood filter;U ∈ nhds xmeans there is an open with (mem_nhds_iff).Uitself need not be open.- Group structure on
E ≃ₜ E(Topology/Homeomorph/Defs.lean):mul f g := g.trans f, so(f * g) e = f (g e)(ordinary composition,fapplied last);1 = Homeomorph.refl E;f⁻¹ = f.symm. MonoidHom.range φis the subgroup with carrierSet.range φ;y ∈ φ.range ↔ ∃ x, φ x = y.MulAction.orbitRel G αis the setoid witha ≈ b ↔ a ∈ MulAction.orbit G b, i.e. .MulAction.orbitRel.Quotient G αis the abbreviationQuotient (orbitRel G α). Ifαhas a topology, the instanceinstTopologicalSpaceQuotientgivesQuotient sthe topology coinduced byQuotient.mk', i.e. the quotient topology ( open iff its preimage is open).
1. IsSemilocallySimplyConnected
variable (X : Type*) [TopologicalSpace X]
def IsSemilocallySimplyConnected : Prop :=
∀ x : X, ∃ U ∈ nhds x, ∀ γ : Path x x, (∀ t, γ t ∈ U) → γ.Homotopic (Path.refl x)
Parameters. X : Type* (its own universe variable, explicit argument), [TopologicalSpace X].
Assertion. For every point there is a set that is a neighbourhood of (contains an open set containing ; need not be open) such that every loop based at whose image lies entirely in (i.e. for all ) is path-homotopic in (rel endpoints) to the constant loop at .
Remarks.
- Only loops based at lying in are tested, not loops based at other points of . This matches Hatcher's definition (each has a neighbourhood with trivial), because is exactly loops at in modulo homotopy in , and "the induced map is trivial" means each such loop is null-homotopic in .
- The non-openness of is harmless: if works then any subset of containing works, so one may shrink to an open set. The condition is equivalent to the textbook one.
- For an empty
Xthe statement is vacuously true.
2. coverHom
variable {E X : Type*} [TopologicalSpace E] [TopologicalSpace X] (p : E → X)
def coverHom (hp : Continuous p) {e₀ : E} {x₀ : X} (he : p e₀ = x₀) :
FundamentalGroup E e₀ →* FundamentalGroup X x₀ :=
FundamentalGroup.mapOfEq ⟨p, hp⟩ he
Parameters. Topological spaces E, X (separate Type* universes), an arbitrary function p : E → X (explicit), a proof hp that p is continuous, implicit points e₀ : E, x₀ : X, and he : p e₀ = x₀.
Object defined. The group homomorphism , (endpoints relabelled from to via he). No covering hypothesis: it is the induced map of any continuous map.
3. coverSubgroup
def coverSubgroup (hp : Continuous p) {e₀ : E} {x₀ : X} (he : p e₀ = x₀) :
Subgroup (FundamentalGroup X x₀) := (coverHom p hp he).range
Object defined. The subgroup , i.e. . Same parameters as coverHom. Again defined for any continuous p, not only coverings.
4. deckGroup
def deckGroup : Subgroup (E ≃ₜ E) where
carrier := {f | ∀ e, p (f e) = p e}
...
Parameters. E, X topological spaces, p : E → X an arbitrary function (explicit; no continuity or covering hypothesis).
Object defined. The subgroup of the group of self-homeomorphisms consisting of those with . Group operation: (f * g) e = f (g e) (composition, g first), identity Homeomorph.refl, inverse f.symm. The mul_mem', one_mem', inv_mem' fields check closure under these.
Remarks. This is the standard deck-transformation group of Hatcher §1.3, extended verbatim to any map. It uses the full homeomorphism group, so members are automatically continuous with continuous inverse.
5. IsNormalCover
def IsNormalCover : Prop := ∀ e e' : E, p e = p e' → ∃ f ∈ deckGroup p, f e = e'
Assertion. For every pair with there is a deck transformation (self-homeomorphism with ) with : the deck group acts transitively on every fibre.
Remarks. Exactly Hatcher's definition of a normal covering ("for each and each pair of lifts there is a deck transformation taking to "). However p here is any function; no hypothesis that it is a covering or that is connected. Vacuously true when E is empty.
6. CoveringSpace
variable (X : Type u) [TopologicalSpace X]
structure CoveringSpace where
E : Type u
[topE : TopologicalSpace E]
p : E → X
isCoveringMap : IsCoveringMap p
attribute [instance] CoveringSpace.topE
Object defined. A structure bundling a type E in the same universe u as X (a genuine restriction compared to the Type* sections; e.g. no Type (u+1) total spaces), a topology on E (registered as an instance), a map p : E → X, and a proof that p is a covering map in Mathlib's sense (locally trivial with discrete fibres, fibres possibly empty, p not necessarily surjective, E not necessarily nonempty or connected).
7. PointedCover
structure PointedCover (x₀ : X) extends CoveringSpace X where
e₀ : E
p_e₀ : p e₀ = x₀
Object defined. A CoveringSpace X together with a point e₀ : E and a proof . Since e₀ exists, E is nonempty and the fibre over is nonempty.
8. IsIsomorphic
variable {X}
def IsIsomorphic (C₁ C₂ : CoveringSpace X) : Prop :=
∃ f : C₁.E ≃ₜ C₂.E, ∀ e, C₂.p (f e) = C₁.p e
Assertion. There is a homeomorphism with . This is Hatcher's isomorphism of covering spaces (of the same base , unpointed).
9. PointedCover.subgroup
def PointedCover.subgroup {x₀ : X} (C : PointedCover X x₀) : Subgroup (FundamentalGroup X x₀) :=
coverSubgroup C.p C.isCoveringMap.continuous C.p_e₀
Object defined. The subgroup attached to a pointed cover; continuity of p is derived from the covering hypothesis. This is the "induced subgroup" of Hatcher Thm 1.38.
10. IsPointedIsomorphic
def IsPointedIsomorphic {x₀ : X} (C₁ C₂ : PointedCover X x₀) : Prop :=
∃ f : C₁.E ≃ₜ C₂.E, (∀ e, C₂.p (f e) = C₁.p e) ∧ f C₁.e₀ = C₂.e₀
Assertion. There is a homeomorphism with and : basepoint-preserving isomorphism of covering spaces.
11. IsCoveringSpaceAction
variable (G : Type*) [Group G] (Y : Type*) [TopologicalSpace Y] [MulAction G Y]
def IsCoveringSpaceAction : Prop :=
(∀ g : G, Continuous fun y : Y => g • y) ∧
∀ y : Y, ∃ U ∈ nhds y, ∀ g : G, ((fun z => g • z) '' U ∩ U).Nonempty → g = 1
Parameters. A group G (no topology on G), a topological space Y, and a (left) group action G on Y (MulAction: 1 • y = y, (g h) • y = g • (h • y)).
Assertion. (i) For every , the map is continuous (hence, having continuous inverse , a homeomorphism). (ii) Every has a neighbourhood (in nhds y, not necessarily open) such that for every , if then . (Because '' has precedence 80 and ∩ has 70, the expression is ((g • ·) '' U) ∩ U.)
Remarks. Hatcher's condition (§1.3, "covering space action") is: each has a neighbourhood with . Applying shows this is equivalent to (ii). Non-openness of is harmless (shrinking preserves the property). The condition forces the action to be free. It is vacuously satisfied by the empty space.
12. OrbitSpace
abbrev OrbitSpace : Type _ := MulAction.orbitRel.Quotient G Y
Object defined. The quotient set of Y by the orbit relation , equipped (through the Quotient instance) with the quotient topology coinduced by the projection. As an abbrev it unfolds transparently, so all Quotient API and instances apply.
13. orbitProj
def orbitProj : Y → OrbitSpace G Y := Quotient.mk _
Object defined. The canonical projection , (the setoid argument is inferred as orbitRel G Y).
14. continuous_orbitProj
theorem continuous_orbitProj : Continuous (orbitProj G Y) := continuous_quotient_mk'
Assertion. The projection is continuous. This is immediate from the definition of the quotient (coinduced) topology; it carries no content beyond that, and does not assert that the projection is open or a covering map.
Global remarks
- Universes. Sections
SpaceProperties,CoveringMap,GroupActionsuseType*(independent universe variables for each type). SectionClassificationfixesX : Type uand forcesE : Type uinCoveringSpace;FundamentalGroup X x₀ : Type uas well. - What is not assumed anywhere. No definition requires or to be path-connected, locally path-connected, nonempty, Hausdorff, or that
pbe surjective. The MathlibIsCoveringMappermits empty fibres. ThedeckGroup/IsNormalCover/coverHom/coverSubgroupdefinitions do not even requirepto be a covering (only continuity, where needed). Consequently theorems about these notions need to import the appropriate hypotheses explicitly, and a textbook reader should check each theorem for them. - Group-law orientation.
FundamentalGroupmultiplication isp * q = q.trans p, reversed relative to Hatcher. This does not change which subsets are subgroups, images, kernels, or normal subgroups, but it does change the reading of any explicit product or conjugation formula.
Confirmed by the mission captain (proposal self-audit).