summaryrefslogtreecommitdiff
path: root/src/Obs/Syntax.idr
blob: a141d28c1a6126cafafb5599f309dffbadef0b2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
||| Raw syntax for terms. This is before eliminating names.
module Obs.Syntax

import Obs.Pretty
import Obs.Universe

import Text.Bounded

%default total

-- Definition ------------------------------------------------------------------

public export
data Syntax : Type where
  Var : (var : String) -> Syntax
  -- Universes
  Universe : (s : Universe) -> Syntax
  -- Dependent Products
  Pi : (var : WithBounds String) -> (domain, codomain : WithBounds Syntax) -> Syntax
  Lambda : (var : WithBounds String) -> (body : WithBounds Syntax) -> Syntax
  App : (fun, arg : WithBounds Syntax) -> Syntax
  -- Dependent Sums
  Sigma : (var : WithBounds String) -> (index, element : WithBounds Syntax) -> Syntax
  Pair : (first, second : WithBounds Syntax) -> Syntax
  First : (arg : WithBounds Syntax) -> Syntax
  Second : (arg : WithBounds Syntax) -> Syntax
  -- Booleans
  Bool : Syntax
  True : Syntax
  False : Syntax
  If : (var : WithBounds String) ->
    (returnType, discriminant, true, false : WithBounds Syntax) ->
    Syntax
  -- True
  Top : Syntax
  Point : Syntax
  -- False
  Bottom : Syntax
  Absurd : (contradiction : WithBounds Syntax) -> Syntax
  -- Equality
  Equal : (left, right : WithBounds Syntax) -> Syntax
  Refl : (value : WithBounds Syntax) -> Syntax
  Transp : (indexedType, oldIndex, value, newIndex, equality : WithBounds Syntax) -> Syntax
  Cast : (oldType, newType, equality, value : WithBounds Syntax) -> Syntax
  CastId : (value : WithBounds Syntax) -> Syntax

public export
record Definition where
  constructor MkDefinition
  name   : WithBounds String
  ty     : WithBounds Syntax
  tm     : WithBounds Syntax

-- Pretty Print ----------------------------------------------------------------

prettyPrecBounds : Prec -> WithBounds Syntax -> Doc ann

prettyPrec : Prec -> Syntax -> Doc ann
prettyPrec d (Var {var}) = pretty var
prettyPrec d (Universe {s}) = prettyPrec d s
prettyPrec d (Pi {var, domain, codomain}) =
  prettyDeclForm d var.val (prettyPrecBounds Open domain) "->" (prettyPrecBounds Open codomain)
prettyPrec d (Lambda {var, body}) = prettyLambda d var.val (prettyPrecBounds Open body)
prettyPrec d (App {fun, arg}) = prettyApp d (prettyPrecBounds Open fun) [prettyPrecBounds App arg]
prettyPrec d (Sigma {var, index, element}) =
  prettyDeclForm d var.val (prettyPrecBounds Open index) "**" (prettyPrecBounds Open element)
prettyPrec d (Pair {first, second}) =
  prettyPair (prettyPrecBounds Open first) (prettyPrecBounds Open second)
prettyPrec d (First {arg}) = prettyApp d (pretty "fst") [prettyPrecBounds App arg]
prettyPrec d (Second {arg}) = prettyApp d (pretty "snd") [prettyPrecBounds App arg]
prettyPrec d Bool = pretty "Bool"
prettyPrec d True = pretty "True"
prettyPrec d False = pretty "False"
prettyPrec d (If {var, returnType, discriminant, true, false}) =
  prettyApp d (pretty "if") $
  [ prettyLambda App var.val (prettyPrecBounds Open returnType)
  , prettyPrecBounds App discriminant
  , prettyPrecBounds App true
  , prettyPrecBounds App false
  ]
prettyPrec d Top = pretty "()"
prettyPrec d Point = pretty "tt"
prettyPrec d Bottom = pretty "Void"
prettyPrec d (Absurd {contradiction}) =
  prettyApp d (pretty "absurd") [prettyPrecBounds App contradiction]
prettyPrec d (Equal {left, right}) =
  prettyEqual d (prettyPrecBounds Equal left) (prettyPrecBounds Equal right)
prettyPrec d (Refl {value}) = prettyApp d (pretty "refl") [prettyPrecBounds App value]
prettyPrec d (Transp {indexedType, oldIndex, value, newIndex, equality}) =
  prettyApp d (pretty "transp") $
  [ prettyPrecBounds App indexedType
  , prettyPrecBounds App oldIndex
  , prettyPrecBounds App value
  , prettyPrecBounds App newIndex
  , prettyPrecBounds App equality
  ]
prettyPrec d (Cast {oldType, newType, equality, value}) =
  prettyApp d (pretty "cast") $
  [ prettyPrecBounds App oldType
  , prettyPrecBounds App newType
  , prettyPrecBounds App equality
  , prettyPrecBounds App value
  ]
prettyPrec d (CastId {value}) = prettyApp d (pretty "castRefl") [prettyPrecBounds App value]

prettyPrecBounds d (MkBounded val _ _) = prettyPrec d val

export
Pretty Syntax where
  prettyPrec = Syntax.prettyPrec

export
Pretty Definition where
  pretty def = group $
    pretty def.name.val <++> colon <+> softline <+> pretty def.ty.val <+> hardline <+>
    pretty def.name.val <++> equals <+> softline <+> pretty def.tm.val