packages feed

cubical-0.1.0: examples/equivSet.cub

module equivSet where

import function
import set

-- a sufficient condition for two sets being equal
-- this is implied by the gradlemma, which has however a more complex proof

equivSet : (A B : U) (f : A -> B) (g : B -> A) -> (section A B f g) 
           -> (injective A B f) -> (set B) -> Id U A B
equivSet A B f g sfg injf setB = equivEq A B f sf tf
  where
  fFiber : B -> U
  fFiber b = fiber A B f b

  fstfFiber : (b : B) -> fFiber b -> A
  fstfFiber b = fst A (\x -> Id B (f x) b)

  eqfFiber : (b : B) -> (v v' : fFiber b) ->
             Id A (fstfFiber b v) (fstfFiber b v') -> Id (fFiber b) v v'
  eqfFiber b = eqPropFam A (\x -> Id B (f x) b) (\x -> setB (f x) b)

  sf : (b : B) -> fFiber b
  sf b = pair (g b) (sfg b)

  tf : (b : B) (v : fFiber b) -> Id (fFiber b) (sf b) v
  tf b v = eqfFiber b (sf b) v rem
    where
    a' : A
    a' = fstfFiber b v

    rem1 : Id B (f (g b)) (f a')
    rem1 = comp B (f (g b)) b (f a') (sfg b)
           (inv B (f a') b (snd A (\x -> Id B (f x) b) v))

    rem : Id A (g b) a'
    rem = injf (g b) a' rem1