-
Notifications
You must be signed in to change notification settings - Fork 87
/
Copy pathbigStepScript.sml
551 lines (466 loc) · 16.4 KB
/
bigStepScript.sml
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
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
(*
A clocked relational big-step semantics for CakeML. This semantics
is no longer used in the CakeML development.
*)
open HolKernel Parse boolLib bossLib;
open namespaceTheory astTheory ffiTheory semanticPrimitivesTheory smallStepTheory;
val _ = numLib.temp_prefer_num();
val _ = new_theory "bigStep"
(* To get the definition of expression divergence to use in defining definition
* divergence *)
(* getOpClass as a inductive to make the proofs potentially easier *)
Inductive opClass:
(∀ op. opClass (Chopb op) Simple) ∧
(∀ op. opClass (Opn op) Simple) ∧
(∀ op. opClass (Opb op) Simple) ∧
(∀ op. opClass (FFI op) Simple) ∧
(∀ op. opClass (WordFromInt op) Simple) ∧
(∀ op. opClass (WordToInt op) Simple) ∧
(∀ op1 op2. opClass (Opw op1 op2) Simple) ∧
(∀ op1 op2 op3. opClass (Shift op1 op2 op3) Simple) ∧
(∀ op. op = Equality ∨ op = FpFromWord ∨ op = FpToWord ∨ op = Opassign ∨
op = Opref ∨ op = Aw8alloc ∨ op = Aw8sub ∨ op = Aw8length ∨
op = Aw8update ∨ op = CopyStrStr ∨ op = CopyStrAw8 ∨
op = CopyAw8Str ∨ op = CopyAw8Aw8 ∨ op = Chr ∨ op = Ord ∨
op = Implode ∨ op = Explode ∨ op = Strsub ∨ op = Strlen ∨
op = Strcat ∨ op = VfromList ∨ op = Vsub ∨
op = Vlength ∨ op = Aalloc ∨ op = AallocEmpty ∨ op = Asub ∨
op = Alength ∨ op = Aupdate ∨ op = Asub_unsafe ∨ op = Aupdate_unsafe ∨
op = Aw8sub_unsafe ∨ op = Aw8update_unsafe ∨ op = ListAppend ∨
op = ConfigGC ∨ op = Env_id ∨ op = Opderef ∨ op = AallocFixed
⇒
opClass op Simple) ∧
(* FunApp *)
(opClass Opapp FunApp) ∧
(* Eval *)
(opClass Eval EvalOp) ∧
(* Icing *)
(∀ op. opClass (FP_cmp op) Icing) ∧
(∀ op. opClass (FP_uop op) Icing) ∧
(∀ op. opClass (FP_bop op) Icing) ∧
(∀ op. opClass (FP_top op) Icing) ∧
(* Reals *)
(∀ op. opClass (Real_cmp op) Reals) ∧
(∀ op. opClass (Real_uop op) Reals) ∧
(∀ op. opClass (Real_bop op) Reals) ∧
(opClass RealFromFP Reals)
End
Definition compress_if_bool_def:
compress_if_bool op fp_opt =
if (isFpBool op) then
(case fp_opt of
Rval (FP_BoolTree fv) => Rval (Boolv (compress_bool fv))
| v => v)
else fp_opt
End
(* ------------------------ Big step semantics -------------------------- *)
(* If the first argument is true, the big step semantics counts down how many
functions applications have happened, and raises an exception when the counter
runs out. *)
Inductive evaluate:
(! ck env l s.
T
==>
evaluate ck env s (Lit l) (s, Rval (Litv l)))
/\ (! ck env e s1 s2 v.
(evaluate ck s1 env e (s2, Rval v))
==>
evaluate ck s1 env (Raise e) (s2, Rerr (Rraise v)))
/\ (! ck env e s1 s2 err.
(evaluate ck s1 env e (s2, Rerr err))
==>
evaluate ck s1 env (Raise e) (s2, Rerr err))
/\ (! ck s1 s2 env e v pes.
(evaluate ck s1 env e (s2, Rval v))
==>
evaluate ck s1 env (Handle e pes) (s2, Rval v))
/\ (! ck s1 s2 env e pes v bv.
(evaluate ck env s1 e (s2, Rerr (Rraise v)) /\
evaluate_match ck env s2 v pes v bv /\
can_pmatch_all env.c s2.refs (MAP FST pes) v)
==>
evaluate ck env s1 (Handle e pes) bv)
/\ (! ck s1 s2 env e pes a.
(evaluate ck env s1 e (s2, Rerr (Rabort a)))
==>
evaluate ck env s1 (Handle e pes) (s2, Rerr (Rabort a)))
/\ (! ck s1 s2 env e pes v.
(evaluate ck env s1 e (s2, Rerr (Rraise v)) /\
~ (can_pmatch_all env.c s2.refs (MAP FST pes) v))
==>
evaluate ck env s1 (Handle e pes) (s2, Rerr (Rabort Rtype_error)))
/\ (! ck env cn es vs s s' v.
(do_con_check env.c cn (LENGTH es) /\
(build_conv env.c cn (REVERSE vs) = SOME v) /\
evaluate_list ck env s (REVERSE es) (s', Rval vs))
==>
evaluate ck env s (Con cn es) (s', Rval v))
/\ (! ck env cn es s.
(~ (do_con_check env.c cn (LENGTH es)))
==>
evaluate ck env s (Con cn es) (s, Rerr (Rabort Rtype_error)))
/\ (! ck env cn es err s s'.
(do_con_check env.c cn (LENGTH es) /\
evaluate_list ck env s (REVERSE es) (s', Rerr err))
==>
evaluate ck env s (Con cn es) (s', Rerr err))
/\ (! ck env n v s.
(nsLookup env.v n = SOME v)
==>
evaluate ck env s (Var n) (s, Rval v))
/\ (! ck env n s.
(nsLookup env.v n = NONE)
==>
evaluate ck env s (Var n) (s, Rerr (Rabort Rtype_error)))
/\ (! ck env n e s.
T
==>
evaluate ck env s (Fun n e) (s, Rval (Closure env n e)))
/\ (! ck env es vs env' e bv s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_opapp (REVERSE vs) = SOME (env', e)) /\
(ck ==> ~ (s2.clock =(( 0 : num)))) /\
(opClass op FunApp) /\
evaluate ck env' (if ck then ( s2 with<| clock := (s2.clock -( 1 : num)) |>) else s2) e bv)
==>
evaluate ck env s1 (App op es) bv)
/\ (! ck env es vs env' e s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_opapp (REVERSE vs) = SOME (env', e)) /\
(s2.clock =( 0 : num)) /\
(opClass op FunApp) /\
ck)
==>
evaluate ck env s1 (App op es) (s2, Rerr (Rabort Rtimeout_error)))
/\ (! ck env es vs s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_opapp (REVERSE vs) = NONE)) /\
(opClass op FunApp)
==>
evaluate ck env s1 (App op es) (s2, Rerr (Rabort Rtype_error)))
/\ (! ck env op es vs res s1 s2 refs' ffi'.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_app (s2.refs,s2.ffi) op (REVERSE vs) = SOME ((refs',ffi'), res)) /\
(opClass op Simple))
==>
evaluate ck env s1 (App op es) (( s2 with<| refs := refs'; ffi :=ffi' |>), res))
/\ (! ck env op es vs vFp res s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_app (s2.refs, s2.ffi) op (REVERSE vs) = SOME ((refs', ffi'), vFp)) /\
(opClass op Icing) /\
(s2.fp_state.canOpt ≠ FPScope Opt) /\
(compress_if_bool op vFp = res))
==>
evaluate ck env s1 (App op es) ((s2 with<| refs := refs'; ffi :=ffi' |>), res))
/\ (! ck env op es vs vFp res s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_app (s2.refs, s2.ffi) op (REVERSE vs) = SOME ((refs', ffi'), vFp)) /\
(opClass op Icing) /\
(s2.fp_state.canOpt = FPScope Opt) /\
(do_fprw vFp (s2.fp_state.opts 0) s2.fp_state.rws = NONE) /\
(compress_if_bool op vFp = res))
==>
evaluate ck env s1 (App op es) (((shift_fp_opts s2) with<| refs := refs'; ffi :=ffi' |>), res))
/\ (! ck env op es vs res rOpt resV s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_app (s2.refs, s2.ffi) op (REVERSE vs) = SOME ((refs', ffi'), res)) /\
(opClass op Icing) /\
(s2.fp_state.canOpt = FPScope Opt) /\
(do_fprw res (s2.fp_state.opts 0) s2.fp_state.rws = SOME rOpt) /\
(compress_if_bool op rOpt = resV))
==>
evaluate ck env s1 (App op es) (((shift_fp_opts s2) with<| refs := refs'; ffi :=ffi' |>), resV))
/\ (! ck env op es vs res s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_app (s2.refs, s2.ffi) op (REVERSE vs) = SOME ((refs', ffi'), res)) /\
(opClass op Reals) /\
(s2.fp_state.real_sem))
==>
evaluate ck env s1 (App op es) ((s2 with<| refs := refs'; ffi :=ffi' |>), res))
/\ (! ck env op es vs s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(opClass op Reals) /\
(~s2.fp_state.real_sem))
==>
evaluate ck env s1 (App op es) (shift_fp_opts s2, Rerr (Rabort Rtype_error)))
/\ (! ck env op es vs s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rval vs) /\
(do_app (s2.refs,s2.ffi) op (REVERSE vs) = NONE) /\
(~ (opClass op FunApp)) /\
(opClass op Reals ⇒ s2.fp_state.real_sem))
==>
evaluate ck env s1 (App op es) (s2, Rerr (Rabort Rtype_error)))
/\ (! ck env op es err s1 s2.
(evaluate_list ck env s1 (REVERSE es) (s2, Rerr err))
==>
evaluate ck env s1 (App op es) (s2, Rerr err))
/\ (! ck env op e1 e2 v e' bv s1 s2.
(evaluate ck env s1 e1 (s2, Rval v) /\
(do_log op v e2 = SOME (Exp e')) /\
evaluate ck env s2 e' bv)
==>
evaluate ck env s1 (Log op e1 e2) bv)
/\ (! ck env op e1 e2 v bv s1 s2.
(evaluate ck env s1 e1 (s2, Rval v) /\
(do_log op v e2 = SOME (Val bv)))
==>
evaluate ck env s1 (Log op e1 e2) (s2, Rval bv))
/\ (! ck env op e1 e2 v s1 s2.
(evaluate ck env s1 e1 (s2, Rval v) /\
(do_log op v e2 = NONE))
==>
evaluate ck env s1 (Log op e1 e2) (s2, Rerr (Rabort Rtype_error)))
/\ (! ck env op e1 e2 err s s'.
(evaluate ck env s e1 (s', Rerr err))
==>
evaluate ck env s (Log op e1 e2) (s', Rerr err))
/\ (! ck env e1 e2 e3 v e' bv s1 s2.
(evaluate ck env s1 e1 (s2, Rval v) /\
(do_if v e2 e3 = SOME e') /\
evaluate ck env s2 e' bv)
==>
evaluate ck env s1 (If e1 e2 e3) bv)
/\ (! ck env e1 e2 e3 v s1 s2.
(evaluate ck env s1 e1 (s2, Rval v) /\
(do_if v e2 e3 = NONE))
==>
evaluate ck env s1 (If e1 e2 e3) (s2, Rerr (Rabort Rtype_error)))
/\ (! ck env e1 e2 e3 err s s'.
(evaluate ck env s e1 (s', Rerr err))
==>
evaluate ck env s (If e1 e2 e3) (s', Rerr err))
/\ (! ck env e pes v bv s1 s2.
(evaluate ck env s1 e (s2, Rval v) /\
evaluate_match ck env s2 v pes bind_exn_v bv /\
can_pmatch_all env.c s2.refs (MAP FST pes) v)
==>
evaluate ck env s1 (Mat e pes) bv)
/\ (! ck env e pes err s s'.
(evaluate ck env s e (s', Rerr err))
==>
evaluate ck env s (Mat e pes) (s', Rerr err))
/\ (! ck env e pes v s1 s2.
(evaluate ck env s1 e (s2, Rval v) /\
~ (can_pmatch_all env.c s2.refs (MAP FST pes) v))
==>
evaluate ck env s1 (Mat e pes) (s2, Rerr (Rabort Rtype_error)))
/\ (! ck env n e1 e2 v bv s1 s2.
(evaluate ck env s1 e1 (s2, Rval v) /\
evaluate ck ( env with<| v := (nsOptBind n v env.v) |>) s2 e2 bv)
==>
evaluate ck env s1 (Let n e1 e2) bv)
/\ (! ck env n e1 e2 err s s'.
(evaluate ck env s e1 (s', Rerr err))
==>
evaluate ck env s (Let n e1 e2) (s', Rerr err))
/\ (! ck env funs e bv s.
(ALL_DISTINCT (MAP (\ (x,y,z) . x) funs) /\
evaluate ck ( env with<| v := (build_rec_env funs env env.v) |>) s e bv)
==>
evaluate ck env s (Letrec funs e) bv)
/\ (! ck env funs e s.
(~ (ALL_DISTINCT (MAP (\ (x,y,z) . x) funs)))
==>
evaluate ck env s (Letrec funs e) (s, Rerr (Rabort Rtype_error)))
/\ (! ck env e t s bv.
(evaluate ck env s e bv)
==>
evaluate ck env s (Tannot e t) bv)
/\ (! ck env e l s bv.
(evaluate ck env s e bv)
==>
evaluate ck env s (Lannot e l) bv)
/\ (! ck env s1 s2 s3 newFp e sc v vsc.
(evaluate ck env (s1 with fp_state := newFp) e (s2, Rval v) /\
(newFp = if (s1.fp_state.canOpt = Strict) then s1.fp_state
else s1.fp_state with <| canOpt := FPScope sc |>) /\
(s3 = s2 with fp_state := s2.fp_state with canOpt := s1.fp_state.canOpt) /\
(vsc = HD (do_fpoptimise sc [v])))
==>
evaluate ck env s1 (FpOptimise sc e) (s3, Rval vsc))
/\ (! ck env s1 s2 s3 newFp e sc err.
(evaluate ck env (s1 with fp_state := newFp) e (s2, Rerr err) /\
(newFp = if (s1.fp_state.canOpt = Strict) then s1.fp_state
else s1.fp_state with <| canOpt := FPScope sc |>) /\
(s3 = s2 with fp_state := s2.fp_state with canOpt := s1.fp_state.canOpt))
==>
evaluate ck env s1 (FpOptimise sc e) (s3, Rerr err))
/\ (! ck env s.
T
==>
evaluate_list ck env s [] (s, Rval []))
/\ (! ck env e es v vs s1 s2 s3.
(evaluate ck env s1 e (s2, Rval v) /\
evaluate_list ck env s2 es (s3, Rval vs))
==>
evaluate_list ck env s1 (e::es) (s3, Rval (v::vs)))
/\ (! ck env e es err s s'.
(evaluate ck env s e (s', Rerr err))
==>
evaluate_list ck env s (e::es) (s', Rerr err))
/\ (! ck env e es v err s1 s2 s3.
(evaluate ck env s1 e (s2, Rval v) /\
evaluate_list ck env s2 es (s3, Rerr err))
==>
evaluate_list ck env s1 (e::es) (s3, Rerr err))
/\ (! ck env v err_v s.
T
==>
evaluate_match ck env s v [] err_v (s, Rerr (Rraise err_v)))
/\ (! ck env env' v p pes e bv err_v s.
(ALL_DISTINCT (pat_bindings p []) /\
(pmatch env.c s.refs p v [] = Match env') /\
evaluate ck ( env with<| v := (nsAppend (alist_to_ns env') env.v) |>) s e bv)
==>
evaluate_match ck env s v ((p,e)::pes) err_v bv)
/\ (! ck env v p e pes bv s err_v.
(ALL_DISTINCT (pat_bindings p []) /\
(pmatch env.c s.refs p v [] = No_match) /\
evaluate_match ck env s v pes err_v bv)
==>
evaluate_match ck env s v ((p,e)::pes) err_v bv)
/\ (! ck env v p e pes s err_v.
(pmatch env.c s.refs p v [] = Match_type_error)
==>
evaluate_match ck env s v ((p,e)::pes) err_v (s, Rerr (Rabort Rtype_error)))
/\ (! ck env v p e pes s err_v.
(~ (ALL_DISTINCT (pat_bindings p [])))
==>
evaluate_match ck env s v ((p,e)::pes) err_v (s, Rerr (Rabort Rtype_error)))
End
(* The set tid_or_exn part of the state tracks all of the types and exceptions
* that have been declared *)
Inductive evaluate_dec:
(! ck env p e v env' s1 s2 locs.
(evaluate ck env s1 e (s2, Rval v) /\
ALL_DISTINCT (pat_bindings p []) /\
every_exp (one_con_check env.c) e /\
(pmatch env.c s2.refs p v [] = Match env'))
==>
evaluate_dec ck env s1 (Dlet locs p e) (s2, Rval <| v := (alist_to_ns env'); c := nsEmpty |>))
/\ (! ck env p e v s1 s2 locs.
(evaluate ck env s1 e (s2, Rval v) /\
ALL_DISTINCT (pat_bindings p []) /\
every_exp (one_con_check env.c) e /\
(pmatch env.c s2.refs p v [] = No_match))
==>
evaluate_dec ck env s1 (Dlet locs p e) (s2, Rerr (Rraise bind_exn_v)))
/\ (! ck env p e v s1 s2 locs.
(evaluate ck env s1 e (s2, Rval v) /\
ALL_DISTINCT (pat_bindings p []) /\
every_exp (one_con_check env.c) e /\
(pmatch env.c s2.refs p v [] = Match_type_error))
==>
evaluate_dec ck env s1 (Dlet locs p e) (s2, Rerr (Rabort Rtype_error)))
/\ (! ck env p e s locs.
(~ (ALL_DISTINCT (pat_bindings p []) /\
every_exp (one_con_check env.c) e))
==>
evaluate_dec ck env s (Dlet locs p e) (s, Rerr (Rabort Rtype_error)))
/\ (! ck env p e err s s' locs.
(evaluate ck env s e (s', Rerr err) /\
ALL_DISTINCT (pat_bindings p []) /\
every_exp (one_con_check env.c) e)
==>
evaluate_dec ck env s (Dlet locs p e) (s', Rerr err))
/\ (! ck env funs s locs.
(ALL_DISTINCT (MAP (\ (x,y,z) . x) funs) /\
EVERY (λ(f,n,e). every_exp (one_con_check env.c) e) funs)
==>
evaluate_dec ck env s (Dletrec locs funs) (s, Rval <| v := (build_rec_env funs env nsEmpty); c := nsEmpty |>))
/\ (! ck env funs s locs.
(~ (ALL_DISTINCT (MAP (\ (x,y,z) . x) funs) /\
EVERY (λ(f,n,e). every_exp (one_con_check env.c) e) funs))
==>
evaluate_dec ck env s (Dletrec locs funs) (s, Rerr (Rabort Rtype_error)))
/\ (! ck env tds s locs.
(EVERY check_dup_ctors tds)
==>
evaluate_dec ck env s (Dtype locs tds)
(( s with<| next_type_stamp := (s.next_type_stamp + LENGTH tds) |>),
Rval <| v := nsEmpty; c := (build_tdefs s.next_type_stamp tds) |>))
/\ (! ck env tds s locs.
(~ (EVERY check_dup_ctors tds))
==>
evaluate_dec ck env s (Dtype locs tds) (s, Rerr (Rabort Rtype_error)))
/\ (! ck env st x es' n.
(declare_env st.eval_state env = SOME (x, es'))
==>
evaluate_dec ck env st (Denv n)
(( st with<| eval_state := es' |>), Rval <| v := (nsSing n x) ; c := nsEmpty |>))
/\ (! ck env st n.
(declare_env st.eval_state env = NONE)
==>
evaluate_dec ck env st (Denv n) (st, Rerr (Rabort Rtype_error)))
/\ (! ck env tvs tn t s locs.
T
==>
evaluate_dec ck env s (Dtabbrev locs tvs tn t) (s, Rval <| v := nsEmpty; c := nsEmpty |>))
/\ (! ck env cn ts s locs.
T
==>
evaluate_dec ck env s (Dexn locs cn ts)
(( s with<| next_exn_stamp := (s.next_exn_stamp +( 1 : num)) |>),
Rval <| v := nsEmpty; c := (nsSing cn (LENGTH ts, ExnStamp s.next_exn_stamp)) |>))
/\ (! ck s1 s2 env ds mn new_env.
(evaluate_decs ck env s1 ds (s2, Rval new_env))
==>
evaluate_dec ck env s1 (Dmod mn ds) (s2, Rval <| v := (nsLift mn new_env.v); c := (nsLift mn new_env.c) |>))
/\ (! ck s1 s2 env ds mn err.
(evaluate_decs ck env s1 ds (s2, Rerr err))
==>
evaluate_dec ck env s1 (Dmod mn ds) (s2, Rerr err))
/\ (! ck s1 s2 env lds ds new_env r.
(evaluate_decs ck env s1 lds (s2, Rval new_env) /\
evaluate_decs ck (extend_dec_env new_env env) s2 ds r)
==>
evaluate_dec ck env s1 (Dlocal lds ds) r)
/\ (! ck s1 s2 env lds ds err.
(evaluate_decs ck env s1 lds (s2, Rerr err))
==>
evaluate_dec ck env s1 (Dlocal lds ds) (s2, Rerr err))
/\ (! ck env s.
T
==>
evaluate_decs ck env s [] (s, Rval <| v := nsEmpty; c := nsEmpty |>))
/\ (! ck s1 s2 env d ds e.
(evaluate_dec ck env s1 d (s2, Rerr e))
==>
evaluate_decs ck env s1 (d::ds) (s2, Rerr e))
/\ (! ck s1 s2 s3 env d ds new_env r.
(evaluate_dec ck env s1 d (s2, Rval new_env) /\
evaluate_decs ck (extend_dec_env new_env env) s2 ds (s3, r))
==>
evaluate_decs ck env s1 (d::ds) (s3, combine_dec_result new_env r))
End
Inductive dec_diverges:
(! env st locs p e.
(ALL_DISTINCT (pat_bindings p []) /\
every_exp (one_con_check env.c) e /\
e_diverges env (st.refs, st.ffi) st.fp_state e)
==>
dec_diverges env st (Dlet locs p e))
/\ (! st env ds mn.
(decs_diverges env st ds)
==>
dec_diverges env st (Dmod mn ds))
/\ (! st env lds ds st2 new_env.
(evaluate_decs F env st lds (st2, Rval new_env) /\
decs_diverges (extend_dec_env new_env env) st2 ds)
==>
dec_diverges env st (Dlocal lds ds))
/\ (! st env lds ds.
(decs_diverges env st lds)
==>
dec_diverges env st (Dlocal lds ds))
/\ (! st env d ds.
(dec_diverges env st d)
==>
decs_diverges env st (d::ds))
/\ (! s1 s2 env d ds new_env.
(evaluate_dec F env s1 d (s2, Rval new_env) /\
decs_diverges (extend_dec_env new_env env) s2 ds)
==>
decs_diverges env s1 (d::ds))
End
val _ = export_theory()