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.

128 lines
4.9 KiB

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