module GpdCont.SetTruncation where
open import GpdCont.Prelude
open import GpdCont.Equiv using (symEquiv)
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Equiv.Properties using (compr≡Equiv)
open import Cubical.Foundations.GroupoidLaws using (rCancel)
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Path as Path using (PathP≡compPath ; pathFiber)
open import Cubical.Foundations.Transport using (substEquiv)
open import Cubical.Foundations.Univalence using (pathToEquiv)
open import Cubical.HITs.SetTruncation as ST using (∥_∥₂ ; ∣_∣₂)
open import Cubical.HITs.PropositionalTruncation as PT using (∥_∥₁)
open import Cubical.Data.Sigma
open import Cubical.Functions.Embedding
open import Cubical.Functions.Surjection
open import Cubical.Functions.Fibration
private
variable
ℓA ℓB : Level
A : Type ℓA
B : A → Type ℓB
IsoSetTruncateFstΣ : isSet A → Iso ∥ Σ A B ∥₂ (Σ A (∥_∥₂ ∘ B))
IsoSetTruncateFstΣ {A} {B} is-set-A = go where
isSetΣA∥B∥ : isSet (Σ A (∥_∥₂ ∘ B))
isSetΣA∥B∥ = isSetΣ is-set-A λ a → ST.isSetSetTrunc
go : Iso _ _
go .Iso.fun = ST.rec isSetΣA∥B∥ λ { (a , b) → a , ST.∣ b ∣₂ }
go .Iso.inv = uncurry λ a → ST.rec ST.isSetSetTrunc λ { b → ST.∣ a , b ∣₂ }
go .Iso.rightInv = uncurry λ a → ST.elim (λ ∣b∣ → isProp→isSet (isSetΣA∥B∥ _ (a , ∣b∣))) λ _ → refl
go .Iso.leftInv = ST.elim (λ ∣a,b∣ → isProp→isSet (ST.isSetSetTrunc _ ∣a,b∣)) λ _ → refl
setTruncateFstΣ≃ : isSet A → ∥ Σ A B ∥₂ ≃ (Σ A (∥_∥₂ ∘ B))
setTruncateFstΣ≃ = isoToEquiv ∘ IsoSetTruncateFstΣ
setTruncEquiv : ∀ {B : Type ℓB} → A ≃ B → ∥ A ∥₂ ≃ ∥ B ∥₂
setTruncEquiv = isoToEquiv ∘ ST.setTruncIso ∘ equivToIso
PathSetTrunc≃PropTruncPath : {a b : A} → (∣ a ∣₂ ≡ ∣ b ∣₂) ≃ ∥ a ≡ b ∥₁
PathSetTrunc≃PropTruncPath = isoToEquiv ST.PathIdTrunc₀Iso
componentEquiv : (A : Type ℓA) → A ≃ (Σ[ x ∈ ∥ A ∥₂ ] fiber ∣_∣₂ x)
componentEquiv A = totalEquiv {B = ∥ A ∥₂} {E = A} ∣_∣₂
isSurjection-∣-∣₂ : ∀ (A : Type ℓA) → isSurjection (∣_∣₂ {A = A})
isSurjection-∣-∣₂ A = (ST.elim (λ _ → isProp→isSet PT.isPropPropTrunc) λ { a → PT.∣ a , refl ∣₁ })
isConnected-fiber-∣-∣₂ : ∀ (x : ∥ A ∥₂) → isContr ∥ fiber ∣_∣₂ x ∥₂
isConnected-fiber-∣-∣₂ {A} = ST.elim (λ x → isProp→isSet isPropIsContr) contr where
lemma : ∀ {a b : A} → (p : ∣ b ∣₂ ≡ ∣ a ∣₂) → ∣ a , refl {x = ∣ a ∣₂} ∣₂ ≡ ∣ b , p ∣₂
lemma {a} {b} p = PT.elim {P = λ p' → ∣ a , refl ∣₂ ≡ ∣ b , p ∣₂} (λ _ → ST.squash₂ _ _)
(λ p' → cong ∣_∣₂ (ΣPathP (sym p' , isProp→PathP (λ i → ST.squash₂ ∣ p' (~ i) ∣₂ ∣ a ∣₂) (λ _ → ∣ a ∣₂) p)))
(ST.PathIdTrunc₀Iso .Iso.fun p)
contr : (a : A) → isContr ∥ fiber ∣_∣₂ ∣ a ∣₂ ∥₂
contr a .fst = ∣ a , refl {x = ∣ a ∣₂} ∣₂
contr a .snd = ST.elim (λ ∣fib∣ → ST.isSetPathImplicit) λ { (b , p) → lemma p }
isEmbeddingCong→hasSetFibers : ∀ {ℓ ℓ'} {A : Type ℓ} {B : Type ℓ'} (f : A → B)
→ (∀ (x y : A) → isEmbedding (cong {x = x} {y = y} f))
→ ∀ b → isSet (fiber f b)
isEmbeddingCong→hasSetFibers {A} {B} f emb = set-fibers where
cong-f : ∀ x y → x ≡ y → f x ≡ f y
cong-f _ _ = cong f
fiber-equivᴰ : ∀ (b : B) (x y : A) → (p : f x ≡ b) → (r : x ≡ y) → (q : f y ≡ b)
→ PathP (λ i → f (r i) ≡ b) p q ≃ (cong f r ≡ p ∙ sym q)
fiber-equivᴰ b x y p = J
(λ y r → (q : f y ≡ b) → PathP (λ i → f (r i) ≡ b) p q ≃ (cong f r ≡ p ∙ sym q))
λ q →
PathP (λ i → f x ≡ b) p q ≃⟨ pathToEquiv (Path.PathP≡Path (λ i → f x ≡ b) p q) ⟩
(subst (λ x → f x ≡ b) refl p) ≡ q ≃⟨ substEquiv (_≡ q) (substRefl {B = λ x → f x ≡ b} p) ⟩
p ≡ q ≃⟨ symEquiv ⟩
q ≡ p ≃⟨ compr≡Equiv q p (sym q) ⟩
q ∙ sym q ≡ p ∙ sym q ≃⟨ substEquiv (_≡ p ∙ sym q) (rCancel q) ⟩
refl ≡ p ∙ sym q ≃∎
fiber-equiv : ∀ (b : B) (x y : A) → (p : f x ≡ b) → (q : f y ≡ b)
→ Path (fiber f b) (x , p) (y , q) ≃ fiber (cong-f x y) (p ∙ sym q)
fiber-equiv b x y p q =
(x , p) ≡ (y , q) ≃⟨ invEquiv ΣPathP≃PathPΣ ⟩
Σ[ r ∈ x ≡ y ] PathP (λ i → f (r i) ≡ b) p q ≃⟨ Σ-cong-equiv-snd (λ r → fiber-equivᴰ b x y p r q) ⟩
Σ[ r ∈ x ≡ y ] cong f r ≡ p ∙ sym q ≃⟨⟩
fiber (cong-f x y) (p ∙ sym q) ≃∎
set-fibers : ∀ b → isSet (fiber f b)
set-fibers b (x , p) (y , q) = isOfHLevelRespectEquiv 1
(invEquiv $ fiber-equiv b x y p q)
(isEmbedding→hasPropFibers (emb x y) (p ∙ sym q))