packages feed

cubical-0.1.0: examples/set.cub

module set where

import lemId

UIP : U -> U
UIP A = (a b : A) -> prop (Id A a b)

set : U -> U
set = UIP

lem1 : (A :U) -> (a:A) -> (h : (x:A) -> Id A a x) ->
       (x y : A) -> (p : Id A x y) -> Id (Id A a y) (comp A a x y (h x) p) (h y)
lem1 A a h x =
  J A x (\ y p -> Id (Id A a y) (comp A a x y (h x) p) (h y)) rem
 where
   rem : Id (Id A a x) (comp A a x x (h x) (refl A x)) (h x)
   rem = compIdr A a x (h x)

lem2 : (A :U) -> (a:A) -> ((x:A) -> Id A a x) -> UIP A
lem2 A a h x y p q =
 lemSimpl A a x y (h x) p q rem
   where
     remp : Id (Id A a y) (comp A a x y (h x) p) (h y)
     remp = lem1 A a h x y p
     remq : Id (Id A a y) (comp A a x y (h x) q) (h y)
     remq = lem1 A a h x y q
     rem : Id (Id A a y) (comp A a x y (h x) p) (comp A a x y (h x) q)
     rem = compDown (Id A a y) (comp A a x y (h x) p) (h y) (comp A a x y (h x) q) (h y)
               remp remq (refl (Id A a y) (h y))

propUIP : (A:U) -> prop A -> UIP A
propUIP A h a = lem2 A a (h a) a

propIsProp : (A : U) -> prop (prop A)
propIsProp A = lemProp1 (prop A) rem
  where
   rem : prop A -> prop (prop A)
   rem pA = rem3 
    where
      rem1 : UIP A
      rem1 = propUIP A pA

      rem2 : (a0:A) -> (f g : Pi A (Id A a0)) -> Id (Pi A (Id A a0)) f g
      rem2 a0 f g = funExt A (\ a1 -> Id A a0 a1) f g (\ a1 -> rem1 a0 a1 (f a1) (g a1))

      rem3 : (f g : (a0 a1 :A) -> Id A a0 a1) -> Id ((a0 a1:A) -> Id A a0 a1) f g
      rem3 f g = funExt A (\ a0 -> (Pi A (Id A a0))) f g (\ a0 -> rem2 a0 (f a0) (g a0))

lemunit : set Unit
lemunit = propUIP Unit propUnit

test2 : Id (Id Unit tt tt) (refl Unit tt) (refl Unit tt)
test2 = lemunit tt tt (refl Unit tt) (refl Unit tt)