packages feed

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)