Edited 1FundamentalGroup/Quest0.agda
This commit is contained in:
parent
682017ab75
commit
79db381ac1
@ -1,21 +1,209 @@
|
|||||||
module 1FundamentalGroup.Quest0 where
|
module 1FundamentalGroup.Quest0 where
|
||||||
|
|
||||||
open import Cubical.Core.Everything
|
|
||||||
open import Cubical.Data.Empty
|
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.Prelude
|
||||||
|
open import Cubical.Foundations.Isomorphism
|
||||||
open import Cubical.Foundations.Path
|
open import Cubical.Foundations.Path
|
||||||
open import Cubical.Foundations.GroupoidLaws
|
|
||||||
|
private
|
||||||
|
variable
|
||||||
|
u : Level
|
||||||
|
|
||||||
data S¹ : Type where
|
data S¹ : Type where
|
||||||
base : S¹
|
base : S¹
|
||||||
loop : base ≡ 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 → ⊥
|
¬ A = A → ⊥
|
||||||
|
|
||||||
doubleCover : type
|
_≢_ : {A : Type u} → (x y : A) → Type u
|
||||||
doubleCover = ?
|
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 )
|
{- transport
|
||||||
refl≢loop h = {!!}
|
|
||||||
|
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 : S¹ → 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)
|
||||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user