-- File by Andrea Vezzosi (https://github.com/Saizan/cubical-demo)
{-# OPTIONS --cubical #-}
module PathPrelude where
open import Primitives public
open import Primitives public using () renaming (Sub to _[_↦_])
module _ {ℓ} {A : Set ℓ} where
refl : {x : A} → x ≡ x
refl {x = x} = λ _ → x
sym : {x y : A} → x ≡ y → y ≡ x
sym p = λ i → p (~ i)
trans' : {x y z : A} → x ≡ y → y ≡ z → x ≡ z
trans' {y = y} p q i = primComp (λ _ → A) _
(λ { j (i = i0) → p (~ j)
; j (i = i1) → q j })
y
trans : {x y z : A} → x ≡ y → y ≡ z → x ≡ z
trans {x = x} p q i = primComp (λ _ → A) _ (λ { j (i = i0) → x
; j (i = i1) → q j }) (p i)
cong : ∀ {ℓ'} {B : Set ℓ'} {x y : A} → (f : A → B) → x ≡ y → f x ≡ f y
cong f p = λ i → f (p i)
infix 3 _≡-qed
infixr 2 _≡⟨⟩_ _≡⟨_⟩_
infix 1 ≡-proof_
≡-proof_ : {x y : A} → x ≡ y → x ≡ y
≡-proof x≡y = x≡y
_≡⟨⟩_ : (x {y} : A) → x ≡ y → x ≡ y
_ ≡⟨⟩ x≡y = x≡y
_≡⟨_⟩_ : (x {y z} : A) → x ≡ y → y ≡ z → x ≡ z
_ ≡⟨ x≡y ⟩ y≡z = trans x≡y y≡z
_≡-qed : (x : A) → x ≡ x
_ ≡-qed = refl
fill : {ℓ : I → _} → (A : (i : I) → Set (ℓ i)) → (φ : I) →
((i : I) → Partial (A i) φ) → A i0 → (i : I) → A i
fill A φ u azero i = unsafeComp (λ j → A (i ∧ j)) (φ ∨ ~ i)
(λ j → unsafePOr φ (~ i) (u (i ∧ j)) λ { (i = i0) → azero }) azero
transp : {ℓ : I → _} → (A : (i : I) → Set (ℓ i)) → A i0 → A i1
transp A x = primComp A i0 (λ _ → empty) x
transp⁻¹ : {ℓ : I → _} → (A : (i : I) → Set (ℓ i)) → A i1 → A i0
transp⁻¹ A = transp (λ i → A (~ i))
toPathP : ∀{ℓ}{A : I → Set ℓ}{x : A i0}{y : A i1} → transp A x ≡ y → PathP A x y
toPathP {ℓ} {A} {x} {y} p i = primComp (λ _ → A i) φ u (xPathP i)
where φ = ~ i ∨ i
u : I → PartialP φ (λ z → A i)
u _ (i = i0) = x
u j (i = i1) = p j
xPathP : PathP A x (transp A x )
xPathP j = fill A _ (λ _ → empty) x j
transp-refl : ∀{ℓb} → {B : Set ℓb} → (x : B) → primComp (λ j → B) i0 (λ j → empty) x ≡ x
transp-refl {B = B} x i = primComp (λ _ → B) i ((λ { j (i = i1) → x })) x
transp-pi : ∀{ℓb} → {B : Set ℓb} → {ℓa : I → _} → (A : (i : I) → Set (ℓa i)) → (f : (B → A i0)) → (λ x → transp A (f x)) ≡ transp (λ i → (B → A i)) f
transp-pi {B = B} A f i x = (primComp A i0 (λ i → empty)) (f (transp-refl x (~ i)))
module _ {ℓa ℓb} {A : Set ℓa} {B : A → Set ℓb} where
funUnImp : ({x : A} → B x) → (x : A) → B x
funUnImp f x = f {x}
funExt : {f g : (x : A) → B x} → ((x : A) → f x ≡ g x) → f ≡ g
funExt p = λ i x → p x i
funExtImp : {f g : {x : A} → B x} → ((x : A) → f {x} ≡ g {x}) →
{x : A} → f {x} ≡ g {x}
funExtImp p {x} = λ i → p x i
{-
module _ {ℓ} {A : Set ℓ} where
singl : (a : A) → Set ℓ
singl a = Σ[ x ∈ A ] (a ≡ x)
contrSingl : {a b : A} (p : a ≡ b) → _≡_ {A = singl a} (a , refl) (b , p)
contrSingl p = λ i → ((p i) , λ j → p (i ∧ j))
module _ {ℓ ℓ'} {A : Set ℓ} {x : A}
(P : ∀ y → x ≡ y → Set ℓ') (d : P x ((λ i → x))) where
pathJ : (y : A) → (p : x ≡ y) → P y p
pathJ _ p = transp (λ i → uncurry P (contrSingl p i)) d
pathJprop : pathJ _ refl ≡ d
pathJprop i = primComp (λ _ → P x refl) i (λ {j (i = i1) → d}) d
module _ {ℓ ℓ'} {A : Set ℓ} {P : A → Set ℓ'} where
subst : {a b : A} (p : Path a b) → P a → P b
subst {a} {b} p pzero = pathJ {ℓ} {ℓ'} (λ (y : A) → λ _ → P y) pzero b p
substInv : {a x : A} (p : Path a x) → P x → P a
substInv p = subst (λ i → p (~ i))
injective : ∀ {ℓa ℓb} → {A : Set ℓa} → {B : Set ℓb} → (f : A → B) → Set (ℓ-max ℓa ℓb)
injective {_} {_} {A} f = {azero a1 : A} → f azero ≡ f a1 → azero ≡ a1
module _ {ℓ} {Azero A1 : Set ℓ} (A : Azero ≡ A1) {φ : I} (azero : A i0)
(p : Partial (Σ A1 λ y → PathP (λ i → A i) azero y) φ) where
-- primComp using only Path
compP : A i1
compP = primComp (λ i → A i) φ (λ i o → p o .snd i) azero
-- fill using only Path
fillP : ∀ j → A j
fillP j = primComp (λ i → A (i ∧ j)) (φ ∨ ~ j)
(λ { i (φ = i1) → p itIsOne .snd (i ∧ j); i (j = i0) → azero }) azero
transpP : ∀ {ℓ ℓ'} {A : Set ℓ}{B : A → Set ℓ'} {x y : A} → x ≡ y → B x → B y
transpP {B = B} p = pathJ (λ y _ → B _ → B y) (λ x → x) _ p
transpP≡subst : ∀ {ℓ ℓ'} {A : Set ℓ}{B : A → Set ℓ'} {x y : A} → (p : x ≡ y) → transpP {B = B} p ≡ subst {P = B} p
transpP≡subst {A = A} {B} {x} {y} p = sym (transp-pi (λ j → uncurry (λ (y : A) → λ _ → B y) (contrSingl p j)) (λ x → x))
coe : ∀ {ℓ} {A B : Set ℓ} → A ≡ B → A → B
coe {A = A} = transpP {B = λ X → X}
module _ {ℓ} (A : Set ℓ) where
isContr : Set ℓ
isContr = Σ[ x ∈ A ] (∀ y → x ≡ y)
isProp : Set ℓ
isProp = (x y : A) → x ≡ y
isSet : Set ℓ
isSet = (x y : A) → (p q : x ≡ y) → p ≡ q
module _ {ℓ} {A : Set ℓ} where
contr : isContr A → (φ : I) → (u : Partial A φ) → A
contr (c , p) φ u = primComp (λ _ → A) φ (λ i o → p (u o) i) c
lemContr : (contr1 : ∀ φ → Partial A φ → A)
→ (contr2 : ∀ u → u ≡ (contr1 i1 λ { _ → u})) → isContr A
lemContr contr1 contr2 = x , (λ y → let module M = Aux y in
trans (contr2 x) (trans (λ i → M.v i) (sym (contr2 y))))
where x = contr1 i0 empty
module Aux (y : A) (i : I) where
φ = ~ i ∨ i
u : Partial A φ
u = λ { (i = i0) → x ; (i = i1) → y }
v = contr1 φ u
contrIsProp : isContr A → isProp A
contrIsProp h a b i = primComp (λ _ → A) _ (λ j →
\ { (i = i0) → snd h a j; (i = i1) → snd h b j }) (fst h)
module _ {ℓ ℓ' : I → _} {T : ∀ i → Set (ℓ i)} {A : ∀ i → Set (ℓ' i)}
(f : ∀ i → T i → A i) (φ : I) (t : ∀ i → Partial (T i) φ)
(tzero : T i0 {- [ φ ↦ t i0 ] -}) where
private
c1 c2 : A i1
c1 = unsafeComp A φ (λ i → (λ { (φ = i1) → f i (t i itIsOne)})) (f i0 tzero)
c2 = f i1 (unsafeComp T φ t tzero)
azero = f i0 tzero
a : ∀ i → Partial (A i) φ
a i = (λ { (φ = i1) → f i ((t i) itIsOne)})
u : ∀ i → A i
u = fill A φ a azero
v : ∀ i → T i
v = fill T φ t tzero
pres : c1 ≡ c2
pres j = unsafeComp A (φ ∨ (j ∨ ~ j)) (λ i → primPOr φ (j ∨ ~ j)
(a i) \ { (j = i1) → f i (v i); (j = i0) → u i}) azero
fiber : ∀ {ℓ ℓ'} {E : Set ℓ} {B : Set ℓ'} (f : E → B) (y : B) → Set (ℓ-max ℓ ℓ')
fiber {E = E} f y = Σ[ x ∈ E ] y ≡ f x
module _ {ℓ ℓ'} (A : Set ℓ) (B : Set ℓ') where
isEquiv : (A → B) → Set (ℓ-max ℓ ℓ')
isEquiv f = (y : B) → isContr (fiber f y)
infix 4 _≃_
_≃_ = Σ _ isEquiv
module _ (f : _≃_) (φ : I) (t : Partial A φ) (a : B {- [ φ ↦ f t ] -})
(p : PartialP φ (λ o → a ≡ fst f (t o))) where
equiv : fiber (fst f) a -- [ φ ↦ (t , λ j → a) ]
equiv = contr ((snd f) a) φ (λ o → t o , (λ i → p o i))
equivFunc : A
equivFunc = fst equiv
equivProof : a ≡ fst f equivFunc
equivProof = snd equiv
{-# BUILTIN ISEQUIV isEquiv #-}
idEquiv : ∀ {ℓ} → {A : Set ℓ} → A ≃ A
idEquiv {A = A} = idFun A , (λ y → (y , refl) , contrSingl ∘ snd)
module _ {ℓ} {A B : Set ℓ} (P : A ≡ B) where
private
E ~E : I → Set ℓ
E = λ i → P i
~E = λ i → P (~ i)
f : A → B
f = transp E
g : B → A
g = transp ~E
u : PathP (λ i → A → E i) (idFun A) f
u i x = fill E i0 (λ _ → empty) x i
v : PathP (λ i → B → E i) g (idFun B)
v i y = fill ~E i0 (λ _ → empty) y (~ i)
fiberPath : (y : B) → (xβzero xβ1 : fiber f y) → xβzero ≡ xβ1
fiberPath y (xzero , βzero) (x1 , β1) k = ω , λ j → δ j where
module _ (j : I) where
private
sys : A → ∀ i → PartialP (~ j ∨ j) (λ _ → E (~ i))
sys x i = λ {(j = i0) → v (~ i) y ; (j = i1) → u (~ i) x}
ωzero = primComp ~E _ (sys xzero) (βzero j)
ω1 = primComp ~E _ (sys x1) (β1 j)
θzero = fill ~E _ (sys xzero) (βzero j)
θ1 = fill ~E _ (sys x1) (β1 j)
sys = λ {j (k = i0) → ωzero j ; j (k = i1) → ω1 j}
ω = primComp (λ _ → A) _ sys (g y)
θ = fill (λ _ → A) _ sys (g y)
δ = λ (j : I) → primComp E ((~ j ∨ j) ∨ (~ k ∨ k))
(λ i → λ { (j = i0) → v i y ; (k = i0) → θzero j (~ i)
; (j = i1) → u i ω ; (k = i1) → θ1 j (~ i) }) (θ j)
γ : (y : B) → y ≡ f (g y)
γ y j = primComp E _ (λ i → λ { (j = i0) → v i y
; (j = i1) → u i (g y) }) (g y)
pathToEquiv : A ≃ B
pathToEquiv = f , (λ y → (g y , γ y) , fiberPath y _)
pathToEquivProof : ∀ {ℓ} (E : I → Set ℓ) → isEquiv (E i0) (E i1) (transp E)
pathToEquivProof E = snd (pathToEquiv P)
where P : E i0 ≡ E i1
P i = E i
{-# BUILTIN PATHTOEQUIV pathToEquivProof #-}
module GluePrims where
primitive
primGlue : ∀ {ℓ ℓ'} (A : Set ℓ) (φ : I)
→ (T : Partial (Set ℓ') φ) → (f : PartialP φ (λ o → T o → A))
→ (pf : PartialP φ (λ o → isEquiv (T o) A (f o))) → Set ℓ'
prim^glue : ∀ {ℓ ℓ'} {A : Set ℓ} {φ : I}
→ {T : Partial (Set ℓ') φ} → {f : PartialP φ (λ o → T o → A)}
→ {pf : PartialP φ (λ o → isEquiv (T o) A (f o))}
→ PartialP φ T → A → primGlue A φ T f pf
prim^unglue : ∀ {ℓ ℓ'} {A : Set ℓ} {φ : I}
→ {T : Partial (Set ℓ') φ} → {f : PartialP φ (λ o → T o → A)}
→ {pf : PartialP φ (λ o → isEquiv (T o) A (f o))}
→ primGlue A φ T f pf → A
open GluePrims public renaming (prim^glue to glue ; prim^unglue to unglue)
module Unsafe'' (dummy : Set1) = GluePrims
module Unsafe''' = Unsafe'' Set -- using () renaming (prim^glue to unsafeGlue) public
unsafeGlue = Unsafe'''.prim^glue
Glue : ∀ {ℓ ℓ'} (A : Set ℓ) → (φ : I) → (T : Partial (Set ℓ') φ)
(f : (PartialP φ (λ o → T o ≃ A))) → Set ℓ'
Glue A φ T f = primGlue A φ T (λ o → fst (f o)) (λ o → snd (f o))
equivToPath : ∀ {ℓ} {A B : Set ℓ} → A ≃ B → A ≡ B
equivToPath {_} {A} {B} f i = Glue B (~ i ∨ i)
(λ {(i = i0) → A ; (i = i1) → B})
(λ {(i = i0) → f ; (i = i1) → idEquiv})
primitive
primFaceForall : (I → I) → I
module FaceForall (φ : I → I) where
δ = primFaceForall φ
postulate
∀v : ∀ i → IsOne (φ i) → IsOne ((δ ∨ (φ i0 ∧ ~ i)) ∨ (φ i1 ∧ i))
∀e : IsOne δ → ∀ i → IsOne (φ i)
module _ {ℓ ℓ'} {A : Set ℓ} {φ : I} {T : Partial (Set ℓ') φ}
{f : (PartialP φ λ o → T o ≃ A)} where
fwdGlueIso : PartialP φ (λ o → Glue A φ T f → T o)
fwdGlueIso (φ = i1) = idFun _
backGlueIso : PartialP φ (λ o → T o → Glue A φ T f)
backGlueIso (φ = i1) = idFun _
lemGlueIso : (b : PartialP φ (λ _ → Glue A φ T f)) → PartialP φ λ o →
(unglue {φ = φ} (b o)) ≡ (fst (f o) (fwdGlueIso o (b o)))
lemGlueIso _ (φ = i1) = refl
module CompGlue {ℓ ℓ' : I → _} (A : ∀ i → Set (ℓ i))
(φ : I → I) (T : ∀ i → Partial (Set (ℓ' i)) (φ i))
(f : ∀ i → PartialP (φ i) λ o → T i o ≃ A i)
where
B : ∀ i → Set (ℓ' i)
B = λ i → Glue (A i) (φ i) (T i) (f i)
module Local (ψ : I) (b : ∀ i → Partial (B i) ψ)
(bzero : B i0 {- [ ψ ↦ b i0 ] -}) where
a : ∀ i → Partial (A i) ψ
a i = λ o → unglue {φ = φ i} (b i o)
module Forall (δ : I) (∀e : IsOne δ → ∀ i → IsOne (φ i)) where
azero : A i0
azero = unglue {φ = φ i0} bzero
a1' = unsafeComp A ψ a azero
t1' : PartialP δ (λ o → T i1 (∀e o i1))
t1' o = unsafeComp (λ i → T i (∀e o i)) ψ
(λ i o' → fwdGlueIso {φ = φ i} (∀e o i) (b i o'))
(fwdGlueIso {φ = φ i0} (∀e o i0) bzero)
ω : PartialP δ _
ω o = pres (λ i → fst (f i (∀e o i))) ψ
(λ i x → fwdGlueIso {φ = φ i} (∀e o i) (b i x))
(fwdGlueIso {φ = φ i0} (∀e o i0) bzero)
a1'' = unsafeComp (λ _ → A i1) (δ ∨ ψ)
(λ j → unsafePOr δ ψ (λ o → ω o j) (a i1)) a1'
g : PartialP (φ i1) _
g o = (equiv (T i1 _) (A i1) (f i1 o) (δ ∨ ψ)
(unsafePOr δ ψ t1' (λ o' → fwdGlueIso {φ = φ i1} o (b i1 o'))) a1''
((unsafePOr δ ψ (λ {(δ = i1) → refl})
((λ{ (ψ = i1) → lemGlueIso {φ = φ i1} (λ _ → b i1 itIsOne) o })))))
t1 α : PartialP (φ i1) _
t1 o = fst (g o)
α o = snd (g o)
a1 = unsafeComp (λ j → A i1) (φ i1 ∨ ψ)
(λ j → unsafePOr (φ i1) ψ (λ o → α o j) (a i1)) a1''
b1 : Glue _ (φ i1) (T i1) (f i1)
b1 = unsafeGlue {φ = φ i1} t1 a1
b1 = Forall.b1 (FaceForall.δ φ) (FaceForall.∀e φ)
compGlue : {ℓ ℓ' : I → _} (A : ∀ i → Set (ℓ i)) (φ : I → I)
(T : ∀ i → Partial (Set (ℓ' i)) (φ i))
(f : ∀ i → PartialP (φ i) λ o → (T i o) → (A i)) →
(pf : ∀ i → PartialP (φ i) (λ o → isEquiv (T i o) (A i) (f i o))) →
let B : ∀ i → Set (ℓ' i)
B = λ i → primGlue (A i) (φ i) (T i) (f i) (pf i)
in (ψ : I) (b : ∀ i → Partial (B i) ψ) (bzero : B i0) → B i1
compGlue A φ T f pf ψ b bzero =
CompGlue.Local.b1 A φ T (λ i p → (f i p) , (pf i p)) ψ b bzero
{-# BUILTIN COMPGLUE compGlue #-}
-}