{-# OPTIONS --without-K #-}
module hott.loop.sum where
open import sum
open import equality
open import function.core
open import function.extensionality
open import function.isomorphism
open import function.overloading
open import sets.nat
open import pointed
open import hott.equivalence
open import hott.level.core
open import hott.loop.core
open import hott.loop.properties
private
abstract
loop-sum' : ∀ {i}{j}{A : Set i}{B : A → Set j}(n : ℕ)
→ (hB : (a : A) → h n (B a))
→ {a₀ : A}{b₀ : B a₀}
→ Ω n {Σ A B} (a₀ , b₀) ≅ Ω n a₀
loop-sum' 0 hB {a₀}{b₀} = Σ-ap-iso refl≅ (λ a → contr-⊤-iso (hB a)) ·≅ ×-right-unit
loop-sum' {A = A}{B = B} (suc n) hB {a₀}{b₀} = Ω-iso n (sym≅ Σ-split-iso) refl
·≅ loop-sum' n λ p → hB _ _ _
loop-sum-β : ∀ {i}{j}{A : Set i}{B : A → Set j}(n : ℕ)
→ (hB : (a : A) → h n (B a))
→ {a₀ : A}{b₀ : B a₀}
→ (p : Ω n {Σ A B} (a₀ , b₀))
→ apply (loop-sum' n hB) p ≡ mapΩ n proj₁ p
loop-sum-β zero hB p = refl
loop-sum-β (suc n) hB p
= loop-sum-β n _ (mapΩ n apΣ p)
· mapΩ-hom n apΣ proj₁ p
· funext-inv (ap proj₁ (ap (mapΩP n) lem)) p
where
lem : ∀ {i}{j}{A : Set i}{B : A → Set j}{a₀ : A}{b₀ : B a₀}
→ _≡_ {A = PMap (_≡_ {A = Σ A B} (a₀ , b₀) (a₀ , b₀) , refl) ((a₀ ≡ a₀) , refl)}
(proj₁ ∘ apΣ , refl)
(ap proj₁ , refl)
lem = apply pmap-eq ((λ _ → refl) , refl)
loop-sum : ∀ {i}{j}{A : Set i}{B : A → Set j}(n : ℕ)
→ (hB : (a : A) → h n (B a))
→ {a₀ : A}{b₀ : B a₀}
→ Ω n {Σ A B} (a₀ , b₀) ≅ Ω n a₀
loop-sum n hB {a₀}{b₀} = ≈⇒≅ (mapΩ n proj₁ , subst weak-equiv eq we)
where
abstract
we : weak-equiv (apply (loop-sum' n hB {a₀}{b₀}))
we = proj₂ (≅⇒≈ (loop-sum' n hB))
eq : apply (loop-sum' n hB {a₀}{b₀}) ≡ mapΩ n proj₁
eq = funext (loop-sum-β n hB)