src/HOL/NanoJava/OpSem.thy
author wenzelm
Mon, 25 Feb 2002 20:48:14 +0100
changeset 12937 0c4fd7529467
parent 11772 cf618fe8facd
child 16417 9bc16273c2d4
permissions -rw-r--r--
clarified syntax of ``long'' statements: fixes/assumes/shows;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     1
(*  Title:      HOL/NanoJava/OpSem.thy
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     2
    ID:         $Id$
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     3
    Author:     David von Oheimb
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     4
    Copyright   2001 Technische Universitaet Muenchen
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     5
*)
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     6
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     7
header "Operational Evaluation Semantics"
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     8
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
     9
theory OpSem = State:
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    10
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    11
consts
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    12
 exec :: "(state \<times> stmt       \<times> nat \<times> state) set"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    13
 eval :: "(state \<times> expr \<times> val \<times> nat \<times> state) set"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    14
syntax (xsymbols)
11508
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    15
 exec :: "[state,stmt,    nat,state] => bool" ("_ -_-_\<rightarrow> _"  [98,90,   65,98] 89)
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    16
 eval :: "[state,expr,val,nat,state] => bool" ("_ -_\<succ>_-_\<rightarrow> _"[98,95,99,65,98] 89)
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    17
syntax
11508
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    18
 exec :: "[state,stmt,    nat,state] => bool" ("_ -_-_-> _"  [98,90,   65,98]89)
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    19
 eval :: "[state,expr,val,nat,state] => bool" ("_ -_>_-_-> _"[98,95,99,65,98]89)
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    20
translations
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    21
 "s -c  -n-> s'" == "(s, c,    n, s') \<in> exec"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    22
 "s -e>v-n-> s'" == "(s, e, v, n, s') \<in> eval"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    23
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    24
inductive exec eval intros
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    25
  Skip: "   s -Skip-n-> s"
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    26
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    27
  Comp: "[| s0 -c1-n-> s1; s1 -c2-n-> s2 |] ==>
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    28
            s0 -c1;; c2-n-> s2"
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    29
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    30
  Cond: "[| s0 -e>v-n-> s1; s1 -(if v\<noteq>Null then c1 else c2)-n-> s2 |] ==>
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    31
            s0 -If(e) c1 Else c2-n-> s2"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    32
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    33
  LoopF:"   s0<x> = Null ==>
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    34
            s0 -While(x) c-n-> s0"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    35
  LoopT:"[| s0<x> \<noteq> Null; s0 -c-n-> s1; s1 -While(x) c-n-> s2 |] ==>
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    36
            s0 -While(x) c-n-> s2"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    37
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    38
  LAcc: "   s -LAcc x>s<x>-n-> s"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    39
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    40
  LAss: "   s -e>v-n-> s' ==>
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    41
            s -x:==e-n-> lupd(x\<mapsto>v) s'"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    42
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    43
  FAcc: "   s -e>Addr a-n-> s' ==>
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    44
            s -e..f>get_field s' a f-n-> s'"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    45
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    46
  FAss: "[| s0 -e1>Addr a-n-> s1;  s1 -e2>v-n-> s2 |] ==>
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    47
            s0 -e1..f:==e2-n-> upd_obj a f v s2"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    48
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    49
  NewC: "   new_Addr s = Addr a ==>
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    50
            s -new C>Addr a-n-> new_obj a C s"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    51
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    52
  Cast: "[| s -e>v-n-> s';
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    53
            case v of Null => True | Addr a => obj_class s' a \<preceq>C C |] ==>
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    54
            s -Cast C e>v-n-> s'"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    55
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    56
  Call: "[| s0 -e1>a-n-> s1; s1 -e2>p-n-> s2; 
11772
cf618fe8facd renamed reset_locs to del_locs
oheimb
parents: 11565
diff changeset
    57
            lupd(This\<mapsto>a)(lupd(Par\<mapsto>p)(del_locs s2)) -Meth (C,m)-n-> s3
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    58
     |] ==> s0 -{C}e1..m(e2)>s3<Res>-n-> set_locs s2 s3"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    59
11497
0e66e0114d9a corrected initialization of locals, streamlined Impl
oheimb
parents: 11486
diff changeset
    60
  Meth: "[| s<This> = Addr a; D = obj_class s a; D\<preceq>C C;
0e66e0114d9a corrected initialization of locals, streamlined Impl
oheimb
parents: 11486
diff changeset
    61
            init_locs D m s -Impl (D,m)-n-> s' |] ==>
11507
4b32a46ffd29 removed imname, uncurried Meth
oheimb
parents: 11497
diff changeset
    62
            s -Meth (C,m)-n-> s'"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    63
11508
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    64
  Impl: "   s -body Cm-    n-> s' ==>
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    65
            s -Impl Cm-Suc n-> s'"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    66
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    67
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    68
inductive_cases exec_elim_cases':
11486
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    69
				  "s -Skip            -n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    70
				  "s -c1;; c2         -n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    71
				  "s -If(e) c1 Else c2-n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    72
				  "s -While(x) c      -n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    73
				  "s -x:==e           -n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    74
				  "s -e1..f:==e2      -n\<rightarrow> t"
