Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Pointed WildCat. Require Import Algebra.Groups. Require Import Modalities.ReflectiveSubuniverse Truncations.Core. Require Import Homotopy.Suspension. Require Import Homotopy.ClassifyingSpace. Require Import Homotopy.HomotopyGroup. Local Open Scope trunc_scope. Local Open Scope pointed_scope. Import ClassifyingSpaceNotation. (** In this file we show that the fundamental group of a bouquet of circles indexed by a type S is the free group on that type S. We begin by defining S-indexed wedges of circles as the suspension of the pointification of S. *) Section AssumeUnivalence. Context `{Univalence}. (** An S-indexed wedge of circles a.k.a a bouquet can be defined as the suspension of the pointification of S. *) Definition Bouquet (S : Type) : pType := psusp (pointify S).
H: Univalence
S: Type

IsConnected (Tr 0) (Bouquet S)
H: Univalence
S: Type

IsConnected (Tr 0) (Bouquet S)
rapply isconnected_susp. Defined. (** We can directly prove that it satisfies the desired equivalence together with naturality in the second argument. *)
H: Univalence
S: Type

NatEquiv (opyon (Pi 1 (Bouquet S))) (opyon S o group_type)
H: Univalence
S: Type

NatEquiv (opyon (Pi 1 (Bouquet S))) (opyon S o group_type)
(** Pointify *)
H: Univalence
S: Type

NatEquiv ?Goal (fun x : Group => opyon S x)
H: Univalence
S: Type
NatEquiv (opyon (Pi 1 (Bouquet S))) ?Goal
H: Univalence
S: Type

NatEquiv (opyon (Pi 1 (Bouquet S))) (fun x : Group => opyon (pointify S) x)
(** Post-compose with [pequiv_loops_bg_g] *)
H: Univalence
S: Type

NatEquiv ?Goal (fun x : Group => opyon (pointify S) x)
H: Univalence
S: Type
NatEquiv (opyon (Pi 1 (Bouquet S))) ?Goal
H: Univalence
S: Type

NatEquiv (opyon (Pi 1 (Bouquet S))) (fun x : Group => opyon (pointify S) ((fun x0 : Group => loops (B x0)) x))
(** Loop-susp adjoint *)
H: Univalence
S: Type

NatEquiv ?Goal (fun x : Group => opyon (pointify S) (loops (B x)))
H: Univalence
S: Type
NatEquiv (opyon (Pi 1 (Bouquet S))) ?Goal
H: Univalence
S: Type

NatEquiv (opyon (Pi 1 (Bouquet S))) (fun x : Group => opyon (psusp (pointify S)) (B x))
(** Pi1-BG adjunction *) rapply natequiv_bg_pi1_adjoint. Defined. (** For the rest of this file, we don't need to unfold this. *) Local Opaque natequiv_pi1bouquet_rec.
H: Univalence
S: Type
G: Group

(Pi 1 (Bouquet S) $-> G) <~> (S -> G)
H: Univalence
S: Type
G: Group

(Pi 1 (Bouquet S) $-> G) <~> (S -> G)
apply natequiv_pi1bouquet_rec. Defined.
H: Univalence
S: Type

Is1Natural (opyon (Pi 1 (Bouquet S))) (opyon S o group_type) (fun G : HomotopyGroup_type 1 => equiv_pi1bouquet_rec S G)
H: Univalence
S: Type

Is1Natural (opyon (Pi 1 (Bouquet S))) (opyon S o group_type) (fun G : HomotopyGroup_type 1 => equiv_pi1bouquet_rec S G)
rapply (is1natural_natequiv (natequiv_pi1bouquet_rec _)). Defined. (** We can define the inclusion map by using the previous equivalence on the identity group homomorphism. *)
H: Univalence
S: Type

S -> Pi 1 (Bouquet S)
H: Univalence
S: Type

S -> Pi 1 (Bouquet S)
H: Univalence
S: Type

Pi 1 (Bouquet S) $-> Pi 1 (Bouquet S)
apply grp_homo_id. Defined. (** The fundemental group of an S-bouquet is the free group on S. *)
H: Univalence
S: Type

IsFreeGroupOn S (Pi 1 (Bouquet S)) (pi1bouquet_incl S)
H: Univalence
S: Type

IsFreeGroupOn S (Pi 1 (Bouquet S)) (pi1bouquet_incl S)
H: Univalence
S: Type

forall G : Group, IsEquiv (fun (f : Pi 1 (Bouquet S) $-> G) (x : S) => f (pi1bouquet_incl S x))
H: Univalence
S: Type
G: Group

IsEquiv (fun (f : Pi 1 (Bouquet S) $-> G) (x : S) => f (pi1bouquet_incl S x))
H: Univalence
S: Type
G: Group

(Pi 1 (Bouquet S) $-> G) <~> (S -> G)
H: Univalence
S: Type
G: Group
?f == (fun (f : Pi 1 (Bouquet S) $-> G) (x : S) => f (pi1bouquet_incl S x))
H: Univalence
S: Type
G: Group

equiv_pi1bouquet_rec S G == (fun (f : Pi 1 (Bouquet S) $-> G) (x : S) => f (pi1bouquet_incl S x))
H: Univalence
S: Type
G: Group
f: Pi 1 (Bouquet S) $-> G

equiv_pi1bouquet_rec S G f = (fun x : S => f (pi1bouquet_incl S x))
H: Univalence
S: Type
G: Group
f: Pi 1 (Bouquet S) $-> G

equiv_pi1bouquet_rec S G f = (equiv_pi1bouquet_rec S G $o fmap (opyon (Pi 1 (Bouquet S))) f) grp_homo_id
H: Univalence
S: Type
G: Group
f: Pi 1 (Bouquet S) $-> G

grp_homo_compose f grp_homo_id = f
rapply (cat_idr_strong f). Defined. End AssumeUnivalence.