{-# OPTIONS --without-K #-} module function.fibration where open import level open import sum open import equality.core open import function.core open import function.isomorphism.core open import function.isomorphism.coherent open import function.isomorphism.lift open import function.isomorphism.univalence open import function.isomorphism.utils open import function.extensionality.core open import function.extensionality.proof open import function.overloading open import hott.level.core open import hott.equivalence.core open import hott.equivalence.alternative open import hott.univalence open import sets.unit Fibration : ∀ {i} j → Set i → Set _ Fibration j X = Σ (Set j) λ Y → Y → X fib : ∀ {i j}{X : Set i}(Y : X → Set j) → Σ X Y → X fib Y = proj₁ fib-iso : ∀ {i j}{X : Set i}{Y : X → Set j} → (x : X) → fib Y ⁻¹ x ≅ Y x fib-iso {X = X}{Y = Y} x₀ = record { to = λ { ((x , y) , p) → subst Y p y } ; from = λ y → ((x₀ , y) , refl) ; iso₁ = λ { ((.x₀ , y) , refl) → refl } ; iso₂ = λ y → refl } total-iso : ∀ {i j}{X : Set i}{Y : Set j}(p : Y → X) → (Σ X (_⁻¹_ p)) ≅ Y total-iso {X = X}{Y = Y} p = begin ( Σ X λ x → (Σ Y λ y → p y ≡ x) ) ≅⟨ Σ-comm-iso ⟩ ( Σ Y λ y → (Σ X λ x → p y ≡ x) ) ≅⟨ ( Σ-ap-iso refl≅ λ y → contr-⊤-iso (singl-contr (p y)) ) ⟩ (Y × ⊤) ≅⟨ ×-right-unit ⟩ Y ∎ where open ≅-Reasoning fib-eq-iso : ∀ {i j}{X : Set i}{Y₁ Y₂ : Set j} → (p₁ : Y₁ → X) (p₂ : Y₂ → X) → _≡_ {A = Fibration _ X} (Y₁ , p₁) (Y₂ , p₂) ≅ ( Σ (Y₁ ≅' Y₂) λ q → p₁ ≡ p₂ ∘ apply q ) fib-eq-iso {i}{j}{X}{Y₁}{Y₂} p₁ p₂ = begin _≡_ {A = Fibration _ X} (Y₁ , p₁) (Y₂ , p₂) ≅⟨ sym≅ Σ-split-iso ⟩ ( Σ (Y₁ ≡ Y₂) λ q → subst (λ Y → Y → X) q p₁ ≡ p₂ ) ≅⟨ ( Σ-ap-iso refl≅ λ q → lem q p₁ p₂ ) ⟩ ( Σ (Y₁ ≡ Y₂) λ q → p₁ ≡ p₂ ∘ coerce q ) ≅⟨ step ⟩ ( Σ (Y₁ ≅' Y₂) λ q → p₁ ≡ p₂ ∘ apply q ) ∎ where open ≅-Reasoning abstract step : ( Σ (Y₁ ≡ Y₂) λ q → p₁ ≡ p₂ ∘ coerce q ) ≅ ( Σ (Y₁ ≅' Y₂) λ q → p₁ ≡ p₂ ∘ apply q ) step = Σ-ap-iso (uni-iso ·≅ ≈⇔≅') λ q → refl≅ abstract lem : {Y₁ Y₂ : Set j}(q : Y₁ ≡ Y₂)(p₁ : Y₁ → X)(p₂ : Y₂ → X) → (subst (λ Y → Y → X) q p₁ ≡ p₂) ≅ (p₁ ≡ p₂ ∘ coerce q) lem refl p₁ p₂ = refl≅ fibration-iso : ∀ {i} j {X : Set i} → (Σ (Set (i ⊔ j)) λ Y → Y → X) ≅ (X → Set (i ⊔ j)) fibration-iso {i} j {X} = record { to = λ { (Y , p) x → p ⁻¹ x } ; from = λ P → (Σ X P , fib P) ; iso₁ = λ { (Y , p) → α Y p } ; iso₂ = λ P → funext λ x → ≅⇒≡ (fib-iso x) } where α : (Y : Set (i ⊔ j))(p : Y → X) → _≡_ {A = Σ (Set (i ⊔ j)) λ Y → Y → X} (Σ X (_⁻¹_ p) , proj₁) (Y , p) α Y p = invert≅ (fib-eq-iso proj₁ p) ( ≅⇒≅' (total-iso p) , funext λ { (y , x , eq) → sym eq } ) family-eq-iso : ∀ {i j₁ j₂}{X : Set i}{Y₁ : X → Set j₁}{Y₂ : X → Set j₂} → (isom : Σ X Y₁ ≅ Σ X Y₂) → (∀ x y → proj₁ (apply≅ isom (x , y)) ≡ x) → (x : X) → Y₁ x ≅ Y₂ x family-eq-iso {i}{j₁}{j₂}{X}{Y₁}{Y₂} isom comm x = lift-iso _ (Y₁ x) ·≅ ≡⇒≅ (funext-inv eq' x) ·≅ sym≅ (lift-iso _ (Y₂ x)) where open _≅_ isom to-we : weak-equiv to to-we = proj₂ (≅⇒≈ isom) P₁ : X → Set (i ⊔ j₁ ⊔ j₂) P₁ x = ↑ (i ⊔ j₂) (Y₁ x) p₁ : Σ X P₁ → X p₁ = proj₁ P₂ : X → Set (i ⊔ j₁ ⊔ j₂) P₂ x = ↑ (i ⊔ j₁) (Y₂ x) p₂ : Σ X P₂ → X p₂ = proj₁ total : Σ X P₁ ≅ Σ X P₂ total = (Σ-ap-iso refl≅ λ x → sym≅ (lift-iso _ _)) ·≅ isom ·≅ (Σ-ap-iso refl≅ λ x → lift-iso _ _) comm' : (a : Σ X P₁) → p₁ a ≡ p₂ (apply total a) comm' (x , lift u) = sym (comm x u) eq' : P₁ ≡ P₂ eq' = iso⇒inj (sym≅ (fibration-iso (i ⊔ j₁ ⊔ j₂))) (invert (fib-eq-iso p₁ p₂) (≅⇒≅' total , funext comm')) fib-compose : ∀ {i j k}{X : Set i}{Y : Set j}{Z : Set k} → (f : X → Y)(g : Y → Z)(z : Z) → (g ∘' f) ⁻¹ z ≅ ( Σ (g ⁻¹ z) λ { (y , _) → f ⁻¹ y } ) fib-compose {X = X}{Y}{Z} f g z = begin (g ∘' f) ⁻¹ z ≅⟨ refl≅ ⟩ ( Σ X λ x → g (f x) ≡ z ) ≅⟨ Σ-ap-iso refl≅ (λ _ → sym≅ ×-left-unit) ⟩ ( Σ X λ x → ⊤ × g (f x) ≡ z) ≅⟨ ( Σ-ap-iso refl≅ λ x → Σ-ap-iso (sym≅ (contr-⊤-iso (singl-contr (f x))) ) λ _ → refl≅ ) ⟩ ( Σ X λ x → singleton (f x) × g (f x) ≡ z ) ≅⟨ ( Σ-ap-iso refl≅ λ x → Σ-assoc-iso ) ⟩ ( Σ X λ x → Σ Y λ y → (f x ≡ y) × (g (f x) ≡ z) ) ≅⟨ ( Σ-ap-iso refl≅ λ x → Σ-ap-iso refl≅ λ y → Σ-ap-iso refl≅ λ p → ≡⇒≅ (ap (λ u → g u ≡ z) p) ) ⟩ ( Σ X λ x → Σ Y λ y → (f x ≡ y) × (g y ≡ z) ) ≅⟨ Σ-comm-iso ⟩ ( Σ Y λ y → Σ X λ x → (f x ≡ y) × (g y ≡ z) ) ≅⟨ ( Σ-ap-iso refl≅ λ y → sym≅ Σ-assoc-iso ) ⟩ ( Σ Y λ y → (f ⁻¹ y) × (g y ≡ z) ) ≅⟨ ( Σ-ap-iso refl≅ λ y → ×-comm ) ⟩ ( Σ Y λ y → (g y ≡ z) × (f ⁻¹ y) ) ≅⟨ sym≅ Σ-assoc-iso ⟩ ( Σ (g ⁻¹ z) λ { (y , _) → f ⁻¹ y } ) ∎ where open ≅-Reasoning