{-# OPTIONS --without-K #-}
module hott.loop.properties where
open import sum
open import equality
open import function.core
open import function.extensionality
open import function.isomorphism.core
open import function.overloading
open import pointed
open import sets.nat.core
open import hott.loop.core
mapΩ₁-const : ∀ {i j}{𝓧 : PSet i}{𝓨 : PSet j}
→ mapΩ₁ (constP 𝓧 𝓨) ≡ constP _ _
mapΩ₁-const = apply pmap-eq (ap-const _ , refl)
where
ap-const : ∀ {i j}{X : Set i}{Y : Set j}(y : Y)
→ {x x' : X}(p : x ≡ x') → ap (λ _ → y) p ≡ refl
ap-const y refl = refl
mapΩP-const : ∀ {i j} n → {𝓧 : PSet i}{𝓨 : PSet j}
→ mapΩP n (constP 𝓧 𝓨) ≡ constP _ _
mapΩP-const zero = refl
mapΩP-const (suc n) = ap (mapΩP n) mapΩ₁-const · mapΩP-const n
mapΩ-const : ∀ {i j} n → {X : Set i}{Y : Set j}(y : Y)
→ (x : X) (p : Ω n x)
→ mapΩ n (λ _ → y) p ≡ refl' n y
mapΩ-const n y x p = funext-inv (ap proj₁ (mapΩP-const n)) p
mapΩ₁-hom : ∀ {i j k}{𝓧 : PSet i}{𝓨 : PSet j}{𝓩 : PSet k}
→ (f : PMap 𝓧 𝓨)(g : PMap 𝓨 𝓩)
→ mapΩ₁ g ∘ mapΩ₁ f ≡ mapΩ₁ (g ∘ f)
mapΩ₁-hom (f , refl) (g , refl) = apply pmap-eq (ap-hom f g , refl)
mapΩP-hom : ∀ {i j k} n → {𝓧 : PSet i}{𝓨 : PSet j}{𝓩 : PSet k}
→ (f : PMap 𝓧 𝓨)(g : PMap 𝓨 𝓩)
→ mapΩP n g ∘ mapΩP n f ≡ mapΩP n (g ∘ f)
mapΩP-hom zero f g = refl
mapΩP-hom (suc n) f g = mapΩP-hom n (mapΩ₁ f) (mapΩ₁ g)
· ap (mapΩP n) (mapΩ₁-hom f g)
mapΩ-hom : ∀ {i j k} n {X : Set i}{Y : Set j}{Z : Set k}
→ (f : X → Y)(g : Y → Z){x : X}(p : Ω n x)
→ mapΩ n g (mapΩ n f p) ≡ mapΩ n (g ∘ f) p
mapΩ-hom n f g = proj₁ (invert pmap-eq (mapΩP-hom n (f , refl) (g , refl)))
mapΩ-refl : ∀ {i j} n {X : Set i}{Y : Set j}
→ (f : X → Y){x : X}
→ mapΩ n f (refl' n x) ≡ refl' n (f x)
mapΩ-refl n f = proj₂ (mapΩP n (f , refl))