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) 482 ∅ 483 (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))