{-# OPTIONS --lossy-unification #-}
open import GpdCont.Prelude
open import GpdCont.TwoCategory.Base
open import GpdCont.TwoCategory.StrictFunctor
module GpdCont.TwoCategory.Family.Properties
{ℓo ℓh ℓr ℓo′ ℓh′ ℓr′}
{C : TwoCategory ℓo ℓh ℓr}
{D : TwoCategory ℓo′ ℓh′ ℓr′}
(F : StrictFunctor C D)
(ℓ : Level)
where
open import GpdCont.TwoCategory.LocalCategory
open import GpdCont.TwoCategory.StrictFunctor.LocalFunctor
open import GpdCont.TwoCategory.Family.Base
open import GpdCont.TwoCategory.Family.Functor
open import GpdCont.TwoCategory.Displayed.Base
open import GpdCont.Axioms.TruncatedChoice using (ASC)
open import Cubical.Foundations.Equiv as Equiv using (isEquiv)
open import Cubical.Foundations.HLevels using (isSetΣ ; hSet)
import Cubical.Data.Sigma as Sigma
import Cubical.Data.Equality as Eq
import Cubical.HITs.PropositionalTruncation as PT
import Cubical.Categories.Category.Base as Category
private
module C = TwoCategory C
module D = TwoCategory D
module FamC = TwoCategory (Fam C ℓ)
module FamD = TwoCategory (Fam D ℓ)
module F = StrictFunctor F
module LiftF = StrictFunctor (FamFunctor F ℓ)
isLocallyFullyFaithfulFam : isLocallyFullyFaithful F → isLocallyFullyFaithful (FamFunctor F ℓ)
isLocallyFullyFaithfulFam is-locally-ff-F x y f g = goal where
FamF₂-equiv : FamC.rel {x} {y} f g ≃ FamD.rel {x = LiftF.₀ x} {y = LiftF.₀ y} (LiftF.₁ {x} {y} f) (LiftF.₁ {x} {y} g)
FamF₂-equiv = Sigma.Σ-cong-equiv-snd λ where
Eq.refl → Equiv.equivΠCod λ j → localEmbedding F is-locally-ff-F (f .snd j) (g .snd j)
Fam₂-equiv≡LiftF₂ : Equiv.equivFun FamF₂-equiv ≡ LiftF.₂
Fam₂-equiv≡LiftF₂ = funExt λ { (Eq.refl , rᴰ) → refl }
goal : isEquiv (LiftF.₂ {x} {y} {f} {g})
goal = subst isEquiv Fam₂-equiv≡LiftF₂ (Equiv.equivIsEquiv FamF₂-equiv)
private
module _ (x* @ (J , x) y* @ (K , y) : FamC.ob) (g* @ (ψ , g) : FamD.hom (LiftF.₀ x*) (LiftF.₀ y*)) where
hasPointwiseSection→hasLocalSectionFam : (∀ j → Σ[ f ∈ C.hom (x j) (y (ψ j)) ] LocalCatIso D (F.₁ f) (g j)) → Σ[ f* ∈ FamC.hom x* y* ] LocalCatIso (Fam D ℓ) (LiftF.₁ f*) g*
hasPointwiseSection→hasLocalSectionFam split-F-at = goal where
f* : Σ[ φ ∈ (⟨ J ⟩ → ⟨ K ⟩) ] ∀ j → C.hom (x j) (y (φ j))
f* .fst = ψ
f* .snd = λ j → split-F-at j .fst
iso-at : LocalCatIso (Fam D ℓ) (LiftF.₁ f*) (ψ , g)
iso-at .fst = Eq.refl , λ j → split-F-at j .snd .fst
iso-at .snd .Category.isIso.inv = Eq.refl , λ j → split-F-at j .snd .snd .Category.isIso.inv
iso-at .snd .Category.isIso.sec = Sigma.ΣPathP (refl , funExt λ j → split-F-at j .snd .snd .Category.isIso.sec)
iso-at .snd .Category.isIso.ret = Sigma.ΣPathP (refl , funExt λ j → split-F-at j .snd .snd .Category.isIso.ret)
goal : Σ[ f* ∈ FamC.hom _ _ ] LocalCatIso (Fam D ℓ) (LiftF.₁ f*) (ψ , g)
goal .fst = f*
goal .snd = iso-at
isLocallySplitEssentiallySurjectiveFam : isLocallySplitEssentiallySurjective F → isLocallySplitEssentiallySurjective (FamFunctor F ℓ)
isLocallySplitEssentiallySurjectiveFam split-F x y g = hasPointwiseSection→hasLocalSectionFam x y g (λ j → split-F (x .snd j) (y .snd (g .fst j)) (g .snd j))
isLocallyEssentiallySurjectiveFam : ASC ℓ (ℓ-max ℓh ℓr′) → isLocallyStrict C → isLocallyEssentiallySurjective F → isLocallyEssentiallySurjective (FamFunctor F ℓ)
isLocallyEssentiallySurjectiveFam choose is-set-hom-C is-eso-F x*@(J , x) y*@(K , y) g*@(ψ , g) = goal where
isPointwiseSplitEso : (j : ⟨ J ⟩) → hSet _
isPointwiseSplitEso j .fst = Σ[ f ∈ C.hom (x j) (y (ψ j)) ] LocalCatIso D (F.₁ f) (g j)
isPointwiseSplitEso j .snd = isSetΣ
(is-set-hom-C (x j) (y (ψ j)))
λ f → isSetLocalCatIso D (F.₁ f) (g j)
is-eso-F-at : (j : ⟨ J ⟩) → PT.∥ ⟨ isPointwiseSplitEso j ⟩ ∥₁
is-eso-F-at j = is-eso-F (x j) (y (ψ j)) (g j)
merely-ptwise-split-eso : PT.∥ (∀ j → ⟨ isPointwiseSplitEso j ⟩) ∥₁
merely-ptwise-split-eso = choose J isPointwiseSplitEso is-eso-F-at
goal : PT.∥ Σ[ f* ∈ FamC.hom x* y* ] LocalCatIso (Fam D ℓ) (LiftF.₁ f*) g* ∥₁
goal = PT.map (hasPointwiseSection→hasLocalSectionFam x* y* g*) merely-ptwise-split-eso