packages feed

hoq-0.3: examples/Cats/Cat.hoq

import Cats.Simp1
import hlevel

record SimpType where
    spine : Nat -> Type
    simp-map : (k n : Nat) -> k ~> n -> spine n -> spine k
  with
    simp-map _ _ (id p) x = transport spine (inv p) x
    simp-map k n (comp m f g) x = simp-map k m f (simp-map m n g x)

Prod : Type -> Type -> Type
Prod A B = Sigma A (\_ -> B)

-- X (suc n) = * X 1 - X n

face0 : (n : Nat) -> zero ~> n
face0 zero = id idp
face0 (suc n) = comp n (face0 n) (face (suc n) (wrap id-le) idp)

face1 : (n : Nat) -> suc zero ~> suc n
face1 zero = id idp
face1 (suc n) = comp (suc n) (face1 n) (face (suc (suc n)) (wrap (wrap id-le)) idp)

face1-left : (n : Nat) -> face0 (suc n) = comp (suc zero) (face (suc zero) (wrap true) idp) (face1 n)
face1-left zero =
    face0 (suc zero)
  ==< idp >==
    comp zero (id idp) (face (suc zero) (wrap id-le) idp)
  ==< path (id-comp (face (suc zero) (wrap true) idp)) >==
    face (suc zero) (wrap id-le) idp
  ==< inv (path (comp-id (face (suc zero) (wrap true) idp))) >==
    comp (suc zero) (face (suc zero) (wrap true) idp) (id idp)
  ==< idp >==
    comp (suc zero) (face (suc zero) (wrap true) idp) (face1 zero)
  !qed
face1-left (suc n) =
    comp (suc n) (face0 (suc n)) (face (suc (suc n)) (wrap (wrap id-le)) idp)
  ==< map (\t -> comp (suc n) t (face (suc (suc n)) (wrap (wrap id-le)) idp)) (face1-left n) >==
    comp (suc n) (comp (suc zero) (face (suc zero) (wrap true) idp) (face1 n)) (face (suc (suc n)) (wrap (wrap id-le)) idp)
  ==< path (comp-comp (suc zero) (suc n) (face (suc zero) (wrap true) idp) (face1 n) (face (suc (suc n)) (wrap (wrap id-le)) idp)) >==
    comp (suc zero) (face (suc zero) (wrap true) idp) (comp (suc n) (face1 n) (face (suc (suc n)) (wrap (wrap id-le)) idp))
  !qed

face1-right : (n : Nat) -> Path (\_ -> zero ~> suc n) (comp (suc zero) (face zero true idp) (face1 n)) (comp n (face0 n) (face zero true idp))
face1-right zero =
    comp (suc zero) (face zero true idp) (face1 zero)
  ==< idp >==
    comp (suc zero) (face zero true idp) (id idp)
  ==< path (comp-id (face zero true idp)) >==
    face zero true idp
  ==< inv (path (id-comp (face zero true idp))) >==
    comp zero (id idp) (face zero true idp)
  ==< idp >==
    comp zero (face0 zero) (face zero true idp)
  !qed
face1-right (suc n) =
    
    comp (suc zero) (face zero true idp) (face1 (suc n))
    
  ==< idp >==
    
    comp (suc zero) (face zero true idp) (comp (suc n) (face1 n) (face (suc (suc n)) (wrap (wrap id-le)) idp))
    
  ==< inv (path (comp-comp (suc zero) (suc n) (face zero true idp) (face1 n) (face (suc (suc n)) (wrap (wrap id-le)) idp))) >==
    
    comp (suc n) (comp (suc zero) (face zero true idp) (face1 n)) (face (suc (suc n)) (wrap (wrap id-le)) idp)
    
  ==< map (\t -> comp (suc n) t (face (suc (suc n)) (wrap (wrap id-le)) idp)) (face1-right n) >==
    
    comp (suc n) (comp n (face0 n) (face zero true idp)) (face (suc (suc n)) (wrap (wrap id-le)) idp)
    
  ==< path (comp-comp n (suc n) (face0 n) (face zero true idp) (face (suc (suc n)) (wrap (wrap id-le)) idp)) >==
    
    comp n (face0 n) (comp (suc n) (face zero true idp) (face (suc (suc n)) (wrap (wrap id-le)) idp))
    
  ==< map (comp n (face0 n)) (path (face-face zero (suc n) true (wrap id-le) idp)) >==
    
    comp n (face0 n) (comp (suc n) (face (suc n) (wrap id-le) idp) (face zero true idp))
    
  ==< inv (path (comp-comp n (suc n) (face0 n) (face (suc n) (wrap id-le) idp) (face zero true idp))) >==
    
    comp (suc n) (comp n (face0 n) (face (suc n) (wrap id-le) idp)) (face zero true idp)
    
  ==< idp >==
    
    comp (suc n) (face0 (suc n)) (face zero true idp)
    
  !qed

Spine : (X : SimpType) -> Nat -> X.spine zero -> Type
Spine _ zero _ = True
Spine X (suc n) r = Sigma (X.spine (suc zero)) (\e ->
    Prod (r = X.simp-map zero (suc zero) (face (suc zero) (wrap true) idp) e)
         (Spine X n (X.simp-map zero (suc zero) (face zero true idp) e)))

getSpine0 : (X : SimpType) (n : Nat) (x : X.spine n) -> Spine X n (X.simp-map zero n (face0 n) x)
getSpine0 X zero x = true
getSpine0 X (suc n) x
    = X.simp-map (suc zero) (suc n) (face1 n) x
    , map (\t -> X.simp-map zero (suc n) t x) (face1-left n)
    , transport (\t -> Spine X n (X.simp-map zero (suc n) t x))
                (inv (face1-right n))
                (getSpine0 X n (X.simp-map n (suc n) (face zero true idp) x))

getSpine : (X : SimpType) (n : Nat) -> X.spine n -> Sigma (X.spine zero) (Spine X n)
getSpine X n x = X.simp-map zero n (face0 n) x, getSpine0 X n x

isEquiv : {X Y : Type} -> (X -> Y) -> Type
isEquiv X Y f = (y : Y) -> isContr (Sigma X (\x -> f x = y))

SegalType = Sigma SimpType (\X -> (n : Nat) -> isEquiv (getSpine X n))