{-# OPTIONS --without-K --rewriting --overlapping-instances #-}
open import lib.Basics
open import lib.NType2
open import lib.types.Group
open import lib.types.EilenbergMacLane1.Core
open import lib.groups.Homomorphism
open import lib.groups.LoopSpace
open import lib.two-semi-categories.FundamentalCategory
open import lib.two-semi-categories.Functor
open import lib.two-semi-categories.GroupToCategory
module lib.types.EilenbergMacLane1.Recursion {i} {G : Group i} where
private
module G = Group G
module EM₁Rec' {j} {C : Type j}
{{C-level : has-level 2 C}}
(embase* : C)
(emloop* : (g : G.El) → embase* == embase*)
(emloop-comp* : (g₁ g₂ : G.El) → emloop* (G.comp g₁ g₂) == emloop* g₁ ∙ emloop* g₂)
(emloop-coh* : (g₁ g₂ g₃ : G.El) →
emloop-comp* (G.comp g₁ g₂) g₃ ◃∙
ap (λ l → l ∙ emloop* g₃) (emloop-comp* g₁ g₂) ◃∙
∙-assoc (emloop* g₁) (emloop* g₂) (emloop* g₃) ◃∎
=ₛ
ap emloop* (G.assoc g₁ g₂ g₃) ◃∙
emloop-comp* g₁ (G.comp g₂ g₃) ◃∙
ap (λ l → emloop* g₁ ∙ l) (emloop-comp* g₂ g₃) ◃∎) where
private
P : EM₁ G → Type j
P _ = C
Q : embase' G == embase → Type j
Q p = embase* == embase* [ P ↓ p ]
emloop** : ∀ g → Q (emloop g)
emloop** g = ↓-cst-in (emloop* g)
emloop-comp** : ∀ g₁ g₂ →
emloop** (G.comp g₁ g₂) == emloop** g₁ ∙ᵈ emloop** g₂
[ Q ↓ emloop-comp g₁ g₂ ]
emloop-comp** g₁ g₂ =
↓-cst-in2 (emloop-comp* g₁ g₂) ▹
↓-cst-in-∙ (emloop g₁) (emloop g₂) (emloop* g₁) (emloop* g₂)
module _ (g₁ g₂ g₃ : G.El) where
s₀ : embase' G == embase
s₀ = emloop (G.comp (G.comp g₁ g₂) g₃)
s₁ : embase' G == embase
s₁ = emloop (G.comp g₁ g₂) ∙ emloop g₃
s₂ : embase' G == embase
s₂ = (emloop g₁ ∙ emloop g₂) ∙ emloop g₃
s₃ : embase' G == embase
s₃ = emloop g₁ ∙ (emloop g₂ ∙ emloop g₃)
s₄ : embase' G == embase
s₄ = emloop (G.comp g₁ (G.comp g₂ g₃))
s₅ : embase' G == embase
s₅ = emloop g₁ ∙ emloop (G.comp g₂ g₃)
e₀₁ : s₀ == s₁
e₀₁ = emloop-comp (G.comp g₁ g₂) g₃
e₁₂ : s₁ == s₂
e₁₂ = ap (_∙ emloop g₃) (emloop-comp g₁ g₂)
e₂₃ : s₂ == s₃
e₂₃ = ∙-assoc (emloop g₁) (emloop g₂) (emloop g₃)
e₀₄ : s₀ == s₄
e₀₄ = ap emloop (G.assoc g₁ g₂ g₃)
e₄₅ : s₄ == s₅
e₄₅ = emloop-comp g₁ (G.comp g₂ g₃)
e₅₃ : s₅ == s₃
e₅₃ = ap (emloop g₁ ∙_) (emloop-comp g₂ g₃)
φ : s₀ == s₃
φ = ↯ (e₀₁ ◃∙ e₁₂ ◃∙ e₂₃ ◃∎)
ψ : s₀ == s₃
ψ = ↯ (e₀₄ ◃∙ e₄₅ ◃∙ e₅₃ ◃∎)
φ=ψ : φ == ψ
φ=ψ = =ₛ-out (emloop-coh g₁ g₂ g₃)
s₀* : embase* == embase*
s₀* = emloop* (G.comp (G.comp g₁ g₂) g₃)
s₁* : embase* == embase*
s₁* = emloop* (G.comp g₁ g₂) ∙ emloop* g₃
s₂* : embase* == embase*
s₂* = (emloop* g₁ ∙ emloop* g₂) ∙ emloop* g₃
s₃* : embase* == embase*
s₃* = emloop* g₁ ∙ (emloop* g₂ ∙ emloop* g₃)
s₄* : embase* == embase*
s₄* = emloop* (G.comp g₁ (G.comp g₂ g₃))
s₅* : embase* == embase*
s₅* = emloop* g₁ ∙ emloop* (G.comp g₂ g₃)
e₀₁* : s₀* == s₁*
e₀₁* = emloop-comp* (G.comp g₁ g₂) g₃
e₁₂* : s₁* == s₂*
e₁₂* = ap (_∙ emloop* g₃) (emloop-comp* g₁ g₂)
e₂₃* : s₂* == s₃*
e₂₃* = ∙-assoc (emloop* g₁) (emloop* g₂) (emloop* g₃)
e₀₄* : s₀* == s₄*
e₀₄* = ap emloop* (G.assoc g₁ g₂ g₃)
e₄₅* : s₄* == s₅*
e₄₅* = emloop-comp* g₁ (G.comp g₂ g₃)
e₅₃* : s₅* == s₃*
e₅₃* = ap (emloop* g₁ ∙_) (emloop-comp* g₂ g₃)
φ* : s₀* == s₃*
φ* = ↯ (e₀₁* ◃∙ e₁₂* ◃∙ e₂₃* ◃∎)
ψ* : s₀* == s₃*
ψ* = ↯ (e₀₄* ◃∙ e₄₅* ◃∙ e₅₃* ◃∎)
φ*=ψ* : φ* == ψ*
φ*=ψ* = =ₛ-out (emloop-coh* g₁ g₂ g₃)
s₀** : Q s₀
s₀** = emloop** (G.comp (G.comp g₁ g₂) g₃)
s₁** : Q s₁
s₁** = emloop** (G.comp g₁ g₂) ∙ᵈ emloop** g₃
s₂** : Q s₂
s₂** = (emloop** g₁ ∙ᵈ emloop** g₂) ∙ᵈ emloop** g₃
s₃** : Q s₃
s₃** = emloop** g₁ ∙ᵈ (emloop** g₂ ∙ᵈ emloop** g₃)
s₄** : Q s₄
s₄** = emloop** (G.comp g₁ (G.comp g₂ g₃))
s₅** : Q s₅
s₅** = emloop** g₁ ∙ᵈ emloop** (G.comp g₂ g₃)
e₀₁** : s₀** == s₁** [ Q ↓ e₀₁ ]
e₀₁** = emloop-comp** (G.comp g₁ g₂) g₃
e₁₂** : s₁** == s₂** [ Q ↓ e₁₂ ]
e₁₂** = emloop-comp** g₁ g₂ ∙ᵈᵣ emloop** g₃
e₂₃** : s₂** == s₃** [ Q ↓ e₂₃ ]
e₂₃** = ∙ᵈ-assoc (emloop** g₁) (emloop** g₂) (emloop** g₃)
e₀₄** : s₀** == s₄** [ Q ↓ e₀₄ ]
e₀₄** = ↓-ap-in Q emloop (apd emloop** (G.assoc g₁ g₂ g₃))
e₄₅** : s₄** == s₅** [ Q ↓ e₄₅ ]
e₄₅** = emloop-comp** g₁ (G.comp g₂ g₃)
e₅₃** : s₅** == s₃** [ Q ↓ e₅₃ ]
e₅₃** = emloop** g₁ ∙ᵈₗ emloop-comp** g₂ g₃
φ** : s₀** == s₃** [ Q ↓ φ ]
φ** = e₀₁** ∙ᵈ e₁₂** ∙ᵈ e₂₃**
ψ** : s₀** == s₃** [ Q ↓ ψ ]
ψ** = e₀₄** ∙ᵈ e₄₅** ∙ᵈ e₅₃**
s₃-path₁ : ↓-cst-in {p = s₃} s₃* ==
emloop** g₁ ∙ᵈ ↓-cst-in (emloop* g₂ ∙ emloop* g₃)
s₃-path₁ = ↓-cst-in-∙ (emloop g₁) (emloop g₂ ∙ emloop g₃)
(emloop* g₁) (emloop* g₂ ∙ emloop* g₃)
s₃-path₂' : ↓-cst-in (emloop* g₂ ∙ emloop* g₃) ==
emloop** g₂ ∙ᵈ emloop** g₃
s₃-path₂' = ↓-cst-in-∙ (emloop g₂) (emloop g₃)
(emloop* g₂) (emloop* g₃)
s₃-path₂ : emloop** g₁ ∙ᵈ ↓-cst-in (emloop* g₂ ∙ emloop* g₃) == s₃**
s₃-path₂ = emloop** g₁ ∙ᵈₗ s₃-path₂'
s₃-path : ↓-cst-in s₃* == s₃**
s₃-path = s₃-path₁ ∙ s₃-path₂
*-to-**-path : (r : s₀ == s₃) → s₀* == s₃* → s₀** == s₃** [ Q ↓ r ]
*-to-**-path r q = ↓-cst-in2 {q = r} q ▹ s₃-path
φ-step : *-to-**-path φ φ* == φ**
φ-step =
↓-cst-in2 {q = φ} φ* ▹ s₃-path
=⟨ (↓-cst-in2-∙ {p₀₁ = e₀₁} {p₁₂ = e₁₂ ∙ e₂₃}
e₀₁* (e₁₂* ∙ e₂₃*)) ∙'ᵈᵣ s₃-path ⟩
(e₀₁*' ∙ᵈ ↓-cst-in2 {q = e₁₂ ∙ e₂₃} (e₁₂* ∙ e₂₃*)) ▹ s₃-path
=⟨ ap (λ y → (e₀₁*' ∙ᵈ y) ▹ s₃-path) $
↓-cst-in2-∙ {p₀₁ = e₁₂} {p₁₂ = e₂₃} e₁₂* e₂₃* ⟩
(e₀₁*' ∙ᵈ e₁₂*' ∙ᵈ e₂₃*') ▹ s₃-path
=⟨ ∙ᵈ-∙'ᵈ-assoc' e₀₁*' (e₁₂*' ∙ᵈ e₂₃*') s₃-path ⟩
e₀₁*' ∙ᵈ (e₁₂*' ∙ᵈ e₂₃*') ▹ s₃-path
=⟨ ap (e₀₁*' ∙ᵈ_) (∙ᵈ-∙'ᵈ-assoc' e₁₂*' e₂₃*' s₃-path) ⟩
e₀₁*' ∙ᵈ e₁₂*' ∙ᵈ e₂₃*' ▹ s₃-path
=⟨ ap (λ y → e₀₁*' ∙ᵈ e₁₂*' ∙ᵈ y) $
↓-cst-in-assoc {p₀ = emloop g₁} {p₁ = emloop g₂} {p₂ = emloop g₃}
(emloop* g₁) (emloop* g₂) (emloop* g₃) ⟩
e₀₁*' ∙ᵈ e₁₂*' ∙ᵈ f₂ ◃ f₃ ◃ e₂₃**
=⟨ ! (ap (e₀₁*' ∙ᵈ_) (▹∙ᵈ-∙ᵈ◃-assoc e₁₂*' f₂ (f₃ ◃ e₂₃**))) ⟩
e₀₁*' ∙ᵈ (e₁₂*' ▹ f₂) ∙ᵈ f₃ ◃ e₂₃**
=⟨ ap (λ y → e₀₁*' ∙ᵈ y ∙ᵈ f₃ ◃ e₂₃**) $
↓-cst-in2-whisker-right {p' = emloop g₃} {q' = emloop* g₃}
{p₀₁ = emloop-comp g₁ g₂}
(emloop-comp* g₁ g₂) ⟩
e₀₁*' ∙ᵈ (f₀ ◃ f₁) ∙ᵈ f₃ ◃ e₂₃**
=⟨ ap (e₀₁*' ∙ᵈ_) (∙ᵈ-assoc f₀ f₁ (f₃ ◃ e₂₃**)) ⟩
e₀₁*' ∙ᵈ f₀ ◃ f₁ ∙ᵈ f₃ ◃ e₂₃**
=⟨ ! (▹∙ᵈ-∙ᵈ◃-assoc e₀₁*' f₀ (f₁ ∙ᵈ f₃ ◃ e₂₃**)) ⟩
e₀₁** ∙ᵈ f₁ ∙ᵈ f₃ ◃ e₂₃**
=⟨ ! (ap (e₀₁** ∙ᵈ_) (▹∙ᵈ-∙ᵈ◃-assoc f₁ f₃ e₂₃**)) ⟩
e₀₁** ∙ᵈ (f₁ ▹ f₃) ∙ᵈ e₂₃**
=⟨ ! (ap (λ y → e₀₁** ∙ᵈ y ∙ᵈ e₂₃**) (∙ᵈᵣ-∙'ᵈ f₁' f₃' (emloop** g₃))) ⟩
φ** =∎
where
e₀₁*' : ↓-cst-in s₀* == ↓-cst-in s₁* [ Q ↓ e₀₁ ]
e₀₁*' = ↓-cst-in2 {q = e₀₁} e₀₁*
e₁₂*' : ↓-cst-in s₁* == ↓-cst-in s₂* [ Q ↓ e₁₂ ]
e₁₂*' = ↓-cst-in2 {q = e₁₂} e₁₂*
e₂₃*' : ↓-cst-in s₂* == ↓-cst-in s₃* [ Q ↓ e₂₃ ]
e₂₃*' = ↓-cst-in2 {q = e₂₃} e₂₃*
f₀ : ↓-cst-in (emloop* (G.comp g₁ g₂) ∙ emloop* g₃) ==
emloop** (G.comp g₁ g₂) ∙ᵈ emloop** g₃
f₀ = ↓-cst-in-∙ (emloop (G.comp g₁ g₂)) (emloop g₃)
(emloop* (G.comp g₁ g₂)) (emloop* g₃)
f₁' : emloop** (G.comp g₁ g₂) ==
↓-cst-in {p = emloop g₁ ∙ emloop g₂} (emloop* g₁ ∙ emloop* g₂)
[ Q ↓ emloop-comp' G g₁ g₂ ]
f₁' = ↓-cst-in2 {q = emloop-comp g₁ g₂} (emloop-comp* g₁ g₂)
f₁ : emloop** (G.comp g₁ g₂) ∙ᵈ emloop** g₃ ==
↓-cst-in {p = emloop g₁ ∙ emloop g₂} (emloop* g₁ ∙ emloop* g₂) ∙ᵈ emloop** g₃
[ Q ↓ ap (_∙ emloop' G g₃) (emloop-comp' G g₁ g₂) ]
f₁ = f₁' ∙ᵈᵣ emloop** g₃
f₂ : ↓-cst-in ((emloop* g₁ ∙ emloop* g₂) ∙ emloop* g₃) ==
↓-cst-in {p = emloop g₁ ∙ emloop g₂} (emloop* g₁ ∙ emloop* g₂) ∙ᵈ emloop** g₃
f₂ = ↓-cst-in-∙ (emloop g₁ ∙ emloop g₂) (emloop g₃)
(emloop* g₁ ∙ emloop* g₂) (emloop* g₃)
f₃' : ↓-cst-in {p = emloop g₁ ∙ emloop g₂} (emloop* g₁ ∙ emloop* g₂) ==
emloop** g₁ ∙ᵈ emloop** g₂
f₃' = ↓-cst-in-∙ (emloop g₁) (emloop g₂) (emloop* g₁) (emloop* g₂)
f₃ : ↓-cst-in {p = emloop g₁ ∙ emloop g₂} (emloop* g₁ ∙ emloop* g₂) ∙ᵈ emloop** g₃ ==
(emloop** g₁ ∙ᵈ emloop** g₂) ∙ᵈ emloop** g₃
f₃ = f₃' ∙ᵈᵣ emloop** g₃
ψ-step : *-to-**-path ψ ψ* == ψ**
ψ-step =
↓-cst-in2 {q = ψ} ψ* ▹ s₃-path
=⟨ ap (_▹ s₃-path) $
↓-cst-in2-∙ {p₀₁ = e₀₄} {p₁₂ = e₄₅ ∙ e₅₃}
e₀₄* (e₄₅* ∙ e₅₃*) ⟩
(e₀₄*' ∙ᵈ ↓-cst-in2 {q = e₄₅ ∙ e₅₃} (e₄₅* ∙ e₅₃*)) ▹ s₃-path
=⟨ ap (λ y → (e₀₄*' ∙ᵈ y) ▹ s₃-path) $
↓-cst-in2-∙ {p₀₁ = e₄₅} {p₁₂ = e₅₃} e₄₅* e₅₃* ⟩
(e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ e₅₃*') ▹ s₃-path
=⟨ ∙ᵈ-∙'ᵈ-assoc' e₀₄*' (e₄₅*' ∙ᵈ e₅₃*') s₃-path ⟩
e₀₄*' ∙ᵈ (e₄₅*' ∙ᵈ e₅₃*') ▹ s₃-path
=⟨ ap (e₀₄*' ∙ᵈ_) (∙ᵈ-∙'ᵈ-assoc' e₄₅*' e₅₃*' s₃-path) ⟩
e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ e₅₃*' ▹ s₃-path
=⟨ ap (λ y → e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ e₅₃*' ▹ y) (∙=∙' s₃-path₁ s₃-path₂) ⟩
e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ e₅₃*' ▹ (s₃-path₁ ∙' s₃-path₂)
=⟨ ! $ ap (λ y → e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ y) $
∙'ᵈ-assoc e₅₃*' s₃-path₁ s₃-path₂ ⟩
e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ (e₅₃*' ▹ s₃-path₁) ▹ s₃-path₂
=⟨ ap (λ y → e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ y ▹ s₃-path₂) $
↓-cst-in2-whisker-left {p = emloop g₁} {q = emloop* g₁}
{p₀₁' = emloop-comp g₂ g₃}
(emloop-comp* g₂ g₃) ⟩
e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ (f₀ ◃ f₁) ▹ s₃-path₂
=⟨ ap (λ y → e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ y) $
∙ᵈ-∙'ᵈ-assoc f₀ f₁ s₃-path₂ ⟩
e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ f₀ ◃ (f₁ ▹ s₃-path₂)
=⟨ ! $ ap (λ y → e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ f₀ ◃ y) $
∙ᵈₗ-∙'ᵈ f₁' s₃-path₂' (emloop** g₁) ⟩
e₀₄*' ∙ᵈ e₄₅*' ∙ᵈ f₀ ◃ e₅₃**
=⟨ ! (ap (e₀₄*' ∙ᵈ_) (▹∙ᵈ-∙ᵈ◃-assoc e₄₅*' f₀ e₅₃**)) ⟩
e₀₄*' ∙ᵈ e₄₅** ∙ᵈ e₅₃**
=⟨ ap (_∙ᵈ e₄₅** ∙ᵈ e₅₃**) $
↓-cst-in2-ap emloop emloop* (G.assoc g₁ g₂ g₃) ⟩
ψ** =∎
where
e₀₄*' : ↓-cst-in s₀* == ↓-cst-in s₄* [ Q ↓ e₀₄ ]
e₀₄*' = ↓-cst-in2 {q = e₀₄} e₀₄*
e₄₅*' : ↓-cst-in s₄* == ↓-cst-in s₅* [ Q ↓ e₄₅ ]
e₄₅*' = ↓-cst-in2 {q = e₄₅} e₄₅*
e₅₃*' : ↓-cst-in s₅* == ↓-cst-in s₃* [ Q ↓ e₅₃ ]
e₅₃*' = ↓-cst-in2 {q = e₅₃} e₅₃*
f₀ : ↓-cst-in (emloop* g₁ ∙ emloop* (G.comp g₂ g₃)) ==
emloop** g₁ ∙ᵈ ↓-cst-in (emloop* (G.comp g₂ g₃))
f₀ = ↓-cst-in-∙ (emloop g₁) (emloop' G (G.comp g₂ g₃))
(emloop* g₁) (emloop* (G.comp g₂ g₃))
f₁' : emloop** (G.comp g₂ g₃) == ↓-cst-in (emloop* g₂ ∙ emloop* g₃)
[ Q ↓ emloop-comp g₂ g₃ ]
f₁' = ↓-cst-in2 {q = emloop-comp g₂ g₃} (emloop-comp* g₂ g₃)
f₁ : emloop** g₁ ∙ᵈ emloop** (G.comp g₂ g₃) ==
emloop** g₁ ∙ᵈ ↓-cst-in (emloop* g₂ ∙ emloop* g₃)
[ Q ↓ ap (emloop g₁ ∙_) (emloop-comp g₂ g₃) ]
f₁ = emloop** g₁ ∙ᵈₗ f₁'
abstract
emloop-coh** : φ** == ψ** [ (λ q → s₀** == s₃** [ Q ↓ q ]) ↓ φ=ψ ]
emloop-coh** =
! φ-step ◃
ap (λ p* → *-to-**-path φ p*) φ*=ψ* ◃
apd (λ p → *-to-**-path p ψ*) φ=ψ ▹
ψ-step
module M = EM₁Elim {P = λ _ → C} {{C-level}}
embase* emloop** emloop-comp** emloop-coh**
abstract
f : EM₁ G → C
f = M.f
embase-β : f embase ↦ embase*
embase-β = M.embase-β
{-# REWRITE embase-β #-}
emloop-β : (g : G.El) → ap f (emloop g) == emloop* g
emloop-β g = apd=cst-in (M.emloop-β g)
private
middle-fun : ∀ {i j} {A : Type i} {B : Type j}
{f : A → B} {a₀ a₁ a₂ : A}
(p₀₁ : a₀ == a₁) (p₁₂ : a₁ == a₂) (p₀₂ : a₀ == a₂)
(q₀₁ : f a₀ == f a₁) (q₁₂ : f a₁ == f a₂) (q₀₂ : f a₀ == f a₂)
(p-comp : p₀₂ == p₀₁ ∙ p₁₂)
→ apd f p₀₂ == ↓-cst-in {p = p₀₁} q₀₁ ∙ᵈ ↓-cst-in {p = p₁₂} q₁₂
[ (λ w → f a₀ == f a₂ [ (λ _ → B) ↓ w ]) ↓ p-comp ]
→ ap f p₀₂ == q₀₁ ∙ q₁₂
middle-fun {f = f} p₀₁ p₁₂ p₀₂ q₀₁ q₁₂ q₀₂ p-comp inner =
ap=↓-cst-out-apd f p₀₂ ∙
↓-cst-out2 inner ∙
↓-cst-out2 (! (↓-cst-in-∙ p₀₁ p₁₂ q₀₁ q₁₂)) ∙
↓-cst-β (p₀₁ ∙ p₁₂) (q₀₁ ∙ q₁₂)
emloop-comp-path-rewrite₁ : ∀ {i j} {A : Type i} {B : Type j}
{f : A → B} {a₀ a₁ a₂ : A}
(p₀₁ : a₀ == a₁) (p₁₂ : a₁ == a₂) (p₀₂ : a₀ == a₂)
(q₀₁ : f a₀ == f a₁) (q₁₂ : f a₁ == f a₂) (q₀₂ : f a₀ == f a₂)
(p-comp : p₀₂ == p₀₁ ∙ p₁₂)
(r₀₁ : apd f p₀₁ == ↓-cst-in q₀₁)
(r₁₂ : apd f p₁₂ == ↓-cst-in q₁₂)
→ ap (ap f) p-comp ∙
ap-∙ f p₀₁ p₁₂ ∙
ap2 _∙_ (apd=cst-in r₀₁) (apd=cst-in r₁₂)
==
middle-fun p₀₁ p₁₂ p₀₂ q₀₁ q₁₂ q₀₂ p-comp
(apd (apd f) p-comp ▹
apd-∙ f p₀₁ p₁₂ ∙
ap2 _∙ᵈ_ r₀₁ r₁₂)
emloop-comp-path-rewrite₁ idp idp .idp q₀₁ q₁₂ q₀₂ idp r₀₁ r₁₂ =
! (∙-unit-r (idp ∙' ap2 _∙_ r₀₁ r₁₂) ∙ ∙'-unit-l (ap2 _∙_ r₀₁ r₁₂))
emloop-comp-path-rewrite₂ : ∀ {i j} {A : Type i} {B : Type j}
{f : A → B} {a₀ a₁ a₂ : A}
(p₀₁ : a₀ == a₁) (p₁₂ : a₁ == a₂) (p₀₂ : a₀ == a₂)
(q₀₁ : f a₀ == f a₁) (q₁₂ : f a₁ == f a₂) (q₀₂ : f a₀ == f a₂)
(p-comp : p₀₂ == p₀₁ ∙ p₁₂) (q-comp : q₀₂ == q₀₁ ∙ q₁₂)
(r₀₁ : apd f p₀₁ == ↓-cst-in q₀₁)
(r₁₂ : apd f p₁₂ == ↓-cst-in q₁₂)
(r₀₂ : apd f p₀₂ == ↓-cst-in q₀₂)
→ middle-fun p₀₁ p₁₂ p₀₂ q₀₁ q₁₂ q₀₂ p-comp
(r₀₂ ◃
↓-cst-in2 {q = p-comp} q-comp ▹
↓-cst-in-∙ p₀₁ p₁₂ q₀₁ q₁₂)
==
apd=cst-in r₀₂ ∙
q-comp
emloop-comp-path-rewrite₂ idp idp .idp q₀₁ q₁₂ q₀₂ idp q-comp r₀₁ r₁₂ r₀₂ =
∙-unit-r (r₀₂ ∙ q-comp)
emloop-comp-path : (g₁ g₂ : G.El)
→ ap (ap f) (emloop-comp g₁ g₂) ◃∙
ap-∙ f (emloop g₁) (emloop g₂) ◃∙
ap2 _∙_ (emloop-β g₁) (emloop-β g₂) ◃∎
=ₛ
emloop-β (G.comp g₁ g₂) ◃∙
emloop-comp* g₁ g₂ ◃∎
emloop-comp-path g₁ g₂ = =ₛ-in $
ap (ap f) (emloop-comp g₁ g₂) ∙
ap-∙ f (emloop g₁) (emloop g₂) ∙
ap2 _∙_ (emloop-β g₁) (emloop-β g₂)
=⟨ emloop-comp-path-rewrite₁ p₀₁ p₁₂ p₀₂ q₀₁ q₁₂ q₀₂ p-comp r₀₁ r₁₂ ⟩
fun (apd (apd f) (emloop-comp g₁ g₂) ▹
apd-∙ f (emloop g₁) (emloop g₂) ∙
ap2 _∙ᵈ_ (M.emloop-β g₁) (M.emloop-β g₂))
=⟨ ap fun (M.emloop-comp-path g₁ g₂) ⟩
fun (M.emloop-β (G.comp g₁ g₂) ◃ emloop-comp** g₁ g₂)
=⟨ emloop-comp-path-rewrite₂ p₀₁ p₁₂ p₀₂ q₀₁ q₁₂ q₀₂ p-comp q-comp r₀₁ r₁₂ r₀₂ ⟩
emloop-β (G.comp g₁ g₂) ∙ emloop-comp* g₁ g₂ =∎
where
p₀₁ = emloop g₁
p₁₂ = emloop g₂
p₀₂ = emloop (G.comp g₁ g₂)
q₀₁ = emloop* g₁
q₁₂ = emloop* g₂
q₀₂ = emloop* (G.comp g₁ g₂)
r₀₁ = M.emloop-β g₁
r₁₂ = M.emloop-β g₂
r₀₂ = M.emloop-β (G.comp g₁ g₂)
p-comp = emloop-comp g₁ g₂
q-comp = emloop-comp* g₁ g₂
fun = middle-fun p₀₁ p₁₂ p₀₂ q₀₁ q₁₂ q₀₂ p-comp
module EM₁Rec {j} {C : Type j}
{{C-level : has-level 2 C}}
(F : TwoSemiFunctor (group-to-cat G) (2-type-fundamental-cat C {{C-level}})) where
private
module F = TwoSemiFunctor F
module M =
EM₁Rec' {C = C} {{C-level}}
(F.F₀ unit)
F.F₁
F.pres-comp
F.pres-comp-coh
abstract
f : EM₁ G → C
f = M.f
embase-β : f embase ↦ F.F₀ unit
embase-β = M.embase-β
{-# REWRITE embase-β #-}
emloop-β : (g : G.El) → ap f (emloop g) == F.F₁ g
emloop-β = M.emloop-β
emloop-comp-path : (g₁ g₂ : G.El)
→ ap (ap f) (emloop-comp g₁ g₂) ◃∙
ap-∙ f (emloop g₁) (emloop g₂) ◃∙
ap2 _∙_ (emloop-β g₁) (emloop-β g₂) ◃∎
=ₛ
emloop-β (G.comp g₁ g₂) ◃∙
F.pres-comp g₁ g₂ ◃∎
emloop-comp-path = M.emloop-comp-path
open EM₁Rec public using () renaming (f to EM₁-rec)
module EM₁Level₁Rec {j} {C : Type j}
{{C-level : has-level 1 C}}
(embase* : C)
(hom* : G →ᴳ (Ω^S-group 0 ⊙[ C , embase* ])) where
module M =
EM₁Rec' {{raise-level 1 C-level}}
embase* (GroupHom.f hom*) (GroupHom.pres-comp hom*)
(λ g₁ g₂ g₃ → =ₛ-in (prop-has-all-paths _ _))
abstract
f : EM₁ G → C
f = M.f
embase-β : f embase ↦ embase*
embase-β = M.embase-β
{-# REWRITE embase-β #-}
emloop-β : (g : G.El) → ap f (emloop g) == GroupHom.f hom* g
emloop-β = M.emloop-β
open EM₁Level₁Rec public using () renaming (f to EM₁-level₁-rec)