{-# OPTIONS --safe --without-K --sized-types #-}
module GlobSet.Examples.Equality where
open import GlobSet
open import GlobSet.Product
open import GlobSet.Composition
open import GlobSet.Invertible
open import GlobSet.HCat
open import Relation.Binary.PropositionalEquality.Core
equality : {a : Level} → (i : Size) → Set a → GlobSet a i
cells (equality i A) = A
morphisms (equality i A) j x y = equality j (x ≡ y)
equalityCompHelper₂ : {a : Level}
→ {k : Size}
→ {A B C : Set a}
→ (f f' : A)
→ (g g' : B)
→ (F : A × B → C)
→ GlobSetMorphism (equality k (f ≡ f') ×G equality k (g ≡ g'))
(equality k (F (f , g) ≡ F (f' , g')))
equalityCompHelper₂ f .f g .g F .func (refl , refl) = refl
equalityCompHelper₂ f f' g g' F .funcMorphisms j (α , β) (α' , β') =
equalityCompHelper₂ α
α'
β
β'
(func (equalityCompHelper₂ f f' g g' F))
equalityCompHelper : {a : Level}
→ (i : Size)
→ (S : Set a)
→ (j : Size< i)
→ (x y z : S)
→ GlobSetMorphism (morphisms (equality i S) j x y
×G
morphisms (equality i S) j y z)
(morphisms (equality i S) j x z)
equalityCompHelper i S j x y z .func (f , g) = trans f g
equalityCompHelper i S j x y z .funcMorphisms k (f , g) (f' , g') =
equalityCompHelper₂ f f' g g' (func (equalityCompHelper i S j x y z))
compEquality : {a : Level} → (i : Size) → (S : Set a) → Composable i (equality i S)
compEquality i S .id j x = refl
compEquality i S .comp j x y z = equalityCompHelper i S j x y z
compEquality i S .compHigher j x y = compEquality j (x ≡ y)
equalityInvertibleMorphisms : {a : Level}
→ (i : Size)
→ {S : Set a}
→ (j : Size< i)
→ (x : S)
→ InvertibleCell i (compEquality i S) j x x
equalityInvertibleMorphisms i S j .cell = refl
equalityInvertibleMorphisms i S j .invert .finv = refl
equalityInvertibleMorphisms i S j .invert .fR k = equalityInvertibleMorphisms S k refl
equalityInvertibleMorphisms i S j .invert .fL k = equalityInvertibleMorphisms S k refl
hCatEquality : {a : Level} → (i : Size) → (S : Set a) → HCat (equality i S) (compEquality i S)
hCatEquality i S .compPreserveId j x y z .idPreserve k l w = equalityInvertibleMorphisms k l refl
hCatEquality i S .compPreserveId j x y z .idPreserveCoin k (a , b) (c , d) =
γ j k (λ v → trans (proj₁ v) (proj₂ v)) a c b d
where
γ : {l : Level}
→ (j : Size)
→ (k : Size< j)
→ {A B C : Set l}
→ (t : A × B → C)
→ (a c : A)
→ (b d : B)
→ PreserveIden (prodComp (compEquality k (a ≡ c))
(compEquality k (b ≡ d)))
(compEquality k (t (a , b) ≡ t (c , d)))
(equalityCompHelper₂ a c b d t)
γ j k t a c b d .idPreserve l m w = equalityInvertibleMorphisms l m refl
γ j k {S} t a c b d .idPreserveCoin l (e , f) (g , h) = γ k l (func (equalityCompHelper₂ a c b d t)) e g f h
hCatEquality i S .compPreserveComp j x y z .compPreserve k l (a , b) (.a , .b) (.a , .b) .eq m ((refl , refl) , (refl , refl)) = equalityInvertibleMorphisms k m refl
hCatEquality i S .compPreserveComp j x y z .compPreserveCoin k (a , b) (c , d) = γ j k (λ {(v₁ , v₂) → trans v₁ v₂}) a c b d
where
γ : {l : Level}
→ (j : Size)
→ (k : Size< j)
→ {A B C : Set l}
→ (t : A × B → C)
→ (a c : A)
→ (b d : B)
→ PreserveComp (prodComp (compEquality k (a ≡ c))
(compEquality k (b ≡ d)))
(compEquality k (t (a , b) ≡ t (c , d)))
(equalityCompHelper₂ a c b d t)
γ j k t a .a b .b .compPreserve l m (refl , refl) (.refl , .refl) (.refl , .refl) .eq n ((refl , refl) , refl , refl) = equalityInvertibleMorphisms l n refl
γ j k t a c b d .compPreserveCoin l (w , x) (y , z) = γ k l (func (equalityCompHelper₂ a c b d t)) w y x z
hCatEquality i S .ƛ {j} k refl = equalityInvertibleMorphisms j k refl
hCatEquality i S .ρ {j} k refl = equalityInvertibleMorphisms j k refl
hCatEquality i S .assoc {j} {k} refl refl refl = equalityInvertibleMorphisms j k refl
hCatEquality i S .hcoin j x y = hCatEquality j (x ≡ y)