-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrules.tex
342 lines (249 loc) · 12.3 KB
/
rules.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
337
338
339
340
341
342
% !TEX root=main.tex
%% Typing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newrule{T-Sym}
{s:\beta \in \Gamma}
{\Gamma,\Sigma \infers s:\tau}
{}
%% Evaluation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newmacro{RelationSE}
{\sime,\sims \simeval \overline{\simv,\sims',\highlight{\phi}}}
\newrule{SE-Value}
{}
{\simv,\sims\simeval \simv,\highlight{\sims,\True}}
{}
\newrule{SE-App}
{\sime_1,\sims\simeval \overline{\lambda x:\tau.\sime_1',\sims',\highlight{\phi_1}}\Quad
\sime_2,\sims'\simeval \overline{\simv_2,\sims'',\highlight{\phi_2}}
\sime_1'[x\mapsto \simv_2],\sims''\simeval \overline{\simv_1,\sims''',{\phi_3}}}
{\sime_1 \sime_2,\sims \simeval \overline{\simv_1,\sims''',\highlight{\phi_1\land\phi_2\land\phi_3}}}
{}
\newrule{SE-If}
{\sime_1,\sims\simeval \overline{\simv_1,\sims',\highlight{\phi_1}} \Quad
\highlight{\sime_2,\sims'\simeval \overline{\simv_2,\sims'',\phi_2}} \Quad
\highlight{\sime_3,\sims'\simeval \overline{\simv_3,\sims''',\phi_3}}}
{\If{\sime_1}{\sime_2}{\sime_3},\sims\simeval \highlight{\overline{\simv_2,\sims'',\phi_1 \land \phi_2\land \simv_1} \cup \overline{\simv_3,\sims''',\phi_1 \land \phi_3 \land \lnot \simv_1}}}
{}
\newrule{SE-Pair}
{\upon{\sime_1,\sims\simeval \overline{\simv_1,\sims',\highlight{\phi_1}}}
{\sime_2,\sims'\simeval \overline{\simv_2,\sims'',\highlight{\phi_2}}}}
{\tuple{\sime_1,\sime_2},\sims\simeval\overline{\tuple{\simv_1,\simv_2},\sims'',\highlight{\phi_1\land\phi_2}}}
{}
\newrule{SE-First}
{\sime,\sims\simeval\overline{\tuple{\simv_1,\simv_2},\sims',\highlight{\phi}}}
{\Fst \sime,\sims\simeval\overline{\simv_1,\sims',\highlight{\phi}} }
{}
\newrule{SE-Second}
{\sime,\sims\simeval\overline{\tuple{\simv_1,\simv_2},\sims',\highlight{\phi}}}
{\Snd\sime,\sims\simeval\overline{\simv_2,\sims',\highlight{\phi}} }
{}
%%%%%%%
\newrule{SE-Cons}
{\sime_1,\sims \simeval \simv_1,\sims',\highlight{\phi_1}
\sime_2,\sims' \simeval \simv_2,\sims'',\highlight{\phi_2}}
{\sime_1 :: \sime_2,\sims \simeval \simv_1:: \simv_2,\sims'',\highlight{\phi_1\land\phi_2}}
{}
\newrule{SE-Head}
{\sime,\sims \simeval \simv_1::\simv_2,\sims',\highlight{\phi}}
{\Head \sime,\sims \simeval \simv_1,\sims',\highlight{\phi}}
{}
\newrule{SE-Tail}
{\sime,\sims \simeval \simv_1::\simv_2,\sims',\highlight{\phi}}
{\Tail \sime,\sims \simeval \simv_2,\sims',\highlight{\phi}}
{}
%%%%%
\newrule{SE-Ref}
{\sime,\sims\simeval \overline{\simv,\sims',\highlight{\phi}}\Quad
l\not\in Dom(\sigma')}
{\Ref \sime,\sims\simeval \overline{l,\sims'[l\mapsto \simv],\highlight{\phi}}}
{}
\newrule{SE-Deref}
{\sime,\sims\simeval \overline{l,\sims',\highlight{\phi}}}
{!\sime,\sims\simeval \overline{\sims'(l),\sims',\highlight{\phi}}}
{}
\newrule{SE-Assign}
{\sime_1,\sims\simeval \overline{l,\sims',\highlight{\phi_1}} \Quad
\sime_2,\sims'\simeval \overline{\simv_2,\sims'',\highlight{\phi_2}}}
{\sime_1:=\sime_2,\sims\simeval \overline{\unit,\sims''[l\mapsto \simv_2],\highlight{\phi_1\wedge\phi_2}}}
{}
\newrule{SE-Edit}
{\sime,\sims \simeval \overline{\simv,\sims',\highlight{\phi}}}
{\Edit \sime , \sims\simeval \overline{\Edit \simv,\sims',\highlight{\phi}}}
{}
\newrule{SE-Update}
{\sime,\sims\simeval \overline{l,\sims',\highlight{\phi}}}
{\Update \sime ,\sims\simeval \overline{\Update l,\sims',\highlight{\phi}}}
{}
\newrule{SE-Fail}
{}
{\Fail,\sims \simeval \Fail,\sims,\highlight{\True}}
{}
\newrule{SE-Then}
{\sime_1 ,\sims\simeval \overline{\simt_1,\sims',\highlight{\phi}}}
{\sime_1 \Then \sime_2,\sims \simeval \overline{\simt_1 \Then \sime_2,\sims',\highlight{\phi}}}
{}
\newrule{SE-Next}
{\sime_1 ,\sims\simeval \overline{\simt_1,\sims',\highlight{\phi}}}
{\sime_1 \Next \sime_2 ,\sims\simeval \overline{\simt_1 \Next \sime_2,\sims',\highlight{\phi}}}
{}
\newrule{SE-And}
{\sime_1 ,\sims\simeval \overline{\simt_1 ,\sims',\highlight{\phi_1}} \Quad
\sime_2 ,\sims'\simeval \overline{\simt_2,\sims'',\highlight{\phi_2}}}
{\sime_1 \And \sime_2 ,\sims\simeval \overline{\simt_1 \And \simt_2,\sims'',\highlight{\phi_1\land\phi_2}}}
{}
\newrule{SE-Or}
{\sime_1 ,\sims\simeval \overline{\simt_1 ,\sims',\highlight{\phi_1}} \Quad
\sime_2 ,\sims'\simeval \overline{\simt_2,\sims'',\highlight{\phi_2}}}
{\sime_1 \Or \sime_2 ,\sims\simeval \overline{\simt_1 \Or \simt_2,\sims'',\highlight{\phi_1\land\phi_2}}}
{}
%% Normalisation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newmacro{RelationSS}
{\simt,\sims\simstride \overline{\simt',\sims',\highlight{\phi}}}
\newrule{SS-Edit}
{ }
{\Edit \simv,\sims \simstride \Edit \simv,\sims,\highlight{\True}}
{}
\newrule{SS-Fill}
{ }
{\Enter \beta,\sims \simstride \Enter \beta,\sims,\highlight{\True}}
{}
\newrule{SS-Update}
{ }
{\Update l,\sims \simstride \Update l,\sims,\highlight{\True}}
{}
\newrule{SS-Fail}
{ }
{\Fail,\sims \simstride \Fail,\sims,\highlight{\True}}
{}
\newrule{SS-ThenStay}
{\simt_1,\sims \simstride \overline{\simt_1',\sims',\highlight{\phi}}}
{\simt_1 \Then \sime_2,\sims \simstride \overline{\simt_1' \Then \sime_2,\sims',\highlight{\phi}}}
{{\Value\ (\simt_1',\sims') = \bot}}
\newrule{SS-ThenFail}
{\simt_1,\sims \simstride \overline{\simt_1',\sims',\highlight{\phi}} \Quad
\sime_2\ \simv_1,\sims' \simeval \overline{\simt_2,\sims'',\highlight{\_}}}
{\simt_1 \Then \sime_2,\sims \simstride \overline{\simt_1' \Then \sime_2,\sims',\highlight{\phi}}}
{\Value\ (\simt_1',\sims') = \simv_1 \land \Failing\ (\simt_2,\sims'')}
\newrule{SS-ThenCont}
{\simt_1,\sims \simstride \overline{\simt_1',\sims',\highlight{\phi_1}} \Quad
\sime_2\ \simv_1,\sims' \simeval \overline{\simt_2 ,\sims'',\highlight{\phi_2}}}
% t_2,\sigma'' \stride t_2',\sigma'''}
{\simt_1 \Then \sime_2,\sims \simstride \overline{t_2,\sigma'',\highlight{\phi_1\land\phi_2}}}
{\Value\ (\simt_1',\sims') = \simv_1 \land \lnot\Failing\ (\simt_2,\sims'')}
\newrule{SS-Next}
{\simt_1,\sims \simstride \overline{\simt_1',\sims',\highlight{\phi}}}
{\simt_1 \Next \sime_2,\sims \simstride \overline{\simt_1' \Next \sime_2,\sims',\highlight{\phi}}}
{}
\newrule{SS-And}
{\simt_1,\sims \simstride \overline{\simt_1',\sims',\highlight{\phi_1 }} \Quad
\simt_2,\sims' \simstride \overline{\simt_2',\sims'',\highlight{\phi_2}}}
{\simt_1 \And \simt_2,\sims \simstride \overline{\simt_1' \And \simt_2',\sims'',\highlight{\phi_1\land\phi_2}}}
{}
\newrule{SS-OrLeft}
{\simt_1,\sims \simstride \overline{\simt_1',\sims',\highlight{\phi}}}
{\simt_1 \Or \simt_2,\sims \simstride \overline{\simt_1',\sims',\highlight{\phi}}}
{{\Value\ (\simt_1',\sims') = \simv_1}}
\newrule{SS-OrRight}
{\simt_1,\sims \simstride \overline{\simt_1',\sims',\highlight{\phi_1}} \Quad
\simt_2,\sims' \simstride \overline{\simt_2',\sims'',\highlight{\phi_2}}}
{\simt_1 \Or \simt_2,\sims \simstride \overline{\simt_2',\sims'',\highlight{\phi_1\land\phi_2}}}
{\Value\ (\simt_1',\sims') = \bot\land \Value\ (\simt_2',\sims'') = \simv_2}
\newrule{SS-OrNone}
{\simt_1,\sims \simstride \overline{\simt_1',\sims' ,\highlight{\phi_1}} \Quad
\simt_2,\sims' \simstride \overline{\simt_2',\sims'',\highlight{\phi_2}}}
{\simt_1 \Or \simt_2,\sims \simstride \overline{\simt_1' \Or \simt_2',\sims'',\highlight{\phi_1\land\phi_2}}}
{\Value\ (\simt_1',\sims') = \bot \land \Value\ (\simt_2',\sims'') = \bot}
\newrule{SS-Xor}
{\ }
{\sime_1 \Xor \sime_2,\sims \simstride \sime_1 \Xor \sime_2,\sims,\highlight{\True}}
{}
%% Normalisation %%
\newmacro{RelationSN}
{\sime,\sims \simnormalise \overline{\simt,\sims',\highlight{\phi}}}
\newrule{SN-Done}
{\sime,\sims \simeval \overline{\simt,\sims',\highlight{\phi_1}} \Quad
\simt,\sims' \simstride \overline{\simt',\sims'',\highlight{\phi_2}}}
{\sime,\sims \simnormalise \overline{\simt,\sims',\highlight{\phi_1\land\phi_2}}}
{\sims'=\sims'' \land \simt=\simt'}
\newrule{SN-Repeat}
{\upon{\sime,\sims \simeval \overline{\simt,\sims',\highlight{\phi_1}}}
{{\simt,\sims' \simstride \overline{\simt',\sims'',\highlight{\phi_2}}}
{\simt',\sims'' \simnormalise \overline{\simt'',\sims''',\highlight{\phi_3}}}}}
{\sime,\sims \simnormalise \overline{\simt'',\sims''',\highlight{\phi_1 \land \phi_2 \land \phi_3}}}
{\sims'\neq \sims''\vee \simt\neq \simt'}
%% Handling %%
\newmacro{RelationSH}
{\simt,\sims \simhandle \overline{\simt',\sims',\highlight{\simi,\phi}}}
\newrule{SH-Change}
{ \text{fresh }s}
{\Edit \simv,\sims \simhandle \Edit s,\sims,\highlight{s,\True}}
{\simv,s:\beta}
\newrule{SH-Fill}
{ \text{fresh }s \Quad
s:\beta}
{\Enter \beta,\sims \simhandle \Edit s,\sims,\highlight{s,\True}}
{}
\newrule{SH-Update}
{ \text{fresh }s \Quad
\sims(l),s:\beta}
{\Update l,\sims \simhandle \Update l,\sims[l \mapsto s],\highlight{s,\True}}
{}
\newrule{SH-PassThen}
{\simt_1,\sims \simhandle \overline{\simt_1',\sims',\simi,\phi}}
{\simt_1 \Then \sime_2,\sims \simhandle \overline{\simt_1' \Then \sime_2,\sims',\highlight{\simi,\phi}}}
{}
\newrule{SH-PassNext}
{\simt_1,\sims \simhandle \overline{\simt_1',\sims',\simi,\phi} \Quad
\Value\ {(\simt_1',\sims')} = \bot}
{\simt_1 \Next \sime_2,\sims \simhandle \overline{\simt_1' \Next \sime_2,\sims',\highlight{\simi,\phi}}}
{}
\newrule{SH-PassNextFail}
{\upon{
\simt_1,\sims \simhandle \overline{\simt_1',\sims_1,\simi,\phi} \Quad
\Value\ {(\simt_1',\sims_1)} = \simv_1 }
{\sime_2\ \simv_1,\sims_1 \simnormalise \overline{\simt_2,\sims_2,{\vphantom{i}\_}} \Quad
\Failing\ (\simt_2,\sims_2)}}
{\simt_1 \Next \sime_2,\sims \simhandle \overline{\simt_1' \Next \sime_2,\sims_1,\simi,\phi}}
{}
\newrule{SH-Next}
{\simt_1,\sims \simhandle \overline{\simt_1',\sims_1,\highlight{\simi,\phi_1}} \Quad
\sime_2\ \simv_1,\sims_1 \simnormalise \overline{\simt_2,\sims_2,\highlight{\phi_2}}}
{\simt_1 \Next \sime_2,\sims \simhandle\highlight{\overline{\simt_1' \Next \sime_2,\sims_1,\simi,\phi_1} \cup\overline{\simt_2,\sims_2,\Continue,\phi_2}}}
{\Value\ {(\simt_1',\sims_1)} = \simv_1\land \neg\Failing\ (\simt_2,\sims_2)}
\newrule{SH-And}
{\simt_1,\sims \simhandle \overline{\simt_1',\sims_1,\highlight{\simi_1,\phi_1}} \Quad
\simt_2,\sims \simhandle \overline{\simt_2',\sims_2,\highlight{\simi_2,\phi_2}}}
{\simt_1 \And \simt_2,\sims \simhandle \highlight{\overline{\simt_1' \And \simt_2,\sims_1,\First \simi_1,\phi_1}\cup \overline{\simt_1 \And \simt_2',\sims_2,\Second \simi_2,\phi_2}}}
{}
\newrule{SH-Or}
{\simt_1,\sims \simhandle \overline{\simt_1',\sims_1,\highlight{\simi_1,\phi_1}}\Quad
\simt_2,\sims \simhandle \overline{\simt_2',\sims_2,\highlight{\simi_2,\phi_2}}}
{\simt_1 \Or \simt_2,\sims \simhandle \highlight{\overline{\simt_1' \Or \simt_2,\sims_1,\First \simi_1,\phi_1}\cup\overline{\simt_1 \Or \simt_2',\sims_2,\Second \simi_2,\phi_2}}}
{}
\newrule{SH-PickLeft}
{\sime_1,\sims\simnormalise \overline{\simt_1,\sims_1,\highlight{\phi_1}} \Quad
\sime_2,\sims \simnormalise \overline{\simt_2,\sims_2,\highlight{\phi_2}}}
{\sime_1 \Xor \sime_2,\sims \simhandle \simt_1,\sims_1,\highlight{\Left,\phi_1}}
{\neg\Failing\ (\simt_1,\sims_1)\land \Failing\ (\simt_2,\sims_2) }
\newrule{SH-PickRight}
{\sime_1,\sims \simnormalise \overline{\simt_1,\sims_1,\highlight{\phi_1}} \Quad
\sime_2,\sims \simnormalise \overline{\simt_2,\sims_2,\highlight{\phi_2}}}
{\sime_1 \Xor \sime_2,\sims \simhandle \simt_2,\sims_2,\highlight{\Right,\phi_2}}
{\Failing\ (\simt_1,\sims_1)\land \neg\Failing\ (\simt_2,\sims_2)}
\newrule{SH-Pick}
{\sime_1,\sims \simnormalise \overline{\simt_1,\sims_1,\highlight{\phi_1}} \Quad
\sime_2,\sims \simnormalise \overline{\simt_2,\sims_2,\highlight{\phi_2}}}
{\sime_1 \Xor \sime_2,\sims \simhandle \highlight{\overline{\simt_1,\sims_1,\Left,\phi_1}\cup\overline{\simt_2,\sims_2,\Right,\phi_2}}}
{ \neg\Failing\ (\simt_1,\sims_1)\land \neg\Failing\ (\simt_2,\sims_2) }
%% Driving %%
\newmacro{RelationSI}
{\simt,\sims \siminteract \overline{\simt',\sims',\highlight{\simi,\phi}}}
\newrule{SI-Handle}
{\simt,\sims \simhandle \overline{\simt',\sims',\highlight{\simi,\phi_1}} \Quad
\simt',\sims' \simnormalise \overline{\simt'',\sims'',\highlight{\phi_2}}}
{\simt,\sims \siminteract \overline{\simt'',\sims'',\highlight{\simi,\phi_1 \land \phi_2}}}
{}
%% Firsts %%
\newrule{R-Firsts}
{t,\sigma\simulate\overline{\simv,\simi:\tilde{is},\Phi}}
{\Firsts(t,\sigma,g) = \overline{\simi,\Phi\land g \simv}}
{\Sat(\Phi\land g\simv)}