packages feed

cubical-0.2.0: examples/curry.cub

module curry where

import swap

curry : (A B C:U) -> ((and A B) -> C) -> A -> B -> C
curry A B C f a b = f (a,b)

uncurry : (A B C:U) -> (A -> B -> C) -> (and A B) -> C
uncurry A B C g z = g z.1 z.2

eqCurry : (A B C : U) -> Id U ((and A B) -> C) (A -> B -> C)
eqCurry A B C =
 isEquivEq T V (curry A B C) (gradLemma T V (curry A B C) (uncurry A B C) (refl V) (refl T))
  where
   T:U
   T = (and A B) -> C
   V : U
   V = A -> B -> C

typFst : U
typFst = (X Y:U) -> (and X Y) -> X

typFst1 : U
typFst1 = (X Y:U) -> X -> Y -> X

eqTest : Id U typFst typFst1
eqTest = eqPi U  (\ X -> Pi U (\ Y -> (and X Y) -> X)) (\ X -> Pi U (\ Y -> X -> Y -> X)) rem
 where
  rem : (X:U) -> Id U (Pi U (\ Y -> (and X Y) -> X)) (Pi U (\ Y -> X -> Y -> X))
  rem X = eqPi U (\ Y -> (and X Y) -> X) (\ Y -> X -> Y -> X) rem1
    where
     rem1 : (Y:U) -> Id U ((and X Y) -> X) (X -> Y -> X)
     rem1 Y = eqCurry X Y X

eqTestInv : Id U typFst1 typFst
eqTestInv = inv U  ((X Y:U) -> (and X Y) -> X) ((X Y:U) -> X -> Y -> X) eqTest

test : N
test =
 transport typFst typFst1
  eqTest (\ X Y z -> z.1) N Bool zero true

test1 : N
test1 =
 transport typFst typFst1
  eqTest (\ X Y z -> z.1) N Bool (suc zero) false

test2 : N
test2 =
 transport typFst1 typFst
  eqTestInv (\ X Y a b -> a) N Bool (zero,true)

-- more test for the equality in U

eqTest2 : Id U typFst typFst
eqTest2 = comp U typFst typFst1 typFst eqTest eqTestInv

eqTest3 : Id U typFst typFst1
eqTest3 = comp U typFst typFst typFst1 eqTest2 eqTest

eqTest4 : Id U typFst typFst
eqTest4 = comp U typFst typFst1 typFst eqTest3 (inv U typFst typFst1 eqTest3)

test4 : N
test4 =
 transport typFst typFst
  eqTest2 (\ X Y z -> z.1) N Bool (suc zero,false)

test5 : N
test5 =
 transport typFst typFst1
  eqTest3 (\ X Y z -> z.1) N Bool (suc zero) false

test6 : N
test6 =
 transport typFst typFst
  eqTest4 (\ X Y z -> z.1) N Bool (suc zero,false)