1FundamentalGroup/Quest1 edits

This commit is contained in:
Jlh18 2021-09-19 13:47:41 +01:00
parent c2c37e796b
commit 16f39b5bf6
10 changed files with 183 additions and 12 deletions

View File

@ -66,7 +66,7 @@ We will fill the hole `{ }0`.
... ...
``` ```
This says you have some unfilled __holes_. This says you have some unfilled _holes_.
- navigate to the hole `{ }0` using `C-c C-f` (forward) or `C-c C-b` (backward) - navigate to the hole `{ }0` using `C-c C-f` (forward) or `C-c C-b` (backward)
- enter `C-c C-r`. The `r` stands for _refine_. - enter `C-c C-r`. The `r` stands for _refine_.
Whenever you do this whilst having your cursor in a hole, Whenever you do this whilst having your cursor in a hole,

View File

@ -41,7 +41,12 @@ you can hover over `Bool` in `agda` and use `M-SPC c d`.)
We will create a map `doubleCover : S¹ → Type` that sends We will create a map `doubleCover : S¹ → Type` that sends
`base` to `Bool` and the path `loop` to a non-trivial path `flipPath : Bool ≡ Bool` `base` to `Bool` and the path `loop` to a non-trivial path `flipPath : Bool ≡ Bool`
in the space of spaces. in the space of spaces.
(Insert gif of double cover.)
<img src="images/doubleCover.png"
alt="doubleCover"
width="500"
class="center"/>
Viewing the picture vertically, Viewing the picture vertically,
for each point `x : S¹`, for each point `x : S¹`,
we call `doubleCover x` the _fiber of `doubleCover` over `x`_. we call `doubleCover x` the _fiber of `doubleCover` over `x`_.
@ -52,7 +57,11 @@ in the fiber of `doubleCover` over `base`
by 'lifting the homotopy' `h : Refl ≡ loop` and considering the end points of by 'lifting the homotopy' `h : Refl ≡ loop` and considering the end points of
the 'lifted paths'. the 'lifted paths'.
`Refl` will 'lift' to a 'constant path' and `loop` will 'lift' to `Refl` will 'lift' to a 'constant path' and `loop` will 'lift' to
(Insert picture of 'lift' of `loop`)
<img src="images/lifted_loops.png"
alt="lifted_loops"
width="500"
class="center"/>
Let's assume for the moment that we have `flipPath` already and Let's assume for the moment that we have `flipPath` already and
define `doubleCover`. define `doubleCover`.

View File

@ -2,7 +2,11 @@
In this part, we will define the path `flipPath : Bool ≡ Bool`. In this part, we will define the path `flipPath : Bool ≡ Bool`.
Recall the picture of `doubleCover`. Recall the picture of `doubleCover`.
(Insert gif.)
<img src="images/doubleCover.png"
alt="doubleCover"
width="500"
class="center"/>
This means we need `flipPath` to correspond to This means we need `flipPath` to correspond to
the unique non-identity permutation of `Bool` the unique non-identity permutation of `Bool`

View File

@ -32,26 +32,29 @@ drawn as a dot `true`.
When we 'lift' `loop` - starting at the point `true : doubleCover base` - When we 'lift' `loop` - starting at the point `true : doubleCover base` -
it will look like it will look like
<!-- [insert picture] --> <img src="images/lifted_loops.png"
alt="lifted_loops"
width="500"
class="center"/>
The homotopy `h : Refl ≡ loop` is 'lifted' The homotopy `h : Refl ≡ loop` is 'lifted'
(starting at 'lifted `Refl`') (starting at 'lifted `Refl`')
to some kind of surface to some kind of surface
<!-- [insert picture] --> <img src="images/lifted_homotopy.png"
alt="lifted_homotopy"
width="500"
class="center"/>
According to the pictures the end point of the 'lifted' According to the pictures the end point of the 'lifted'
`Refl` is `true` and the end point of the 'lifted' `loop` is `false`. `Refl` is `true` and the end point of the 'lifted' `loop` is `false`.
We are interested in the end points of each We are interested in the end points of each
'lifted paths' in the 'lifted homotopy', 'lifted paths' in the 'lifted homotopy',
since this forms a path in the endpoint fiber `doubleCover base` since this forms a path in the endpoint fiber `doubleCover base`
from `true` to `false` from `true` to `false`.
<!-- [insert picture] -->
We can evaluate the end points of both 'lifted paths' by using We can evaluate the end points of both 'lifted paths' by using
something in the cubical library called `endPt` something in the cubical library (called `subst`) which we call `endPt`.
(originally called `subst`).
```agda ```agda
endPt : (B : A → Type) (p : x ≡ y) (bx : B x) → B y endPt : (B : A → Type) (p : x ≡ y) (bx : B x) → B y
@ -93,6 +96,6 @@ from `f x` to `f y`.
cong : (f : A → B) → (p : x ≡ y) → f x ≡ f y cong : (f : A → B) → (p : x ≡ y) → f x ≡ f y
``` ```
Using `cong` and `endPtOfTrue` you should be able to complete Quest0. Using `cong` and `endPtOfTrue` you should be able to complete `Quest0`.
If you have done everything correctly you can reload `agda` and see that If you have done everything correctly you can reload `agda` and see that
you have no remaining goals. you have no remaining goals.

