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.

142 lines
5.2 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 Bool = Ref (Bound (T.pack ".Bool") 0)
  61. beautify Tt = Ref (Bound (T.pack ".true") 0)
  62. beautify Ff = Ref (Bound (T.pack ".false") 0)
  63. beautify (If a b c d) = toFun "if" [a, b, c, d]
  64. beautify (Partial phi a) = toFun "Partial" [phi, a]
  65. beautify (PartialP phi a) = toFun "PartialP" [phi, a]
  66. beautify (Comp a phi u a0) = toFun "comp" [a, phi, u, a0]
  67. beautify (Sub a phi u) = toFun "Sub" [a, phi, u]
  68. beautify (Inc _ _ u) = toFun "inS" [u]
  69. beautify (Ouc _ _ _ u) = toFun "outS" [u]
  70. beautify (GlueTy a I1 _ _) = a
  71. beautify (GlueTy a b c d) = toFun "Glue" [a,b,c,d]
  72. beautify (Glue a b c d e f) = toFun "glue" [a,b,c,d,e,f]
  73. beautify (Unglue a b c d e) = toFun "unglue" [a,b,c,d,e]
  74. beautify x = x
  75. toFun s a = foldl (App Ex) (Ref (Bound (T.pack ('.':s)) 0)) a
  76. keyword :: Doc AnsiStyle -> Doc AnsiStyle
  77. keyword = annotate (color Magenta)
  78. operator :: Doc AnsiStyle -> Doc AnsiStyle
  79. operator = annotate (color Yellow)
  80. parenArg :: Term -> Doc AnsiStyle
  81. parenArg x@App{} = parens (prettyTm x)
  82. parenArg x@IElim{} = parens (prettyTm x)
  83. parenArg x@IsOne{} = parens $ prettyTm x
  84. parenArg x@IsOne1{} = parens $ prettyTm x
  85. parenArg x@IsOne2{} = parens $ prettyTm x
  86. parenArg x@Partial{} = parens $ prettyTm x
  87. parenArg x@PartialP{} = parens $ prettyTm x
  88. parenArg x@Sub{} = parens $ prettyTm x
  89. parenArg x@Inc{} = parens $ prettyTm x
  90. parenArg x@Ouc{} = parens $ prettyTm x
  91. parenArg x@Comp{} = parens $ prettyTm x
  92. parenArg x = prettyDom x
  93. prettyDom :: Term -> Doc AnsiStyle
  94. prettyDom x@Pi{} = parens (prettyTm x)
  95. prettyDom x@Sigma{} = parens (prettyTm x)
  96. prettyDom x = parenFun x
  97. parenFun :: Term -> Doc AnsiStyle
  98. parenFun x@Lam{} = parens $ prettyTm x
  99. parenFun x@PathIntro{} = parens $ prettyTm x
  100. parenFun x = prettyTm x
  101. render :: Doc AnsiStyle -> Text
  102. render = L.toStrict . renderLazy . layoutSmart defaultLayoutOptions
  103. showValue :: Value -> String
  104. showValue = L.unpack . renderLazy . layoutSmart defaultLayoutOptions . prettyTm . quote
  105. showFace :: Map Head Bool -> Doc AnsiStyle
  106. showFace = hsep . map go . Map.toList where
  107. go (h, b) = parens $ prettyTm (quote (VNe h mempty)) <+> operator (pretty "=") <+> pretty (if b then "i1" else "i0")