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