|
{-# PRIMITIVE Type #-}
|
|
{-# PRIMITIVE Pretype #-}
|
|
|
|
I : Pretype
|
|
{-# PRIMITIVE Interval I #-}
|
|
|
|
i0 : I
|
|
i1 : I
|
|
{-# PRIMITIVE i0 #-}
|
|
{-# PRIMITIVE i1 #-}
|
|
|
|
iand : I -> I -> I
|
|
{-# PRIMITIVE iand #-}
|
|
|
|
ior : I -> I -> I
|
|
{-# PRIMITIVE ior #-}
|
|
|
|
inot : I -> I
|
|
{-# PRIMITIVE inot #-}
|
|
|
|
PathP : (A : I -> Pretype) -> A i0 -> A i1 -> Type
|
|
{-# PRIMITIVE PathP #-}
|
|
|
|
Path : {A : Pretype} -> A -> A -> Type
|
|
Path {A} = PathP (\i -> A)
|
|
|
|
refl : {A : Pretype} {x : A} -> Path x x
|
|
refl {A} {x} i = x
|
|
|
|
sym : {A : I -> Pretype} {x : A i0} {y : A i1} -> PathP A x y -> PathP (\i -> A (inot i)) y x
|
|
sym p i = p (inot i)
|
|
|
|
id : {A : Type} -> A -> A
|
|
id x = x
|
|
|
|
the : (A : Pretype) -> A -> A
|
|
the A x = x
|
|
|
|
iElim : {A : I -> Pretype} {x : A i0} {y : A i1} -> PathP A x y -> (i : I) -> A i
|
|
iElim p i = p i
|
|
|
|
Singl : (A : Type) -> A -> Type
|
|
Singl A x = (y : A) * Path x y
|
|
|
|
isContr : Type -> Type
|
|
isContr A = (x : A) * ((y : A) -> Path x y)
|
|
|
|
singContr : {A : Type} {a : A} -> isContr (Singl A a)
|
|
singContr {A} {a} = ((a, \i -> a), \y i -> (y.2 i, \j -> y.2 (iand i j)))
|
|
|
|
cong : {A : Type} {B : A -> Type} (f : (x : A) -> B x) {x : A} {y : A} (p : Path x y) -> PathP (\i -> B (p i)) (f x) (f y)
|
|
cong f p i = f (p i)
|
|
|
|
congComp : {A : Type} {B : Type} {C : Type}
|
|
{f : A -> B} {g : B -> C} {x : A} {y : A}
|
|
(p : Path x y)
|
|
-> Path (cong g (cong f p)) (cong (\x -> g (f x)) p)
|
|
congComp p = refl
|
|
|
|
congId : {A : Type} {x : A} {y : A}
|
|
(p : Path x y)
|
|
-> Path (cong (id {A}) p) p
|
|
congId p = refl
|
|
|
|
IsOne : I -> Type
|
|
{-# PRIMITIVE IsOne #-}
|
|
|
|
itIs1 : IsOne i1
|
|
{-# PRIMITIVE itIs1 #-}
|
|
|
|
isOneL : {i : I} {j : I} -> IsOne i -> IsOne (ior i j)
|
|
{-# PRIMITIVE isOneL #-}
|
|
|
|
isOneR : {i : I} {j : I} -> IsOne j -> IsOne (ior i j)
|
|
{-# PRIMITIVE isOneR #-}
|
|
|
|
Partial : I -> Type -> Pretype
|
|
{-# PRIMITIVE Partial #-}
|
|
|
|
PartialP : (phi : I) -> Partial phi Type -> Pretype
|
|
{-# PRIMITIVE PartialP #-}
|
|
|
|
Bool : Type
|
|
tt, ff : Bool
|
|
|
|
foo : (i : I) -> (j : I) -> Partial (ior (inot i) (ior i (iand i j))) Bool
|
|
foo i j = \ { (i = i0) -> tt, (i = i1) -> ff, (i = i1) && (j = i1) -> ff }
|
|
|
|
apPartial : {B : Type} {A : Type} -> (phi : I) -> (A -> B) -> Partial phi A -> Partial phi B
|
|
apPartial phi f p is1 = f (p is1)
|