View File

@ -0,0 +1,16 @@
module 1FundamentalGroup.Quest1 where
open import Cubical.Core.Everything
open import Cubical.HITs.S1
open import Cubical.Data.Nat
open import Cubical.Data.Int
open import Cubical.Foundations.Prelude
Ω : (A : Type) (a : A) Type
Ω A a = a a
loop_times : Ω base
loop pos zero times = refl
loop pos (suc n) times = loop pos n times loop
loop negsuc zero times = sym loop
loop negsuc (suc n) times = loop negsuc n times sym loop

View File

@ -19,6 +19,81 @@ In general the _loop space_ of a space `A` at a point `a` is defined as follows
Ω A a = a ≡ a Ω A a = a ≡ a
``` ```
Clearly for each integer `n : ` we have a path
that is '`loop` around `n` times'.
Locate `loop_times` in the `Quest1.agda`
(note how `agda` treats underscores)
```agda
loop_times : → Ω S¹ base
loop n times = {!!}
```
Try casing on `n`, you should see
```agda
loop_times : → Ω S¹ base
loop pos n times = {!!}
loop negsuc n times = {!!}
```
It says to map out of `` it suffices to
map the non-negative integers (`pos`)
and the negative integers (`negsuc`).
```agda
data : Type where
pos : (n : ) →
negsuc : (n : ) →
```
This definition of `` uses the naturals, so try
casing on `n` again, you should see
```agda
loop_times : → Ω S¹ base
loop pos zero times = {!!}
loop pos (suc n) times = {!!}
loop negsuc n times = {!!}
```
It says to map out of `` it suffices to map `zero` and
map each succesive integer `suc n` inductively.
When we loop `zero` (`pos zero`) times what should we get?
Try filling it in.
For looping `pos (suc n)` times we loop `n` times and
loop once more.
For this we need composition of paths.
```agda
_∙_ : x ≡ y → y ≡ z → x ≡ z
```
Try typing `_∙_` or `? ∙ ?` in the hole (input `/.`)
and refining.
Checking the new holes you should see that now you need
to give two loops.
Try giving it '`loop n times`' composed with `loop`.
Then try to also define the map on the negative integers.
You will need to invert paths using `sym`.
<p>
<details>
<summary>Looking up definitions</summary>
If you don't know the definition of something
you can look up the definition by sticking your cursor
on it and pressing `M-SPC c d` in _insert mode_
or `SPC c d` in _evil mode_.
You can use it to find out the definition of `` and ``.
</details>
</p>
<!-- Next level -->
Warning : Warning :
the loop space can contain higher homotopical information that the loop space can contain higher homotopical information that
the fundamental group does not capture. the fundamental group does not capture.
@ -49,3 +124,67 @@ However, the 'composition' of the path `southHemisphere` with `northHemisphere`
in `base ≡ base` gives the surface of `S²`, in `base ≡ base` gives the surface of `S²`,
which intuitively is not homotopic to the constant point `base`. which intuitively is not homotopic to the constant point `base`.
So `base ≡ base` has non-trivial path structure. So `base ≡ base` has non-trivial path structure.
<img src="images/S2.png"
alt="S2"
width="500"
class="center"/>
Let's be more precise about homotopical data :
We can check that a space is 'homotopically trivial' (h-trivial)
from dimension `n`
by checking if spheres of dimension `n` can be filled.
To be h-trivial from `0` is for any two points
to have a line in between; to fill `S⁰`.
This data is captured in
```agda
isProp : Type → Type
isProp A = (x y : A) → x ≡ y
```
<p>
<details>
<summary>All maps are continuous in HoTT</summary>
There is a subtlety in the definition `isProp`.
This is _stronger_ than saying that the space `A` is path connected.
Since `A` is equipped with a continuous map taking pairs `x y : A`
to a path between them.
We will show that `isProp S¹` is _empty_ despite `S¹` being path connected.
</details>
</p>
Similarly, to be h-trivial from `1` is for any two points `x y : A`
and any two paths `p q : x ≡ y` to have a homotopy from `p` to `q`;
to fill `S¹`. This is captured in
```agda
isSet : Type → Type
isSet A = (x y : A) → isProp (x ≡ y)
```
We may therefore want to remove homotopical data
beyond a certain dimension.
We define the fundamental group to be
the homotopical data of `S¹` up to (and
including) dimension `1`, i.e.
the homotopical data of the loop space of `S¹`
up to dimension `0`.
We make the definitions for a space to
have homotopical data only up to dimension `0`
and `1` respectively
```agda
isProp : Type → Type
isProp A = (x y : A) → x ≡ y
isSet : Type → Type
isSet A = (x y : A) → isProp (x ≡ y)
isProp→isSet : (A : Type) → isProp A → isSet A
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.