11508
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    75
inductive_cases Meth_elim_cases:  "s -Meth Cm         -n\<rightarrow> t"
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    76
inductive_cases Impl_elim_cases:  "s -Impl Cm         -n\<rightarrow> t"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    77
lemmas exec_elim_cases = exec_elim_cases' Meth_elim_cases Impl_elim_cases
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    78
inductive_cases eval_elim_cases:
11486
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    79
				  "s -new C         \<succ>v-n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    80
				  "s -Cast C e      \<succ>v-n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    81
				  "s -LAcc x        \<succ>v-n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    82
				  "s -e..f          \<succ>v-n\<rightarrow> t"
8f32860eac3a layout, subscripts
oheimb
parents: 11476
diff changeset
    83
				  "s -{C}e1..m(e2)  \<succ>v-n\<rightarrow> t"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    84
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    85
lemma exec_eval_mono [rule_format]: 
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    86
  "(s -c  -n\<rightarrow> t \<longrightarrow> (\<forall>m. n \<le> m \<longrightarrow> s -c  -m\<rightarrow> t)) \<and>
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    87
   (s -e\<succ>v-n\<rightarrow> t \<longrightarrow> (\<forall>m. n \<le> m \<longrightarrow> s -e\<succ>v-m\<rightarrow> t))"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    88
apply (rule exec_eval.induct)
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    89
prefer 14 (* Impl *)
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    90
apply clarify
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    91
apply (rename_tac n)
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    92
apply (case_tac n)
11508
168dbdaedb71 cosmetics
oheimb
parents: 11507
diff changeset
    93
apply (blast intro:exec_eval.intros)+
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
    94
done
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    95
lemmas exec_mono = exec_eval_mono [THEN conjunct1, rule_format]
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    96
lemmas eval_mono = exec_eval_mono [THEN conjunct2, rule_format]
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    97
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    98
lemma exec_exec_max: "\<lbrakk>s1 -c1-    n1   \<rightarrow> t1 ; s2 -c2-       n2\<rightarrow> t2\<rbrakk> \<Longrightarrow> 
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
    99
                       s1 -c1-max n1 n2\<rightarrow> t1 \<and> s2 -c2-max n1 n2\<rightarrow> t2"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   100
by (fast intro: exec_mono le_maxI1 le_maxI2)
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
   101
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   102
lemma eval_exec_max: "\<lbrakk>s1 -c-    n1   \<rightarrow> t1 ; s2 -e\<succ>v-       n2\<rightarrow> t2\<rbrakk> \<Longrightarrow> 
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   103
                       s1 -c-max n1 n2\<rightarrow> t1 \<and> s2 -e\<succ>v-max n1 n2\<rightarrow> t2"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   104
by (fast intro: eval_mono exec_mono le_maxI1 le_maxI2)
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   105
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   106
lemma eval_eval_max: "\<lbrakk>s1 -e1\<succ>v1-    n1   \<rightarrow> t1 ; s2 -e2\<succ>v2-       n2\<rightarrow> t2\<rbrakk> \<Longrightarrow> 
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   107
                       s1 -e1\<succ>v1-max n1 n2\<rightarrow> t1 \<and> s2 -e2\<succ>v2-max n1 n2\<rightarrow> t2"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   108
by (fast intro: eval_mono le_maxI1 le_maxI2)
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   109
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   110
lemma eval_eval_exec_max: 
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   111
 "\<lbrakk>s1 -e1\<succ>v1-n1\<rightarrow> t1; s2 -e2\<succ>v2-n2\<rightarrow> t2; s3 -c-n3\<rightarrow> t3\<rbrakk> \<Longrightarrow> 
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   112
   s1 -e1\<succ>v1-max (max n1 n2) n3\<rightarrow> t1 \<and> 
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   113
   s2 -e2\<succ>v2-max (max n1 n2) n3\<rightarrow> t2 \<and> 
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   114
   s3 -c    -max (max n1 n2) n3\<rightarrow> t3"
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   115
apply (drule (1) eval_eval_max, erule thin_rl)
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   116
by (fast intro: exec_mono eval_mono le_maxI1 le_maxI2)
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
   117
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents: 11558
diff changeset
   118
lemma Impl_body_eq: "(\<lambda>t. \<exists>n. Z -Impl M-n\<rightarrow> t) = (\<lambda>t. \<exists>n. Z -body M-n\<rightarrow> t)"
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
   119
apply (rule ext)
11476
06c1998340a8 changed to full expressions with side effects
oheimb
parents: 11376
diff changeset
   120
apply (fast elim: exec_elim_cases intro: exec_eval.Impl)
11376
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
   121
done
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
   122
bf98ad1c22c6 added NanoJava
oheimb
parents:
diff changeset
   123
end