Zulip Chat Archive
Stream: Is there code for X?
Topic: How to deal with fundamental group (homotopy class)
Ruize Chen (Mar 21 2025 at 13:59):
Hi, I am trying to use the homotopy lifting property to prove the isomorphism between the fundamental group of S^1 and integer Z. However, I need to use the homotopy lifting on the actual path in the homotopy class (which is an element of the fundamental group). I cannot do that in lean because the definition of a fundamental group relies on the category theory. I think I cannot understand and use the Path.Homotopic.Quotient. How can I make lean 'understand' fundamental group from the basic concept like homotopy between paths?
Aaron Liu (Mar 21 2025 at 14:05):
To lift an element of the fundamental group, you define a lift for paths and prove that lifting two homotopic paths gives the same result
Aaron Liu (Mar 21 2025 at 14:05):
This lifts the lift on paths to a lift on the fundamental group
Ruize Chen (Mar 21 2025 at 14:07):
Yeah I know, I think that is basically what I am wondering, I tried that, but I cannot do it last night
Aaron Liu (Mar 21 2025 at 14:09):
Are you coming from docs#FundamentalGroup
Ruize Chen (Mar 21 2025 at 14:11):
yes, I am trying to understand the FundamentalGroup.toPathand FundamentalGroup.fromPath
Aaron Liu (Mar 21 2025 at 14:15):
It looks like docs#FundamentalGroup.toPath and docs#FundamentalGroup.fromPath both take the type argument as a bundled topological space, which is weird
Ruize Chen (Mar 21 2025 at 14:18):
I just don't understand the structure, honestly, I am expecting some function to do the transformation but that sounds unrealistic due to the structure of the fundamental group and classes
Aaron Liu (Mar 21 2025 at 14:19):
What kind of transformation do you want?
Ruize Chen (Mar 21 2025 at 14:20):
From the homotopic statement to the equivalence of the two elements in fundamental group
Aaron Liu (Mar 21 2025 at 14:23):
How are you building the elements of the fundamental group from paths?
Ruize Chen (Mar 21 2025 at 14:25):
from the quotient of paths
Ruize Chen (Mar 21 2025 at 14:26):
I think I will try more today about using quotient.
Adam Topaz (Mar 21 2025 at 15:25):
Do we have Van-Kampen? If so, then the proof should be relatively easy.
Edit: Sorry, this was meant for the fundamental group of the sphere topic elsewhere in this stream.
Jz Pan (Mar 21 2025 at 15:29):
Do we have universal covering spaces in mathlib? Maybe you can prove that R is the universal covering space of S^1.
Ruize Chen (Mar 21 2025 at 15:29):
Adam Topaz said:
Do we have Van-Kampen? If so, then the proof should be relatively easy.
Edit: Sorry, this was meant for the fundamental group of the sphere topic elsewhere in this stream.
I searched for the similar stuff in zulip before starting this project, I think it's in someone's todo list
Ruize Chen (Mar 21 2025 at 15:48):
I think there is no direct structure corresponds to universal covering space (In the Algebraic Topology part of mathlib), I tried lean search, But I think it's possible to define one. (Not sure) The next step will be pointing out the decktransformation. (I haven't found the theorem to that).
Ruize Chen (Mar 21 2025 at 15:55):
(There is covering map and space, I am aware of that. ) I think successfully proving the thing using one of the two methods (Homotopy lifting or deck transformation) will be very nice to have. I think we have (or about to) the HLP in the mathlib. So I am trying to understand and evaluate this method originally, I haven't understood everything yet. @Edison Xie and @David Ang and I was working on this last night, we definitely need more api to achieve that.
Ruize Chen (Mar 21 2025 at 15:57):
Honestly I prefer deck transformation mathematically, it looks good, but without the important theorem, It might be painful to do as well.
Jireh Loreaux (Mar 21 2025 at 16:03):
Instead of proving π₁(𝕋) ≃* Multiplicative ℤ
, I suggest developing the more general theory in Mathlib first.
Ruize Chen (Mar 21 2025 at 16:06):
Yeah that's probably what's missing, I chose this as one of my assessed project (I am undergraduate). my plan is generalising the content and leaving some valuable sorry s. so that it doesn't die as an unfinished thing
Ruize Chen (Mar 21 2025 at 16:07):
and hopefully find out what is actually missing or needed.
Ruize Chen (Mar 21 2025 at 16:20):
image.png
I am trying to find out what I can do about setoid
Aaron Liu (Mar 21 2025 at 16:29):
Define your map on the paths, define a map on the quotient by Quotient.lift map proof
, and define the map on the fundamental group by fun x => mapQuot (toPath x)
Ruize Chen (Mar 21 2025 at 18:02):
I want to prove that the p is a covering space, but I got this
image.png
I used to play with teh trivialization but under the assumption, it's the first time I actually create one, I am using IsCoveringMap.mk to do this
abbrev uc := AddCircle (1 : ℝ)
def zero_loop := fun (t : I) ↦ (0 : uc)
def p_cov_map := fun (k : ℝ) ↦ (k : uc)
def F := fun (k : uc) ↦ ↑(p_cov_map ⁻¹' {k})
def triv_cov := fun (k : uc) ↦ Trivialization (F k) p_cov_map
#check (Trivialization ↑(p_cov_map ⁻¹' {(0 : uc)}) p_cov_map)
lemma h_triv : ∀ (k : uc), k ∈ (triv_cov k).baseSet
I am wondering what is going on. is there anything I need to change to fix this issue?
Edison Xie (Mar 21 2025 at 19:02):
(deleted)
Aaron Liu (Mar 21 2025 at 19:04):
You are trying to take the base set of the type of trivializations
Aaron Liu (Mar 21 2025 at 19:04):
This does not work
Ruize Chen (Mar 21 2025 at 19:04):
yeah because I want to feed the lemma to .mk, to get a coveringmap statement
Aaron Liu said:
You are trying to take the base set of the type of trivializations
Ruize Chen (Mar 21 2025 at 19:05):
Ruize Chen (Mar 21 2025 at 19:05):
I might get the thing wrong but to me it seems like in the theorem, similar things are made (e x).baseSet
Michał Mrugała (Mar 21 2025 at 19:08):
Ruize Chen said:
it's probably better to link to the docs rather than use screenshots, like so: docs#IsCoveringMap.mk
Edison Xie (Mar 21 2025 at 19:11):
are you sure you want the set of all trivialization?
Edison Xie (Mar 21 2025 at 19:11):
@Ruize Chen
Aaron Liu (Mar 21 2025 at 19:13):
def triv_cov (k : uc) : Trivialization (F k) p_cov_map where
toFun := sorry
invFun := sorry
source := sorry
target := sorry
map_source' := sorry
map_target' := sorry
left_inv' := sorry
right_inv' := sorry
open_source := sorry
open_target := sorry
continuousOn_toFun := sorry
continuousOn_invFun := sorry
baseSet := sorry
open_baseSet := sorry
source_eq := sorry
target_eq := sorry
proj_toFun := sorry
Aaron Liu (Mar 21 2025 at 19:13):
try this
Aaron Liu (Mar 21 2025 at 19:14):
If you prove you have a fiber bundle then you can also use docs#FiberBundle.trivializationAt
Aaron Liu (Mar 21 2025 at 19:15):
and then pull through a homeomorphism
Aaron Liu (Mar 21 2025 at 19:16):
nvm defining a fiber bundle needs a trivialization
Ruize Chen (Mar 21 2025 at 19:41):
Aaron Liu said:
def triv_cov (k : uc) : Trivialization (F k) p_cov_map where toFun := sorry invFun := sorry source := sorry target := sorry map_source' := sorry map_target' := sorry left_inv' := sorry right_inv' := sorry open_source := sorry open_target := sorry continuousOn_toFun := sorry continuousOn_invFun := sorry baseSet := sorry open_baseSet := sorry source_eq := sorry target_eq := sorry proj_toFun := sorry
I am wondering according to the definition of docs#Trivialization, I just need to give it F and proj (p_cov_map), should it be the user to define it from the groud?
Ruize Chen (Mar 21 2025 at 21:16):
Ruize Chen said:
Aaron Liu said:
def triv_cov (k : uc) : Trivialization (F k) p_cov_map where toFun := sorry invFun := sorry source := sorry target := sorry map_source' := sorry map_target' := sorry left_inv' := sorry right_inv' := sorry open_source := sorry open_target := sorry continuousOn_toFun := sorry continuousOn_invFun := sorry baseSet := sorry open_baseSet := sorry source_eq := sorry target_eq := sorry proj_toFun := sorry
I am wondering according to the definition of docs#Trivialization, I just need to give it F and proj (p_cov_map), should it be the user to define it from the groud?
probably I need to do this
Aaron Liu (Mar 21 2025 at 21:16):
Ruize Chen said:
I am wondering according to the definition of docs#Trivialization, I just need to give it F and proj (p_cov_map), should it be the user to define it from the groud?
Compare with docs#Equiv: you just need to give it α
and β
, but that doesn't mean you get an Equiv.
Ruize Chen (Mar 21 2025 at 21:17):
Yeah I just read that, I need to prove something
Junyan Xu (Mar 22 2025 at 00:25):
I think currently it's annoying to work with the fundamental group because it's not defeq to the homotopy class of paths from a point to itself (Path.Homotopic.Quotient), but the units in this type ("Aut" in category theory rather than "End"). This is being changed in #22771.
Aaron Liu said:
To lift an element of the fundamental group, you define a lift for paths and prove that lifting two homotopic paths gives the same result
This is done in #22771 and it's a direct consequence of IsCoveringMap.liftPath_apply_one_eq_of_homotopicRel.
Aaron Liu said:
It looks like docs#FundamentalGroup.toPath and docs#FundamentalGroup.fromPath both take the type argument as a bundled topological space, which is weird
This is being changed in #22771.
Jz Pan said:
Do we have universal covering spaces in mathlib? Maybe you can prove that R is the universal covering space of S^1.
It's shown in #7596 that R->S^1 (AddCircle) is a covering map, and we know R is contractible and therefore simply-connected, so ...
I also commented what generality we should aim for for mathlib.
Junyan Xu (Mar 22 2025 at 00:32):
The lifting criterion will be used to show the group of deck transformations act transitively on the fibers if the covering map is Galois (the induced map between fundamental groups has normal image). (For the universal cover this is always the case since the image is trivial; in algebra we correspondingly know that the separable closure of a field is always Galois.)
Junyan Xu (Mar 22 2025 at 01:14):
But in the case of R -> S^1 you start from a group action (by translations) which are the deck transformations so you don't need to construct them. If you fix a basepoint in p ⁻¹' {x}
, using monodromy
you get a point in p ⁻¹' {x}
for each element in the fundamental group at x
. Any two elements in p ⁻¹' {x}
differ by an element in the group (Z in this case), so you get a map from the fundamental group to Z, and you only have to show it's an isomorphism.
Last updated: May 02 2025 at 03:31 UTC