{-# OPTIONS --without-K --exact-split --two-level #-}
module Extension.FundamentalId where
open import Extension.Prelude
open import Extension.GlueUA using (contr-contr-isEquiv)
private
variable
ℓ ℓ' ℓ'' : Level
tot : {A : UU ℓ} {P : A → UU ℓ'} {Q : A → UU ℓ''} (f : (a : A) → P a → Q a)
→ Σ A P → Σ A Q
tot f (a , p) = a , f a p
module _ {A : UU ℓ} {P : A → UU ℓ'} {Q : A → UU ℓ''} (f : (a : A) → P a → Q a) where
private
nat : {a' a : A} (e : Id a' a) (p' : P a') → Id (f a (tr P e p')) (tr Q e (f a' p'))
nat refl p' = refl
fiberwise-from-total : isEquiv (tot f) → (a : A) → isEquiv (f a)
fiberwise-from-total etot a q = retract-of-singleton (retr , sect , retr-sect) (etot (a , q))
where
sect : fiber (f a) q → fiber (tot f) (a , q)
sect (p , e) = (a , p) , dep-pair⁼ _ _ (refl , e)
retr : fiber (tot f) (a , q) → fiber (f a) q
retr ((a' , p') , w) =
tr P (pr1 (inv-dep-pair⁼ _ _ w)) p'
, nat (pr1 (inv-dep-pair⁼ _ _ w)) p' · pr2 (inv-dep-pair⁼ _ _ w)
retr-sect : (retr ∘ sect) ~ id
retr-sect (p , e) = ap retr' (htpy-inv-dep-pair⁼-dep-pair⁼ _ _ (refl , e))
where
retr' : dep-pair-Id (a , f a p) (a , q) → fiber (f a) q
retr' (e₁ , e₂) = tr P e₁ p , nat e₁ p · e₂
module _ {A : UU ℓ} {a₀ : A} {Q : A → UU ℓ'}
(f : (a : A) → Id a₀ a → Q a)
where
private
based-path-contr : is-contr (Σ A (λ a → Id a₀ a))
based-path-contr = (a₀ , refl) , (λ {(a , refl) → refl})
fundamental-id : is-contr (Σ A Q) → (a : A) → isEquiv (f a)
fundamental-id cΣQ = fiberwise-from-total f (contr-contr-isEquiv based-path-contr cΣQ (tot f))