@@ -57,6 +57,8 @@ grammar
57
57
{{ com -- extract or extend bitvector $e$}}
58
58
| e1 @ e2 :: :: concat
59
59
{{ com -- concatenate two bitvector $e_1$ to $e_2$ }}
60
+ | [ e1 / var ] e2 :: M :: subst
61
+ {{ com -- the (capture avoiding) substitution of $e_1$ for $var$ in $e_2$ }}
60
62
61
63
var :: var_ ::=
62
64
| id : type :: S :: var
@@ -201,6 +203,11 @@ formula :: formula_ ::=
201
203
| nat1 > nat2 :: M :: nat_gt {{ coq ([[nat1]] > [[nat2]])}}
202
204
| nat1 = nat2 :: M :: nat_eq {{ coq ([[nat1]] = [[nat2]])}}
203
205
| nat1 >= nat2 :: M :: nat_ge {{ coq ([[nat1]] >= [[nat2]])}}
206
+ | e1 :=def e2 :: M :: defines
207
+ {{ tex [[e1]] \stackrel{\text{def} }{:=} [[e2]] }}
208
+ | ( var , val ) in delta :: M :: in_env
209
+ | var notin dom ( delta ) :: M :: notin_env
210
+ {{ tex [[var]] [[notin]] \mathsf{dom}([[delta]]) }}
204
211
205
212
terminals :: terminals_ ::=
206
213
| -> :: :: rarrow {{ tex \rightarrow }}
@@ -210,10 +217,13 @@ terminals :: terminals_ ::=
210
217
| |-> :: :: mapsto {{ tex \mapsto }}
211
218
| lambda :: :: lambda {{ tex \lambda }}
212
219
| ~> :: :: leadsto {{ tex \leadsto }}
220
+ | ~>* :: :: mleadsto {{ tex \leadsto^{*} }}
213
221
| <> :: :: neq {{ tex \neq }}
214
222
| >> :: :: lsr {{ tex \gg}}
215
223
| ~>> :: :: asr {{ tex \ggg}}
216
224
| << :: :: lsl {{ tex \ll}}
225
+ | in :: :: in {{ tex \in }}
226
+ | notin :: :: notin {{ tex \notin }}
217
227
218
228
219
229
subrules
@@ -386,44 +396,35 @@ defns reduce_exp :: '' ::=
386
396
387
397
defn delta |- exp ~> exp' :: :: exp :: '' by
388
398
389
-
390
- -------------------------------------------- :: var_reduce
391
- delta[var <- v] |- var ~> v
392
-
393
-
399
+ (var,v) in delta
400
+ ------------------ :: var_in
394
401
delta |- var ~> v
395
- var <> var'
396
- -------------------------------------------- :: var_extend
397
- delta[var' <- v'] |- var ~> v
398
-
399
402
400
403
404
+ id:type notin dom(delta)
401
405
-------------------------------------------- :: var_unknown
402
- [] |- id:type ~> unknown [str] : type
406
+ delta |- id:type ~> unknown[str]: type
403
407
404
408
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
405
409
% LOAD %
406
410
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
407
411
412
+ delta |- e2 ~> e2'
413
+ ------------------------------------- :: load_step_addr
414
+ delta |- e1[e2,ed]:sz ~> e1[e2',ed]:sz
408
415
409
- delta |- e2 ~> v2
410
- ------------------------------------- :: load_addr
411
- delta |- e1[e2,ed]:sz ~> e1[v2,ed]:sz
412
416
417
+ delta |- e1 ~> e1'
418
+ ------------------------------------- :: load_step_mem
419
+ delta |- e1[v2,ed]:sz ~> e1'[v2,ed]:sz
413
420
414
- delta |- e1 ~> v1
415
- ------------------------------------- :: load_mem
416
- delta |- e1[v2,ed]:sz ~> v1[v2,ed]:sz
417
421
418
-
419
- ----------------------------------------------------------- :: load_byte
422
+ ------------------------------------------------------ :: load_byte
420
423
delta |- (v1 with [w,ed]:8 <- num:8)[w,ed']:8 ~> num:8
421
424
422
425
------------------------------------------------------------------------------ :: load_un_addr
423
426
delta |- (v1 with [unknown[str]:t,ed]:8 <- v2)[v3,ed]:8 ~> unknown[str]:imm<8>
424
427
425
-
426
-
427
428
w1 <> w2
428
429
---------------------------------------------------------- :: load_rec
429
430
delta |- (v1 with [w1,ed]:8 <- v3)[w2,ed]:8 ~> v1[w2,ed]:8
@@ -446,94 +447,90 @@ defns reduce_exp :: '' ::=
446
447
%% STORE %
447
448
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
448
449
450
+
449
451
450
-
451
- delta |- e ~> v
452
- ------------------------------------------------------------------------- :: store_val
453
- delta |- e1 with [e2,ed]:sz <- e ~> e1 with [e2,ed] : sz <- v
452
+ delta |- e3 ~> e3'
453
+ ------------------------------------------------------------------------- :: store_step_val
454
+ delta |- e1 with [e2,ed]:sz <- e3 ~> e1 with [e2,ed] : sz <- e3'
454
455
455
456
456
- delta |- e ~> v
457
- ------------------------------------------------------------------------- :: store_addr
458
- delta |- e1 with [e ,ed]:sz <- val ~> e1 with [v ,ed] : sz <- val
457
+ delta |- e2 ~> e2'
458
+ ------------------------------------------------------------------------- :: store_step_addr
459
+ delta |- e1 with [e2 ,ed]:sz <- v3 ~> e1 with [e2' ,ed] : sz <- v3
459
460
460
461
461
- delta |- e ~> v
462
- ------------------------------------------------------------------------- :: store_mem
463
- delta |- e with [v1 ,ed]:sz <- val ~> v with [v1 ,ed] : sz <- val
462
+ delta |- e1 ~> e1'
463
+ ------------------------------------------------------------------------- :: store_step_mem
464
+ delta |- e1 with [v2 ,ed]:sz <- v3 ~> e1' with [v2 ,ed] : sz <- v3
464
465
465
466
succ w = w'
466
- delta |- high:8[w] ~> w1
467
- delta |- low:(sz-8)[w] ~> w2
468
- delta |- v with [w,be]:8 <- w1 ~> v'
467
+ e1 :=def (v with [w,be]:8 <- high:8[val])
469
468
-------------------------------------------------------------------- :: store_word_be
470
- delta |- v with [w,be]:sz <- val ~> v' with [w', be]:(sz-8) <- w2
469
+ delta |- v with [w,be]:sz <- val ~> e1 with [w',be]:(sz-8) <- low:(sz-8)[val]
471
470
472
471
succ w = w'
473
- delta |- low:8[w] ~> w1
474
- delta |- high:(sz-8)[w] ~> w2
475
- delta |- v with [w,be]:8 <- w1 ~> v'
472
+ e1 :=def (v with [w,el]:8 <- low:8[val])
476
473
-------------------------------------------------------------------- :: store_word_el
477
- delta |- v with [w,el]:sz <- val ~> v' with [w', el]:(sz-8) <- w2
474
+ delta |- v with [w,el]:sz <- val ~> e1 with [w',el]:(sz-8) <- high:(sz-8)[val]
478
475
479
476
477
+ delta |- e1 ~> e1'
478
+ ------------------------------------------------ :: let_step
479
+ delta |- let var = e1 in e2 ~> let var = e1' in e2
480
480
481
481
482
- delta |- e1 ~> v
483
- ------------------------------------------------ :: let_head
484
- delta |- let var = e1 in e2 ~> let var = v in e2
482
+ ------------------------------------------------- :: let
483
+ delta |- let var = v in e ~> [v/var]e
485
484
486
485
487
- delta[var <- v] |- e ~> val
488
- -------------------------------- :: let_body
489
- delta |- let var = v in e ~> val
486
+ delta |- e1 ~> e1'
487
+ ------------------------------------------------------------------ :: ite_step
488
+ delta |- if e1 then e2 else e3 ~> if e1' then e2 else e3
490
489
490
+ ----------------------------------------------- :: ite_true
491
+ delta |- if true then e2 else e3 ~> e2
491
492
492
- delta |- e1 ~> true
493
- ------------------------------------ :: ite_true
494
- delta |- if e1 then e2 else e3 ~> e2
493
+
494
+ ------------------------------------------------ :: ite_false
495
+ delta |- if false then e2 else e3 ~> e3
495
496
496
- delta |- e1 ~> false
497
- ------------------------------------ :: ite_false
498
- delta |- if e1 then e2 else e3 ~> e3
499
497
498
+ delta |- e2 ~> e2'
499
+ ------------------------------------------ :: bop_rhs
500
+ delta |- e1 bop e2 ~> e1 bop e2'
500
501
501
- delta |- e2 ~> v
502
- ------------------------------------- :: bop_rhs
503
- delta |- e1 bop e2 ~> e1 bop v
502
+ delta |- e1 ~> e1'
503
+ ----------------------------------------- :: bop_lhs
504
+ delta |- e1 bop v2 ~> e1' bop v2
504
505
505
- delta |- e1 ~> v
506
- ------------------------------------- :: bop_lhs
507
- delta |- e1 bop v' ~> v bop v'
508
506
509
-
510
- ----------------------------------------------- :: bop_unk_rhs
507
+ -------------------------------------------------------- :: bop_unk_rhs
511
508
delta |- e bop unknown[str]:t ~> unknown[str]:t
512
509
513
- ----------------------------------------------- :: bop_unk_lhs
510
+ -------------------------------------------------------- :: bop_unk_lhs
514
511
delta |- unknown[str]:t bop e ~> unknown[str]:t
515
512
516
513
517
- ---------------------------------------- :: plus
514
+ -------------------------------------- :: plus
518
515
delta |- w1 + w2 ~> w1 .+ w2
519
516
520
- ---------------------------------------- :: minus
517
+ -------------------------------------- :: minus
521
518
delta |- w1 - w2 ~> w1 .- w2
522
519
523
520
524
- ---------------------------------------- :: times
521
+ ------------------------------------- :: times
525
522
delta |- w1 * w2 ~> w1 .* w2
526
523
527
524
528
- ---------------------------------------- :: div
525
+ ------------------------------------- :: div
529
526
delta |- w1 / w2 ~> w1 ./ w2
530
527
531
528
532
- ----------------------------------------------- :: sdiv
529
+ --------------------------------------- :: sdiv
533
530
delta |- w1 /$ w2 ~> w1 ./$ w2
534
531
535
532
536
- ---------------------------------------- :: mod
533
+ ------------------------------------- :: mod
537
534
delta |- w1 % w2 ~> w1 .% w2
538
535
539
536
@@ -573,22 +570,22 @@ defns reduce_exp :: '' ::=
573
570
delta |- w1 < w2 ~> w1 .< w2
574
571
575
572
576
- delta |- w1 <> w2 ~> w
573
+
577
574
----------------------------------------------- :: less_eq
578
- delta |- w1 <= w2 ~> w & (w1 < w2)
575
+ delta |- w1 <= w2 ~> (w1 < w2) | (w1 = w2)
579
576
580
577
581
578
582
579
----------------------------------------------- :: signed_less
583
580
delta |- w1 <$ w2 ~> w1 .<$ w2
584
581
585
- delta |- w1 <> w2 ~> w
586
- ----------------------------------------------- :: signed_less_eq
587
- delta |- w1 <=$ w2 ~> w & (w1 <$ w2)
588
582
589
- delta |- e ~> v
583
+ ----------------------------------------------------- :: signed_less_eq
584
+ delta |- w1 <=$ w2 ~> (w1 = w2) & (w1 <$ w2)
585
+
586
+ delta |- e ~> e'
590
587
---------------------------------------- :: uop
591
- delta |- uop e ~> uop v
588
+ delta |- uop e ~> uop e'
592
589
593
590
---------------------------------------- :: not_true
594
591
delta |- ~true ~> false
@@ -598,14 +595,14 @@ defns reduce_exp :: '' ::=
598
595
delta |- ~false ~> true
599
596
600
597
601
- delta |- e2 ~> v2
598
+ delta |- e2 ~> e2'
602
599
---------------------------------------- :: concat_rhs
603
- delta |- e1 @ e2 ~> e1 @ v2
600
+ delta |- e1 @ e2 ~> e1 @ e2'
604
601
605
602
606
- delta |- e1 ~> v1
603
+ delta |- e1 ~> e1'
607
604
---------------------------------------- :: concat_lhs
608
- delta |- e1 @ v2 ~> v1 @ v2
605
+ delta |- e1 @ v2 ~> e1' @ v2
609
606
610
607
---------------------------------------------- :: concat_lhs_un
611
608
delta |- unknown[str]:t @ v2 ~> unknown[str]:t
@@ -616,9 +613,9 @@ defns reduce_exp :: '' ::=
616
613
---------------------------------------- :: concat
617
614
delta |- w1 @ w2 ~> w1 .@ w2
618
615
619
- delta |- e ~> v
616
+ delta |- e ~> e'
620
617
------------------------------------------------- :: extract_reduce
621
- delta |- extract:sz1:sz2[e] ~> extract:sz1:sz2[v ]
618
+ delta |- extract:sz1:sz2[e] ~> extract:sz1:sz2[e' ]
622
619
623
620
624
621
---------------------------------------------------------- :: extract_un
@@ -627,9 +624,9 @@ defns reduce_exp :: '' ::=
627
624
------------------------------------------------------ :: extract
628
625
delta |- extract:sz1:sz2[w] ~> ext w ~hi:sz1 ~lo:sz2
629
626
630
- delta |- e ~> v
627
+ delta |- e ~> e'
631
628
--------------------------------- :: cast_reduce
632
- delta |- cast:sz[e] ~> cast:sz[v ]
629
+ delta |- cast:sz[e] ~> cast:sz[e' ]
633
630
634
631
635
632
-------------------------------------------- :: cast_low
@@ -652,11 +649,12 @@ defns reduce_stmt :: '' ::=
652
649
defn delta , word |- stmt ~> delta' , word' :: :: stmt :: '' by
653
650
654
651
655
- delta |- e ~> v
652
+ delta |- e ~>* v
656
653
----------------------------------------- :: move
657
654
delta,w |- var := e ~> delta[var <- v], w
658
655
659
- delta |- e ~> w'
656
+
657
+ delta |- e ~>* w'
660
658
---------------------------------- :: jmp
661
659
delta,w |- jmp e ~> delta, w'
662
660
@@ -669,29 +667,29 @@ defns reduce_stmt :: '' ::=
669
667
delta,w |- special(str) ~> delta,w
670
668
671
669
672
- delta |- e ~> true
670
+ delta |- e ~>* true
673
671
delta,word |- seq ~> delta',word',{}
674
672
------------------------------------- :: ifthen_true
675
673
delta,word |- if (e) seq ~> delta', word'
676
674
677
- delta |- e ~> true
675
+ delta |- e ~>* true
678
676
delta,word |- seq ~> delta',word',{}
679
677
------------------------------------- :: if_true
680
678
delta,word |- if (e) seq else seq1 ~> delta', word'
681
679
682
- delta |- e ~> false
680
+ delta |- e ~>* false
683
681
delta,word |- seq ~> delta',word',{}
684
682
------------------------------------- :: if_false
685
683
delta,word |- if (e) seq1 else seq ~> delta', word'
686
684
687
685
688
- delta1 |- e ~> true
686
+ delta1 |- e ~>* true
689
687
delta1,word1 |- seq ~> delta2,word2,{}
690
688
delta2,word2 |- while (e) seq ~> delta3,word3
691
689
--------------------------------------------- :: while
692
690
delta1,word1 |- while (e) seq ~> delta3,word3
693
691
694
- delta |- e ~> false
692
+ delta |- e ~>* false
695
693
----------------------------------------- :: while_false
696
694
delta,word |- while (e) seq ~> delta,word
697
695
@@ -714,3 +712,15 @@ defns reduce_stmt :: '' ::=
714
712
715
713
------------------------------------------------------------- :: seq_nil
716
714
delta,word |- {} ~> delta, word, {}
715
+
716
+ defns multistep_exp :: '' ::=
717
+
718
+ defn delta |- exp ~>* exp' :: :: mexp :: '' by
719
+
720
+ ---------------- :: refl
721
+ delta |- e ~>* e
722
+
723
+ delta |- e1 ~> e2
724
+ delta |- e2 ~>* e3
725
+ ------------------ :: reduce
726
+ delta |- e1 ~>* e3
0 commit comments