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.

109 lines
4.1 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) = pretty v
  19. prettyTm (App Im f x) = parenFun f <+> braces (prettyTm x)
  20. prettyTm (App Ex f x) = parenFun f <+> parenArg x
  21. prettyTm (Pair x y) = parens $ prettyTm x <> operator comma <+> prettyTm y
  22. prettyTm (Proj1 x) = prettyTm x <> operator (pretty ".1")
  23. prettyTm (Proj2 x) = prettyTm x <> operator (pretty ".2")
  24. prettyTm l@(Lam _ _ _) = pretty '\\' <> hsep (map prettyArgList al) <+> pretty "->" <+> prettyTm bod where
  25. unwindLam (Lam p x y) = first ((p, x):) (unwindLam y)
  26. unwindLam (PathIntro _ (Lam p x y)) = first ((p, x):) (unwindLam y)
  27. unwindLam t = ([], t)
  28. (al, bod) = unwindLam l
  29. prettyArgList (Ex, v) = pretty v
  30. prettyArgList (Im, v) = braces (pretty v)
  31. prettyTm (Meta x) = keyword $ pretty '?' <> pretty (mvName x)
  32. prettyTm Type{} = keyword $ pretty "Type"
  33. prettyTm Typeω{} = keyword $ pretty "Typeω"
  34. prettyTm I{} = keyword $ pretty "I"
  35. prettyTm I0{} = keyword $ pretty "i0"
  36. prettyTm I1{} = keyword $ pretty "i1"
  37. prettyTm (Pi Ex (T.unpack -> "_") d r) = prettyDom d <+> pretty "->" <+> prettyTm r
  38. prettyTm (Pi Im v d r) = braces (pretty v <+> colon <+> prettyTm d) <+> pretty "->" <+> prettyTm r
  39. prettyTm (Pi Ex v d r) = parens (pretty v <+> colon <+> prettyTm d) <+> pretty "->" <+> prettyTm r
  40. prettyTm (Sigma (T.unpack -> "_") d r) = prettyDom d <+> pretty "*" <+> prettyTm r
  41. prettyTm (Sigma v d r) = parens (pretty v <+> colon <+> prettyTm d) <+> pretty "*" <+> prettyTm r
  42. prettyTm (IAnd x y) = parens $ prettyTm x <+> operator (pretty "&&") <+> prettyTm y
  43. prettyTm (IOr x y) = parens $ prettyTm x <+> operator (pretty "||") <+> prettyTm y
  44. prettyTm (INot x) = operator (pretty '~') <> prettyTm x
  45. prettyTm (PathP l x y) = keyword (pretty "PathP") <+> parenArg l <+> parenArg x <+> parenArg y
  46. prettyTm (IElim _ _ _ f i) = prettyTm (App Ex f i)
  47. prettyTm (PathIntro _ f) = prettyTm f
  48. prettyTm (IsOne phi) = brackets (prettyTm phi)
  49. prettyTm ItIsOne = keyword (pretty "1=1")
  50. prettyTm (IsOne1 phi) = prettyTm (App Ex (Ref (Bound (T.pack "isOne1"))) phi)
  51. prettyTm (IsOne2 phi) = prettyTm (App Ex (Ref (Bound (T.pack "isOne2"))) phi)
  52. prettyTm (Partial phi a) = prettyTm $ foldl (App Ex) (Ref (Bound (T.pack "Partial"))) [phi, a]
  53. prettyTm (PartialP phi a) = prettyTm $ foldl (App Ex) (Ref (Bound (T.pack "PartialP"))) [phi, a]
  54. prettyTm (System xs) = braces (mempty <+> hsep (punctuate comma (map go (Map.toList xs))) <+> mempty) where
  55. go (f, t) = prettyTm f <+> operator (pretty "=>") <+> prettyTm t
  56. keyword :: Doc AnsiStyle -> Doc AnsiStyle
  57. keyword = annotate (color Magenta)
  58. operator :: Doc AnsiStyle -> Doc AnsiStyle
  59. operator = annotate (color Yellow)
  60. parenArg :: Term -> Doc AnsiStyle
  61. parenArg x@App{} = parens (prettyTm x)
  62. parenArg x@IElim{} = parens (prettyTm x)
  63. parenArg x@IsOne1{} = parens $ prettyTm x
  64. parenArg x@IsOne2{} = parens $ prettyTm x
  65. parenArg x@Partial{} = parens $ prettyTm x
  66. parenArg x@PartialP{} = parens $ prettyTm x
  67. parenArg x = prettyDom x
  68. prettyDom :: Term -> Doc AnsiStyle
  69. prettyDom x@Pi{} = parens (prettyTm x)
  70. prettyDom x@Sigma{} = parens (prettyTm x)
  71. prettyDom x = parenFun x
  72. parenFun :: Term -> Doc AnsiStyle
  73. parenFun x@Lam{} = parens $ prettyTm x
  74. parenFun x@PathIntro{} = parens $ prettyTm x
  75. parenFun x = prettyTm x
  76. render :: Doc AnsiStyle -> Text
  77. render = L.toStrict . renderLazy . layoutPretty defaultLayoutOptions
  78. showValue :: Value -> String
  79. showValue = L.unpack . renderLazy . layoutPretty defaultLayoutOptions . prettyTm . quote
  80. showFace :: Map Head Bool -> Doc AnsiStyle
  81. showFace = hsep . map go . Map.toList where
  82. go (h, b) = parens $ prettyTm (quote (VNe h mempty)) <+> operator (pretty "=") <+> pretty (if b then "i1" else "i0")