{-# OPTIONS --rewriting #-}
open import Agda.Primitive using (Level;lsuc;_⊔_;lzero)
open import Lib
open import Interval
open import Proposition
open import Cofibs
open import Kan
open import Glue
open import Equiv
open import Equiv
open import Path
open import universe.Universe
open import universe.Sigma
open import universe.Pi
module universe.Path where
PathData : ∀ {@♭ l : Level} → Set (lsuc (lsuc lzero) ⊔ lsuc l)
PathData {l} = (Σ \ (A : I → U {l}) → El(A `0) × El(A `1))
Path-from-data : ∀ {@♭ l : Level} → PathData{l} → Set _
Path-from-data Aab = PathO (\ x → El (fst Aab x)) (fst (snd (Aab))) (snd (snd (Aab)))
com-Path-universal : ∀ {@♭ l : Level} → relCom {Γ = (PathData {l})} Path-from-data
com-Path-universal{l} Aa0a1 r r' α t b =
((\ x → fst (coma x)) , (! (fst (snd (coma `0)) (inr (inl id))) ) , (! (fst (snd (coma `1)) (inr (inr id))) )) ,
(\ pα → PathO= _ _ (\ x → fst (snd (coma x)) (inl pα) )) ,
(\ r=r' → PathO= _ _ (\ x → snd (snd (coma x)) r=r' ∘ ⇒fst {A = λ z z' → El (A z z')} {a0 = λ z → a0 z} {a1 = λ z → a1 z} r=r' (fst b) _)) where
A = \ x → fst (Aa0a1 x)
a0 = \ x → fst (snd (Aa0a1 x))
a1 = \ x → snd (snd (Aa0a1 x))
coma : (x : I) → _
coma x = comEl (\ z → A z x) r r'
(α ∨ ((x == `0) ∨ (x == `1)))
(\ z → case (\ pα → fst (t z pα) x )
(case (\ x=0 → transport _ (! x=0) (a0 z) )
(\ x=1 → transport _ (! x=1) (a1 z) )
(\ p q → abort (iabort (q ∘ ! p))))
(\ pα → ∨-elim _ (\ x=0 → ap (transport _ (! x=0)) (fst (snd (t z pα))) ∘ ! (apd (fst (t z pα)) (! x=0))) ((\ x=1 → ap (transport _ (! x=1)) (snd (snd (t z pα))) ∘ ! (apd (fst (t z pα)) (! x=1)))) (\ _ _ → uip)))
(fst (fst b) x ,
∨-elim _ (\ pα → ap (\ h → fst h x) (snd b pα)) (∨-elim _ (\ x=0 → ! (apd! (fst (fst b)) x=0) ∘ ap (transport _ (! x=0)) (! (fst (snd (fst b))))) ((\ x=1 → ! (apd! (fst (fst b)) x=1) ∘ ap (transport _ (! x=1)) (! (snd (snd (fst b)))))) ((\ _ _ → uip))) (((\ _ _ → uip))))
Path-code-universal : ∀ {@♭ l : Level} → PathData{l} → U{l}
Path-code-universal {l} = code (PathData{l})
(Path-from-data{l})
com-Path-universal
Path-code : ∀ {@♭ l1 l2 : Level} {Γ : Set l1}
(A : Γ × I → U{l2})
(a0 : (θ : Γ) → El (A (θ , `0)))
(a1 : (θ : Γ) → El (A (θ , `1)))
→ Γ → U{l2}
Path-code A a0 a1 = Path-code-universal o (\ θ → ((\ y → A (θ , y)) , a0 θ , a1 θ))
El-Path-code : ∀ {@♭ l1 l2 : Level} {Γ : Set l1}
(A : Γ × I → U{l2})
(a0 : (x : Γ) → El (A (x , `0)))
(a1 : (x : Γ) → El (A (x , `1)))
→ (θ : Γ) → El (Path-code A a0 a1 θ) == PathO (\ x → El (A (θ , x))) (a0 θ) (a1 θ)
El-Path-code A a0 a1 θ = id
HFiber-code : ∀ {@♭ l : Level} {A B : U {l}} (f : El A → El B) → El B → U {l}
HFiber-code {A = A}{B} f b = Σcode-universal (A , (\ a → Path-code-universal ((\ _ → B) , (f a , b))))
Contractible-code : {@♭ l1 : Level} (A : U{l1}) → U{l1}
Contractible-code A = Σcode-universal (A , (\ x → Πcode-universal (A , (\ y → Path-code-universal ((\ _ → A) , ((x , y)))))))
isEquiv-code : {@♭ l1 : Level} (A : U {l1}) (B : U {l1}) (f : El A → El B) → U {l1}
isEquiv-code A B f = Πcode-universal (B , (\ x → Contractible-code ((HFiber-code {A = A} {B} f x))))
coePathU : {@♭ l : Level} {A B : U{l}} → Path U A B → El A → El B
coePathU p a =
coe (ap El ((snd (snd p)))) (fst (coeU (fst p) `0 `1 (coe (ap El (! (fst (snd p)))) a)))