cubical-0.2.0: examples/lemId.cub
module lemId where
import prelude
-- general lemmas about Identity type
comp : (A : U) -> (a b c : A) -> Id A a b -> Id A b c -> Id A a c
comp A a b c p q = subst A (Id A a) b c q p
compInvIdr : (A : U) -> (a b : A) -> (p : Id A a b) -> Id (Id A a b) p (comp A a b b p (refl A b))
compInvIdr A a b p = substeq A (\x -> Id A a x) b p
inv : (A : U) -> (a b :A) -> Id A a b -> Id A b a
inv A a b p = subst A (\x -> Id A x a) a b p (refl A a)
invRefl : (A:U) -> (a:A) -> Id (Id A a a) (refl A a) (inv A a a (refl A a))
invRefl A a = substeq A (\x -> Id A x a) a (refl A a)
compIdr : (A : U) -> (a b : A) -> (p : Id A a b) -> Id (Id A a b) (comp A a b b p (refl A b)) p
compIdr A a b p = inv (Id A a b) p (comp A a b b p (refl A b)) (compInvIdr A a b p)
compInvIdl : (A : U) -> (b c : A) -> (q : Id A b c) ->
Id (Id A b c) q (comp A b b c (refl A b) q)
compInvIdl A b c q = J A b (\c q -> Id (Id A b c) q (comp A b b c (refl A b) q)) rem c q
where
rem : Id (Id A b b) (refl A b) (comp A b b b (refl A b) (refl A b))
rem = compInvIdr A b b (refl A b)
compIdl : (A : U) -> (b c : A) -> (q : Id A b c) ->
Id (Id A b c) (comp A b b c (refl A b) q) q
compIdl A b c q = inv (Id A b c) q (comp A b b c (refl A b) q) (compInvIdl A b c q)
compInv : (A : U) -> (a b c : A) -> Id A a b -> Id A a c -> Id A b c
compInv A a b c p r = subst A (\ x -> Id A x c) a b p r
compInvIdl' : (A : U) (a b : A) (p : Id A a b) ->
Id (Id A a b) p (compInv A a a b (refl A a) p)
compInvIdl' A a b p = substeq A (\x -> Id A x b) a p
idEuclid : (A : U) -> euclidean A (Id A)
idEuclid A a b c p q = transpInv (Id A a b) (Id A a c) rem p
where rem : Id U (Id A a b) (Id A a c)
rem = mapOnPath A U (Id A a) b c q
-- similarity with ssreflect?? start to use equality on U
lemUpDown : (A:U) -> (a a' b b':A) -> Id A a a' -> Id A b b' -> Id U (Id A a b) (Id A a' b')
lemUpDown A a a' b b' p q =
appOnPath A U (Id A a) (Id A a') b b' (mapOnPath A (A->U) (Id A) a a' p) q
compUp : (A:U) -> (a a' b b':A) -> Id A a a' -> Id A b b' -> Id A a b -> Id A a' b'
compUp A a a' b b' p q = transport (Id A a b) (Id A a' b') (lemUpDown A a a' b b' p q)
compDown : (A:U) -> (a a' b b':A) -> Id A a a' -> Id A b b' -> Id A a' b' -> Id A a b
compDown A a a' b b' p q = transpInv (Id A a b) (Id A a' b') (lemUpDown A a a' b b' p q)
lemInv : (A:U) -> (a b c : A) -> (p : Id A a b) -> (q : Id A b c) ->
Id (Id A b c) q (compInv A a b c p (comp A a b c p q))
lemInv A a b c p q =
J A a (\ b p -> (c : A) (q : Id A b c) ->
Id (Id A b c) q (compInv A a b c p (comp A a b c p q))) rem b p c q
where
rem1 : (c : A) (q : Id A a c) ->
Id (Id A a c) (comp A a a c (refl A a) q)
(compInv A a a c (refl A a) (comp A a a c (refl A a) q))
rem1 c q = compInvIdl' A a c (comp A a a c (refl A a) q)
rem2 : (c : A) (q : Id A a c) -> Id (Id A a c) q (comp A a a c (refl A a) q)
rem2 c q = compInvIdl A a c q
rem : (c : A) (q : Id A a c) ->
Id (Id A a c) q (compInv A a a c (refl A a) (comp A a a c (refl A a) q))
rem c q = comp (Id A a c) q
(comp A a a c (refl A a) q)
(compInv A a a c (refl A a) (comp A a a c (refl A a) q))
(rem2 c q)
(rem1 c q)
lemSimpl : (A:U) -> (a b c : A) -> (p : Id A a b) -> (q q' : Id A b c) ->
Id (Id A a c) (comp A a b c p q) (comp A a b c p q') -> Id (Id A b c) q q'
lemSimpl A a b c p q q' h =
compDown (Id A b c)
q (compInv A a b c p (comp A a b c p q)) q' (compInv A a b c p (comp A a b c p q'))
rem rem1 rem2
where
rem : Id (Id A b c) q (compInv A a b c p (comp A a b c p q))
rem = lemInv A a b c p q
rem1 : Id (Id A b c) q' (compInv A a b c p (comp A a b c p q'))
rem1 = lemInv A a b c p q'
rem2 : Id (Id A b c) (compInv A a b c p (comp A a b c p q))
(compInv A a b c p (comp A a b c p q'))
rem2 = mapOnPath (Id A a c) (Id A b c) (compInv A a b c p)
(comp A a b c p q) (comp A a b c p q') h
eqSigma : (A : U) (B : A -> U) (a b : A) (p : Id A a b)
(u : B a) (v : B b) (q : Id (B b) (subst A B a b p u) v) ->
Id (Sigma A B) (a, u) (b, v)
eqSigma A B a =
J A a (\b p -> (u : B a) (v : B b) (q : Id (B b) (subst A B a b p u) v) ->
Id (Sigma A B) (a, u) (b, v)) rem2
where
rem1 : (u v : B a) -> Id (B a) u v ->
Id (Sigma A B) (a, u) (a, v)
rem1 = mapOnPath (B a) (Sigma A B) (\x -> (a, x))
rem2 : (u v : B a) -> Id (B a) (subst A B a a (refl A a) u) v ->
Id (Sigma A B) (a, u) (a, v)
rem2 u v q = rem1 u v q'
where q' : Id (B a) u v
q' = comp (B a) u (subst A B a a (refl A a) u) v (substeq A B a u) q
eqPropFam : (A : U) (B : A -> U) (h : propFam A B) (au bv : Sigma A B) ->
Id A au.1 bv.1 -> Id (Sigma A B) au bv
eqPropFam A B h au bv p =
eqSigma A B au.1 bv.1 p au.2 bv.2 (h bv.1 (subst A B au.1 bv.1 p au.2) bv.2)