cubical-0.1.1: 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 (pair a b)
uncurry : (A B C:U) -> (A -> B -> C) -> (and A B) -> C
uncurry A B C g = split
pair a b -> g a b
secCurry : (A B C :U) (f : (and A B) -> C)
-> Id ((and A B) -> C) (uncurry A B C (curry A B C f)) f
secCurry A B C f = funExt (and A B) (\ _ -> C) (uncurry A B C (curry A B C f)) f rem
where
rem : (z:and A B) -> Id C (uncurry A B C (curry A B C f) z) (f z)
rem = split
pair a b -> refl C (f (pair a b))
retCurry : (A B C :U) (g : A -> B -> C)
-> Id (A -> B -> C) (curry A B C (uncurry A B C g)) g
retCurry A B C g = funExt A (\ _ -> B -> C) (curry A B C (uncurry A B C g)) g rem
where
rem : (a:A) -> Id (B -> C) (curry A B C (uncurry A B C g) a) (g a)
rem a = funExt B (\ _ -> C) (curry A B C (uncurry A B C g) a) (g a) rem1
where
rem1 : (b:B) -> Id C (curry A B C (uncurry A B C g) a b) (g a b)
rem1 b = refl C (g a b)
eqCurry : (A B C : U) -> Id U ((and A B) -> C) (A -> B -> C)
eqCurry A B C = isEquivEq ((and A B) -> C) (A -> B -> C) (curry A B C) rem
where
rem : isEquiv ((and A B) -> C) (A -> B -> C) (curry A B C)
rem = gradLemma ((and A B) -> C) (A -> B -> C)
(curry A B C) (uncurry A B C) (retCurry A B C) (secCurry 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 -> (fst X (\ _ -> Y))) N Bool zero true
test1 : N
test1 =
transport typFst typFst1
eqTest (\ X Y -> (fst X (\ _ -> Y))) N Bool (suc zero) false
test2 : N
test2 =
transport typFst1 typFst
eqTestInv (\ X Y a b -> a) N Bool (pair 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 -> (fst X (\ _ -> Y))) N Bool (pair (suc zero) false)
test5 : N
test5 =
transport typFst typFst1
eqTest3 (\ X Y -> (fst X (\ _ -> Y))) N Bool (suc zero) false
test6 : N
test6 =
transport typFst typFst
eqTest4 (\ X Y -> (fst X (\ _ -> Y))) N Bool (pair (suc zero) false)