Edited 1FundamentalGroup/Quest0.agda

This commit is contained in:
Jlh18 2021-09-15 11:54:35 +01:00
parent 682017ab75
commit 79db381ac1
2 changed files with 195 additions and 7 deletions

View File

@ -1,21 +1,209 @@
module 1FundamentalGroup.Quest0 where
open import Cubical.Core.Everything
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
open import Cubical.Foundations.GroupoidLaws
private
variable
u : Level
data : Type where
base :
loop : base base
¬ : Type Type
-- 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
doubleCover : type
doubleCover = ?
_≢_ : {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:
-}
refl≢loop : ¬ ( refl loop )
refl≢loop h = {!!}
{- 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
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)