Hatcher §1.2: the homomorphisms , , and the normal subgroup of van Kampen's theorem
DefinitionHatcher_VanKampenThis bundle fixes the objects appearing in the statement of van Kampen's theorem (Hatcher, Section 1.2, pp. 42–43), in the book-wide namespace Hatcher.
Let be a topological space with basepoint and let be a family of subsets of , each containing (hypothesis hx₀). Each and each carries the subspace topology, and is regarded as a point of them (basept, basept₂).
-
inclHom αis , the homomorphism induced by the inclusion . -
FreeProdis the free product (Mathlib'sMonoid.CoprodI), andvanKampenHomis
the unique homomorphism restricting to on each factor.
-
interHomLeft α βandinterHomRight α βare and , induced by the two inclusions of . -
vanKampenRelatorsis the set of elements of the free product, for all and all , andvanKampenNormalis , the normal subgroup they generate (with itsNormalinstance). -
loopIn α gregards a loop in at as a loop in , andloopProdforms the product of a finite list of loops at (the empty product being the constant loop).
These are the data of Theorem 1.20: is surjective and under Hatcher's hypotheses on the cover.
Formalization Note Both and are defined on , so the set of relators ranges over ordered pairs and no identification is needed. Induced homomorphisms are Mathlib's FundamentalGroup.mapOfEq. No hypotheses on the cover (openness, path-connectedness) are part of the definitions; they are stated on each theorem.
import Mathlib
/-!
Hatcher, *Algebraic Topology*, Section 1.2 "Van Kampen's Theorem" (pp. 41–43).
Data for van Kampen's theorem: a space `X` with basepoint `x₀`, a family of subsets
`A α` each containing `x₀`, the homomorphisms `j_α : π₁(A_α) → π₁(X)` induced by the
inclusions, their extension `Φ : ∗_α π₁(A_α) → π₁(X)` to the free product, the
homomorphisms `i_{αβ} : π₁(A_α ∩ A_β) → π₁(A_α)`, and the normal subgroup `N`
generated by the elements `i_{αβ}(ω) i_{βα}(ω)⁻¹`.
-/
noncomputable section
namespace Hatcher
variable {X : Type*} [TopologicalSpace X] {ι : Type*} (A : ι → Set X) (x₀ : X)
(hx₀ : ∀ α, x₀ ∈ A α)
/-- The basepoint `x₀`, viewed as a point of the subspace `A α`. -/
def basept (α : ι) : A α := ⟨x₀, hx₀ α⟩
/-- The basepoint `x₀`, viewed as a point of the subspace `A α ∩ A β`. -/
def basept₂ (α β : ι) : ↥(A α ∩ A β) := ⟨x₀, hx₀ α, hx₀ β⟩
/-- `j_α : π₁(A_α, x₀) → π₁(X, x₀)`, induced by the inclusion `A_α ↪ X`. -/
def inclHom (α : ι) : FundamentalGroup (A α) (basept A x₀ hx₀ α) →* FundamentalGroup X x₀ :=
FundamentalGroup.mapOfEq ⟨Subtype.val, continuous_subtype_val⟩ rfl
/-- The free product `∗_α π₁(A_α, x₀)`. -/
abbrev FreeProd : Type _ := Monoid.CoprodI (fun α => FundamentalGroup (A α) (basept A x₀ hx₀ α))
/-- `Φ : ∗_α π₁(A_α, x₀) → π₁(X, x₀)`, the extension of the `j_α` to the free product. -/
def vanKampenHom : FreeProd A x₀ hx₀ →* FundamentalGroup X x₀ :=
Monoid.CoprodI.lift (inclHom A x₀ hx₀)
/-- `i_{αβ} : π₁(A_α ∩ A_β, x₀) → π₁(A_α, x₀)`, induced by the inclusion `A_α ∩ A_β ↪ A_α`. -/
def interHomLeft (α β : ι) :
FundamentalGroup ↥(A α ∩ A β) (basept₂ A x₀ hx₀ α β) →* FundamentalGroup (A α) (basept A x₀ hx₀ α) :=
FundamentalGroup.mapOfEq ⟨Set.inclusion Set.inter_subset_left, continuous_inclusion _⟩ rfl
/-- `i_{βα} : π₁(A_α ∩ A_β, x₀) → π₁(A_β, x₀)`, induced by the inclusion `A_α ∩ A_β ↪ A_β`. -/
def interHomRight (α β : ι) :
FundamentalGroup ↥(A α ∩ A β) (basept₂ A x₀ hx₀ α β) →* FundamentalGroup (A β) (basept A x₀ hx₀ β) :=
FundamentalGroup.mapOfEq ⟨Set.inclusion Set.inter_subset_right, continuous_inclusion _⟩ rfl
/-- The elements `i_{αβ}(ω) i_{βα}(ω)⁻¹` of the free product, for `ω ∈ π₁(A_α ∩ A_β)`. -/
def vanKampenRelators : Set (FreeProd A x₀ hx₀) :=
{g | ∃ (α β : ι) (ω : FundamentalGroup ↥(A α ∩ A β) (basept₂ A x₀ hx₀ α β)),
g = (Monoid.CoprodI.of (interHomLeft A x₀ hx₀ α β ω) : FreeProd A x₀ hx₀) *
(Monoid.CoprodI.of (interHomRight A x₀ hx₀ α β ω) : FreeProd A x₀ hx₀)⁻¹}
/-- `N`, the normal subgroup of `∗_α π₁(A_α)` generated by the elements `i_{αβ}(ω) i_{βα}(ω)⁻¹`. -/
def vanKampenNormal : Subgroup (FreeProd A x₀ hx₀) :=
Subgroup.normalClosure (vanKampenRelators A x₀ hx₀)
instance vanKampenNormal_normal : (vanKampenNormal A x₀ hx₀).Normal :=
Subgroup.normalClosure_normal
/-- A loop in `A α` at `x₀`, regarded as a loop in `X` at `x₀`. -/
def loopIn (α : ι) (g : Path (basept A x₀ hx₀ α) (basept A x₀ hx₀ α)) : Path x₀ x₀ :=
g.map continuous_subtype_val
/-- The product `f₁ f₂ ⋯ f_m` of a finite list of loops at `x₀` (the empty product is the
constant loop). -/
def loopProd (l : List (Path x₀ x₀)) : Path x₀ x₀ :=
l.foldr (fun p q => p.trans q) (Path.refl x₀)
end Hatcher
end
Read-back
What the Lean code literally says, in plain math · claude-fable-5-1
Read-back: Hatcher definition bundle (van Kampen data)
Ambient data shared by every declaration
Every declaration below lives in a namespace called Hatcher and is parametrised by the following data, which are arguments to each declaration (the first two implicitly, the last three explicitly):
- a type equipped with a topology (no separation, connectedness, or path-connectedness assumption is made);
- an index type (arbitrary; it may be empty, finite, or infinite);
- a family of subsets , one for each (no hypothesis is imposed on the : they need not be open, path-connected, or cover , and distinct indices may give the same set);
- a point ;
- a proof that for every .
Throughout, a subset is regarded as a topological space in its own right by giving it the subspace topology inherited from ; its points are pairs (a point of , a proof that it lies in ). The intersection is likewise given the subspace topology.
Convention for fundamental groups used by the code. For a topological space and a point , the Mathlib object written below is the set of endpoint-preserving homotopy classes of loops with , made into a group as follows:
- the identity element is the class of the constant loop at ;
- the inverse of is the class of the reversed loop ;
- the product is reversed relative to concatenation order: for classes ,
where denotes the loop that first traverses a representative of (on , at double speed) and then a representative of (on , at double speed). Thus is " first, then ."
(Internally is the endomorphism monoid of the object in the fundamental groupoid of , whose morphisms are homotopy classes of paths from to and whose composition is " then "; the monoid product on endomorphisms is defined as , which produces the reversal just stated.)
Induced homomorphisms. For a continuous map and points , together with a proof that , Mathlib's FundamentalGroup.mapOfEq is the group homomorphism sending to , where the loop (based at ) is re-labelled as a loop based at using the equation . In every use below the proof of is the trivial one (the two sides are literally the same point), so the re-labelling does nothing and the map is simply .
1. basept
For each , is the point regarded as an element of the subspace , i.e. the pair
where is the supplied proof that . Its underlying point of is .
2. basept₂
For each pair (not required to be distinct), is the point regarded as an element of the subspace , i.e.
Its underlying point of is .
3. inclHom
For each , is a group homomorphism
It is the homomorphism induced (in the sense of "Induced homomorphisms" above) by the continuous map that sends a point of the subspace to its underlying point of (the subspace inclusion ), together with the trivial proof that . Concretely, a homotopy class of a loop in based at is sent to the homotopy class of the same loop viewed in . The domain and codomain groups carry the reversed-product convention stated above, and this map respects it.
4. FreeProd
is a type (introduced as an abbreviation, so it unfolds transparently): the Mathlib free product Monoid.CoprodI of the indexed family of groups
Explicitly, Monoid.CoprodI of a family of monoids is the quotient of the free monoid on the alphabet (letters are pairs with ) by the smallest monoid congruence such that
- the one-letter word is identified with the empty word, for every ; and
- the two-letter word is identified with the one-letter word , for every and .
Its multiplication is concatenation of words. Because each factor here is a group, Mathlib equips Monoid.CoprodI with a group structure (the inverse of a word is obtained by reversing it and inverting each letter in its own factor). So is the free product . If is empty, is the trivial group.
For each , the canonical homomorphism from the -th factor into the free product, written Monoid.CoprodI.of and denoted below, sends to the class of the one-letter word .
5. vanKampenHom
is a group homomorphism
namely the one obtained by Mathlib's universal-property map Monoid.CoprodI.lift from the family . It is the unique monoid homomorphism with for every . Concretely, the class of a word is sent to the product
computed in with the reversed-product convention above (so, as a loop, this is " first, then , …, then ", each viewed in ); the empty word goes to the identity.
6. interHomLeft
For each pair (not required to be distinct), is a group homomorphism
It is the homomorphism induced by the continuous map that sends a point of the intersection to the point of (this is Mathlib's Set.inclusion applied to the inclusion : the identity on underlying points, discarding the membership proof for ), together with the trivial proof that this map sends to . Concretely, with the loop re-viewed as a loop in .
7. interHomRight
For each pair , is a group homomorphism
induced by the continuous map sending (Mathlib's Set.inclusion for ), together with the trivial proof that is sent to . Concretely, with re-viewed as a loop in . Note that the same intersection (in that order) is the domain of both and .
8. vanKampenRelators
is a subset of , defined by
Here:
- and range independently over all of , including ;
- ranges over all elements of ;
- places the image of in into the -th factor of the free product, and places the image of in into the -th factor;
- the product and inverse are those of the group ; the inverse applies only to the second factor, so is the (class of the) two-letter word: first the letter , then the letter .
If is empty then is empty. When , both homomorphisms coincide and the corresponding element of is the identity.
9. vanKampenNormal
is a subgroup of : the Mathlib normal closure Subgroup.normalClosure of the set above. By definition this is the subgroup generated by the set of all conjugates of elements of ,
i.e. the smallest subgroup of containing every with and arbitrary. (Mathlib phrases "conjugates of " as all with .) If is empty, is the trivial subgroup.
10. vanKampenNormal_normal (instance)
This registers the fact that the subgroup is a normal subgroup of , i.e. for all and all , . The proof is Mathlib's general fact that the normal closure of any set is normal. It introduces no new data.
11. loopIn
For each and each path in the subspace from to (a Mathlib Path: a continuous map with , i.e. a loop in at ), is a path in from to , namely the composite of with the subspace inclusion (Mathlib's Path.map, whose underlying function is literally ). This is an actual path, not a homotopy class. Its endpoints are , which is by definition.
12. loopProd
For a finite list of paths in from to (each continuous with ), is a single path in from to , defined by a right fold with Mathlib's path concatenation Path.trans and the constant path (Mathlib's Path.refl) as the initial value:
where for paths the concatenation is the path
(" first, then ", each at double speed). In particular:
- for the empty list, , the constant loop at ;
- for , the resulting loop traverses on , on , and in general on for , and is constant at on the final interval ;
- the list order is the traversal order: is traversed first and last.
This is an actual parametrised path, not a homotopy class, and no relation to the group product of (whose convention is "second factor first") is asserted by this definition.
Confirmed by the mission captain (proposal self-audit).