{-# OPTIONS --without-K --exact-split --two-level #-}
module Extension.ExoPushout where
open import Extension.Prelude
open import Extension.Core
private
variable
ℓ ℓ' ℓΦ ℓL ℓR ℓP ℓE ℓX ℓB ℓA : Level
exo-tr-inj : {X : UUᵉ ℓ} (Q : X → UUᵉ ℓ') {x y : X} (e : x =ᵉ y) {u v : Q x}
→ exo-tr Q e u =ᵉ exo-tr Q e v → u =ᵉ v
exo-tr-inj Q reflᵉ q = q
tr-section-compat : {X : UUᵉ ℓX} {B : UUᵉ ℓB} (q : X → B) (A : B → UUᵉ ℓA)
(h : (x : X) → A (q x)) {x₁ x₂ : X} (e : x₁ =ᵉ x₂)
{b : B} (α : q x₁ =ᵉ b) (β : q x₂ =ᵉ b)
→ exo-tr A α (h x₁) =ᵉ exo-tr A β (h x₂)
tr-section-compat q A h reflᵉ α β = exo-ap-tr (UIPᵉ α β)
private
exo-tr-const' : {X : UUᵉ ℓ} {B : UUᵉ ℓ'} {x y : X} (e : x =ᵉ y) (b : B)
→ exo-tr (λ _ → B) e b =ᵉ b
exo-tr-const' reflᵉ b = reflᵉ
record is-exo-pushout
{Φ : UUᵉ ℓΦ} {L : UUᵉ ℓL} {R : UUᵉ ℓR}
(f : Φ → L) (g : Φ → R)
{P : UUᵉ ℓP} (inlᴾ : L → P) (inrᴾ : R → P)
(glueᴾ : (w : Φ) → inlᴾ (f w) =ᵉ inrᴾ (g w))
(ℓE : Level)
: UUᵉ (ℓΦ ⊔ ℓL ⊔ ℓR ⊔ ℓP ⊔ lsuc ℓE) where
field
po-elim : (E : P → UUᵉ ℓE)
(l : (x : L) → E (inlᴾ x))
(r : (y : R) → E (inrᴾ y))
(coh : (w : Φ) → exo-tr E (glueᴾ w) (l (f w)) =ᵉ r (g w))
→ (p : P) → E p
po-βl : (E : P → UUᵉ ℓE)
(l : (x : L) → E (inlᴾ x))
(r : (y : R) → E (inrᴾ y))
(coh : (w : Φ) → exo-tr E (glueᴾ w) (l (f w)) =ᵉ r (g w))
(x : L)
→ po-elim E l r coh (inlᴾ x) =ᵉ l x
po-βr : (E : P → UUᵉ ℓE)
(l : (x : L) → E (inlᴾ x))
(r : (y : R) → E (inrᴾ y))
(coh : (w : Φ) → exo-tr E (glueᴾ w) (l (f w)) =ᵉ r (g w))
(y : R)
→ po-elim E l r coh (inrᴾ y) =ᵉ r y
open is-exo-pushout public
module _ {Φ : UUᵉ ℓΦ} {L : UUᵉ ℓL} {R : UUᵉ ℓR}
{f : Φ → L} {g : Φ → R}
{P : UUᵉ ℓP} {inlᴾ : L → P} {inrᴾ : R → P}
{glueᴾ : (w : Φ) → inlᴾ (f w) =ᵉ inrᴾ (g w)}
where
Coconeᵈ : (E : P → UUᵉ ℓE) → UUᵉ (ℓΦ ⊔ ℓL ⊔ ℓR ⊔ ℓE)
Coconeᵈ E = Σᵉ ((x : L) → E (inlᴾ x)) (λ l →
Σᵉ ((y : R) → E (inrᴾ y)) (λ r →
(w : Φ) → exo-tr E (glueᴾ w) (l (f w)) =ᵉ r (g w)))
cocone-=ᵉ : {E : P → UUᵉ ℓE} {z z' : Coconeᵈ E}
→ pr1ᵉ z =ᵉ pr1ᵉ z'
→ pr1ᵉ (pr2ᵉ z) =ᵉ pr1ᵉ (pr2ᵉ z')
→ z =ᵉ z'
cocone-=ᵉ {E = E} {l ,ᵉ (r ,ᵉ coh)} {.l ,ᵉ (.r ,ᵉ coh')} reflᵉ reflᵉ =
exo-ap (λ z → l ,ᵉ (r ,ᵉ z)) (funextᵉ (λ w → UIPᵉ (coh w) (coh' w)))
module _ (po : is-exo-pushout f g inlᴾ inrᴾ glueᴾ ℓE) where
po-η : {E : P → UUᵉ ℓE} (h k : (p : P) → E p)
→ ((x : L) → h (inlᴾ x) =ᵉ k (inlᴾ x))
→ ((y : R) → h (inrᴾ y) =ᵉ k (inrᴾ y))
→ (p : P) → h p =ᵉ k p
po-η {E = E} h k hl hr =
po-elim po (λ p → h p =ᵉ k p) hl hr (λ w → UIPᵉ _ _)
private
rec-coh : {X : UUᵉ ℓE} (l : L → X) (r : R → X)
→ ((w : Φ) → l (f w) =ᵉ r (g w))
→ (w : Φ) → exo-tr (λ _ → X) (glueᴾ w) (l (f w)) =ᵉ r (g w)
rec-coh l r coh w = exo-concat (exo-tr-const' (glueᴾ w) (l (f w))) (coh w)
po-rec : {X : UUᵉ ℓE} (l : L → X) (r : R → X)
→ ((w : Φ) → l (f w) =ᵉ r (g w)) → P → X
po-rec {X = X} l r coh = po-elim po (λ _ → X) l r (rec-coh l r coh)
po-rec-βl : {X : UUᵉ ℓE} (l : L → X) (r : R → X)
(coh : (w : Φ) → l (f w) =ᵉ r (g w)) (x : L)
→ po-rec l r coh (inlᴾ x) =ᵉ l x
po-rec-βl {X = X} l r coh = po-βl po (λ _ → X) l r (rec-coh l r coh)
po-rec-βr : {X : UUᵉ ℓE} (l : L → X) (r : R → X)
(coh : (w : Φ) → l (f w) =ᵉ r (g w)) (y : R)
→ po-rec l r coh (inrᴾ y) =ᵉ r y
po-rec-βr {X = X} l r coh = po-βr po (λ _ → X) l r (rec-coh l r coh)
po-section-≅ : (E : P → UUᵉ ℓE) → ((p : P) → E p) ≅ Coconeᵈ E
po-section-≅ E = to ,ᵉ (from ,ᵉ (linv ,ᵉ rinv))
where
to : ((p : P) → E p) → Coconeᵈ E
to h = (λ x → h (inlᴾ x))
,ᵉ ((λ y → h (inrᴾ y))
,ᵉ (λ w → exo-apd h (glueᴾ w)))
from : Coconeᵈ E → (p : P) → E p
from (l ,ᵉ (r ,ᵉ coh)) = po-elim po E l r coh
linv : (h : (p : P) → E p) → from (to h) =ᵉ h
linv h = funextᵉ
(po-η (from (to h)) h
(po-βl po E (λ x → h (inlᴾ x)) (λ y → h (inrᴾ y)) (λ w → exo-apd h (glueᴾ w)))
(po-βr po E (λ x → h (inlᴾ x)) (λ y → h (inrᴾ y)) (λ w → exo-apd h (glueᴾ w))))
rinv : (z : Coconeᵈ E) → to (from z) =ᵉ z
rinv (l ,ᵉ (r ,ᵉ coh)) =
cocone-=ᵉ (funextᵉ (po-βl po E l r coh)) (funextᵉ (po-βr po E l r coh))