cubical-0.2.0: examples/subset.cub
module subset where
import univalence
import equivTotal
import elimEquiv
-- 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 z = fiber z.1 A z.2
sub21 : (A:U) -> subset2 A -> subset1 A
sub21 A P = (Sigma A P,\ x -> x.1)
retsub : (A:U) -> (P : subset2 A) -> Id (subset2 A) (sub12 A (sub21 A P)) P
retsub A P = funExt A (\ _ -> U) (fiber (Sigma A P) A (\x -> x.1)) P (lem1Sub A P)
-- in the other direction we use a corollary of equivalence
lemSecSub : (A X Y:U)(g:X->Y) -> isEquiv X Y g -> (f:Y -> A) ->
Id (subset1 A) (Y,f) (X,\ y -> f (g y))
lemSecSub A X = elimIsEquiv X P (\ f -> refl (subset1 A) (X,f))
where
P : (Y:U) -> (X->Y) -> U
P Y g = (f:Y -> A) -> Id (subset1 A) (Y,f) (X,\ y -> f (g y))
lem2SecSub : (A X:U) (f:X -> A) ->
isEquiv X (Sigma A (fiber X A f)) (\ x -> (f x,(x,refl A (f x))))
lem2SecSub A X f = gradLemma X Y g h rgh sgh
where
F : A -> U
F = fiber X A f
Y : U
Y = Sigma A F
h : Y -> A
h y = y.1
g : X -> Y
g x = (f x,(x,refl A (f x)))
h : Y -> X
h y = y.2.1
Z : U
Z = Sigma X (\ x -> Sigma A (\ a -> Id A (f x) a))
sw1 : Y -> Z
sw1 y = (y.2.1,(y.1,y.2.2))
sw2 : Z -> Y
sw2 z = (z.2.1,(z.1,z.2.2))
sgh : (x:X) -> Id X (h (g x)) x
sgh x = refl X x
rgh : (y:Y) -> Id Y (g (h y)) y
rgh y = lem y.2
where
lem : (xp : Sigma X (\ x -> Id A (f x) y.1)) -> Id Y (g (h (y.1,xp))) (y.1,xp)
lem xp = lem1
where
x:X
x = xp.1
p : Id A (f x) y.1
p = xp.2
C : (v u:A) -> Id A v u -> U
C v u q = Id (Sigma A (Id A v)) (v,refl A v) (u,q)
lem5 : (v:A) -> C v v (refl A v)
lem5 v = refl (Sigma A (Id A v)) (v,refl A v)
lem4 : (v u:A) (q: Id A v u) -> C v u q
lem4 v = J A v (C v) (lem5 v)
lem3 : Id (Sigma A (Id A (f x))) (f x,refl A (f x)) (y.1,p)
lem3 = lem4 (f x) y.1 xp.2
lem2 : Id Z (x,(f x,refl A (f x))) (x,(y.1,xp.2))
lem2 = mapOnPath (Sigma A (Id A (f x)))
(Sigma X (\ x -> Sigma A (Id A (f x))))
(\ z -> (x,z))
(f x,refl A (f x)) (y.1,xp.2) lem3
lem1 : Id Y (f x,(x,refl A (f x))) (y.1,xp)
lem1 = mapOnPath Z Y sw2 (x,(f x,refl A (f x))) (x,(y.1,p)) lem2
secsub : (A:U) -> (z : subset1 A) -> Id (subset1 A) (sub21 A (sub12 A z)) z
secsub A z = lemSecSub A z.1 Y g (lem2SecSub A z.1 z.2) h
where
X : U
X = z.1
F : A -> U
F = fiber X A z.2
Y : U
Y = Sigma A F
f : X -> A
f = z.2
h : Y -> A
h y = y.1
g : X -> Y
g x = (f x,(x,refl A (f x)))
thmSubset : (A:U) -> Id U (subset1 A) (subset2 A)
thmSubset A = isEquivEq (subset1 A) (subset2 A) (sub12 A) rem
where rem : isEquiv (subset1 A) (subset2 A) (sub12 A)
rem = gradLemma (subset1 A) (subset2 A) (sub12 A) (sub21 A) (retsub A) (secsub A)