{-# OPTIONS --without-K #-}
module function.surjective where
open import sum
open import equality
open import function.isomorphism.core
open import hott.level.core
open import hott.equivalence.core
open import hott.truncation.core
surjective : ∀ {i j}{A : Set i}{B : Set j} → (A → B) → Set _
surjective f = ∀ b → Trunc 1 (f ⁻¹ b)
retr⇒surj : ∀ {i j}{A : Set i}{B : Set j}
→ (f : A → B)
→ retraction f
→ surjective f
retr⇒surj f retr b = [ retr b ]
inj+surj⇒eq : ∀ {i j}{A : Set i}{B : Set j}
→ h 2 A → h 2 B
→ (f : A → B)
→ injective f
→ surjective f
→ weak-equiv f
inj+surj⇒eq {A = A}{B = B} hA hB f inj surj b = retr-f b , propFib b (retr-f b)
where
propFib : (b : B) → prop (f ⁻¹ b)
propFib b (a , p) (a' , p') = unapΣ (inj (p · sym p') , h1⇒prop (hB (f a') b) _ _)
retr-f : retraction f
retr-f b = Trunc-elim 1 _ _ (prop⇒h1 (propFib b)) (λ x → x) (surj b)