Prototype, extremely bad code implementation of CCHM Cubical Type Theory
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
3.5 KiB

  1. let Id : (A : Type) -> A -> A -> Type = \A x y -> Path (\i -> A) x y in
  2. let the : (A : Type) -> A -> A = \A x -> x in
  3. let
  4. fill : (i : I) (A : I -> Type)
  5. (phi : I) (u : (i : I) -> Partial phi (A i))
  6. -> Sub (A i0) phi (u i0) -> A i
  7. = \i A phi u a0 ->
  8. comp (\j -> A (i && j)) (phi || ~i) (\j -> [ phi -> u (i && j), ~i -> a0 ]) a0
  9. in let
  10. trans : (A : Type) (a b c : A)
  11. -> Path (\i -> A) a b
  12. -> Path (\i -> A) b c
  13. -> Path (\i -> A) a c
  14. = \A a b c p q i ->
  15. comp (\j -> A) (i || ~i)
  16. (\j -> [ ~i -> a, i -> q j ])
  17. (p i)
  18. in
  19. let isContr : Type -> Type
  20. = \A -> (x : A) * (y : A) -> Path (\i -> A) x y in
  21. let fiber : (T A : Type) -> (T -> A) -> A -> Type
  22. = \T A f y -> (x : T) * Path (\i -> A) y (f x) in
  23. let isEquiv : (T A : Type) -> (T -> A) -> Type
  24. = \T A f -> (y : A) -> isContr (fiber T A f y) in
  25. let idFun : (B : Type) -> B -> B = \A x -> x in
  26. let idEquiv : (B : Type) -> isEquiv B B (idFun B)
  27. = \B y -> ((y, \i -> y), \u -> \i -> (u.2 i, \j -> u.2 (i && j))) in
  28. let equiv : (A B : Type) -> Type
  29. = \A B -> (f : A -> B) * isEquiv A B f in
  30. let
  31. univalence : (A B : Type) -> equiv A B -> Path (\i -> Type) A B
  32. = \A B fun i -> Glue B (i || ~i) [~i -> A, i -> B] [~i -> fun, i -> (idFun B, idEquiv B)]
  33. in
  34. let idToEquiv : (A B : Type) -> Path (\i -> Type) A B -> equiv A B
  35. = \A B p -> comp (\i -> equiv A (p i)) i0 (\i -> []) (idFun A,
  36. idEquiv A)
  37. in
  38. let transp : (A B : Type) (p : Path (\i -> Type) A B) -> A -> B = \A B p -> comp (\i -> p i) i0 (\j -> []) in
  39. let
  40. univalenceBeta : (A B : Type) (f : equiv A B)
  41. -> Id (A -> B) (transp A B (univalence A B f)) f.1
  42. = \A B f i a ->
  43. let b : B = transp B B (\i -> B) (f.1 a) in
  44. let rem1 : Id B b (f.1 a) = \i -> fill ~i (\i -> B) i0 (\j -> []) (f.1 a) in
  45. let rem2 : Id B (transp B B (\i -> B) b) b = \i -> fill ~i (\i -> B) i0 (\j -> []) b in
  46. let goal : Id B (transp B B (\i -> B) b) (f.1 a) =
  47. trans B (transp B B (\i -> B) b) b (f.1 a) rem2 rem1
  48. in goal i
  49. in
  50. let not : Bool -> Bool = if (\x -> Bool) ff tt in
  51. let notInv : (b : Bool) -> Id Bool b (not (not b)) = if (\x -> Id Bool x (not (not x))) (\i -> tt) (\i -> ff) in
  52. let trueNotFalse : (A : Type) -> Id Bool tt ff -> A =
  53. \A p -> comp (\i -> if (\b -> Type) (A -> A) A (p i)) i0 (\j -> []) (\x -> x) in
  54. let notEquiv : isEquiv Bool Bool not =
  55. let contract1 : (a : Bool) (b : Path (\i -> Bool) tt (not a)) -> Path (\i -> fiber Bool Bool not tt) (ff, \i -> tt) (a, b)
  56. = \a -> if (\a -> (b : Path (\i -> Bool) tt (not a)) -> Path (\i -> fiber Bool Bool not tt) (ff, \i -> tt) (a, b))
  57. (\b -> trueNotFalse (Path (\i -> fiber Bool Bool not tt) (ff, \i -> tt) (tt, b)) b)
  58. (\b i -> (ff, \j -> b (i && j)))
  59. a in
  60. let contract2 : (a : Bool) (b : Path (\i -> Bool) ff (not a)) -> Path (\i -> fiber Bool Bool not ff) (tt, \i -> ff) (a, b) =
  61. \a -> if (\a -> (b : Path (\i -> Bool) ff (not a)) -> Path (\i -> fiber Bool Bool not ff) (tt, \i -> ff) (a, b))
  62. (\b i -> (tt, \j -> b (i && j)))
  63. (\b -> trueNotFalse (Path (\i -> fiber Bool Bool not ff) (tt, \i -> ff) (ff, b)) (\j -> b ~j))
  64. a in
  65. \b -> if (\b -> isContr (fiber Bool Bool not b))
  66. ((ff, \i -> tt), \fiber -> contract1 fiber.1 fiber.2)
  67. ((tt, \i -> ff), \fiber -> contract2 fiber.1 fiber.2)
  68. b
  69. in the (Id Bool (not ff) tt) (\i -> transp Bool Bool (univalence Bool Bool (not, notEquiv)) ff)