packages feed

cubical-0.2.0: examples/heterogeneous.cub

module heterogeneous where

import primitives
import prelude
import gradLemma

eqFst : (A : U) (B : A -> U) (u v : Sigma A B) ->
        Id (Sigma A B) u v -> Id A u.1 v.1
eqFst A B = mapOnPath (Sigma A B) A (\x -> x.1)

eqSnd : (A : U) (B : A -> U) (u v : Sigma A B) (p : Id (Sigma A B) u v) ->
        IdS A B u.1 v.1 (eqFst A B u v p) u.2 v.2
eqSnd A B = mapOnPathD (Sigma A B) (\x -> B x.1) (\x -> x.2)

eqPair1 : (A : U) (B : A -> U) (a0 a1 : A) (b0 : B a0) (b1 : B a1) ->
        Id (Sigma A B) (a0,b0) (a1,b1) -> Id A a0 a1
eqPair1 A B a0 a1 b0 b1 = eqFst A B (a0,b0) (a1,b1)

-- eqPair2 : (A : U) (B : A -> U) (a0 a1 : A) (b0 : B a0) (b1 : B a1)
--        (p : Id (Sigma A B) (pair a0 b0) (pair a1 b1)) ->
--        IdS A B a0 a1 (eqPair1 A B a0 a1 b0 b1 p) b0 b1
-- eqPair2 A B a0 a1 b0 b1 = eqSnd A B (pair a0 b0) (pair a1 b1)

-- conversion test:
reflIdIdP : (A:U) (a b : A) -> Id U (Id A a b) (IdP A A (refl U A) a b)
reflIdIdP A a b = refl U (Id A a b)

-- conversion test:
reflS : (A:U) (F:A -> U) (a:A) (b : F a) -> IdS A F a a (refl A a) b b
reflS A F a b = refl (F a) b

-- conversion test:
composeMapOnPath : (A : U) (B : A -> U) (u v : Sigma A B) ->
                   (p : Id (Sigma A B) u v) ->
  Id (Id U (B u.1) (B v.1))
    (mapOnPath (Sigma A B) U (\x -> B x.1) u v p)
    (mapOnPath A U B u.1 v.1 (mapOnPath (Sigma A B) A (\x -> x.1) u v p))
composeMapOnPath A B u v p = refl (Id U (B u.1) (B v.1))
          (mapOnPath (Sigma A B) U (\x -> B x.1) u v p)

eqFstSnd : (A : U) (B : A -> U) (a0 a1 : A) (b0 : B a0) (b1 : B a1) ->
           Id U
             (Id (Sigma A B) (a0, b0) (a1, b1))
	     (Sigma (Id A a0 a1) (\p -> IdS A B a0 a1 p b0 b1))
eqFstSnd A B a0 a1 b0 b1 = isEquivEq IdSig SigId f
                           (gradLemma IdSig SigId f g (refl SigId) (refl IdSig))
  where IdSig : U
        IdSig = Id (Sigma A B) (a0, b0) (a1, b1)

        SigId : U
        SigId = Sigma (Id A a0 a1) (\p -> IdS A B a0 a1 p b0 b1)

        f : IdSig -> SigId
        f p = (eqFst A B (a0,b0) (a1,b1) p, eqSnd  A B (a0,b0) (a1,b1) p)


        g : SigId -> IdSig
        g z =  mapOnPathS A B (Sigma A B) (\a b -> (a, b)) a0 a1 z.1 b0 b1 z.2


eqSubstSig : (A : U) (B : A -> U) (a0 a1 : A) (p:Id A a0 a1) (b0 : B a0) (b1 : B a1) ->
           Id U (IdS A B a0 a1 p b0 b1) (Id (B a1) (subst A B a0 a1 p b0) b1)
eqSubstSig A B a0 =
 J A a0 (\ a1 p -> (b0 : B a0) (b1 : B a1) ->
                    Id U (IdS A B a0 a1 p b0 b1) (Id (B a1) (subst A B a0 a1 p b0) b1))
        rem
  where rem :(b0 b1 :B a0) -> Id U (Id (B a0) b0 b1) (Id (B a0) (subst A B a0 a0 (refl A a0) b0) b1)
        rem b0 b1 = mapOnPath (B a0) U (\ b -> Id (B a0) b b1)
                     b0 (subst A B a0 a0 (refl A a0) b0) (substeq A B a0 b0)

pairEq : (A B:U) (a0 a1:A) (b0 b1:B) -> Id A a0 a1 -> Id B b0 b1 ->
         Id (and A B) (a0, b0) (a1, b1)
pairEq A B a0 a1 b0 b1 p q =
 appOnPath B (and A B) f0 f1 b0 b1 rem q
  where f0 : B -> and A B
        f0 y = (a0, y)
        f1 : B -> and A B
        f1 y = (a1, y)
        rem : Id (B -> and A B) f0 f1
        rem = mapOnPath A (B -> and A B) (\ x y -> (x, y)) a0 a1 p

test : (A B:U) (a0 a1:A) (b0 b1:B) (p:Id A a0 a1) (q:Id B b0 b1) ->
         Id (Id A a0 a1)
            p
            (mapOnPath (and A B) A (\x -> x.1) (a0, b0) (a1, b1)
                       (pairEq A B a0 a1 b0 b1 p q))
test A B a0 a1 b0 b1 p q = refl (Id A a0 a1) p