-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMain.hs
183 lines (161 loc) · 5.61 KB
/
Main.hs
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
module Main where
import CompGen
string :: AgdaType
string = Builtin "String" "primStringEquality" "primStringLess"
float :: AgdaType
float = Builtin "Float" "primFloatEquality" "primFloatLess"
char :: AgdaType
char = Builtin "Char" "primCharEquality" "primCharLess"
nat :: AgdaType
nat = Custom "Nat"
[ ("zero", [])
, ("suc", [nat])
]
list :: AgdaType -> AgdaType
list a = Custom ("List " ++ maybeParens (typeName a))
[ ("[]", [])
, ("_∷_", [a, list a])
]
-- postulate Name : Set
-- primQNameEquality : Name → Name → Bool
name :: AgdaType
name = Builtin "Name" "primQNameEquality" "primQNameLess"
-- data Visibility : Set where
-- visible hidden instance′ : Visibility
visibility :: AgdaType
visibility = Custom "Visibility"
[ ("visible", [])
, ("hidden", [])
, ("instance′", [])
]
-- data Relevance : Set where
-- relevant irrelevant : Relevance
relevance :: AgdaType
relevance = Custom "Relevance"
[ ("relevant", [])
, ("irrelevant", [])
]
-- data Abs (A : Set) : Set where
-- abs : (s : String) (x : A) → Abs A
ab :: AgdaType -> AgdaType
ab a = Custom ("Abs " ++ maybeParens (typeName a))
[ ("abs", [string, a])
]
-- data ArgInfo : Set where
-- arg-info : (v : Visibility) (r : Relevance) → ArgInfo
argInfo :: AgdaType
argInfo = Custom "ArgInfo"
[ ("arg-info", [visibility, relevance])
]
-- data Arg (A : Set) : Set where
-- arg : (i : ArgInfo) (x : A) → Arg A
arg :: AgdaType -> AgdaType
arg a = Custom ("Arg " ++ maybeParens (typeName a))
[ ("arg", [argInfo, a])
]
-- postulate Meta : Set
-- primMetaEquality : Meta → Meta → Bool
meta :: AgdaType
meta = Builtin "Meta" "primMetaEquality" "primMetaLess"
-- data Literal : Set where
-- nat : (n : Nat) → Literal
-- float : (x : Float) → Literal
-- char : (c : Char) → Literal
-- string : (s : String) → Literal
-- name : (x : Name) → Literal
-- meta : (x : Meta) → Literal
literal :: AgdaType
literal = Custom "Literal"
[ ("nat", [nat])
, ("float", [float])
, ("char", [char])
, ("string", [string])
, ("name", [name])
, ("meta", [meta])
]
-- data Pattern : Set where
-- con : (c : Name) (ps : List (Arg Pattern)) → Pattern
-- dot : Pattern
-- var : (s : String) → Pattern
-- lit : (l : Literal) → Pattern
-- proj : (f : Name) → Pattern
-- absurd : Pattern
pat :: AgdaType
pat = Custom "Pattern"
[ ("con", [name, list (arg pat)])
, ("dot", [])
, ("var", [string])
, ("lit", [literal])
, ("proj", [name])
, ("absurd", [])
]
-- data Term : Set
-- data Sort : Set
-- data Clause : Set
-- Type = Term
typ :: AgdaType
typ = term
-- data Term where
-- var : (x : Nat) (args : List (Arg Term)) → Term
-- con : (c : Name) (args : List (Arg Term)) → Term
-- def : (f : Name) (args : List (Arg Term)) → Term
-- lam : (v : Visibility) (t : Abs Term) → Term
-- pat-lam : (cs : List Clause) (args : List (Arg Term)) → Term
-- pi : (a : Arg Type) (b : Abs Type) → Term
-- agda-sort : (s : Sort) → Term
-- lit : (l : Literal) → Term
-- meta : (x : Meta) → List (Arg Term) → Term
-- unknown : Term -- Treated as '_' when unquoting.
term :: AgdaType
term = Custom "Term"
[ ("var", [nat, list (arg term)])
, ("con", [name, list (arg term)])
, ("def", [name, list (arg term)])
, ("lam", [visibility, ab term])
, ("pat-lam", [list clause, list (arg term)])
, ("pi", [arg typ, ab typ])
, ("agda-sort", [sort])
, ("lit", [literal])
, ("meta", [meta, list (arg term)])
, ("unknown", [])
]
-- data Sort where
-- set : (t : Term) → Sort -- A Set of a given (possibly neutral) level.
-- lit : (n : Nat) → Sort -- A Set of a given concrete level.
-- unknown : Sort
sort :: AgdaType
sort = Custom "Sort"
[ ("set", [term])
, ("lit", [nat])
, ("unknown", [])
]
-- data Clause where
-- clause : (ps : List (Arg Pattern)) (t : Term) → Clause
-- absurd-clause : (ps : List (Arg Pattern)) → Clause
clause :: AgdaType
clause = Custom "Clause"
[ ("clause", [list (arg pat), term])
, ("absurd-clause", [list (arg pat)])
]
-- data Definition : Set where
-- function : (cs : List Clause) → Definition
-- data-type : (pars : Nat) (cs : List Name) → Definition -- parameters and constructors
-- record-type : (c : Name) → Definition -- name of data/record type
-- data-cons : (d : Name) → Definition -- name of constructor
-- axiom : Definition
-- prim-fun : Definition
definition :: AgdaType
definition = Custom "Definition"
[ ("function", [list clause])
, ("data-type", [nat, list name])
, ("record-type", [name])
, ("data-cons", [name])
, ("axiom", [])
, ("prim-fun", [])
]
main :: IO ()
main = do
let arr = [term]
putStr $ makeEqs arr
putStrLn ""
putStr $ makeLts arr