packages feed

cubical-0.1.0: examples/swapDisc.cub

module swapDisc where

import lemId

-- defines the swap function over a discrete type and proves that this is an idempotent map
-- needed for Nicolai Kraus example

-- intermediate function

auxSwapD : (X:U) -> discrete X -> X -> X -> X -> X
auxSwapD X dX x0 x1 x = defCase (Id X x1 x) X x0 x (dX x1 x)

swapDisc : (X:U) -> discrete X -> X -> X -> X -> X
swapDisc X dX x0 x1 x = defCase (Id X x0 x) X x1 (auxSwapD X dX x0 x1 x) (dX x0 x)

idSwapDisc0 : (X:U) (dX: discrete X) -> (x0 x1 : X) -> (x:X) -> Id X x0 x -> 
     Id X (swapDisc X dX x0 x1 x) x1
idSwapDisc0 X dX x0 x1 x eqx0x =
 IdDefCasel (Id X x0 x) X x1 (auxSwapD X dX x0 x1 x) (dX x0 x) eqx0x

idSwapDiscn0 : (X:U) (dX: discrete X) -> (x0 x1 : X) -> (x:X) -> neg (Id X x0 x) -> 
              Id X (swapDisc X dX x0 x1 x) (auxSwapD X dX x0 x1 x)
idSwapDiscn0 X dX x0 x1 x neqx0x =
 IdDefCaser (Id X x0 x) X x1 (defCase (Id X x1 x) X x0 x (dX x1 x)) (dX x0 x) neqx0x

idAuxSwap1 :  (X:U) (dX: discrete X) -> (x0 x1 : X) -> (x:X) -> Id X x1 x -> 
              Id X (auxSwapD X dX x0 x1 x) x0
idAuxSwap1 X dX x0 x1 x eqx1x =
 IdDefCasel (Id X x1 x) X x0 x (dX x1 x) eqx1x

idAuxSwapn1 :  (X:U) (dX: discrete X) -> (x0 x1 : X) -> (x:X) -> neg (Id X x1 x) -> 
            Id X (auxSwapD X dX x0 x1 x) x
idAuxSwapn1 X dX x0 x1 x neqx1x = 
 IdDefCaser (Id X x1 x) X x0 x (dX x1 x) neqx1x

idSwapDisc1 : (X:U) (dX: discrete X) -> (x0 x1 : X) -> neg (Id X x0 x1) -> Id X (swapDisc X dX x0 x1 x1) x0
idSwapDisc1 X dX x0 x1 neqx0x1 = 
 comp X (swapDisc X dX x0 x1 x1) (defCase (Id X x0 x1) X x1 x0 (dX x0 x1)) x0 rem2 rem1
 where
  rem : Id X (defCase (Id X x1 x1) X x0 x1 (dX x1 x1)) x0
  rem = IdDefCasel (Id X x1 x1) X x0 x1 (dX x1 x1) (refl X x1)

  rem1 : Id X (defCase (Id X x0 x1) X x1 x0 (dX x0 x1)) x0
  rem1 = IdDefCaser (Id X x0 x1) X x1 x0 (dX x0 x1) neqx0x1

  rem2 : Id X (swapDisc X dX x0 x1 x1) (defCase (Id X x0 x1) X x1 x0 (dX x0 x1))
  rem2 = cong X X (\ y -> defCase (Id X x0 x1) X x1 y (dX x0 x1)) (defCase (Id X x1 x1) X x0 x1 (dX x1 x1)) x0 rem

-- can we show that swapDisc is idempotent??

idemSwapDisc : (X:U) (dX: discrete X) -> (x0 x1 : X) -> neg (Id X x0 x1) -> (x:X) -> 
               Id X (swapDisc X dX x0 x1 (swapDisc X dX x0 x1 x)) x 
idemSwapDisc X dX x0 x1 neqx0x1 x = orElim (Id X x0 x) (neg (Id X x0 x)) G rem9 rem11 (dX x0 x)
 where
   sD : X -> X
   sD = swapDisc X dX x0 x1 

   G : U
   G = Id X (sD (sD x)) x

   aD : X -> X
   aD = auxSwapD X dX x0 x1 

   rem : Id X x0 x -> Id X (sD x) x1
   rem = idSwapDisc0 X dX x0 x1 x  

   rem1 : neg (Id X x0 x) -> Id X (sD x) (aD x)
   rem1 = idSwapDiscn0 X dX x0 x1 x

   rem2 : Id X x1 x -> Id X (aD x) x0
   rem2 = idAuxSwap1 X dX x0 x1 x

   rem3 : neg (Id X x1 x) -> Id X (aD x) x
   rem3 = idAuxSwapn1 X dX x0 x1 x

   rem4 : Id X (aD x1) x0
   rem4 = idAuxSwap1 X dX x0 x1 x1 (refl X x1)

   rem5 : Id X (sD x1) (aD x1)
   rem5 = idSwapDiscn0 X dX x0 x1 x1 neqx0x1

   rem6 : Id X (sD x1) x0
   rem6 = comp X (sD x1) (aD x1) x0 rem5 rem4

   rem7 : Id X x0 x -> Id X (sD (sD x)) (sD x1)
   rem7 p = cong X X sD (sD x) x1 (rem p)

   rem8 : Id X x0 x -> Id X (sD (sD x)) x0
   rem8 p = comp X (sD (sD x)) (sD x1) x0 (rem7 p) rem6

   rem9 : Id X x0 x -> G
   rem9 p = comp X (sD (sD x)) x0 x (rem8 p) p

   rem10 : Id X (sD x0) x1
   rem10 = idSwapDisc0 X dX x0 x1 x0 (refl X x0)

   rem11 : neg (Id X x0 x) -> G
   rem11 neqx0x = orElim (Id X x1 x) (neg (Id X x1 x)) G rem14 rem15 (dX x1 x)
      where
        rem12 : Id X (sD x) (aD x)
        rem12 = rem1 neqx0x

        rem13 : Id X x1 x -> Id X (sD (aD x)) x1
        rem13 p = comp X (sD (aD x)) (sD x0) x1 (cong X X sD (aD x) x0 (rem2 p)) rem10

        rem14 : Id X x1 x -> G
        rem14 p = comp X (sD (sD x)) (sD (aD x)) x (cong X X sD (sD x) (aD x) rem12) (comp X (sD (aD x)) x1 x (rem13 p) p)

        rem15 : neg (Id X x1 x) -> G
        rem15 neqx1x = comp X (sD (sD x)) (sD x) x rem17 rem18
            where
             rem16 : Id X (aD x) x
             rem16 = rem3 neqx1x

             rem17 : Id X (sD (sD x)) (sD x)
             rem17 = comp X (sD (sD x)) (sD (aD x)) (sD x) (cong X X sD (sD x) (aD x) rem12) (cong X X sD (aD x) x rem16)

             rem18 : Id X (sD x) x
             rem18 = comp X (sD x) (aD x) x rem12 rem16