TheHoTTGame/1FundamentalGroup/Quest0.agda
2021-09-15 11:54:35 +01:00

210 lines
4.1 KiB
Agda
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module 1FundamentalGroup.Quest0 where
open import Cubical.Data.Empty
open import Cubical.Data.Unit renaming ( Unit to )
open import Cubical.Data.Bool
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Path
private
variable
u : Level
data : Type where
base :
loop : base base
-- if you don't know how to input a character
-- go to evil-mode, put your cursor on the character
-- and do `SPC h '`
¬ : Type u Type u
¬ A = A
_≢_ : {A : Type u} (x y : A) Type u
x y = ¬ (x y)
_≅_ = Iso
{- Bool
data Bool : Type where
true : Bool
false : Bool
The above definition for the Booleans
can be interpreted as
- a construction with only two recipes
`true` and `false`
- a space with two points `true` and `false`.
This space is discrete in the sense that
we haven't specified any paths.
Our goal is to show
refl ≢ loop (input \nequiv)
that there is path (aka homotopy) from `refl` to `loop`.
To do so we must assume there is such a path and derive
a contradiction.
The contradiction we will try to reach is that `true ≡ false`.
Indeed it does not hold:
-}
{- transport
To follow a point in `a : A` along a path `p : A ≡ B`
we use
transport : {A B : Type u} → A ≡ B → A → B
Why do we propify? Discuss.
-}
true≢false' : true false
true≢false' h = transport ⊤≡⊥ tt where
propify : Bool Type
propify false =
propify true =
⊤≡⊥ :
⊤≡⊥ = cong propify h
Flip : Bool Bool
Flip false = true
Flip true = false
{- Iso
We show that Flip is an isomorphism from Bool → Bool
with inverse Flip.
A proof of `A ≅ B` (input \cong or write Iso A B) is given by
iso f i s r
where
f : A → B and i : B → A
are the map and its inverse,
here both `f` and `i` are Flip
`s` is a proof that `f` is a section with
right inverse `i` and
`r` is a proof that `f` is a retraction
with left inverse `i`
-}
flipIso : Bool Bool
flipIso = iso Flip Flip s r where
s : section Flip Flip
s false = refl
s true = refl
r : retract Flip Flip
r false = refl
r true = refl
{- Path ≡
A corollary of univalence is
`isoToPath` which takes an isomorphism
`f : A ≅ B` and gives a path
`fPath : A ≡ B`.
The resulting path has the important property
that when you follow (transport/subst)
a point in `A` along the path
you will get the point `f(a)` in `B`
-}
flipPath : Bool Bool
flipPath = isoToPath flipIso
{-
Try out `transport` on `true : Bool` and
`flipPath` by doing `C-c C-n`
and typing in `transport flipPath true`
-}
{- bundle over S¹
We want to construct a bundle over S¹
that looks like this:
-- insert image of double cover
to do so we use flipPath
to specify the fibers of the bundle
at each point on the `loop`.
These fibers must coincide at the end-points
with the fiber we set for `base`, which is `Bool`.
-}
-- the bundle
doubleCover : Type
doubleCover base = Bool
doubleCover (loop i) = flipPath i
{- subst
Given a bundle `B : A → Type u`
over a space `A` and a path `p : x ≡ y`
between points in `x y : A`,
subst : (B : A → Type u) (p : x ≡ y) → B x → B y
follows the path _over_ `p`, taking one
end point of the path in fiber `B x` to
the other end point in fiber `B y`.
We use `subst` to get a function that takes a path `p : base ≡ base`
and follows the point `true` in the fiber `doubleCover base`
along the path over `p` to some point in `doubleCover base`.
Note that `doubleCover base` is just `Bool` (externally).
-}
SubstTrue : (p : base base) doubleCover base
SubstTrue p = subst doubleCover p true
{-
You can check that `SubstTrue refl` and `SubstTrue loop`
are using `C-c C-n`
-}
{- cong
Given a function `f : A → B`
and a path `p : x ≡ y` between points `x y : A`
cong : (f : A → B) → (p : x ≡ y) → f x ≡ f y
gives us a path in `B` from `f x` to `f y`
We can use the above to get the contradiction we want
by
- assuming `p : refl ≡ loop`
- deducing `SubstTrue refl ≡ SubstTrue loop` using `cong`
-}
refl≢loop : refl loop
refl≢loop p = true≢false (cong SubstTrue p)