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: TypeIsConnected (Tr 0) (Bouquet S)exact isconnected_susp. Defined. (** We can directly prove that it satisfies the desired equivalence together with naturality in the second argument. *)H: Univalence
S: TypeIsConnected (Tr 0) (Bouquet S)H: Univalence
S: TypeNatEquiv (opyon (Pi 1 (Bouquet S))) (opyon S o group_type)(** Pointify *)H: Univalence
S: TypeNatEquiv (opyon (Pi 1 (Bouquet S))) (opyon S o group_type)H: Univalence
S: TypeNatEquiv ?Goal (fun x : Group => opyon S x)H: Univalence
S: TypeNatEquiv (opyon (Pi 1 (Bouquet S))) ?Goal(** Post-compose with [pequiv_loops_bg_g] *)H: Univalence
S: TypeNatEquiv (opyon (Pi 1 (Bouquet S))) (fun x : Group => opyon (pointify S) x)H: Univalence
S: TypeNatEquiv ?Goal (fun x : Group => opyon (pointify S) x)H: Univalence
S: TypeNatEquiv (opyon (Pi 1 (Bouquet S))) ?Goal(** Loop space-suspension adjunction *)H: Univalence
S: TypeNatEquiv (opyon (Pi 1 (Bouquet S))) (fun x : Group => opyon (pointify S) ((fun x0 : Group => loops (B x0)) x))H: Univalence
S: TypeNatEquiv ?Goal (fun x : Group => opyon (pointify S) (loops (B x)))H: Univalence
S: TypeNatEquiv (opyon (Pi 1 (Bouquet S))) ?Goal(** 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: TypeNatEquiv (opyon (Pi 1 (Bouquet S))) (fun x : Group => opyon (psusp (pointify S)) (B x))H: Univalence
S: Type
G: Group(Pi 1 (Bouquet S) $-> G) <~> (S -> G)apply natequiv_pi1bouquet_rec. Defined.H: Univalence
S: Type
G: Group(Pi 1 (Bouquet S) $-> G) <~> (S -> G)H: Univalence
S: TypeIs1Natural (opyon (Pi 1 (Bouquet S))) (opyon S o group_type) (fun G : HomotopyGroup_type 1 => equiv_pi1bouquet_rec S G)exact (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: TypeIs1Natural (opyon (Pi 1 (Bouquet S))) (opyon S o group_type) (fun G : HomotopyGroup_type 1 => equiv_pi1bouquet_rec S G)H: Univalence
S: TypeS -> Pi 1 (Bouquet S)H: Univalence
S: TypeS -> Pi 1 (Bouquet S)exact grp_homo_id. Defined. (** The fundamental group of an S-bouquet is the free group on S. *)H: Univalence
S: TypePi 1 (Bouquet S) $-> Pi 1 (Bouquet S)H: Univalence
S: TypeIsFreeGroupOn S (Pi 1 (Bouquet S)) (pi1bouquet_incl S)H: Univalence
S: TypeIsFreeGroupOn S (Pi 1 (Bouquet S)) (pi1bouquet_incl S)H: Univalence
S: Typeforall G : Group, IsEquiv (fun (f : Pi 1 (Bouquet S) $-> G) (x : S) => f (pi1bouquet_incl S x))H: Univalence
S: Type
G: GroupIsEquiv (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: Groupequiv_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) $-> Gequiv_pi1bouquet_rec S G f = (fun x : S => f (pi1bouquet_incl S x))H: Univalence
S: Type
G: Group
f: Pi 1 (Bouquet S) $-> Gequiv_pi1bouquet_rec S G f = (equiv_pi1bouquet_rec S G $o fmap (opyon (Pi 1 (Bouquet S))) f) grp_homo_idexact (cat_idr_strong f). Defined. End AssumeUnivalence.H: Univalence
S: Type
G: Group
f: Pi 1 (Bouquet S) $-> Ggrp_homo_compose f grp_homo_id = f