diff --git a/src/foundation.lagda.md b/src/foundation.lagda.md index 20e65d33ce..208ba766ff 100644 --- a/src/foundation.lagda.md +++ b/src/foundation.lagda.md @@ -40,6 +40,7 @@ open import foundation.cartesian-product-types public open import foundation.cartesian-products-set-quotients public open import foundation.category-of-sets public open import foundation.choice-of-representatives-equivalence-relation public +open import foundation.codiagonal-maps-of-types public open import foundation.coherently-invertible-maps public open import foundation.commuting-3-simplices-of-homotopies public open import foundation.commuting-3-simplices-of-maps public diff --git a/src/foundation/codiagonal-maps-of-types.lagda.md b/src/foundation/codiagonal-maps-of-types.lagda.md new file mode 100644 index 0000000000..60c45ec21e --- /dev/null +++ b/src/foundation/codiagonal-maps-of-types.lagda.md @@ -0,0 +1,32 @@ +# Codiagonal maps of types + +```agda +module foundation.codiagonal-maps-of-types where +``` + +
Imports + +```agda +open import foundation.universe-levels + +open import foundation-core.coproduct-types +``` + +
+ +## Idea + +The codiagonal map `∇ : A + A → A` of `A` is the map that projects `A + A` onto +`A`. + +## Definitions + +```agda +module _ + { l1 : Level} (A : UU l1) + where + + codiagonal : A + A → A + codiagonal (inl a) = a + codiagonal (inr a) = a +``` diff --git a/src/synthetic-homotopy-theory.lagda.md b/src/synthetic-homotopy-theory.lagda.md index dc5d8f089d..3eb5a75f12 100644 --- a/src/synthetic-homotopy-theory.lagda.md +++ b/src/synthetic-homotopy-theory.lagda.md @@ -14,11 +14,15 @@ open import synthetic-homotopy-theory.cavallos-trick public open import synthetic-homotopy-theory.circle public open import synthetic-homotopy-theory.cocones-under-spans public open import synthetic-homotopy-theory.cocones-under-spans-of-pointed-types public +open import synthetic-homotopy-theory.coequalizers public open import synthetic-homotopy-theory.cofibers public +open import synthetic-homotopy-theory.coforks public open import synthetic-homotopy-theory.conjugation-loops public open import synthetic-homotopy-theory.dependent-cocones-under-spans public +open import synthetic-homotopy-theory.dependent-coforks public open import synthetic-homotopy-theory.dependent-pullback-property-pushouts public open import synthetic-homotopy-theory.dependent-suspension-structures public +open import synthetic-homotopy-theory.dependent-universal-property-coequalizers public open import synthetic-homotopy-theory.dependent-universal-property-pushouts public open import synthetic-homotopy-theory.dependent-universal-property-suspensions public open import synthetic-homotopy-theory.descent-circle public @@ -28,6 +32,7 @@ open import synthetic-homotopy-theory.descent-circle-equivalence-types public open import synthetic-homotopy-theory.descent-circle-function-types public open import synthetic-homotopy-theory.descent-circle-subtypes public open import synthetic-homotopy-theory.double-loop-spaces public +open import synthetic-homotopy-theory.flattening-lemma-coequalizers public open import synthetic-homotopy-theory.flattening-lemma-pushouts public open import synthetic-homotopy-theory.free-loops public open import synthetic-homotopy-theory.functoriality-loop-spaces public @@ -58,6 +63,7 @@ open import synthetic-homotopy-theory.suspensions-of-types public open import synthetic-homotopy-theory.triple-loop-spaces public open import synthetic-homotopy-theory.universal-cover-circle public open import synthetic-homotopy-theory.universal-property-circle public +open import synthetic-homotopy-theory.universal-property-coequalizers public open import synthetic-homotopy-theory.universal-property-pushouts public open import synthetic-homotopy-theory.universal-property-suspensions public open import synthetic-homotopy-theory.universal-property-suspensions-of-pointed-types public diff --git a/src/synthetic-homotopy-theory/coequalizers.lagda.md b/src/synthetic-homotopy-theory/coequalizers.lagda.md new file mode 100644 index 0000000000..58b565106d --- /dev/null +++ b/src/synthetic-homotopy-theory/coequalizers.lagda.md @@ -0,0 +1,119 @@ +# Coequalizers + +```agda +module synthetic-homotopy-theory.coequalizers where +``` + +
Imports + +```agda +open import foundation.codiagonal-maps-of-types +open import foundation.coproduct-types +open import foundation.equivalences +open import foundation.identity-types +open import foundation.transport-along-identifications +open import foundation.universe-levels + +open import synthetic-homotopy-theory.coforks +open import synthetic-homotopy-theory.dependent-cocones-under-spans +open import synthetic-homotopy-theory.dependent-coforks +open import synthetic-homotopy-theory.dependent-universal-property-coequalizers +open import synthetic-homotopy-theory.pushouts +open import synthetic-homotopy-theory.universal-property-coequalizers +``` + +
+ +## Idea + +The **coequalizer** of a parallel pair `f, g : A → B` is the colimiting +[cofork](synthetic-homotopy-theory.coforks.md), i.e. a cofork with the +[universal property of coequalizers](synthetic-homotopy-theory.universal-property-coequalizers.md). + +## Properties + +### All parallel pairs admit a coequalizer + +The **canonical coequalizer** may be obtained as a +[pushout](synthetic-homotopy-theory.pushouts.md) of the span + +```text + ∇ [f,g] +A <----- A + A -----> B +``` + +where the left map is the +[codiagonal map](foundation.codiagonal-maps-of-types.md), sending `inl(a)` and +`inr(a)` to `a`, and the right map is defined by the universal property of +[coproducts](foundation.coproduct-types.md) to send `inl(a)` to `f(a)` and +`inr(a)` to `g(a)`. + +The pushout thus constructed will consist of a copy of `B`, a copy of `A`, and +for every point `a` of `A` there will be a path from `f(a)` to `a` and to +`g(a)`, which corresponds to having a copy of `B` with paths connecting every +`f(a)` to `g(a)`. + +The construction from pushouts itself is an implementation detail, which is why +the definition is marked abstract. + +```agda +module _ + { l1 l2 : Level} {A : UU l1} {B : UU l2} (f g : A → B) + where + + abstract + canonical-coequalizer : UU (l1 ⊔ l2) + canonical-coequalizer = + pushout (codiagonal A) (ind-coprod (λ _ → B) f g) + + cofork-canonical-coequalizer : cofork f g canonical-coequalizer + cofork-canonical-coequalizer = + cofork-cocone-codiagonal f g + ( cocone-pushout (codiagonal A) (ind-coprod (λ _ → B) f g)) + + dup-canonical-coequalizer : + { l : Level} → + dependent-universal-property-coequalizer l f g + ( cofork-canonical-coequalizer) + dup-canonical-coequalizer P = + is-equiv-comp-htpy + ( dependent-cofork-map f g cofork-canonical-coequalizer) + ( dependent-cofork-dependent-cocone-codiagonal f g + ( cofork-canonical-coequalizer) + ( P)) + ( dependent-cocone-map + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g cofork-canonical-coequalizer) + ( P)) + ( triangle-dependent-cofork-dependent-cocone-codiagonal f g + ( cofork-canonical-coequalizer) + ( P)) + ( tr + ( λ c → + is-equiv + ( dependent-cocone-map + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c) + ( P))) + ( inv + ( is-retraction-map-inv-is-equiv + ( is-equiv-cofork-cocone-codiagonal f g) + ( cocone-pushout (codiagonal A) (ind-coprod (λ _ → B) f g)))) + ( dependent-up-pushout + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( P))) + ( is-equiv-dependent-cofork-dependent-cocone-codiagonal f g + ( cofork-canonical-coequalizer) + ( P)) + + up-canonical-coequalizer : + { l : Level} → + universal-property-coequalizer l f g cofork-canonical-coequalizer + up-canonical-coequalizer = + universal-property-dependent-universal-property-coequalizer f g + ( cofork-canonical-coequalizer) + ( dup-canonical-coequalizer) +``` diff --git a/src/synthetic-homotopy-theory/coforks.lagda.md b/src/synthetic-homotopy-theory/coforks.lagda.md new file mode 100644 index 0000000000..e0d242d305 --- /dev/null +++ b/src/synthetic-homotopy-theory/coforks.lagda.md @@ -0,0 +1,344 @@ +# Coforks + +```agda +module synthetic-homotopy-theory.coforks where +``` + +
Imports + +```agda +open import foundation.action-on-identifications-functions +open import foundation.codiagonal-maps-of-types +open import foundation.commuting-triangles-of-maps +open import foundation.contractible-types +open import foundation.coproduct-types +open import foundation.dependent-pair-types +open import foundation.equality-dependent-pair-types +open import foundation.equivalences +open import foundation.function-types +open import foundation.functoriality-dependent-pair-types +open import foundation.fundamental-theorem-of-identity-types +open import foundation.homotopies +open import foundation.homotopy-induction +open import foundation.identity-types +open import foundation.path-algebra +open import foundation.structure-identity-principle +open import foundation.universe-levels +open import foundation.whiskering-homotopies + +open import synthetic-homotopy-theory.cocones-under-spans +``` + +
+ +## Idea + +A **cofork** of a parallel pair `f, g : A → B` with vertext `X` is a map +`e : B → X` together with a [homotopy](foundation.homotopies.md) +`H : e ∘ f ~ e ∘ g`. The name comes from the diagram + +```text + g + -----> e + A -----> B -----> X + f +``` + +which looks like a fork if you flip the arrows, hence a cofork. + +Coforks are an analogue of +[cocones under spans](synthetic-homotopy-theory.cocones-under-spans.md) for +parallel pairs. The universal cofork of a pair is their +[coequalizer](synthetic-homotopy-theory.coequalizers.md). + +## Definitions + +### Coforks + +```agda +module _ + { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f g : A → B) + where + + cofork : UU l3 → UU (l1 ⊔ l2 ⊔ l3) + cofork X = Σ (B → X) (λ e → e ∘ f ~ e ∘ g) + + module _ + { X : UU l3} (e : cofork X) + where + + map-cofork : B → X + map-cofork = pr1 e + + coherence-cofork : map-cofork ∘ f ~ map-cofork ∘ g + coherence-cofork = pr2 e +``` + +### Homotopies of coforks + +A homotopy between coforks with the same vertex is given by a homotopy between +the two maps, together with a coherence datum asserting that we may apply the +given homotopy and the appropriate cofork homotopy in either order. + +```agda +module _ + { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + where + + coherence-htpy-cofork : + ( e e' : cofork f g X) → + ( K : map-cofork f g e ~ map-cofork f g e') → + UU (l1 ⊔ l3) + coherence-htpy-cofork e e' K = + ( (coherence-cofork f g e) ∙h (K ·r g)) ~ + ( (K ·r f) ∙h (coherence-cofork f g e')) + + htpy-cofork : cofork f g X → cofork f g X → UU (l1 ⊔ l2 ⊔ l3) + htpy-cofork e e' = + Σ ( map-cofork f g e ~ map-cofork f g e') + ( coherence-htpy-cofork e e') +``` + +### Postcomposing coforks + +Given a cofork `e : B → X` and a map `h : X → Y`, we may compose the two to get +a new cofork `h ∘ e`. + +```text + g + -----> e h + A -----> B -----> X -----> Y + f +``` + +```agda +module _ + { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f g : A → B) + { X : UU l3} (e : cofork f g X) + where + + cofork-map : {l : Level} {Y : UU l} → (X → Y) → cofork f g Y + pr1 (cofork-map h) = h ∘ map-cofork f g e + pr2 (cofork-map h) = h ·l (coherence-cofork f g e) +``` + +## Properties + +### Characterization of identity types of coforks + +```agda +module _ + { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + where + + reflexive-htpy-cofork : (e : cofork f g X) → htpy-cofork f g e e + pr1 (reflexive-htpy-cofork e) = refl-htpy + pr2 (reflexive-htpy-cofork e) = right-unit-htpy + + htpy-cofork-eq : + ( e e' : cofork f g X) → (e = e') → htpy-cofork f g e e' + htpy-cofork-eq e .e refl = reflexive-htpy-cofork e + + abstract + is-contr-total-htpy-cofork : + ( e : cofork f g X) → is-contr (Σ (cofork f g X) (htpy-cofork f g e)) + is-contr-total-htpy-cofork e = + is-contr-total-Eq-structure + ( ev-pair (coherence-htpy-cofork f g e)) + ( is-contr-total-htpy (map-cofork f g e)) + ( map-cofork f g e , refl-htpy) + ( is-contr-is-equiv' + ( Σ ( map-cofork f g e ∘ f ~ map-cofork f g e ∘ g) + ( λ K → coherence-cofork f g e ~ K)) + ( tot (λ K M → right-unit-htpy ∙h M)) + ( is-equiv-tot-is-fiberwise-equiv + ( is-equiv-concat-htpy right-unit-htpy)) + ( is-contr-total-htpy (coherence-cofork f g e))) + + is-equiv-htpy-cofork-eq : + ( e e' : cofork f g X) → is-equiv (htpy-cofork-eq e e') + is-equiv-htpy-cofork-eq e = + fundamental-theorem-id (is-contr-total-htpy-cofork e) (htpy-cofork-eq e) + + eq-htpy-cofork : + ( e e' : cofork f g X) → htpy-cofork f g e e' → e = e' + eq-htpy-cofork e e' = map-inv-is-equiv (is-equiv-htpy-cofork-eq e e') +``` + +### Postcomposing a cofork by identity is the identity + +```agda +module _ + { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) + where + + cofork-map-id : cofork-map f g e id = e + cofork-map-id = + eq-htpy-cofork f g + ( cofork-map f g e id) + ( e) + (refl-htpy , (right-unit-htpy ∙h (ap-id ∘ coherence-cofork f g e))) +``` + +### Postcomposing coforks distributes over function composition + +```text + g + -----> e h k + A -----> B -----> X -----> Y -----> Z + f +``` + +```agda +module _ + { l1 l2 l3 l4 l5 : Level} {A : UU l1} {B : UU l2} (f g : A → B) + { X : UU l3} {Y : UU l4} {Z : UU l5} + ( e : cofork f g X) + where + + cofork-map-comp : + (h : X → Y) (k : Y → Z) → + cofork-map f g e (k ∘ h) = cofork-map f g (cofork-map f g e h) k + cofork-map-comp h k = + eq-htpy-cofork f g + ( cofork-map f g e (k ∘ h)) + ( cofork-map f g (cofork-map f g e h) k) + ( refl-htpy , (right-unit-htpy ∙h (ap-comp k h ∘ coherence-cofork f g e))) +``` + +### Coforks are special cases of cocones under spans + +The type of coforks of parallel pairs is equivalent to the type of +[cocones](synthetic-homotopy-theory.cocones-under-spans.md) under the span + +```text + ∇ [f,g] +A <----- A + A -----> B. +``` + +```agda +module _ + { l1 l2 : Level} {A : UU l1} {B : UU l2} (f g : A → B) + where + + module _ + { l3 : Level} {X : UU l3} + where + + cofork-cocone-codiagonal : + cocone (codiagonal A) (ind-coprod (λ _ → B) f g) X → + cofork f g X + pr1 (cofork-cocone-codiagonal c) = + vertical-map-cocone (codiagonal A) (ind-coprod (λ _ → B) f g) c + pr2 (cofork-cocone-codiagonal c) = + ( ( inv-htpy + ( coherence-square-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c))) ·r + ( inl)) ∙h + ( ( coherence-square-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c)) ·r + ( inr)) + + cocone-codiagonal-cofork : + cofork f g X → + cocone (codiagonal A) (ind-coprod (λ _ → B) f g) X + pr1 (cocone-codiagonal-cofork e) = map-cofork f g e ∘ f + pr1 (pr2 (cocone-codiagonal-cofork e)) = map-cofork f g e + pr2 (pr2 (cocone-codiagonal-cofork e)) (inl a) = refl + pr2 (pr2 (cocone-codiagonal-cofork e)) (inr a) = coherence-cofork f g e a + + abstract + is-section-cocone-codiagonal-cofork : + cofork-cocone-codiagonal ∘ cocone-codiagonal-cofork ~ id + is-section-cocone-codiagonal-cofork e = + eq-htpy-cofork f g + ( cofork-cocone-codiagonal (cocone-codiagonal-cofork e)) + ( e) + ( refl-htpy , right-unit-htpy) + + is-retraction-cocone-codiagonal-fork : + cocone-codiagonal-cofork ∘ cofork-cocone-codiagonal ~ id + is-retraction-cocone-codiagonal-fork c = + eq-htpy-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork (cofork-cocone-codiagonal c)) + ( c) + ( ( ( inv-htpy + ( coherence-square-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c))) ·r + ( inl)) , + ( refl-htpy) , + ( λ { + (inl a) → + inv + ( left-inv + ( coherence-square-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c) + ( inl a))) ; + (inr a) → right-unit})) + + is-equiv-cofork-cocone-codiagonal : + is-equiv cofork-cocone-codiagonal + is-equiv-cofork-cocone-codiagonal = + is-equiv-is-invertible + ( cocone-codiagonal-cofork) + ( is-section-cocone-codiagonal-cofork) + ( is-retraction-cocone-codiagonal-fork) + + equiv-cocone-codiagonal-cofork : + cocone (codiagonal A) (ind-coprod (λ _ → B) f g) X ≃ + cofork f g X + pr1 equiv-cocone-codiagonal-cofork = cofork-cocone-codiagonal + pr2 equiv-cocone-codiagonal-cofork = is-equiv-cofork-cocone-codiagonal + + triangle-cofork-cocone : + { l3 l4 : Level} {X : UU l3} {Y : UU l4} → + ( c : cocone (codiagonal A) (ind-coprod (λ _ → B) f g) X) → + coherence-triangle-maps + ( cofork-map f g (cofork-cocone-codiagonal c) {Y = Y}) + ( cofork-cocone-codiagonal) + ( cocone-map (codiagonal A) (ind-coprod (λ _ → B) f g) c) + triangle-cofork-cocone c h = + eq-htpy-cofork f g + ( cofork-map f g (cofork-cocone-codiagonal c) h) + ( cofork-cocone-codiagonal + ( cocone-map (codiagonal A) (ind-coprod (λ _ → B) f g) c h)) + ( refl-htpy , + ( right-unit-htpy ∙h + ( λ a → + ( ap-concat h + ( inv + ( coherence-square-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c) + ( inl a))) + ( coherence-square-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c) + ( inr a))) ∙ + ( identification-right-whisk + ( ap-inv h + ( coherence-square-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c) + ( inl a))) + ( ap h + ( coherence-square-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( c) + ( inr a))))))) +``` diff --git a/src/synthetic-homotopy-theory/dependent-coforks.lagda.md b/src/synthetic-homotopy-theory/dependent-coforks.lagda.md new file mode 100644 index 0000000000..6dbe72ff61 --- /dev/null +++ b/src/synthetic-homotopy-theory/dependent-coforks.lagda.md @@ -0,0 +1,445 @@ +# Dependent coforks + +```agda +module synthetic-homotopy-theory.dependent-coforks where +``` + +
Imports + +```agda +open import foundation.action-on-identifications-dependent-functions +open import foundation.action-on-identifications-functions +open import foundation.codiagonal-maps-of-types +open import foundation.commuting-triangles-of-maps +open import foundation.constant-type-families +open import foundation.contractible-types +open import foundation.coproduct-types +open import foundation.dependent-identifications +open import foundation.dependent-pair-types +open import foundation.equivalences +open import foundation.function-types +open import foundation.functoriality-dependent-function-types +open import foundation.functoriality-dependent-pair-types +open import foundation.fundamental-theorem-of-identity-types +open import foundation.homotopies +open import foundation.homotopy-induction +open import foundation.identity-types +open import foundation.structure-identity-principle +open import foundation.transport-along-identifications +open import foundation.universe-levels +open import foundation.whiskering-homotopies + +open import synthetic-homotopy-theory.coforks +open import synthetic-homotopy-theory.dependent-cocones-under-spans +``` + +
+ +## Idea + +Given a parallel pair `f, g : A → B`, a +[cofork](synthetic-homotopy-theory.coforks.md) `e : B → X` with vertex `X`, and +a type family `P : X → 𝓤` over `X`, we may construct _dependent_ coforks on `P` +over `e`. + +A **dependent cofork** on `P` over `e` consists of a dependent map + +```text +k : (b : B) → P (e b) +``` + +and a family of +[dependent identifications](foundation.dependent-identifications.md) indexed by +`A` + +```text +(a : A) → dependent-identification P (H a) (k (f a)) (k (g a)). +``` + +Dependent coforks are an analogue of +[dependent cocones under spans](synthetic-homotopy-theory.dependent-cocones-under-spans.md) +for parallel pairs. + +## Definitions + +### Dependent coforks + +```agda +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) (P : X → UU l4) + where + + dependent-cofork : UU (l1 ⊔ l2 ⊔ l4) + dependent-cofork = + Σ ( (b : B) → P (map-cofork f g e b)) + ( λ k → + ( a : A) → + dependent-identification P + ( coherence-cofork f g e a) + ( k (f a)) + ( k (g a))) + +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + { e : cofork f g X} (P : X → UU l4) + ( k : dependent-cofork f g e P) + where + + map-dependent-cofork : (b : B) → P (map-cofork f g e b) + map-dependent-cofork = pr1 k + + coherence-dependent-cofork : + ( a : A) → + dependent-identification P + ( coherence-cofork f g e a) + ( map-dependent-cofork (f a)) + ( map-dependent-cofork (g a)) + coherence-dependent-cofork = pr2 k +``` + +### Homotopies of dependent coforks + +A homotopy between dependent coforks is a homotopy between the underlying maps, +together with a coherence condition. + +```agda +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + { e : cofork f g X} (P : X → UU l4) + where + + coherence-htpy-dependent-cofork : + ( k k' : dependent-cofork f g e P) → + ( K : map-dependent-cofork f g P k ~ map-dependent-cofork f g P k') → + UU (l1 ⊔ l4) + coherence-htpy-dependent-cofork k k' K = + ( a : A) → + ( ( coherence-dependent-cofork f g P k a) ∙ (K (g a))) = + ( ( ap (tr P (coherence-cofork f g e a)) (K (f a))) ∙ + ( coherence-dependent-cofork f g P k' a)) + + htpy-dependent-cofork : + ( k k' : dependent-cofork f g e P) → + UU (l1 ⊔ l2 ⊔ l4) + htpy-dependent-cofork k k' = + Σ ( map-dependent-cofork f g P k ~ map-dependent-cofork f g P k') + ( coherence-htpy-dependent-cofork k k') +``` + +### Obtaining dependent coforks as postcomposition of coforks with dependent maps + +One way to obtains dependent coforks is to postcompose the underlying cofork by +a dependent map, according to the diagram + +```text + g + -----> e h + A -----> B -----> (x : X) -----> (P x) + f +``` + +```agda +module _ + { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) + where + + dependent-cofork-map : + { l : Level} {P : X → UU l} → ((x : X) → P x) → dependent-cofork f g e P + pr1 (dependent-cofork-map h) = h ∘ map-cofork f g e + pr2 (dependent-cofork-map h) = apd h ∘ coherence-cofork f g e +``` + +## Properties + +### Characterization of identity types of coforks + +```agda +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + { e : cofork f g X} (P : X → UU l4) + where + + reflexive-htpy-dependent-cofork : + ( k : dependent-cofork f g e P) → + htpy-dependent-cofork f g P k k + pr1 (reflexive-htpy-dependent-cofork k) = refl-htpy + pr2 (reflexive-htpy-dependent-cofork k) = right-unit-htpy + + htpy-dependent-cofork-eq : + ( k k' : dependent-cofork f g e P) → + ( k = k') → htpy-dependent-cofork f g P k k' + htpy-dependent-cofork-eq k .k refl = reflexive-htpy-dependent-cofork k + + abstract + is-contr-total-htpy-dependent-cofork : + ( k : dependent-cofork f g e P) → + is-contr (Σ (dependent-cofork f g e P) (htpy-dependent-cofork f g P k)) + is-contr-total-htpy-dependent-cofork k = + is-contr-total-Eq-structure + ( ev-pair (coherence-htpy-dependent-cofork f g P k)) + ( is-contr-total-htpy (map-dependent-cofork f g P k)) + ( map-dependent-cofork f g P k , refl-htpy) + ( is-contr-is-equiv' + ( Σ ( (a : A) → + dependent-identification P + ( coherence-cofork f g e a) + ( map-dependent-cofork f g P k (f a)) + ( map-dependent-cofork f g P k (g a))) + ( λ K → coherence-dependent-cofork f g P k ~ K)) + ( tot (λ K M → right-unit-htpy ∙h M)) + ( is-equiv-tot-is-fiberwise-equiv + ( is-equiv-concat-htpy right-unit-htpy)) + ( is-contr-total-htpy (coherence-dependent-cofork f g P k))) + + is-equiv-htpy-dependent-cofork-eq : + ( k k' : dependent-cofork f g e P) → + is-equiv (htpy-dependent-cofork-eq k k') + is-equiv-htpy-dependent-cofork-eq k = + fundamental-theorem-id + ( is-contr-total-htpy-dependent-cofork k) + ( htpy-dependent-cofork-eq k) + + eq-htpy-dependent-cofork : + ( k k' : dependent-cofork f g e P) → + htpy-dependent-cofork f g P k k' → k = k' + eq-htpy-dependent-cofork k k' = + map-inv-is-equiv (is-equiv-htpy-dependent-cofork-eq k k') +``` + +### Dependent coforks on constant type families are equivalent to regular coforks + +```agda +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) (Y : UU l4) + where + + compute-dependent-cofork-constant-family : + dependent-cofork f g e (λ _ → Y) ≃ cofork f g Y + compute-dependent-cofork-constant-family = + equiv-tot + ( λ h → + equiv-Π-equiv-family + ( λ a → + equiv-concat + ( inv + ( tr-constant-type-family (coherence-cofork f g e a) (h (f a)))) + ( h (g a)))) + + map-compute-dependent-cofork-constant-family : + dependent-cofork f g e (λ _ → Y) → cofork f g Y + map-compute-dependent-cofork-constant-family = + map-equiv compute-dependent-cofork-constant-family + + triangle-compute-dependent-cofork-constant-family : + coherence-triangle-maps + ( cofork-map f g e) + ( map-compute-dependent-cofork-constant-family) + ( dependent-cofork-map f g e) + triangle-compute-dependent-cofork-constant-family h = + eq-htpy-cofork f g + ( cofork-map f g e h) + ( map-compute-dependent-cofork-constant-family + ( dependent-cofork-map f g e h)) + ( ( refl-htpy) , + ( right-unit-htpy ∙h + ( λ a → + left-transpose-eq-concat _ _ _ + ( inv (apd-constant-type-family h (coherence-cofork f g e a)))))) +``` + +### Dependent coforks are special cases of dependent cocones under spans + +The type of dependent coforks on `P` over `e` is equivalent to the type of +[dependent cocones](synthetic-homotopy-theory.dependent-cocones-under-spans.md) +on `P` over a cocone corresponding to `e` via `cocone-codiagonal-cofork`. + +```agda +module _ + { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) + where + + module _ + { l4 : Level} (P : X → UU l4) + where + + dependent-cofork-dependent-cocone-codiagonal : + dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) → + dependent-cofork f g e P + pr1 (dependent-cofork-dependent-cocone-codiagonal k) = + vertical-map-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( k) + pr2 (dependent-cofork-dependent-cocone-codiagonal k) a = + inv + ( ap + ( tr P (coherence-cofork f g e a)) + ( coherence-square-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( k) + ( inl a))) ∙ + coherence-square-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( k) + ( inr a) + + dependent-cocone-codiagonal-dependent-cofork : + dependent-cofork f g e P → + dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + pr1 (dependent-cocone-codiagonal-dependent-cofork k) = + map-dependent-cofork f g P k ∘ f + pr1 (pr2 (dependent-cocone-codiagonal-dependent-cofork k)) = + map-dependent-cofork f g P k + pr2 (pr2 (dependent-cocone-codiagonal-dependent-cofork k)) (inl a) = + refl + pr2 (pr2 (dependent-cocone-codiagonal-dependent-cofork k)) (inr a) = + coherence-dependent-cofork f g P k a + + abstract + is-section-dependent-cocone-codiagonal-dependent-cofork : + ( ( dependent-cofork-dependent-cocone-codiagonal) ∘ + ( dependent-cocone-codiagonal-dependent-cofork)) ~ + ( id) + is-section-dependent-cocone-codiagonal-dependent-cofork k = + eq-htpy-dependent-cofork f g P + ( dependent-cofork-dependent-cocone-codiagonal + ( dependent-cocone-codiagonal-dependent-cofork k)) + ( k) + ( refl-htpy , right-unit-htpy) + + is-retraction-dependent-cocone-codiagonal-dependent-cofork : + ( ( dependent-cocone-codiagonal-dependent-cofork) ∘ + ( dependent-cofork-dependent-cocone-codiagonal)) ~ + ( id) + is-retraction-dependent-cocone-codiagonal-dependent-cofork d = + eq-htpy-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( dependent-cocone-codiagonal-dependent-cofork + ( dependent-cofork-dependent-cocone-codiagonal d)) + ( d) + ( inv-htpy + ( ( coherence-square-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( d)) ∘ + ( inl)) , + ( refl-htpy) , + ( right-unit-htpy ∙h + ( λ { + (inl a) → + inv + ( ( ap + ( _∙ + coherence-square-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( d) + ( inl a)) + ( ap-id + ( inv + ( coherence-square-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( d) + ( inl a))))) ∙ + ( left-inv + ( coherence-square-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( d) + ( inl a)))) ; + (inr a) → + ap + ( _∙ + coherence-square-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( d) + ( inr a)) + ( inv + ( ap-inv + ( tr P (coherence-cofork f g e a)) + ( coherence-square-dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( d) + ( inl a))))}))) + + is-equiv-dependent-cofork-dependent-cocone-codiagonal : + is-equiv dependent-cofork-dependent-cocone-codiagonal + is-equiv-dependent-cofork-dependent-cocone-codiagonal = + is-equiv-is-invertible + ( dependent-cocone-codiagonal-dependent-cofork) + ( is-section-dependent-cocone-codiagonal-dependent-cofork) + ( is-retraction-dependent-cocone-codiagonal-dependent-cofork) + + equiv-dependent-cofork-dependent-cocone-codiagonal : + dependent-cocone + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) ≃ + dependent-cofork f g e P + pr1 equiv-dependent-cofork-dependent-cocone-codiagonal = + dependent-cofork-dependent-cocone-codiagonal + pr2 equiv-dependent-cofork-dependent-cocone-codiagonal = + is-equiv-dependent-cofork-dependent-cocone-codiagonal + + triangle-dependent-cofork-dependent-cocone-codiagonal : + { l4 : Level} (P : X → UU l4) → + coherence-triangle-maps + ( dependent-cofork-map f g e) + ( dependent-cofork-dependent-cocone-codiagonal P) + ( dependent-cocone-map + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P)) + triangle-dependent-cofork-dependent-cocone-codiagonal P h = + eq-htpy-dependent-cofork f g P + ( dependent-cofork-map f g e h) + ( dependent-cofork-dependent-cocone-codiagonal P + ( dependent-cocone-map + ( codiagonal A) + ( ind-coprod (λ _ → B) f g) + ( cocone-codiagonal-cofork f g e) + ( P) + ( h))) + ( refl-htpy , + right-unit-htpy) +``` diff --git a/src/synthetic-homotopy-theory/dependent-universal-property-coequalizers.lagda.md b/src/synthetic-homotopy-theory/dependent-universal-property-coequalizers.lagda.md new file mode 100644 index 0000000000..2a5d19fb95 --- /dev/null +++ b/src/synthetic-homotopy-theory/dependent-universal-property-coequalizers.lagda.md @@ -0,0 +1,134 @@ +# The dependent universal property of coequalizers + +```agda +module synthetic-homotopy-theory.dependent-universal-property-coequalizers where +``` + +
Imports + +```agda +open import foundation.contractible-maps +open import foundation.contractible-types +open import foundation.dependent-pair-types +open import foundation.equivalences +open import foundation.fibers-of-maps +open import foundation.functoriality-dependent-pair-types +open import foundation.homotopies +open import foundation.universe-levels + +open import synthetic-homotopy-theory.coforks +open import synthetic-homotopy-theory.dependent-coforks +open import synthetic-homotopy-theory.universal-property-coequalizers +``` + +
+ +## Idea + +The **dependent universal property of coequalizers** is a property of +[coequalizers](synthetic-homotopy-theory.coequalizers.md) of a parallel pair +`f, g : A → B`, asserting that for any type family `P : X → 𝓤` over the +coequalizer `e : B → X`, there is an equivalence between sections of `P` and +dependent cocones on `P` over `e`, given by the map + +```text +dependent-cofork-map : ((x : X) → P x) → dependent-cocone e P. +``` + +## Definitions + +### The dependent universal property of coequalizers + +```agda +module _ + { l1 l2 l3 : Level} (l : Level) {A : UU l1} {B : UU l2} (f g : A → B) + { X : UU l3} (e : cofork f g X) + where + + dependent-universal-property-coequalizer : UU (l1 ⊔ l2 ⊔ l3 ⊔ lsuc l) + dependent-universal-property-coequalizer = + (P : X → UU l) → is-equiv (dependent-cofork-map f g e {P = P}) + +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) {P : X → UU l4} + ( dup-coequalizer : dependent-universal-property-coequalizer l4 f g e) + where + + map-dependent-universal-property-coequalizers : + dependent-cofork f g e P → + (x : X) → P x + map-dependent-universal-property-coequalizers = + map-inv-is-equiv (dup-coequalizer P) +``` + +## Properties + +### The mediating dependent map obtained by the dependent universal property is unique + +```agda +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) {P : X → UU l4} + ( dup-coequalizer : dependent-universal-property-coequalizer l4 f g e) + ( k : dependent-cofork f g e P) + where + + htpy-dependent-cofork-map-dependent-universal-property-coequalizer : + htpy-dependent-cofork f g P + ( dependent-cofork-map f g e + ( map-dependent-universal-property-coequalizers f g e + ( dup-coequalizer) + ( k))) + ( k) + htpy-dependent-cofork-map-dependent-universal-property-coequalizer = + htpy-dependent-cofork-eq f g P + ( dependent-cofork-map f g e + ( map-dependent-universal-property-coequalizers f g e + ( dup-coequalizer) + ( k))) + ( k) + ( is-section-map-inv-is-equiv (dup-coequalizer P) k) + + abstract + uniqueness-dependent-universal-property-coequalizers : + is-contr + ( Σ ((x : X) → P x) + ( λ h → htpy-dependent-cofork f g P (dependent-cofork-map f g e h) k)) + uniqueness-dependent-universal-property-coequalizers = + is-contr-is-equiv' + ( fiber (dependent-cofork-map f g e) k) + ( tot + ( λ h → + htpy-dependent-cofork-eq f g P (dependent-cofork-map f g e h) k)) + ( is-equiv-tot-is-fiberwise-equiv + ( λ h → + is-equiv-htpy-dependent-cofork-eq f g P + ( dependent-cofork-map f g e h) + ( k))) + ( is-contr-map-is-equiv (dup-coequalizer P) k) +``` + +### The dependent universal property of coequializers implies the universal property of coequalizers + +```agda +module _ + { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) + where + + universal-property-dependent-universal-property-coequalizer : + ( {l : Level} → dependent-universal-property-coequalizer l f g e) → + ( {l : Level} → universal-property-coequalizer l f g e) + universal-property-dependent-universal-property-coequalizer + ( dup-coequalizer) + ( Y) = + is-equiv-comp-htpy + ( cofork-map f g e) + ( map-compute-dependent-cofork-constant-family f g e Y) + ( dependent-cofork-map f g e) + ( triangle-compute-dependent-cofork-constant-family f g e Y) + ( dup-coequalizer (λ _ → Y)) + ( is-equiv-map-equiv + ( compute-dependent-cofork-constant-family f g e Y)) +``` diff --git a/src/synthetic-homotopy-theory/flattening-lemma-coequalizers.lagda.md b/src/synthetic-homotopy-theory/flattening-lemma-coequalizers.lagda.md new file mode 100644 index 0000000000..d39acc6304 --- /dev/null +++ b/src/synthetic-homotopy-theory/flattening-lemma-coequalizers.lagda.md @@ -0,0 +1,169 @@ +# The flattening lemma for coequalizers + +```agda +module synthetic-homotopy-theory.flattening-lemma-coequalizers where +``` + +
Imports + +```agda +open import foundation.commuting-triangles-of-maps +open import foundation.dependent-pair-types +open import foundation.equality-dependent-pair-types +open import foundation.equivalences +open import foundation.function-extensionality +open import foundation.function-types +open import foundation.functoriality-dependent-function-types +open import foundation.functoriality-dependent-pair-types +open import foundation.homotopies +open import foundation.identity-types +open import foundation.transport-along-identifications +open import foundation.universal-property-dependent-pair-types +open import foundation.universe-levels + +open import synthetic-homotopy-theory.coforks +open import synthetic-homotopy-theory.dependent-coforks +open import synthetic-homotopy-theory.dependent-universal-property-coequalizers +open import synthetic-homotopy-theory.universal-property-coequalizers +``` + +
+ +## Idea + +The **flattening lemma** for +[coequalizers](synthetic-homotopy-theory.coequalizers.md) states that +coequalizers commute with +[dependent pair types](foundation.dependent-pair-types.md). More precisely, +given a coequalizer + +```text + g + -----> e + A -----> B -----> X + f +``` + +with homotopy `H : e ∘ f ~ e ∘ g`, and a type family `P : X → 𝓤` over `X`, the +cofork + +```text + -----> +Σ (a : A) P(efa) -----> Σ (b : B) P(eb) ---> Σ (x : X) P(x) +``` + +is again a coequalizer. + +## Definitions + +### The statement of the flattening lemma for coequalizers + +```agda +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( P : X → UU l4) (e : cofork f g X) + where + + cofork-flattening-lemma-coequalizer : + cofork + ( map-Σ-map-base f (P ∘ map-cofork f g e)) + ( map-Σ (P ∘ map-cofork f g e) g (λ a → tr P (coherence-cofork f g e a))) + ( Σ X P) + pr1 cofork-flattening-lemma-coequalizer = map-Σ-map-base (map-cofork f g e) P + pr2 cofork-flattening-lemma-coequalizer = + coherence-square-maps-map-Σ-map-base P g f + ( map-cofork f g e) + ( map-cofork f g e) + ( coherence-cofork f g e) + + flattening-lemma-coequalizer-statement : UUω + flattening-lemma-coequalizer-statement = + ( {l : Level} → dependent-universal-property-coequalizer l f g e) → + { l : Level} → + universal-property-coequalizer l + ( map-Σ-map-base f (P ∘ map-cofork f g e)) + ( map-Σ (P ∘ map-cofork f g e) g (λ a → tr P (coherence-cofork f g e a))) + ( cofork-flattening-lemma-coequalizer) +``` + +## Properties + +### Proof of the flattening lemma for coequalizers + +The proof is analogous to the one of the +[flattening lemma for pushouts](synthetic-homotopy-theory.flattening-lemma-pushouts.md). + +```agda +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( P : X → UU l4) (e : cofork f g X) + where + + cofork-map-flattening-coequalizer : + { l : Level} (Y : UU l) → + ( Σ X P → Y) → + cofork + ( map-Σ-map-base f (P ∘ map-cofork f g e)) + ( map-Σ (P ∘ map-cofork f g e) g (λ a → tr P (coherence-cofork f g e a))) + ( Y) + cofork-map-flattening-coequalizer Y = + cofork-map + ( map-Σ-map-base f (P ∘ map-cofork f g e)) + ( map-Σ (P ∘ map-cofork f g e) g (λ a → tr P (coherence-cofork f g e a))) + ( cofork-flattening-lemma-coequalizer f g P e) + + comparison-dependent-cofork-ind-Σ-cofork : + { l : Level} (Y : UU l) → + Σ ( (b : B) → P (map-cofork f g e b) → Y) + ( λ k → + ( a : A) (t : P (map-cofork f g e (f a))) → + ( k (f a) t) = + ( k (g a) (tr P (coherence-cofork f g e a) t))) ≃ + dependent-cofork f g e (λ x → P x → Y) + comparison-dependent-cofork-ind-Σ-cofork Y = + equiv-tot + ( λ k → + equiv-Π-equiv-family + ( equiv-htpy-dependent-fuction-dependent-identification-function-type + ( Y) + ( coherence-cofork f g e) + ( k ∘ f) + ( k ∘ g))) + + triangle-comparison-dependent-cofork-ind-Σ-cofork : + { l : Level} (Y : UU l) → + coherence-triangle-maps + ( dependent-cofork-map f g e {P = (λ x → P x → Y)}) + ( map-equiv (comparison-dependent-cofork-ind-Σ-cofork Y)) + ( map-equiv equiv-ev-pair² ∘ cofork-map-flattening-coequalizer Y ∘ ind-Σ) + triangle-comparison-dependent-cofork-ind-Σ-cofork Y h = + eq-pair-Σ + ( refl) + ( eq-htpy + ( inv-htpy + ( compute-equiv-htpy-dependent-fuction-dependent-identification-function-type + ( Y) + ( coherence-cofork f g e) + ( h)))) + + flattening-lemma-coequalizer : + flattening-lemma-coequalizer-statement f g P e + flattening-lemma-coequalizer dup-coequalizer Y = + is-equiv-left-factor + ( cofork-map-flattening-coequalizer Y) + ( ind-Σ) + ( is-equiv-right-factor + ( map-equiv equiv-ev-pair²) + ( cofork-map-flattening-coequalizer Y ∘ ind-Σ) + ( is-equiv-map-equiv equiv-ev-pair²) + ( is-equiv-right-factor-htpy + ( dependent-cofork-map f g e {P = (λ x → P x → Y)}) + ( map-equiv (comparison-dependent-cofork-ind-Σ-cofork Y)) + ( ( map-equiv equiv-ev-pair²) ∘ + ( cofork-map-flattening-coequalizer Y) ∘ + ( ind-Σ)) + ( triangle-comparison-dependent-cofork-ind-Σ-cofork Y) + ( is-equiv-map-equiv (comparison-dependent-cofork-ind-Σ-cofork Y)) + ( dup-coequalizer (λ x → P x → Y)))) + ( is-equiv-ind-Σ) +``` diff --git a/src/synthetic-homotopy-theory/flattening-lemma-pushouts.lagda.md b/src/synthetic-homotopy-theory/flattening-lemma-pushouts.lagda.md index f6ef8f235a..55df1bf9f1 100644 --- a/src/synthetic-homotopy-theory/flattening-lemma-pushouts.lagda.md +++ b/src/synthetic-homotopy-theory/flattening-lemma-pushouts.lagda.md @@ -69,7 +69,6 @@ module _ { l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3} { X : UU l4} (P : X → UU l5) ( f : S → A) (g : S → B) (c : cocone f g X) - ( dup-pushout : {l : Level} → dependent-universal-property-pushout l f g c) where horizontal-map-cocone-flattening-pushout : @@ -114,6 +113,7 @@ module _ flattening-lemma-pushout-statement : UUω flattening-lemma-pushout-statement = + ( { l : Level} → dependent-universal-property-pushout l f g c) → { l : Level} → universal-property-pushout l ( map-Σ-map-base f (P ∘ horizontal-map-cocone f g c)) @@ -137,7 +137,6 @@ module _ { l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3} { X : UU l4} (P : X → UU l5) ( f : S → A) (g : S → B) (c : cocone f g X) - ( dup-pushout : {l : Level} → dependent-universal-property-pushout l f g c) where cocone-map-flattening-pushout : @@ -157,7 +156,7 @@ module _ ( P ∘ vertical-map-cocone f g c) ( g) ( λ s → tr P (coherence-square-cocone f g c s))) - ( cocone-flattening-pushout P f g c dup-pushout) + ( cocone-flattening-pushout P f g c) comparison-dependent-cocone-ind-Σ-cocone : { l : Level} (Y : UU l) → @@ -200,8 +199,8 @@ module _ ( h))))) flattening-lemma-pushout : - flattening-lemma-pushout-statement P f g c dup-pushout - flattening-lemma-pushout Y = + flattening-lemma-pushout-statement P f g c + flattening-lemma-pushout dup-pushout Y = is-equiv-left-factor ( cocone-map-flattening-pushout Y) ( ind-Σ) diff --git a/src/synthetic-homotopy-theory/universal-property-coequalizers.lagda.md b/src/synthetic-homotopy-theory/universal-property-coequalizers.lagda.md new file mode 100644 index 0000000000..9671b76938 --- /dev/null +++ b/src/synthetic-homotopy-theory/universal-property-coequalizers.lagda.md @@ -0,0 +1,94 @@ +# The universal property of coequalizers + +```agda +module synthetic-homotopy-theory.universal-property-coequalizers where +``` + +
Imports + +```agda +open import foundation.contractible-maps +open import foundation.contractible-types +open import foundation.dependent-pair-types +open import foundation.equivalences +open import foundation.fibers-of-maps +open import foundation.functoriality-dependent-pair-types +open import foundation.universe-levels + +open import synthetic-homotopy-theory.coforks +``` + +
+ +## Idea + +Given a parallel pair `f, g : A → B`, consider a +[cofork](synthetic-homotopy-theory.coforks.md) `e : B → X` with vertex X. The +**universal property of coequalizers** is the statement that the cofork +postcomposition map + +```text +cofork-map : (X → Y) → cofork Y +``` + +is an equivalence. + +## Definitions + +### The universal property of coequalizers + +```agda +module _ + { l1 l2 l3 : Level} (l : Level) {A : UU l1} {B : UU l2} (f g : A → B) + { X : UU l3} (e : cofork f g X) + where + + universal-property-coequalizer : UU (l1 ⊔ l2 ⊔ l3 ⊔ lsuc l) + universal-property-coequalizer = + ( Y : UU l) → is-equiv (cofork-map f g e {Y = Y}) + +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) {Y : UU l4} + ( up-coequalizer : universal-property-coequalizer l4 f g e) + where + + map-universal-property-coequalizer : cofork f g Y → (X → Y) + map-universal-property-coequalizer = map-inv-is-equiv (up-coequalizer Y) +``` + +## Properties + +### The mediating map obtained by the universal property is unique + +```agda +module _ + { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} (f g : A → B) {X : UU l3} + ( e : cofork f g X) {Y : UU l4} + ( up-coequalizer : universal-property-coequalizer l4 f g e) + ( e' : cofork f g Y) + where + + htpy-cofork-map-universal-property-coequalizer : + htpy-cofork f g + ( cofork-map f g e + ( map-universal-property-coequalizer f g e up-coequalizer e')) + ( e') + htpy-cofork-map-universal-property-coequalizer = + htpy-cofork-eq f g + ( cofork-map f g e + ( map-universal-property-coequalizer f g e up-coequalizer e')) + ( e') + ( is-section-map-inv-is-equiv (up-coequalizer Y) e') + + abstract + uniqueness-map-universal-property-coequalizer : + is-contr (Σ (X → Y) (λ h → htpy-cofork f g (cofork-map f g e h) e')) + uniqueness-map-universal-property-coequalizer = + is-contr-is-equiv' + ( fiber (cofork-map f g e) e') + ( tot (λ h → htpy-cofork-eq f g (cofork-map f g e h) e')) + ( is-equiv-tot-is-fiberwise-equiv + ( λ h → is-equiv-htpy-cofork-eq f g (cofork-map f g e h) e')) + ( is-contr-map-is-equiv (up-coequalizer Y) e') +```