{-# 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) 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)))