packages feed

cubical-0.1.0: examples/subset.cub

module subset where

import univalence

-- a non trivial equivalence: two different ways to represent subsets
-- this is not finished
-- it should provide a non trivial equivalence

subset1 : U -> U
subset1 A = Sigma U (\ X -> X -> A)

subset2 : U -> U
subset2 A = A -> U

-- map in both directions

sub12 : (A:U) -> subset1 A -> subset2 A
sub12 A = split
           pair X f -> fiber X A f

sub21 : (A:U) -> subset2 A -> subset1 A
sub21 A P = pair (Sigma A P) (fst A P)

lem2Sub : (A:U) (P: A -> U) (a:A) -> Id U (fiber (Sigma A P) A (fst A P) a) 
                                          (Sigma (Sigma A (\ x -> Id A x a)) (\ z -> P (fst A (\ x -> Id A x a) z)))
lem2Sub A P a = isoId F T f g sfg rfg
 where
   T : U
   T = Sigma (Sigma A (\ x -> Id A x a)) (\ z -> P (fst A (\ x -> Id A x a) z))

   F : U
   F = fiber (Sigma A P) A (fst A P) a

   f : F -> T
   f = split
        pair z p -> rem z p 
          where rem : (z : Sigma A P) (p : Id A (fst A P z) a) -> T
                rem = split
                      pair x u -> \ p -> pair (pair x p) u

   g : T -> F
   g = split
        pair z u -> rem z u
          where rem : (z: Sigma A (\x -> Id A x a)) -> (u: P (fst A (\ x -> Id A x a) z)) -> fiber (Sigma A P) A (fst A P) a
                rem = split
                        pair x p -> \ u -> pair (pair x u) p

   rfg : (v :F) -> Id F (g (f v)) v
   rfg = split
          pair z p -> rem z p
           where rem : (z : Sigma A P) (p : Id A (fst A P z) a) -> Id (fiber (Sigma A P) A (fst A P) a) (g (f (pair z p))) (pair z p)
                 rem = split
                        pair x u -> \ p -> refl F (pair (pair x u) p)

   sfg : (v:T) -> Id T (f (g v)) v
   sfg = split
          pair z u -> rem z u
            where rem : (z: Sigma A (\x -> Id A x a)) -> (u: P (fst A (\ x -> Id A x a) z)) -> Id T (f (g (pair z u))) (pair z u)
                  rem = split
                        pair x p -> \ u -> refl T (pair (pair x p) u)