less prototype, less bad code implementation of CCHM 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.

137 lines
5.0 KiB

  1. {-# OPTIONS_GHC -Wno-orphans #-}
  2. {-# LANGUAGE ViewPatterns #-}
  3. module Syntax.Pretty where
  4. import Control.Arrow (Arrow(first))
  5. import qualified Data.Map.Strict as Map
  6. import qualified Data.Text.Lazy as L
  7. import qualified Data.Text as T
  8. import Data.Map.Strict (Map)
  9. import Data.Text (Text)
  10. import Data.Generics
  11. import Presyntax.Presyntax (Plicity(..))
  12. import Prettyprinter.Render.Terminal
  13. import Prettyprinter
  14. import Syntax
  15. instance Pretty Name where
  16. pretty (Bound x _) = pretty x
  17. pretty (Defined x _) = pretty x
  18. prettyTm :: Term -> Doc AnsiStyle
  19. prettyTm = prettyTm . everywhere (mkT beautify) where
  20. prettyTm (Ref v) =
  21. case T.uncons (getNameText v) of
  22. Just ('.', w) -> keyword (pretty w)
  23. _ -> pretty v
  24. prettyTm (App Im f x) = parenFun f <+> braces (prettyTm x)
  25. prettyTm (App Ex f x) = parenFun f <+> parenArg x
  26. prettyTm (Pair x y) = parens $ prettyTm x <> operator comma <+> prettyTm y
  27. prettyTm (Proj1 x) = prettyTm x <> operator (pretty ".1")
  28. prettyTm (Proj2 x) = prettyTm x <> operator (pretty ".2")
  29. prettyTm l@(Lam _ _ _) = pretty '\\' <> hsep (map prettyArgList al) <+> pretty "->" <+> prettyTm bod where
  30. unwindLam (Lam p x y) = first ((p, x):) (unwindLam y)
  31. unwindLam (PathIntro _ _ _ (Lam p x y)) = first ((p, x):) (unwindLam y)
  32. unwindLam t = ([], t)
  33. (al, bod) = unwindLam l
  34. prettyArgList (Ex, v) = pretty v
  35. prettyArgList (Im, v) = braces (pretty v)
  36. prettyTm (Meta x) = keyword $ pretty '?' <> pretty (mvName x)
  37. prettyTm Type{} = keyword $ pretty "Type"
  38. prettyTm Typeω{} = keyword $ pretty "Typeω"
  39. prettyTm I{} = keyword $ pretty "I"
  40. prettyTm I0{} = keyword $ pretty "i0"
  41. prettyTm I1{} = keyword $ pretty "i1"
  42. prettyTm (Pi Ex (T.unpack . getNameText -> "_") d r) = prettyDom d <+> pretty "->" <+> prettyTm r
  43. prettyTm (Pi Im v d r) = group (braces (pretty v <+> colon <+> prettyTm d)) <> softline <> pretty "->" <+> prettyTm r
  44. prettyTm (Pi Ex v d r) = group (parens (pretty v <+> colon <+> prettyTm d)) <> softline <> pretty "->" <+> prettyTm r
  45. prettyTm (Sigma (T.unpack . getNameText -> "_") d r) = prettyDom d <+> pretty "*" <+> prettyTm r
  46. prettyTm (Sigma v d r) = parens (pretty v <+> colon <+> prettyTm d) <+> pretty "*" <+> prettyTm r
  47. prettyTm (IAnd x y) = parens $ prettyTm x <+> operator (pretty "&&") <+> prettyTm y
  48. prettyTm (IOr x y) = parens $ prettyTm x <+> operator (pretty "||") <+> prettyTm y
  49. prettyTm (INot x) = operator (pretty '~') <> prettyTm x
  50. prettyTm (System xs) = braces (mempty <+> hsep (punctuate comma (map go (Map.toList xs))) <+> mempty) where
  51. go (f, t) = prettyTm f <+> operator (pretty "=>") <+> prettyTm t
  52. prettyTm x = error (show x)
  53. beautify (PathP l x y) = toFun "PathP" [l, x, y]
  54. beautify (IElim _ _ _ f i) = App Ex f i
  55. beautify (PathIntro _ _ _ f) = f
  56. beautify (IsOne phi) = toFun "IsOne" [phi]
  57. beautify ItIsOne = Ref (Bound (T.pack ".1=1") 0)
  58. beautify (IsOne1 phi) = toFun "isOne1" [phi]
  59. beautify (IsOne2 phi) = toFun "isOne2" [phi]
  60. beautify (Partial phi a) = toFun "Partial" [phi, a]
  61. beautify (PartialP phi a) = toFun "PartialP" [phi, a]
  62. beautify (Comp a phi u a0) = toFun "comp" [a, phi, u, a0]
  63. beautify (Sub a phi u) = toFun "Sub" [a, phi, u]
  64. beautify (Inc _ _ u) = toFun "inS" [u]
  65. beautify (Ouc _ phi u0 u) = toFun "outS" [phi, u0, u]
  66. beautify (GlueTy a I1 _ _) = a
  67. beautify (GlueTy a b c d) = toFun "Glue" [a,b,c,d]
  68. beautify (Glue a b c d e f) = toFun "glue" [a,b,c,d,e,f]
  69. beautify (Unglue a b c d e) = toFun "unglue" [a,b,c,d,e]
  70. beautify x = x
  71. toFun s a = foldl (App Ex) (Ref (Bound (T.pack ('.':s)) 0)) a
  72. keyword :: Doc AnsiStyle -> Doc AnsiStyle
  73. keyword = annotate (color Magenta)
  74. operator :: Doc AnsiStyle -> Doc AnsiStyle
  75. operator = annotate (color Yellow)
  76. parenArg :: Term -> Doc AnsiStyle
  77. parenArg x@App{} = parens (prettyTm x)
  78. parenArg x@IElim{} = parens (prettyTm x)
  79. parenArg x@IsOne{} = parens $ prettyTm x
  80. parenArg x@IsOne1{} = parens $ prettyTm x
  81. parenArg x@IsOne2{} = parens $ prettyTm x
  82. parenArg x@Partial{} = parens $ prettyTm x
  83. parenArg x@PartialP{} = parens $ prettyTm x
  84. parenArg x@Sub{} = parens $ prettyTm x
  85. parenArg x@Inc{} = parens $ prettyTm x
  86. parenArg x@Ouc{} = parens $ prettyTm x
  87. parenArg x@Comp{} = parens $ prettyTm x
  88. parenArg x = prettyDom x
  89. prettyDom :: Term -> Doc AnsiStyle
  90. prettyDom x@Pi{} = parens (prettyTm x)
  91. prettyDom x@Sigma{} = parens (prettyTm x)
  92. prettyDom x = parenFun x
  93. parenFun :: Term -> Doc AnsiStyle
  94. parenFun x@Lam{} = parens $ prettyTm x
  95. parenFun x@PathIntro{} = parens $ prettyTm x
  96. parenFun x = prettyTm x
  97. render :: Doc AnsiStyle -> Text
  98. render = L.toStrict . renderLazy . layoutSmart defaultLayoutOptions
  99. showValue :: Value -> String
  100. showValue = L.unpack . renderLazy . layoutSmart defaultLayoutOptions . prettyTm . quote
  101. showFace :: Map Head Bool -> Doc AnsiStyle
  102. showFace = hsep . map go . Map.toList where
  103. go (h, b) = parens $ prettyTm (quote (VNe h mempty)) <+> operator (pretty "=") <+> pretty (if b then "i1" else "i0")