packages feed

cubical-0.2.0: examples/hedberg.cub

module hedberg where

import set

-- proves that a type with decidable equality is a set
-- in particular both N and Bool are sets

const : (A : U) (f : A -> A) -> U
const A f = (x y : A) -> Id A (f x) (f y)

exConst : (A : U) -> U
exConst A = Sigma (A -> A) (const A)

decConst : (A : U) -> dec A -> exConst A
decConst A = split
  inl a -> (\x -> a, \ x y -> refl A a)
  inr h -> (\x -> x, \ x y -> efq (Id A x y) (h x))

hedbergLemma : (A: U) (f : (a b : A) -> Id A a b -> Id A a b) (a b : A)
            (p : Id A a b) ->
            Id (Id A a b) (comp A a a b (f a a (refl A a)) p) (f a b p)
hedbergLemma A f a = J A a (\ b p -> Id (Id A a b) (comp A a a b (f a a (refl A a)) p) (f a b p)) rem
  where rem : Id (Id A a a) (comp A a a a (f a a (refl A a)) (refl A a)) (f a a (refl A a))
        rem = compIdr A a a (f a a (refl A a))

hedberg : (A : U) -> discrete A -> set A
hedberg A h a b p q = lemSimpl A a a b r p q rem5
  where
    rem1 : (x y : A) -> exConst (Id A x y)
    rem1 x y = decConst (Id A x y) (h x y)

    f : (x y : A) -> Id A x y -> Id A x y
    f x y = (rem1 x y).1

    fIsConst : (x y : A) -> const (Id A x y) (f x y)
    fIsConst x y = (rem1 x y).2

    r : Id A a a
    r = f a a (refl A a)

    rem2 : Id (Id A a b) (comp A a a b r p) (f a b p)
    rem2 = hedbergLemma A f a b p

    rem3 : Id (Id A a b) (comp A a a b r q) (f a b q)
    rem3 = hedbergLemma A f a b q

    rem4 : Id (Id A a b) (f a b p) (f a b q)
    rem4 = fIsConst a b p q

    rem5 : Id (Id A a b) (comp A a a b r p) (comp A a a b r q)
    rem5 = compDown (Id A a b) (comp A a a b r p) (f a b p) (comp A a a b r q) (f a b q) rem2 rem3 rem4

NIsSet : set N
NIsSet = hedberg N natDec

test3 : Id (Id N zero zero) (refl N zero) (refl N zero)
test3 = NIsSet zero zero (refl N zero) (refl N zero)

boolIsSet : set Bool
boolIsSet = hedberg Bool boolDec

unitIsSet : set Unit
unitIsSet = hedberg Unit unitDec

N0IsSet : set N0
N0IsSet = hedberg N0 N0Dec