{-# OPTIONS --without-K --cubical-compatible #-}
open import common
module palg where
P : ∀ {ℓ₁ ℓ₂ ℓ₃} (A : Type ℓ₁) (B : A → Type ℓ₂) (X : Type ℓ₃)
→ Type (ℓ₁ ⊔ ℓ₂ ⊔ ℓ₃)
P A B X = Σ A (λ a → B a → X)
P-map : ∀ {ℓ₁ ℓ₂ ℓ₃ ℓ₄} {A : Type ℓ₁} {B : A → Type ℓ₂}
{C : Type ℓ₃} {D : Type ℓ₄}
→ (C → D) → P A B C → P A B D
P-map f (a , u) = (a , f ∘ u)
P-∘ : ∀ {ℓ₁ ℓ₂ ℓ₃ ℓ₄ ℓ₅}
{A : Type ℓ₁} {B : A → Type ℓ₂}
{X : Type ℓ₃} {Y : Type ℓ₄} {Z : Type ℓ₅}
→ (g : Y → Z) (f : X → Y)
→ P-map {A = A} {B = B} g ∘ P-map f
≡ P-map {A = A} {B = B} (g ∘ f)
P-∘ g f = ext (λ _ → refl)
P-id : ∀ {ℓ₁ ℓ₂ ℓ₃}
{A : Type ℓ₁} {B : A → Type ℓ₂} {X : Type ℓ₃}
→ P-map {A = A} {B = B} {C = X} {D = X} (λ x → x) ≡ λ p → p
P-id = ext (λ _ → refl)
P-resp : ∀ {ℓ} {A : Type ℓ} {B : A → Type ℓ} {C D : Type ℓ}
(f g : C → D)
→ (∀ x → f x ≡ g x)
→ ∀ p → P-map {A = A} {B = B} f p ≡ P-map g p
P-resp f g α (a , u) = Σ-≡-intro refl (ext (λ b → α (u b)))
P-resp-is-ap-P-map : ∀ {ℓ} {A : Type ℓ} {B : A → Type ℓ}
{C D : Type ℓ} {f g : C → D}
(α : ∀ x → f x ≡ g x) (p : P A B C)
→ P-resp f g α p ≡ ap (λ h → P-map h p) (ext α)
P-resp-is-ap-P-map α (a , u) =
ap (Σ-≡-intro refl) (! (precomp-ext u α))
• Σ-≡-intro-ap (ext α)
P-Alg : ∀ {ℓ₁ ℓ₂ ℓ₃} (A : Type ℓ₁) (B : A → Type ℓ₂)
→ Type (ℓ₁ ⊔ ℓ₂ ⊔ lsuc ℓ₃)
P-Alg {ℓ₃ = ℓ₃} A B = Σ (Type ℓ₃) (λ C → P A B C → C)
Carrier : ∀ {ℓ₁ ℓ₂ ℓ₃} {A : Type ℓ₁} {B : A → Type ℓ₂}
→ P-Alg {ℓ₃ = ℓ₃} A B → Type ℓ₃
Carrier = fst
SMap : ∀ {ℓ₁ ℓ₂ ℓ₃} {A : Type ℓ₁} {B : A → Type ℓ₂}
→ (X : P-Alg {ℓ₃ = ℓ₃} A B) → P A B (Carrier X) → Carrier X
SMap = snd
isAlgHom : ∀ {ℓ₁ ℓ₂ ℓ₃ ℓ₄}
{A : Type ℓ₁} {B : A → Type ℓ₂}
→ (X : P-Alg {ℓ₃ = ℓ₃} A B) (Y : P-Alg {ℓ₃ = ℓ₄} A B)
→ (Carrier X → Carrier Y) → Type (ℓ₁ ⊔ ℓ₂ ⊔ ℓ₃ ⊔ ℓ₄)
isAlgHom (C , f) (D , g) h = h ∘ f ≡ g ∘ P-map h
AlgHom : ∀ {ℓ₁ ℓ₂ ℓ₃ ℓ₄}
{A : Type ℓ₁} {B : A → Type ℓ₂}
→ P-Alg {ℓ₃ = ℓ₃} A B → P-Alg {ℓ₃ = ℓ₄} A B
→ Type (ℓ₁ ⊔ ℓ₂ ⊔ ℓ₃ ⊔ ℓ₄)
AlgHom X Y = Σ (Carrier X → Carrier Y) (isAlgHom X Y)
AlgHom-∘ : ∀ {ℓ₁ ℓ₂ ℓ₃ ℓ₄ ℓ₅}
{A : Type ℓ₁} {B : A → Type ℓ₂}
(X : P-Alg {ℓ₃ = ℓ₃} A B)
(Y : P-Alg {ℓ₃ = ℓ₄} A B)
(Z : P-Alg {ℓ₃ = ℓ₅} A B)
→ AlgHom X Y → AlgHom Y Z → AlgHom X Z
AlgHom-∘ (C , f) (D , g) (E , h) (s , s-hom) (r , r-hom) =
r ∘ s , square
where
square : r ∘ (s ∘ f) ≡ h ∘ P-map (r ∘ s)
square = ap (r ∘_) s-hom
• ap (_∘ P-map s) r-hom
• ap (h ∘_) (P-∘ r s)
isInitAlg : ∀ {ℓ₁ ℓ₂ ℓ₃}
{A : Type ℓ₁} {B : A → Type ℓ₂}
→ P-Alg {ℓ₃ = ℓ₃} A B → Type (ℓ₁ ⊔ ℓ₂ ⊔ lsuc ℓ₃)
isInitAlg {ℓ₃ = ℓ₃} {A = A} {B = B} X =
(Y : P-Alg {ℓ₃ = ℓ₃} A B) → iscontr (AlgHom X Y)
InitAlg : ∀ {ℓ₁ ℓ₂ ℓ₃} (A : Type ℓ₁) (B : A → Type ℓ₂)
→ Type (ℓ₁ ⊔ ℓ₂ ⊔ lsuc ℓ₃)
InitAlg {ℓ₃ = ℓ₃} A B = Σ (P-Alg {ℓ₃ = ℓ₃} A B) isInitAlg
record InitAlgOn {ℓ₁ ℓ₂ ℓ₃ : Level} (A : Type ℓ₁) (B : A → Type ℓ₂)
(C : Type ℓ₃) : Type (ℓ₁ ⊔ ℓ₂ ⊔ lsuc ℓ₃) where
field
sup : P A B C → C
isInit : isInitAlg (C , sup)
id-hom : ∀ {ℓ₁ ℓ₂ ℓ₃} {A : Type ℓ₁} {B : A → Type ℓ₂}
(X : P-Alg {ℓ₃ = ℓ₃} A B) → AlgHom X X
id-hom X = (λ x → x) , refl
isAlgEquiv : ∀ {ℓ₁ ℓ₂ ℓ₃ ℓ₄}
{A : Type ℓ₁} {B : A → Type ℓ₂}
(X : P-Alg {ℓ₃ = ℓ₃} A B) (Y : P-Alg {ℓ₃ = ℓ₄} A B)
→ AlgHom X Y → Type (ℓ₁ ⊔ ℓ₂ ⊔ ℓ₃ ⊔ ℓ₄)
isAlgEquiv X Y f =
Σ (AlgHom Y X) (λ g → AlgHom-∘ X Y X f g ≡ id-hom X)
× Σ (AlgHom Y X) (λ h → AlgHom-∘ Y X Y h f ≡ id-hom Y)
AlgEquiv : ∀ {ℓ₁ ℓ₂ ℓ₃ ℓ₄}
{A : Type ℓ₁} {B : A → Type ℓ₂}
→ P-Alg {ℓ₃ = ℓ₃} A B → P-Alg {ℓ₃ = ℓ₄} A B
→ Type (ℓ₁ ⊔ ℓ₂ ⊔ ℓ₃ ⊔ ℓ₄)
AlgEquiv X Y = Σ (AlgHom X Y) (isAlgEquiv X Y)
homEqInitId : ∀ {ℓ₁ ℓ₂ ℓ₃}
{A : Type ℓ₁} {B : A → Type ℓ₂}
(X : P-Alg {ℓ₃ = ℓ₃} A B)
→ isInitAlg X → (f : AlgHom X X) → f ≡ id-hom X
homEqInitId X isInit f =
isInit X .snd f • ! (isInit X .snd (id-hom X))