1#lang racket
2
3(require redex/reduction-semantics
4         "jdg-grammar.rkt")
5
6(provide (all-defined-out))
7
8
9(define (bytecode-ok? e)
10  (not (eq? 'invalid (car (term (verify ,e () 0 #f () () ∅))))))
11
12(define (bytecode-ok/V? e)
13  (judgment-holds
14   (V ,e • O #f • • ∅ s_1 γ_1 η_1)))
15
16(define-extended-language verification
17  bytecode
18  (s (ṽ ...) invalid)
19  (ṽ uninit imm box imm-nc box-nc not)
20  (γ ((n ṽ) ...))
21  (η (n ...))
22  (f (n n (ṽ ...)) ∅)
23  (m n ?))
24
25(define-language bl
26  (e (loc n)
27     (loc-noclr n)
28     (loc-clr n)
29     (loc-box n)
30     (loc-box-noclr n)
31     (loc-box-clr n)
32
33     (let-one e e)
34     (let-void n e)
35     (let-void-box n e)
36
37     (boxenv n e)
38     (install-value n e e)
39     (install-value-box n e e)
40
41     (application e el)
42     ;; change to (seq el) ?
43     (seq e e)
44     (branch e e e)
45     (let-rec ll e)
46     (indirect x)
47     (proc-const τl e)
48     (case-lam ll)
49     l
50     v)
51
52  (el (e el) •)
53
54  (l (lam τl nl e))
55
56  (ll (l ll) •)
57
58  (τl (τ τl) •)
59
60  (nl (n nl) •)
61
62  (v n
63     void
64     'variable
65     b)
66
67  (τ val ref)
68  (n O (S n))
69  (b boolean)
70  ((x y) variable))
71
72(define-metafunction bl
73  [(trans-e (application e el))
74   (application (trans-e e) (trans-e e_2) ...)
75   (where (e_2 ...) (cns->lst el))]
76  [(trans-e (proc-const τl e))
77   (proc-const (cns->lst τl) (trans-e e))]
78  [(trans-e (case-lam el))
79   (case-lam any ...)
80   (where (e ...) (cns->lst el))
81   (where (any ...) ((trans-e e) ...))]
82  [(trans-e (any n e))
83   (any (trans-n n) (trans-e e))
84   (side-condition (memq (term any) '(let-void let-void-box)))]
85  [(trans-e (seq e_1 e_2))
86   (seq any_3 ... any_4 ...)
87   (where (any_3 ...) (un-seq e_1))
88   (where (any_4 ...) (un-seq e_2))]
89  [(trans-e (branch e_1 e_2 e_3))
90   (branch (trans-e e_1) (trans-e e_2) (trans-e e_3))]
91  [(trans-e (let-one e_1 e_2))
92   (let-one (trans-e e_1) (trans-e e_2))]
93  [(trans-e (boxenv n e))
94   (boxenv (trans-n n) (trans-e e))]
95  [(trans-e (any n e_1 e_2))
96   (any (trans-n n) (trans-e e_1) (trans-e e_2))
97   (side-condition (memq (term any) '(install-value install-value-box)))]
98  [(trans-e (proc-const τl e))
99   (proc-const (cns->lst τl) (trans-e e))]
100  [(trans-e (let-rec ll e))
101   (let-rec ((trans-l any_l) ...) (trans-e e))
102   (where (any_l ...) (cns->lst ll))]
103  [(trans-e (any n))
104   (any (trans-n n))
105   (side-condition (memq (term any) '(loc loc-noclr loc-clr loc-box loc-box-clr loc-box-noclr)))]
106  [(trans-e l_1)
107   (trans-l l_1)]
108  [(trans-e n)
109   (trans-n n)]
110  [(trans-e any)
111   any])
112
113(define-metafunction bl
114  [(trans-l (lam τl nl e))
115   (lam (cns->lst τl) (number_2 ...) (trans-e e))
116   (where (n_1 ...) (cns->lst nl))
117   (where (number_2 ...) ((trans-n n_1) ...))])
118
119(define-metafunction bl
120  [(un-seq e_1)
121   (any_2 ...)
122   (where (seq any_2 ...) (trans-e e_1))]
123  [(un-seq e)
124   ((trans-e e))])
125
126(define-metafunction bl
127  [(trans-n O)
128   0]
129  [(trans-n (S n))
130   ,(add1 (term (trans-n n)))])
131
132(define-extended-language vl
133  bl
134  (sl (ν sl) •)
135  (s sl invalid)
136  (ν uninit imm box imm-nc box-nc not)
137  (γ ((n ν) γ) •)
138  (η (n η) •)
139  (f (n n sl) ∅)
140  (m n ?))
141
142
143(define (check-V-res v-res)
144  ;(displayln (list 'check-V-res v-res))
145  (match v-res
146    [`(V ,e ,s1 ,n ,b ,γ1 ,η1 ,f ,s2 ,γ2 ,η2)
147     (unless
148         (equal?
149          (term
150           (verify
151            (trans-e ,e)
152            (trans-s ,s1)
153            (trans-n ,n)
154            ,b
155            (trans-γ ,γ1)
156            (trans-η ,η1)
157            (trans-f ,f)))
158          (term
159           ((trans-s ,s2)
160            (trans-γ ,γ2)
161            (trans-η ,η2))))
162       (error 'check-V-res "failed on ~s " e))]))
163
164(define (check-Vs n #:generator [g #f])
165  (define gen (redex-generator vl
166                               (V e • O #f • • ∅ s_1 γ_1 η_1)
167                               6))
168  (for ([_ (in-range n)])
169    (define maybe-V
170      (if g
171          (gen)
172          (generate-term
173           vl
174           #:satisfying
175           ;(V e s n b γ η f s_1 γ_1 η_1)
176           (V e • O #f • • ∅ s_1 γ_1 η_1)
177           5)))
178    (match maybe-V
179      [#f
180       (display ".")]
181      [`(V ,e ,s ,n ,b ,γ ,η ,f ,s_1 ,γ_1 ,η_1)
182       (displayln (term (trans-e ,e)))
183       (check-V-res maybe-V)])))
184
185(define-metafunction vl
186  [(trans-γ ((n ν) γ))
187   (((trans-n n) ν) any ...)
188   (where (any ...) (trans-γ γ))]
189  [(trans-γ •)
190   ()])
191
192(define-metafunction vl
193  [(trans-η (n η))
194   ((trans-n n) any ...)
195   (where (any ...) (trans-η η))]
196  [(trans-η •)
197   ()])
198
199(define-metafunction vl
200  [(trans-f ∅)
201   ∅]
202  [(trans-f (n_1 n_2 sl))
203   ((trans-n n_1) (trans-n n_2) (cns->lst sl))])
204
205(define-metafunction vl
206  [(trans-s invalid)
207   invalid]
208  [(trans-s sl)
209   (cns->lst sl)])
210
211(define-metafunction vl
212  [(cns->lst (any_1 any_2))
213   (any_1 any_3 ...)
214   (where (any_3 ...) (cns->lst any_2))]
215  [(cns->lst •)
216   ()])
217
218
219;; verification judgment -----------------------------------------------
220
221
222(define-judgment-form vl
223  #:mode (V I I I I I I I O O O)
224  #:contract (V e s n b γ η f s γ η)
225
226  ;localrefs
227  [(V (loc n) s n_l #f γ η f s γ η)
228   (lmem (sref n s) (imm (imm-nc •)))]
229  [(V (loc n) s n_l #t γ η f s γ η)
230   (lmem (sref n s) (imm (imm-nc (box (box-nc •)))))]
231  [(V (loc-box n) s n_l b γ η f s γ η)
232   (lmem (sref n s) (box (box-nc •)))]
233
234  [(V (loc-noclr n) s n_l #f γ η f (supdt n (nc ν_n) s) γ η_l)
235   (where ν_n (sref n s))
236   (log-noclr n n_l ν_n η η_l)
237   (lmem ν_n (imm (imm-nc •)))]
238  [(V (loc-noclr n) s n_l #t γ η f (supdt n (nc ν_n) s) γ η_l)
239   (where ν_n (sref n s))
240   (log-noclr n n_l ν_n η η_l)
241   (lmem ν_n (imm (imm-nc (box (box-nc •)))))]
242  [(V (loc-box-noclr n) s n_l b γ η f (supdt n box-nc s) γ η_l)
243   (where ν_n (sref n s))
244   (log-noclr n n_l ν_n η η_l)
245   (lmem ν_n (box (box-nc •)))]
246
247
248  [(V (loc-clr n) s n_l #f γ η f (supdt n not s) γ_l η)
249   (where imm (sref n s))
250   (log-clr n s n_l γ γ_l)]
251  [(V (loc-clr n) s n_l #t γ η f (supdt n not s) γ_l η)
252   (lmem (sref n s) (imm (box •)))
253   (log-clr n s n_l γ γ_l)]
254  [(V (loc-box-clr n) s n_l b γ η f (supdt n not s) γ_l η)
255   (where box (sref n s))
256   (log-clr n s n_l γ γ_l)]
257
258  ;branch
259  [(V (branch e_c e_t e_e) s n_l b γ η f s_n (concat γ_2 γ_3) η_3)
260   (V e_c s n_l #f γ η ∅ s_1 γ_1 η_1)
261   (V e_t (trim s_1 s) O b • • f s_2 γ_2 η_2)
262   (undo-clrs γ_2 (trim s_2 s) s_21)
263   (undo-noclrs η_2 s_21 s_22)
264   (V e_e s_22 O b γ_1 η_1 f s_3 γ_3 η_3)
265   (redo-clrs γ_2 (trim s_3 s) s_n)]
266
267  ;let-one
268  [(V (let-one e_r e_b) sl n_l b γ η f s_2 γ_2 η_2)
269   (where sl_0 (uninit sl))
270   (V e_r sl_0 (n+ n_l (S O)) #f γ η ∅ sl_1 γ_1 η_1)
271   (where (uninit sl_1*) (trim sl_1 sl_0))
272   (V e_b (imm sl_1*) (n+ n_l (S O)) b γ_1 η_1 (shift (S O) f) s_2 γ_2 η_2)]
273
274  ;seq
275  [(V (seq e_0 e_1) s n_l b γ η f s_2 γ_2 η_2)
276   (V e_0 s n_l #t γ η ∅ s_1 γ_1 η_1)
277   (V e_1 (trim s_1 s) n_l b γ_1 η_1 f s_2 γ_2 η_2)]
278
279  ;application
280  [(V (application (loc-noclr n) el) s n_l b_i γ η (n_f n_s sl_f) s_2 γ_2 η_2)
281   (n= n (n+ n_f (len el)))
282   (V-self-app (application (loc-noclr n) el) s n_l γ η (n_f n_s sl_f) s_2 γ_2 η_2)]
283  [(V (application (lam τl nl e) el) s n_l b γ η f s_2 γ_2 η_2)
284   (where n (len el))
285   (where n_l* (n+ n n_l))
286   (where s_1 (abs-push n not s))
287   (V*-ref el τl s_1 n_l* γ η s_2 γ_2 η_2)
288   (lam-verified? (lam τl nl e) s_1 ?)]
289  [(V (application (proc-const τl e) el) s n_l b γ η f s_2 γ_2 η_2)
290   (V (application (lam τl • e) el) s n_l b γ η f s_2 γ_2 η_2)]
291  [(V (application e_0 el) s n_l b γ η f s_2 γ_2 η_2)
292   ;; the only place where cases might overlap, so exclude that explicitly
293   (not-self-app (application e_0 el) s f)
294   (where n (len el))
295   (where n_l* (n+ n n_l))
296   (V* (e_0 el) (abs-push n not s) n_l* #f γ η s_2 γ_2 η_2)]
297
298  ; literals
299  [(V n s n_l b γ η f s γ η)]
300  [(V b s n_l b_i γ η f s γ η)]
301  [(V (quote variable) s n_l b γ η f s γ η)]
302  [(V void s n_l b γ η f s γ η)]
303
304  ; install-value
305  [(V (install-value n e_r e_b) s n_l b γ η f s_3 γ_3 η_3)
306   (n< n n_l)
307   (V e_r s n_l #f γ η ∅ s_1 γ_1 η_1)
308   (where s_2 (trim s_1 s))
309   (where uninit (sref n s_2))
310   (V e_b (supdt n imm s_2) n_l b γ η f s_3 γ_3 η_3)]
311  [(V (install-value-box n e_r e_b) s n_l b γ η f s_3 γ_3 η_3)
312   (n< n (len s))
313   (V e_r s n_l #f γ η ∅ s_1 γ_1 η_1)
314   (where s_2 (trim s_1 s))
315   (lmem (sref n s_2) (box (box-nc •)))
316   (V e_b s_2 n_l b γ_1 η_1 f s_3 γ_3 η_3)]
317
318  ; boxenv
319  [(V (boxenv n_p e) s n_l b γ η f s_2 γ_2 η_2)
320   (where imm (sref n_p s))
321   (V e (supdt n_p box s) n_l b γ η f s_2 γ_2 η_2)
322   (n< n_p n_l)]
323
324  ; indirect
325  [(V (indirect x) s n_l b γ η f s γ η)]
326
327  ; let-void
328  [(V (let-void n e) s n_l b_i γ η f s_1 γ_1 η_1)
329   (V e (abs-push n uninit s) (n+ n n_l) b_i γ η (shift n f) s_1 γ_1 η_1)]
330  [(V (let-void-box n e) s n_l b_i γ η f s_1 γ_1 η_1)
331   (V e (abs-push n box s) (n+ n n_l) b_i γ η (shift n f) s_1 γ_1 η_1)]
332
333   ; procedures in arbitrary context
334  [(V (lam τl nl e) s n_l b γ η f s γ η)
335   (vals (val τl))
336   (lam-verified? (lam τl nl e) s ?)]
337  [(V (proc-const τl e) s n_l b γ η f s_1 γ_1 η_1)
338   (vals τl)
339   (V (lam τl • e) s n_l b γ η f s_1 γ_1 η_1)]
340
341  ; case-lam
342  [(V (case-lam el) s n_l b γ η f s γ η)
343   (lam-verified?* el s ?)]
344
345   ; let-rec
346  [(V (let-rec ll e) s n_l b γ η f s_2 γ_2 η_2)
347   (where n (len ll))
348   (n<=  n n_l)
349   (lsplit n s s_a s_b)
350   (uninits s_a)
351   (where s_1 (abs-push n imm s_b))
352   (verify-ll O s_1 ll)
353   (V e s_1 n_l b γ η f s_2 γ_2 η_2)])
354
355(define-judgment-form vl
356  #:mode (verify-ll I I I)
357  [(verify-ll n s •)]
358  [(verify-ll n s ((lam τl (n_l nl) e) ll))
359   (vals τl)
360   (lam-verified? (lam τl (n_l nl) e) s n)
361   (verify-ll (S n) s ll)])
362
363(define-judgment-form vl
364  #:mode (V* I I I I I I O O O)
365  #:contract (V* el s n b γ η s γ η)
366  [(V* • s n_l b γ η s γ η)]
367  [(V* (e_0 el) s n_l b γ η s_2 γ_2 η_2)
368   (V e_0 s n_l b γ η ∅ s_1 γ_1 η_1)
369   (V* el (trim s_1 s) n_l b γ_1 η_1 s_2 γ_2 η_2)])
370
371(define-judgment-form vl
372  #:mode (V-self-app I I I I I I O O O)
373  #:contract (V-self-app e s n γ η f s γ η)
374  [(V-self-app (application e_0 el) sl n_l γ η (n_f n_s sl_f) sl_1 γ_1 η_1)
375   (where n (len el))
376   (where n_l* (n+ n n_l))
377   (V* (e_0 el) (abs-push n not sl) n_l* #f γ η sl_1 γ_1 η_1)
378   (closure-intact (ssblst n_s (slen sl_f) sl_1) sl_f)])
379
380(define-judgment-form vl
381  #:mode (V*-ref I I I I I I O O O)
382  [(V*-ref • • s n_l γ η s γ η)]
383  [(V*-ref (e_0 el) (val τl) s n_l γ η s_2 γ_2 η_2)
384   (V e_0 s n_l #f γ η ∅ s_1 γ_1 η_1)
385   (V*-ref el τl (trim s_1 s) n_l γ_1 η_1 s_2 γ_2 η_2)]
386  [(V*-ref (e_0 el) • s n_l γ η s_2 γ_2 η_2)
387   (V* (e_0 el) s n_l #f γ η s_2 γ_2 η_2)]
388  [(V*-ref • (τ_0 τl) s n_l γ η s γ η)]
389  [(V*-ref ((loc n) el) (ref τl) s n_l γ η s_2 γ_2 η_2)
390   ; Require the reference to load a box.
391   (V (loc-box n) s n_l #f γ η ∅ s_1 γ_1 η_1)
392   (V*-ref el τl s_1 n_l γ_1 η_1 s_2 γ_2 η_2)]
393  [(V*-ref ((loc-noclr n) el) (ref τl) s n_l γ η s_2 γ_2 η_2)
394   ; Require the reference to load a box.
395   (V (loc-box-noclr n) s n_l #f γ η ∅ s_1 γ_1 η_1)
396   (V*-ref el τl s_1 n_l γ_1 η_1 s_2 γ_2 η_2)]
397  [(V*-ref ((loc-clr n) el) (ref τl) s n_l γ η s_2 γ_2 η_2)
398   ; Require the reference to load a box.
399   (V (loc-box-clr n) s n_l #f γ η ∅ s_1 γ_1 η_1)
400   (V*-ref el τl s_1 n_l γ_1 η_1 s_2 γ_2 η_2)])
401
402(define-relation vl
403  [(closure-intact • •)]
404  [(closure-intact (imm-nc sl_1) (imm sl_2))
405   (closure-intact sl_1 sl_2)]
406  [(closure-intact (box-nc sl_1) (box sl_2))
407   (closure-intact sl_1 sl_2)]
408  [(closure-intact (ν sl_1) (ν sl_2))
409   (closure-intact sl_1 sl_2)])
410
411(define-relation vl
412  [(vals (val τl))
413   (vals τl)]
414  [(vals •)])
415
416(define-relation vl
417  [(uninits (uninit sl))
418   (uninits sl)]
419  [(uninits •)])
420
421(define-judgment-form vl
422  #:mode (lam-verified? I I I)
423  [(lam-verified? (lam τl nl e) sl m)
424   ;(where n_d (len sl))
425   ;(lmax nl n_m)
426   ;(n< n_m n_d)
427   (where n_d* (n+ (len nl) (len τl)))
428   (where sl_0 (collate-refs nl sl))
429   (not-lmem uninit sl_0)
430   (not-lmem not sl_0)
431   (where s_d (drop-noclrs sl_0))
432   (extract-self m nl τl s_d f)
433   (V e (concat s_d (arg τl)) n_d* #f • • f sl_1 γ_1 η_1)])
434
435(define-judgment-form vl
436  #:mode (lam-verified?* I I I)
437  [(lam-verified?* • sl m)]
438  [(lam-verified?* ((lam τl nl e) el) sl m)
439   (vals τl)
440   (lam-verified? (lam τl nl e) sl m)
441   (lam-verified?* el sl m)])
442
443;; suffers from ?/n confusion
444;; fixable by transforming to a metafunction
445;; but need to add judgment-holds support
446
447(define-judgment-form vl
448  #:mode (extract-self I I I I O)
449  [(extract-self ? nl τl sl ∅)]
450  [(extract-self n nl τl sl ∅)
451   (not-lmem n nl)]
452  [(extract-self n_i (n_i nl) τl sl (O (len τl) sl))
453   (not-lmem n_i nl)]
454  [(extract-self n_i (n_0 nl) τl sl ((S n_n) n_τ sl))
455   (extract-self n_i nl τl sl (n_n n_τ sl))
456   (nlmem n_i nl)])
457
458(define-metafunction vl
459  [(loc-noclr? (loc-noclr e))
460   #t]
461  [(loc-noclr? e)
462   #f])
463
464(define-relation vl
465  [(not-self-app (application e el) s ∅)]
466  [(not-self-app (application e el) s f)
467   (where #f (loc-noclr? e))]
468  [(not-self-app (application (loc-noclr n) el) s (n_f n_s s_f))
469   (n≠ n (n+ n_f (len el)))])
470
471(define-relation vl
472  [(n≠ O (S n))]
473  [(n≠ (S n) O)]
474  [(n≠ (S n_1) (S n_2))
475   (n≠ n_1 n_2)])
476
477#;
478(define-metafunction vl
479  [(es ? nl τl sl)
480   ∅]
481  [(extract-self n nl τl sl)
482483   (judgment-holds (not-lmem n nl))]
484  [(extract-self n_i (n_i nl) (τ_0 τl) sl (O O sl))
485   (not-lmem n_i nl)]
486  [(extract-self n_i (n_0 nl) (τ_0 τl) sl ((S n_n) (S n_τ) sl))
487   (extract-self n_i nl τl sl (n_n n_τ sl))
488   (nlmem n_i nl)])
489
490(define-metafunction vl
491  [(ssblst O O sl)
492   •]
493  [(ssblst O (S n) (ν sl))
494   (ν (ssblst O n sl))]
495  [(ssblst (S n_1) n_2 (ν sl))
496   (ssblst n_1 n_2 sl)])
497
498(define-relation vl
499  [(lmem ν (ν sl))]
500  [(lmem ν (ν_1 sl))
501   (lmem ν sl)])
502
503(define-relation vl
504  [(nlmem n (n nl))]
505  [(nlmem n (n_1 nl))
506   (nlmem n nl)])
507
508(define-relation vl
509  [(not-lmem any_1 (any_2 any_3))
510   (not-lmem any_1 any_3)
511   (where (any_!_4 any_!_4) (any_1 any_2))]
512  [(not-lmem any_1 •)])
513
514(define-judgment-form vl
515  #:mode (lmax I O)
516  [(lmax • O)]
517  [(lmax (n nl) n)
518   (lmax nl n_m)
519   (n< n_m n)]
520  [(lmax (n nl) n_m)
521   (lmax nl n_m)
522   (n< n n_m)])
523
524(define-metafunction vl
525  [(sref O (ν sl))
526   ν]
527  [(sref (S n) (ν_1 sl))
528   (sref n sl)]
529  [(sref n •)
530   #f])
531
532(define-metafunction vl
533  #;[(supdt O ν_1 •)
534   (ν_1 •)]
535  [(supdt O ν_1 (ν_2 sl))
536   (ν_1 sl)]
537  [(supdt (S n) ν_1 (ν_2 sl))
538   (ν_2 (supdt n ν_1 sl))])
539
540(define-metafunction vl
541  [(n- n_1 O)
542   n_1]
543  [(n- (S n_1) (S n_2))
544   (n- n_1 n_2)]
545  #;
546  [(n- O (S n))
547   #f])
548
549(define-metafunction vl
550  [(n+ O n)
551   n]
552  [(n+ (S n_1) n_2)
553   (n+ n_1 (S n_2))])
554
555(define-metafunction vl
556  [(slen •)
557   O]
558  [(slen (ν sl))
559   (S (slen sl))])
560
561(define-metafunction vl
562  [(len •)
563   O]
564  [(len (any_1 any_2))
565   (S (len any_2))])
566
567(define-relation vl
568  [(n< O (S n))]
569  [(n< (S n_1) (S n_2))
570   (n< n_1 n_2)])
571
572(define-relation vl
573  [(n<= O n)]
574  [(n<= (S n_1) (S n_2))
575   (n<= n_1 n_2)])
576
577(define-relation vl
578  [(n= O O)]
579  [(n= (S n_1) (S n_2))
580   (n= n_1 n_2)])
581
582(define-judgment-form vl
583  #:mode (lsplit I I O O)
584  [(lsplit O any_1 • any_1)]
585  [(lsplit (S n) (any_1 any_2) (any_1 any_3) any_4)
586   (lsplit n any_2 any_3 any_4)])
587
588
589(define-metafunction vl
590  shift : n f -> f
591  [(shift n ∅) ∅]
592  [(shift n (n_f n_s sl))
593   ((n+ n n_f) (n+ n n_s) sl)])
594
595(define-metafunction vl
596  abs-push : n ν sl -> sl
597  [(abs-push O ν sl) sl]
598  [(abs-push (S n) ν sl)
599   (abs-push n ν (ν sl))])
600
601;; note: could turn this back into a metafunction
602;; if the restriction on relations in term positions
603;; is removed....
604;; or support judgment-holds, maybe that is better
605;; naturally a metafunction in any case...
606(define-judgment-form vl
607  #:contract (log-noclr n n ν η η)
608  #:mode (log-noclr I I I I O)
609  [(log-noclr n_p n_l ν_p η ((n- n_p n_l) η))
610   (n<= n_l n_p)
611   (lmem ν_p (imm (box •)))]
612  [(log-noclr n_p n_l ν_p η η)
613   (lmem ν_p (imm-nc (box-nc (uninit (not •)))))]
614  [(log-noclr n_p n_l ν_p η η)
615   (n< n_p n_l)])
616
617
618(define-metafunction vl
619  nc : ν -> ν
620  [(nc imm) imm-nc]
621  [(nc imm-nc) imm-nc]
622  [(nc box) box-nc]
623  [(nc box-nc) box-nc])
624
625(define-judgment-form vl
626  #:contract (log-clr n s n γ γ)
627  #:mode (log-clr I I I I O)
628  [(log-clr n_p s n_l γ (((n- (n- (slen s) n_p) (S O)) ν_np) γ))
629   (where ν_np (sref n_p s))
630   (n<= n_l n_p)]
631  [(log-clr n_p s n_l γ γ)
632   (n< n_p n_l)])
633
634;; need more specific nt types in
635;; relations like this or there can be problems
636;; satisfying constraings (i.e. trying to satisfy an sl with anys)
637(define-metafunction vl
638  [(concat • any_1)
639   any_1]
640  [(concat (any_1 any_2) any_3)
641   (any_1 (concat any_2 any_3))])
642
643
644(define-judgment-form vl
645  #:mode (undo-clrs I I O)
646  [(undo-clrs γ invalid invalid)]
647  [(undo-clrs • s s)]
648  [(undo-clrs ((n ν) γ) s (supdt (n- (n- (slen s) n) (S O)) ν s_2))
649   (n< n (slen s))
650   (n≠ (n- (slen s) n) O)
651   (undo-clrs γ s s_2)]
652  [(undo-clrs ((n ν) γ) s s)
653   (n<= (slen s) n)])
654
655(define-judgment-form vl
656  #:mode (undo-noclrs I I O)
657  [(undo-noclrs η invalid invalid)]
658  [(undo-noclrs • s s)]
659  [(undo-noclrs (n η) s (supdt n imm s_2))
660   (where imm-nc (sref n s))
661   (undo-noclrs η s s_2)]
662  [(undo-noclrs (n η) s (supdt n box s_2))
663   (where box-nc (sref n s))
664   (undo-noclrs η s s_2)]
665  [(undo-noclrs (n η) s s_2)
666   (undo-noclrs η s s_2)
667   ;; Bug 1
668   ;; (lmem (sref n s) (uninit (imm (imm-nc (boc-nc (box (not •)))))))
669   (lmem (sref n s) (uninit (imm (box (not •)))))])
670
671(define-judgment-form vl
672  #:mode (redo-clrs I I O)
673  [(redo-clrs γ invalid invalid)]
674  [(redo-clrs • s s)]
675  [(redo-clrs ((n ν) γ) s (supdt (n- (n- (slen s) n) (S O)) not s_2))
676   (n< n (slen s))
677   (n≠ (n- (slen s) n) O)
678   (redo-clrs γ s s_2)]
679  [(redo-clrs ((n ν) γ) s s)
680   (n<= (slen s) n)])
681
682(define-metafunction vl
683  [(collate-refs • sl)
684   •]
685  [(collate-refs (n nl) sl)
686   ((sref n sl) (collate-refs nl sl))])
687
688(define-metafunction vl
689  [(drop-noclrs (imm-nc sl))
690   (imm (drop-noclrs sl))]
691  [(drop-noclrs (box-nc sl))
692   (box sl)]
693  [(drop-noclrs (ν sl))
694   (ν (drop-noclrs sl))]
695  [(drop-noclrs •)
696   •])
697
698;; had to make both of these
699;; j-forms for the below reasons...
700#;
701(define-metafunction vl
702  undo-clrs : γ s -> s
703  [(undo-clrs γ invalid) invalid]
704  [(undo-clrs • s) s]
705  [(undo-clrs ((n ν) γ) s)
706   (undo-clrs γ (supdt (n- (n- (slen s) n) (S O)) ν s))]
707  ;; --> (slen s) < n
708  ;; but generation doesn't support this fall-through!!
709  [(undo-clrs ((n ν) γ) s)
710   (undo-clrs γ s)])
711#;
712(define-metafunction vl
713  redo-clrs : γ s -> s
714  [(redo-clrs γ invalid) invalid]
715  [(redo-clrs • s) s]
716  [(redo-clrs ((n ν) γ) s)
717   (redo-clrs γ (supdt (n- (n- (slen s) n) (S O)) not s))]
718  ;; --> (slen s) < n
719  ;; but generation doesn't support this fall-through!!
720  [(redo-clrs ((n ν) γ) s)
721   (redo-clrs γ s)])
722
723(define-metafunction vl
724  trim : s s -> s
725  [(trim invalid s) invalid]
726  [(trim s_1 s_2)
727   (sdrp (n- (slen s_1) (slen s_2)) s_1)])
728
729(define-metafunction vl
730  [(sdrp O sl)
731   sl]
732  [(sdrp (S n) (ν sl))
733   (sdrp n sl)]
734  [(sdrp n •)
735   •])
736
737(define-metafunction vl
738  [(valid? invalid) #f]
739  [(valid? sl) #t])
740
741(define-metafunction vl
742  [(arg •)
743   •]
744  [(arg (val τl))
745   (imm (arg τl))]
746  [(arg (ref τl))
747   (box (arg τl))])
748
749
750(provide (all-defined-out))