packages feed

cubical-0.1.0: examples/function.cub

module function where

import lemId

-- some general facts about functions

-- g is a section of f 
section : (A B : U) (f : A -> B) (g : B -> A) -> U
section A B f g = (b : B) -> Id B (f (g b)) b

injective : (A B : U) (f : A -> B) -> U
injective A B f = (a0 a1 : A) -> Id B (f a0) (f a1) -> Id A a0 a1

retract : (A B : U) (f : A -> B) (g : B -> A) -> U
retract A B f g = section B A g f

retractInj : (A B : U) (f : A -> B) (g : B -> A) -> 
             retract A B f g -> injective A B f
retractInj A B f g h a0 a1 h' = compUp A (g (f a0)) a0 (g (f a1)) a1 rem1 rem2 rem3
  where
  rem1 : Id A (g (f a0)) a0
  rem1 = h a0

  rem2 : Id A (g (f a1)) a1
  rem2 = h a1

  rem3 : Id A (g (f a0)) (g (f a1))
  rem3 = cong B A g (f a0) (f a1) h'



hasSection : (A B : U) -> (A -> B) -> U
hasSection A B f = Sigma (B->A) (section A B f) 

-- an equivalence has a section

equivSec : (A B :U) -> (f:A->B) -> isEquiv A B f -> hasSection A B f
equivSec A B f = 
 split 
  pair s t -> pair g rem
    where g : B -> A
          g y = fst A (\ x -> Id B (f x) y) (s y)

          rem : (y:B) -> Id B (f (g y)) y
          rem y = snd A (\ x -> Id B (f x) y) (s y)

allSection : (A B : U) (f:A->B) -> hasSection A B f -> (Q : B->U) -> ((x:A) -> Q (f x)) -> Pi B Q
allSection A B f =
 split
  pair g sfg -> rem 
     where rem : (Q : B->U) -> ((x:A) -> Q (f x)) -> Pi B Q
           rem Q h y = rem2
                  where rem1 : Q (f (g y))
                        rem1 = h (g y)

                        rem2 : Q y
                        rem2 = subst B Q (f (g y)) y (sfg y) rem1


isEquivSection : (A B : U) (f : A -> B) (g : B -> A) -> section A B f g -> 
                 ((b : B) -> prop (fiber A B f b)) -> isEquiv A B f
isEquivSection A B f g sfg h = pair s t
  where
  s : (y : B) -> fiber A B f y
  s y = pair (g y) (sfg y)

  t : (y : B) -> (v : fiber A B f y) -> Id (fiber A B f y) (s y) v
  t y v = h y (s y) v

injProp : (A B : U) (f : A -> B) -> injective A B f -> prop B -> prop A
injProp A B f injf pB a0 a1 = injf a0 a1 (pB (f a0) (f a1))

injId : (X : U) -> injective X X (id X)
injId X a0 a1 h = h


idempotent : (A:U) -> (A->A) -> U
idempotent A f = section A A f f