-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathExp_all.tex
336 lines (281 loc) · 12.9 KB
/
Exp_all.tex
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
% generated by Ott 0.33 from: Exp.ott
\documentclass[11pt]{article}
\usepackage{amsmath,amssymb}
\usepackage{supertabular}
\usepackage{geometry}
\usepackage{ifthen}
\usepackage{alltt}%hack
\geometry{a4paper,dvips,twoside,left=22.5mm,right=22.5mm,top=20mm,bottom=30mm}
\usepackage{color}
\newcommand{\ottdrule}[4][]{{\displaystyle\frac{\begin{array}{l}#2\end{array}}{#3}\quad\ottdrulename{#4}}}
\newcommand{\ottusedrule}[1]{\[#1\]}
\newcommand{\ottpremise}[1]{ #1 \\}
\newenvironment{ottdefnblock}[3][]{ \framebox{\mbox{#2}} \quad #3 \\[0pt]}{}
\newenvironment{ottfundefnblock}[3][]{ \framebox{\mbox{#2}} \quad #3 \\[0pt]\begin{displaymath}\begin{array}{l}}{\end{array}\end{displaymath}}
\newcommand{\ottfunclause}[2]{ #1 \equiv #2 \\}
\newcommand{\ottnt}[1]{\mathit{#1}}
\newcommand{\ottmv}[1]{\mathit{#1}}
\newcommand{\ottkw}[1]{\mathbf{#1}}
\newcommand{\ottsym}[1]{#1}
\newcommand{\ottcom}[1]{\text{#1}}
\newcommand{\ottdrulename}[1]{\textsc{#1}}
\newcommand{\ottcomplu}[5]{\overline{#1}^{\,#2\in #3 #4 #5}}
\newcommand{\ottcompu}[3]{\overline{#1}^{\,#2<#3}}
\newcommand{\ottcomp}[2]{\overline{#1}^{\,#2}}
\newcommand{\ottgrammartabular}[1]{\begin{supertabular}{llcllllll}#1\end{supertabular}}
\newcommand{\ottmetavartabular}[1]{\begin{supertabular}{ll}#1\end{supertabular}}
\newcommand{\ottrulehead}[3]{$#1$ & & $#2$ & & & \multicolumn{2}{l}{#3}}
\newcommand{\ottprodline}[6]{& & $#1$ & $#2$ & $#3 #4$ & $#5$ & $#6$}
\newcommand{\ottfirstprodline}[6]{\ottprodline{#1}{#2}{#3}{#4}{#5}{#6}}
\newcommand{\ottlongprodline}[2]{& & $#1$ & \multicolumn{4}{l}{$#2$}}
\newcommand{\ottfirstlongprodline}[2]{\ottlongprodline{#1}{#2}}
\newcommand{\ottbindspecprodline}[6]{\ottprodline{#1}{#2}{#3}{#4}{#5}{#6}}
\newcommand{\ottprodnewline}{\\}
\newcommand{\ottinterrule}{\\[5.0mm]}
\newcommand{\ottafterlastrule}{\\}
\newcommand{\ottmetavars}{
\ottmetavartabular{
$ \text{Term variables} ,\, \ottmv{x} ,\, \ottmv{y} ,\, \ottmv{z} $ & \ottcom{variables} \\
$ \text{Type variables} ,\, \ottmv{a} ,\, \ottmv{b} $ & \ottcom{type variables} \\
$ \text{Integer} ,\, \ottmv{i} $ & \\
}}
\newcommand{\otttyXXmono}{
\ottrulehead{\text{Monotypes} ,\ \tau}{::=}{\ottcom{Monotypes}}\ottprodnewline
\ottfirstprodline{|}{ \texttt{Int} }{}{}{}{}\ottprodnewline
\ottprodline{|}{\ottmv{a}}{}{}{}{}\ottprodnewline
\ottprodline{|}{ \tau_{{\mathrm{1}}} \to \tau_{{\mathrm{2}}} }{}{}{}{}}
\newcommand{\otttyXXrho}{
\ottrulehead{\text{Rho-types} ,\ \rho}{::=}{\ottcom{Rho-types}}\ottprodnewline
\ottfirstprodline{|}{\tau}{}{}{}{}\ottprodnewline
\ottprodline{|}{ ( \rho ) } {\textsf{S}}{}{}{}}
\newcommand{\otttyXXpoly}{
\ottrulehead{\text{Polytypes} ,\ \sigma}{::=}{}\ottprodnewline
\ottfirstprodline{|}{\rho}{}{}{}{}\ottprodnewline
\ottprodline{|}{ \forall \ottmv{a} . \sigma }{}{\textsf{bind}\; \ottmv{a}\; \textsf{in}\; \sigma}{}{}\ottprodnewline
\ottprodline{|}{ \left[ \ottmv{a} \mapsto \tau \right] \sigma } {\textsf{M}}{}{}{}}
\newcommand{\otttm}{
\ottrulehead{\text{Terms} ,\ \ottnt{t} ,\ \ottnt{u}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{\ottmv{i}}{}{}{}{\ottcom{Literal}}\ottprodnewline
\ottprodline{|}{\ottmv{x}}{}{}{}{\ottcom{Variable}}\ottprodnewline
\ottprodline{|}{ \lambda \ottmv{x} . \ottnt{t} }{}{\textsf{bind}\; \ottmv{x}\; \textsf{in}\; \ottnt{t}}{}{\ottcom{Abstraction}}\ottprodnewline
\ottprodline{|}{ \ottnt{t} \; \ottnt{u} }{}{}{}{\ottcom{Application}}\ottprodnewline
\ottprodline{|}{ \lambda ( \ottmv{x} :: \sigma ). \ottnt{t} }{}{\textsf{bind}\; \ottmv{x}\; \textsf{in}\; \ottnt{t}}{}{\ottcom{Typed abstraction}}\ottprodnewline
\ottprodline{|}{ \texttt{let}\; \ottmv{x} = \ottnt{u} \;\texttt{in}\; \ottnt{t} }{}{\textsf{bind}\; \ottmv{x}\; \textsf{in}\; \ottnt{t}}{}{\ottcom{Local binding}}\ottprodnewline
\ottprodline{|}{ \ottnt{t} :: \sigma }{}{}{}{\ottcom{Type annotation}}\ottprodnewline
\ottprodline{|}{ ( \ottnt{t} ) } {\textsf{S}}{}{}{}\ottprodnewline
\ottprodline{|}{ \ottnt{t} \left[ \ottmv{x} \leadsto \ottnt{t'} \right] } {\textsf{M}}{}{}{}}
\newcommand{\ottvalue}{
\ottrulehead{\ottnt{value} ,\ \ottnt{v}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{\ottmv{i}}{}{}{}{}\ottprodnewline
\ottprodline{|}{ \lambda \ottmv{x} . \ottnt{t} }{}{\textsf{bind}\; \ottmv{x}\; \textsf{in}\; \ottnt{t}}{}{}\ottprodnewline
\ottprodline{|}{ \lambda ( \ottmv{x} :: \sigma ). \ottnt{t} }{}{\textsf{bind}\; \ottmv{x}\; \textsf{in}\; \ottnt{t}}{}{}}
\newcommand{\ottctx}{
\ottrulehead{\text{Typing contexts} ,\ \Gamma}{::=}{}\ottprodnewline
\ottfirstprodline{|}{ \epsilon }{}{}{}{\ottcom{empty context}}\ottprodnewline
\ottprodline{|}{\Gamma \ottsym{,} \ottmv{x} \ottsym{:} \sigma}{}{}{}{\ottcom{assumption}}}
\newcommand{\ottfv}{
\ottrulehead{\ottnt{fv}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{\ottnt{fv} \ottsym{(} \ottnt{t} \ottsym{)}} {\textsf{M}}{}{}{}}
\newcommand{\ottftvany}{
\ottrulehead{\ottnt{ftvany}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{ \text{ftv} ( \tau ) } {\textsf{M}}{}{}{}\ottprodnewline
\ottprodline{|}{ \text{ftv} ( \rho ) } {\textsf{M}}{}{}{}\ottprodnewline
\ottprodline{|}{ \text{ftv} ( \sigma ) } {\textsf{M}}{}{}{}\ottprodnewline
\ottprodline{|}{ \text{ftv} ( \Gamma ) } {\textsf{M}}{}{}{}}
\newcommand{\ottterminals}{
\ottrulehead{\ottnt{terminals}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{ \longrightarrow }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \to }{}{}{}{}\ottprodnewline
\ottprodline{|}{ :: }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \text{fv} }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \text{ftv} }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \in }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \not\in }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \vdash }{}{}{}{}}
\newcommand{\ottformula}{
\ottrulehead{\ottnt{formula}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{\ottnt{judgement}}{}{}{}{}\ottprodnewline
\ottprodline{|}{ \mathsf{value}\, \ottnt{v} }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \mathsf{uniq}\, \Gamma }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \mathsf{closed}\, \sigma }{}{}{}{}\ottprodnewline
\ottprodline{|}{ \ottmv{a} \not\in \ottnt{ftvany} }{}{}{}{}\ottprodnewline
\ottprodline{|}{\ottmv{x} \ottsym{:} \sigma \, \in \, \Gamma}{}{}{}{}}
\newcommand{\ottJTyping}{
\ottrulehead{\ottnt{JTyping}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{ \Gamma \vdash \ottnt{t} : \sigma }{}{}{}{}}
\newcommand{\ottJStep}{
\ottrulehead{\ottnt{JStep}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{ \ottnt{t} \longrightarrow \ottnt{u} }{}{}{}{}}
\newcommand{\ottjudgement}{
\ottrulehead{\ottnt{judgement}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{\ottnt{JTyping}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\ottnt{JStep}}{}{}{}{}}
\newcommand{\ottuserXXsyntax}{
\ottrulehead{\ottnt{user\_syntax}}{::=}{}\ottprodnewline
\ottfirstprodline{|}{\text{Term variables}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\text{Type variables}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\text{Integer}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\text{Monotypes}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\text{Rho-types}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\text{Polytypes}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\text{Terms}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\ottnt{value}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\text{Typing contexts}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\ottnt{fv}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\ottnt{ftvany}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\ottnt{terminals}}{}{}{}{}\ottprodnewline
\ottprodline{|}{\ottnt{formula}}{}{}{}{}}
\newcommand{\ottgrammar}{\ottgrammartabular{
\otttyXXmono\ottinterrule
\otttyXXrho\ottinterrule
\otttyXXpoly\ottinterrule
\otttm\ottinterrule
\ottvalue\ottinterrule
\ottctx\ottinterrule
\ottfv\ottinterrule
\ottftvany\ottinterrule
\ottterminals\ottinterrule
\ottformula\ottinterrule
\ottJTyping\ottinterrule
\ottJStep\ottinterrule
\ottjudgement\ottinterrule
\ottuserXXsyntax\ottafterlastrule
}}
% defnss
% defns JTyping
%% defn typing
\newcommand{\ottdruletypXXint}[1]{\ottdrule[#1]{%
}{
\Gamma \vdash \ottmv{i} : \texttt{Int} }{%
{\ottdrulename{typ\_int}}{}%
}}
\newcommand{\ottdruletypXXvar}[1]{\ottdrule[#1]{%
\ottpremise{ \mathsf{uniq}\, \Gamma }%
\ottpremise{\ottmv{x} \ottsym{:} \sigma \, \in \, \Gamma}%
}{
\Gamma \vdash \ottmv{i} : \sigma }{%
{\ottdrulename{typ\_var}}{}%
}}
\newcommand{\ottdruletypXXabs}[1]{\ottdrule[#1]{%
\ottpremise{ \Gamma \ottsym{,} \ottmv{x} \ottsym{:} \tau_{{\mathrm{1}}} \vdash \ottnt{t} : \tau_{{\mathrm{2}}} }%
}{
\Gamma \vdash ( \lambda \ottmv{x} . \ottnt{t} ) : ( \tau_{{\mathrm{1}}} \to \tau_{{\mathrm{2}}} ) }{%
{\ottdrulename{typ\_abs}}{}%
}}
\newcommand{\ottdruletypXXapp}[1]{\ottdrule[#1]{%
\ottpremise{ \Gamma \vdash \ottnt{t} : \tau_{{\mathrm{1}}} \to \tau_{{\mathrm{2}}} }%
\ottpremise{ \Gamma \vdash \ottnt{u} : \tau_{{\mathrm{1}}} }%
}{
\Gamma \vdash \ottnt{t} \; \ottnt{u} : \tau_{{\mathrm{2}}} }{%
{\ottdrulename{typ\_app}}{}%
}}
\newcommand{\ottdruletypXXlet}[1]{\ottdrule[#1]{%
\ottpremise{ \Gamma \vdash \ottnt{u} : \sigma }%
\ottpremise{ \Gamma \ottsym{,} \ottmv{x} \ottsym{:} \sigma \vdash \ottnt{t} : \rho }%
}{
\Gamma \vdash \texttt{let}\; \ottmv{x} = \ottnt{u} \;\texttt{in}\; \ottnt{t} : \rho }{%
{\ottdrulename{typ\_let}}{}%
}}
\newcommand{\ottdruletypXXannot}[1]{\ottdrule[#1]{%
\ottpremise{ \mathsf{closed}\, \sigma }%
\ottpremise{ \Gamma \vdash \ottnt{t} : \sigma }%
}{
\Gamma \vdash ( \ottnt{t} :: \sigma ) : \sigma }{%
{\ottdrulename{typ\_annot}}{}%
}}
\newcommand{\ottdruletypXXgen}[1]{\ottdrule[#1]{%
\ottpremise{ \Gamma \vdash \ottnt{t} : \rho }%
}{
\Gamma \vdash \ottnt{t} : \forall \ottmv{a} . \rho }{%
{\ottdrulename{typ\_gen}}{}%
}}
\newcommand{\ottdruletypXXinst}[1]{\ottdrule[#1]{%
\ottpremise{ \Gamma \vdash \ottnt{t} : \forall \ottmv{a} . \rho }%
}{
\Gamma \vdash \ottnt{t} : \left[ \ottmv{a} \mapsto \tau \right] \rho }{%
{\ottdrulename{typ\_inst}}{}%
}}
\newcommand{\ottdefntyping}[1]{\begin{ottdefnblock}[#1]{$ \Gamma \vdash \ottnt{t} : \sigma $}{}
\ottusedrule{\ottdruletypXXint{}}
\ottusedrule{\ottdruletypXXvar{}}
\ottusedrule{\ottdruletypXXabs{}}
\ottusedrule{\ottdruletypXXapp{}}
\ottusedrule{\ottdruletypXXlet{}}
\ottusedrule{\ottdruletypXXannot{}}
\ottusedrule{\ottdruletypXXgen{}}
\ottusedrule{\ottdruletypXXinst{}}
\end{ottdefnblock}}
\newcommand{\ottdefnsJTyping}{
\ottdefntyping{}}
% defns JStep
%% defn step
\newcommand{\ottdrulestepXXletOne}[1]{\ottdrule[#1]{%
\ottpremise{ \ottnt{u} \longrightarrow \ottnt{u'} }%
}{
\texttt{let}\; \ottmv{x} = \ottnt{u} \;\texttt{in}\; \ottnt{t} \longrightarrow \texttt{let}\; \ottmv{x} = \ottnt{u'} \;\texttt{in}\; \ottnt{t} }{%
{\ottdrulename{step\_let1}}{}%
}}
\newcommand{\ottdrulestepXXlet}[1]{\ottdrule[#1]{%
}{
\texttt{let}\; \ottmv{x} = \ottnt{v} \;\texttt{in}\; \ottnt{t} \longrightarrow \ottnt{t} \left[ \ottmv{x} \leadsto \ottnt{v} \right] }{%
{\ottdrulename{step\_let}}{}%
}}
\newcommand{\ottdrulestepXXappOne}[1]{\ottdrule[#1]{%
\ottpremise{ \ottnt{t} \longrightarrow \ottnt{t'} }%
}{
\ottnt{t} \; \ottnt{u} \longrightarrow \ottnt{t'} \; \ottnt{u} }{%
{\ottdrulename{step\_app1}}{}%
}}
\newcommand{\ottdrulestepXXappTwo}[1]{\ottdrule[#1]{%
\ottpremise{ \ottnt{u} \longrightarrow \ottnt{u'} }%
}{
( \lambda \ottmv{x} . \ottnt{t} ) \; \ottnt{u} \longrightarrow ( \lambda \ottmv{x} . \ottnt{t} ) \; \ottnt{u'} }{%
{\ottdrulename{step\_app2}}{}%
}}
\newcommand{\ottdrulestepXXapp}[1]{\ottdrule[#1]{%
}{
( \lambda \ottmv{x} . \ottnt{t} ) \; \ottnt{v} \longrightarrow \ottnt{t} \left[ \ottmv{x} \leadsto \ottnt{v} \right] }{%
{\ottdrulename{step\_app}}{}%
}}
\newcommand{\ottdrulestepXXannotXXappTwo}[1]{\ottdrule[#1]{%
\ottpremise{ \ottnt{u} \longrightarrow \ottnt{u'} }%
}{
( \lambda ( \ottmv{x} :: \sigma ). \ottnt{t} ) \; \ottnt{u} \longrightarrow ( \lambda ( \ottmv{x} :: \sigma ). \ottnt{t} ) \; \ottnt{u'} }{%
{\ottdrulename{step\_annot\_app2}}{}%
}}
\newcommand{\ottdrulestepXXannotXXapp}[1]{\ottdrule[#1]{%
}{
( \lambda ( \ottmv{x} :: \sigma ). \ottnt{t} ) \; \ottnt{v} \longrightarrow \ottnt{t} \left[ \ottmv{x} \leadsto \ottnt{v} \right] }{%
{\ottdrulename{step\_annot\_app}}{}%
}}
\newcommand{\ottdrulestepXXerase}[1]{\ottdrule[#1]{%
}{
\ottnt{t} :: \sigma \longrightarrow \ottnt{t} }{%
{\ottdrulename{step\_erase}}{}%
}}
\newcommand{\ottdefnstep}[1]{\begin{ottdefnblock}[#1]{$ \ottnt{t} \longrightarrow \ottnt{u} $}{}
\ottusedrule{\ottdrulestepXXletOne{}}
\ottusedrule{\ottdrulestepXXlet{}}
\ottusedrule{\ottdrulestepXXappOne{}}
\ottusedrule{\ottdrulestepXXappTwo{}}
\ottusedrule{\ottdrulestepXXapp{}}
\ottusedrule{\ottdrulestepXXannotXXappTwo{}}
\ottusedrule{\ottdrulestepXXannotXXapp{}}
\ottusedrule{\ottdrulestepXXerase{}}
\end{ottdefnblock}}
\newcommand{\ottdefnsJStep}{
\ottdefnstep{}}
\newcommand{\ottdefnss}{
\ottdefnsJTyping
\ottdefnsJStep
}
\newcommand{\ottall}{\ottmetavars\\[0pt]
\ottgrammar\\[5.0mm]
\ottdefnss}
\begin{document}
\ottall
\begin{verbatim}
Definition rules: 16 good 0 bad
Definition rule clauses: 31 good 0 bad
\end{verbatim}
\end{document}