packages feed

cubical-0.2.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 = mapOnPath 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 st = (\y -> (st.1 y).1, \y -> (st.1 y).2)

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 z = rem
   where rem : (Q : B->U) -> ((x:A) -> Q (f x)) -> Pi B Q
         rem Q h y = rem2
                where rem1 : Q (f (z.1 y))
                      rem1 = h (z.1 y)
                      rem2 : Q y
                      rem2 = subst B Q (f (z.1 y)) y (z.2 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 = (s, t)
  where
  s : (y : B) -> fiber A B f y
  s y = (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


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