src/HOL/Bali/State.thy
author haftmann
Fri Nov 27 08:42:50 2009 +0100 (2009-11-27)
changeset 33965 f57c11db4ad4
parent 32960 69916a850301
child 35067 af4c18c30593
permissions -rw-r--r--
Inl and Inr now with authentic syntax
wenzelm@12857
     1
(*  Title:      HOL/Bali/State.thy
schirmer@12854
     2
    Author:     David von Oheimb
schirmer@12854
     3
*)
schirmer@12854
     4
header {* State for evaluation of Java expressions and statements *}
schirmer@12854
     5
haftmann@33965
     6
theory State
haftmann@33965
     7
imports DeclConcepts
haftmann@33965
     8
begin
schirmer@12854
     9
schirmer@12854
    10
text {*
schirmer@12854
    11
design issues:
schirmer@12854
    12
\begin{itemize}
schirmer@12854
    13
\item all kinds of objects (class instances, arrays, and class objects)
schirmer@12854
    14
  are handeled via a general object abstraction
schirmer@12854
    15
\item the heap and the map for class objects are combined into a single table
schirmer@12854
    16
  @{text "(recall (loc, obj) table \<times> (qtname, obj) table  ~=  (loc + qtname, obj) table)"}
schirmer@12854
    17
\end{itemize}
schirmer@12854
    18
*}
schirmer@12854
    19
schirmer@12854
    20
section "objects"
schirmer@12854
    21
schirmer@13688
    22
datatype  obj_tag =     --{* tag for generic object   *}
wenzelm@32960
    23
          CInst qtname  --{* class instance           *}
wenzelm@32960
    24
        | Arr  ty int   --{* array with component type and length *}
schirmer@13688
    25
    --{* | CStat qtname   the tag is irrelevant for a class object,
wenzelm@32960
    26
                           i.e. the static fields of a class,
schirmer@12925
    27
                           since its type is given already by the reference to 
schirmer@13688
    28
                           it (see below) *}
schirmer@12854
    29
wenzelm@32960
    30
types   vn   = "fspec + int"                    --{* variable name      *}
wenzelm@32960
    31
record  obj  = 
schirmer@13688
    32
          tag :: "obj_tag"                      --{* generalized object *}
haftmann@31127
    33
          "values" :: "(vn, val) table"      
schirmer@12854
    34
schirmer@12854
    35
translations 
schirmer@12854
    36
  "fspec" <= (type) "vname \<times> qtname" 
schirmer@12854
    37
  "vn"    <= (type) "fspec + int"
schirmer@12854
    38
  "obj"   <= (type) "\<lparr>tag::obj_tag, values::vn \<Rightarrow> val option\<rparr>"
schirmer@12854
    39
  "obj"   <= (type) "\<lparr>tag::obj_tag, values::vn \<Rightarrow> val option,\<dots>::'a\<rparr>"
schirmer@12854
    40
schirmer@12854
    41
constdefs
schirmer@12854
    42
  
schirmer@12854
    43
  the_Arr :: "obj option \<Rightarrow> ty \<times> int \<times> (vn, val) table"
wenzelm@14766
    44
 "the_Arr obj \<equiv> SOME (T,k,t). obj = Some \<lparr>tag=Arr T k,values=t\<rparr>"
schirmer@12854
    45
schirmer@12854
    46
lemma the_Arr_Arr [simp]: "the_Arr (Some \<lparr>tag=Arr T k,values=cs\<rparr>) = (T,k,cs)"
schirmer@12854
    47
apply (auto simp: the_Arr_def)
schirmer@12854
    48
done
schirmer@12854
    49
schirmer@12854
    50
lemma the_Arr_Arr1 [simp,intro,dest]:
schirmer@12854
    51
 "\<lbrakk>tag obj = Arr T k\<rbrakk> \<Longrightarrow> the_Arr (Some obj) = (T,k,values obj)"
schirmer@12854
    52
apply (auto simp add: the_Arr_def)
schirmer@12854
    53
done
schirmer@12854
    54
schirmer@12854
    55
constdefs
schirmer@12854
    56
schirmer@12854
    57
  upd_obj       :: "vn \<Rightarrow> val \<Rightarrow> obj \<Rightarrow> obj" 
schirmer@12854
    58
 "upd_obj n v \<equiv> \<lambda> obj . obj \<lparr>values:=(values obj)(n\<mapsto>v)\<rparr>"
schirmer@12854
    59
schirmer@12854
    60
lemma upd_obj_def2 [simp]: 
schirmer@12854
    61
  "upd_obj n v obj = obj \<lparr>values:=(values obj)(n\<mapsto>v)\<rparr>" 
schirmer@12854
    62
apply (auto simp: upd_obj_def)
schirmer@12854
    63
done
schirmer@12854
    64
schirmer@12854
    65
constdefs
schirmer@12854
    66
  obj_ty        :: "obj \<Rightarrow> ty"
schirmer@12854
    67
 "obj_ty obj    \<equiv> case tag obj of 
schirmer@12854
    68
                    CInst C \<Rightarrow> Class C 
schirmer@12854
    69
                  | Arr T k \<Rightarrow> T.[]"
schirmer@12854
    70
schirmer@12854
    71
lemma obj_ty_eq [intro!]: "obj_ty \<lparr>tag=oi,values=x\<rparr> = obj_ty \<lparr>tag=oi,values=y\<rparr>" 
schirmer@12854
    72
by (simp add: obj_ty_def)
schirmer@12854
    73
schirmer@12854
    74
schirmer@12854
    75
lemma obj_ty_eq1 [intro!,dest]: 
schirmer@12854
    76
  "tag obj = tag obj' \<Longrightarrow> obj_ty obj = obj_ty obj'" 
schirmer@12854
    77
by (simp add: obj_ty_def)
schirmer@12854
    78
schirmer@12854
    79
lemma obj_ty_cong [simp]: 
schirmer@12854
    80
  "obj_ty (obj \<lparr>values:=vs\<rparr>) = obj_ty obj" 
schirmer@12854
    81
by auto
schirmer@13688
    82
schirmer@12854
    83
lemma obj_ty_CInst [simp]: 
schirmer@12854
    84
 "obj_ty \<lparr>tag=CInst C,values=vs\<rparr> = Class C" 
schirmer@12854
    85
by (simp add: obj_ty_def)
schirmer@12854
    86
schirmer@12854
    87
lemma obj_ty_CInst1 [simp,intro!,dest]: 
schirmer@12854
    88
 "\<lbrakk>tag obj = CInst C\<rbrakk> \<Longrightarrow> obj_ty obj = Class C" 
schirmer@12854
    89
by (simp add: obj_ty_def)
schirmer@12854
    90
schirmer@12854
    91
lemma obj_ty_Arr [simp]: 
schirmer@12854
    92
 "obj_ty \<lparr>tag=Arr T i,values=vs\<rparr> = T.[]"
schirmer@12854
    93
by (simp add: obj_ty_def)
schirmer@12854
    94
schirmer@12854
    95
lemma obj_ty_Arr1 [simp,intro!,dest]: 
schirmer@12854
    96
 "\<lbrakk>tag obj = Arr T i\<rbrakk> \<Longrightarrow> obj_ty obj = T.[]"
schirmer@12854
    97
by (simp add: obj_ty_def)
schirmer@12854
    98
schirmer@12854
    99
lemma obj_ty_widenD: 
schirmer@12854
   100
 "G\<turnstile>obj_ty obj\<preceq>RefT t \<Longrightarrow> (\<exists>C. tag obj = CInst C) \<or> (\<exists>T k. tag obj = Arr T k)"
schirmer@12854
   101
apply (unfold obj_ty_def)
schirmer@12854
   102
apply (auto split add: obj_tag.split_asm)
schirmer@12854
   103
done
schirmer@12854
   104
schirmer@12854
   105
constdefs
schirmer@12854
   106
schirmer@12854
   107
  obj_class :: "obj \<Rightarrow> qtname"
schirmer@12854
   108
 "obj_class obj \<equiv> case tag obj of 
schirmer@12854
   109
                    CInst C \<Rightarrow> C 
schirmer@12854
   110
                  | Arr T k \<Rightarrow> Object"
schirmer@12854
   111
schirmer@12854
   112
schirmer@12854
   113
lemma obj_class_CInst [simp]: "obj_class \<lparr>tag=CInst C,values=vs\<rparr> = C" 
schirmer@12854
   114
by (auto simp: obj_class_def)
schirmer@12854
   115
schirmer@12854
   116
lemma obj_class_CInst1 [simp,intro!,dest]: 
schirmer@12854
   117
  "tag obj = CInst C \<Longrightarrow> obj_class obj = C" 
schirmer@12854
   118
by (auto simp: obj_class_def)
schirmer@12854
   119
schirmer@12854
   120
lemma obj_class_Arr [simp]: "obj_class \<lparr>tag=Arr T k,values=vs\<rparr> = Object" 
schirmer@12854
   121
by (auto simp: obj_class_def)
schirmer@12854
   122
schirmer@12854
   123
lemma obj_class_Arr1 [simp,intro!,dest]: 
schirmer@12854
   124
 "tag obj = Arr T k \<Longrightarrow> obj_class obj = Object" 
schirmer@12854
   125
by (auto simp: obj_class_def)
schirmer@12854
   126
schirmer@12854
   127
lemma obj_ty_obj_class: "G\<turnstile>obj_ty obj\<preceq> Class statC = G\<turnstile>obj_class obj \<preceq>\<^sub>C statC"
schirmer@12854
   128
apply (case_tac "tag obj")
schirmer@12854
   129
apply (auto simp add: obj_ty_def obj_class_def)
schirmer@12854
   130
apply (case_tac "statC = Object")
schirmer@12854
   131
apply (auto dest: widen_Array_Class)
schirmer@12854
   132
done
schirmer@12854
   133
schirmer@12854
   134
section "object references"
schirmer@12854
   135
schirmer@13688
   136
types oref = "loc + qtname"         --{* generalized object reference *}
schirmer@12854
   137
syntax
schirmer@12854
   138
  Heap  :: "loc   \<Rightarrow> oref"
schirmer@12854
   139
  Stat  :: "qtname \<Rightarrow> oref"
schirmer@12854
   140
schirmer@12854
   141
translations
haftmann@33965
   142
  "Heap" => "CONST Inl"
haftmann@33965
   143
  "Stat" => "CONST Inr"
schirmer@12854
   144
  "oref" <= (type) "loc + qtname"
schirmer@12854
   145
schirmer@12854
   146
constdefs
schirmer@12854
   147
  fields_table::
schirmer@12854
   148
    "prog \<Rightarrow> qtname \<Rightarrow> (fspec \<Rightarrow> field \<Rightarrow> bool)  \<Rightarrow> (fspec, ty) table"
schirmer@12854
   149
 "fields_table G C P 
nipkow@30235
   150
    \<equiv> Option.map type \<circ> table_of (filter (split P) (DeclConcepts.fields G C))"
schirmer@12854
   151
schirmer@12854
   152
lemma fields_table_SomeI: 
schirmer@12854
   153
"\<lbrakk>table_of (DeclConcepts.fields G C) n = Some f; P n f\<rbrakk> 
schirmer@12854
   154
 \<Longrightarrow> fields_table G C P n = Some (type f)"
schirmer@12854
   155
apply (unfold fields_table_def)
schirmer@12854
   156
apply clarsimp
schirmer@12854
   157
apply (rule exI)
schirmer@12854
   158
apply (rule conjI)
schirmer@12854
   159
apply (erule map_of_filter_in)
schirmer@12854
   160
apply assumption
schirmer@12854
   161
apply simp
schirmer@12854
   162
done
schirmer@12854
   163
schirmer@12854
   164
(* unused *)
schirmer@12854
   165
lemma fields_table_SomeD': "fields_table G C P fn = Some T \<Longrightarrow>  
schirmer@12854
   166
  \<exists>f. (fn,f)\<in>set(DeclConcepts.fields G C) \<and> type f = T"
schirmer@12854
   167
apply (unfold fields_table_def)
schirmer@12854
   168
apply clarsimp
schirmer@12854
   169
apply (drule map_of_SomeD)
schirmer@12854
   170
apply auto
schirmer@12854
   171
done
schirmer@12854
   172
schirmer@12854
   173
lemma fields_table_SomeD: 
schirmer@12854
   174
"\<lbrakk>fields_table G C P fn = Some T; unique (DeclConcepts.fields G C)\<rbrakk> \<Longrightarrow>  
schirmer@12854
   175
  \<exists>f. table_of (DeclConcepts.fields G C) fn = Some f \<and> type f = T"
schirmer@12854
   176
apply (unfold fields_table_def)
schirmer@12854
   177
apply clarsimp
schirmer@12854
   178
apply (rule exI)
schirmer@12854
   179
apply (rule conjI)
schirmer@12854
   180
apply (erule table_of_filter_unique_SomeD)
schirmer@12854
   181
apply assumption
schirmer@12854
   182
apply simp
schirmer@12854
   183
done
schirmer@12854
   184
schirmer@12854
   185
constdefs
schirmer@12854
   186
  in_bounds :: "int \<Rightarrow> int \<Rightarrow> bool"            ("(_/ in'_bounds _)" [50, 51] 50)
schirmer@12854
   187
 "i in_bounds k \<equiv> 0 \<le> i \<and> i < k"
schirmer@12854
   188
schirmer@12854
   189
  arr_comps :: "'a \<Rightarrow> int \<Rightarrow> int \<Rightarrow> 'a option"
schirmer@12854
   190
 "arr_comps T k \<equiv> \<lambda>i. if i in_bounds k then Some T else None"
schirmer@12854
   191
  
schirmer@12854
   192
  var_tys       :: "prog \<Rightarrow> obj_tag \<Rightarrow> oref \<Rightarrow> (vn, ty) table"
schirmer@12854
   193
"var_tys G oi r 
schirmer@12854
   194
  \<equiv> case r of 
schirmer@12854
   195
      Heap a \<Rightarrow> (case oi of 
schirmer@12854
   196
                   CInst C \<Rightarrow> fields_table G C (\<lambda>n f. \<not>static f) (+) empty
schirmer@12854
   197
                 | Arr T k \<Rightarrow> empty (+) arr_comps T k)
schirmer@12854
   198
    | Stat C \<Rightarrow> fields_table G C (\<lambda>fn f. declclassf fn = C \<and> static f) 
schirmer@12854
   199
                (+) empty"
schirmer@12854
   200
schirmer@12854
   201
lemma var_tys_Some_eq: 
schirmer@12854
   202
 "var_tys G oi r n = Some T 
schirmer@12854
   203
  = (case r of 
schirmer@12854
   204
       Inl a \<Rightarrow> (case oi of  
schirmer@12854
   205
                   CInst C \<Rightarrow> (\<exists>nt. n = Inl nt \<and> fields_table G C (\<lambda>n f. 
schirmer@12854
   206
                               \<not>static f) nt = Some T)  
schirmer@12854
   207
                 | Arr t k \<Rightarrow> (\<exists> i. n = Inr i  \<and> i in_bounds k \<and> t = T))  
schirmer@12854
   208
     | Inr C \<Rightarrow> (\<exists>nt. n = Inl nt \<and> 
schirmer@12854
   209
                 fields_table G C (\<lambda>fn f. declclassf fn = C \<and> static f) nt 
schirmer@12854
   210
                  = Some T))"
schirmer@12854
   211
apply (unfold var_tys_def arr_comps_def)
schirmer@12854
   212
apply (force split add: sum.split_asm sum.split obj_tag.split)
schirmer@12854
   213
done
schirmer@12854
   214
schirmer@12854
   215
schirmer@12854
   216
section "stores"
schirmer@12854
   217
wenzelm@32960
   218
types   globs               --{* global variables: heap and static variables *}
wenzelm@32960
   219
        = "(oref , obj) table"
wenzelm@32960
   220
        heap
wenzelm@32960
   221
        = "(loc  , obj) table"
wenzelm@32960
   222
(*      locals                   
wenzelm@32960
   223
        = "(lname, val) table" *) (* defined in Value.thy local variables *)
schirmer@12854
   224
schirmer@12854
   225
translations
schirmer@12854
   226
 "globs"  <= (type) "(oref , obj) table"
schirmer@12854
   227
 "heap"   <= (type) "(loc  , obj) table"
schirmer@13337
   228
(*  "locals" <= (type) "(lname, val) table" *)
schirmer@12854
   229
schirmer@12854
   230
datatype st = (* pure state, i.e. contents of all variables *)
wenzelm@32960
   231
         st globs locals
schirmer@12854
   232
schirmer@12854
   233
subsection "access"
schirmer@12854
   234
schirmer@12854
   235
constdefs
schirmer@12854
   236
schirmer@12854
   237
  globs  :: "st \<Rightarrow> globs"
schirmer@12854
   238
 "globs  \<equiv> st_case (\<lambda>g l. g)"
schirmer@12854
   239
  
schirmer@12854
   240
  locals :: "st \<Rightarrow> locals"
schirmer@12854
   241
 "locals \<equiv> st_case (\<lambda>g l. l)"
schirmer@12854
   242
schirmer@12854
   243
  heap   :: "st \<Rightarrow> heap"
schirmer@12854
   244
 "heap s \<equiv> globs s \<circ> Heap"
schirmer@12854
   245
schirmer@12854
   246
schirmer@12854
   247
lemma globs_def2 [simp]: " globs (st g l) = g"
schirmer@12854
   248
by (simp add: globs_def)
schirmer@12854
   249
schirmer@12854
   250
lemma locals_def2 [simp]: "locals (st g l) = l"
schirmer@12854
   251
by (simp add: locals_def)
schirmer@12854
   252
schirmer@12854
   253
lemma heap_def2 [simp]:  "heap s a=globs s (Heap a)"
schirmer@12854
   254
by (simp add: heap_def)
schirmer@12854
   255
schirmer@12854
   256
schirmer@12854
   257
syntax
schirmer@12854
   258
  val_this     :: "st \<Rightarrow> val"
schirmer@12854
   259
  lookup_obj   :: "st \<Rightarrow> val \<Rightarrow> obj"
schirmer@12854
   260
schirmer@12854
   261
translations
nipkow@30235
   262
 "val_this s"       == "CONST the (locals s This)" 
nipkow@30235
   263
 "lookup_obj s a'"  == "CONST the (heap s (the_Addr a'))"
schirmer@12854
   264
schirmer@12854
   265
subsection "memory allocation"
schirmer@12854
   266
schirmer@12854
   267
constdefs
schirmer@12854
   268
  new_Addr     :: "heap \<Rightarrow> loc option"
wenzelm@14766
   269
 "new_Addr h   \<equiv> if (\<forall>a. h a \<noteq> None) then None else Some (SOME a. h a = None)"
schirmer@12854
   270
schirmer@12854
   271
lemma new_AddrD: "new_Addr h = Some a \<Longrightarrow> h a = None"
nipkow@18576
   272
apply (auto simp add: new_Addr_def)
paulson@18447
   273
apply (erule someI) 
schirmer@12854
   274
done
schirmer@12854
   275
schirmer@12854
   276
lemma new_AddrD2: "new_Addr h = Some a \<Longrightarrow> \<forall>b. h b \<noteq> None \<longrightarrow> b \<noteq> a"
schirmer@12854
   277
apply (drule new_AddrD)
schirmer@12854
   278
apply auto
schirmer@12854
   279
done
schirmer@12854
   280
schirmer@12854
   281
lemma new_Addr_SomeI: "h a = None \<Longrightarrow> \<exists>b. new_Addr h = Some b \<and> h b = None"
nipkow@18576
   282
apply (simp add: new_Addr_def)
paulson@18447
   283
apply (fast intro: someI2)
schirmer@12854
   284
done
schirmer@12854
   285
schirmer@12854
   286
schirmer@12854
   287
subsection "initialization"
schirmer@12854
   288
schirmer@12854
   289
syntax
schirmer@12854
   290
schirmer@12854
   291
  init_vals     :: "('a, ty) table \<Rightarrow> ('a, val) table"
schirmer@12854
   292
schirmer@12854
   293
translations
nipkow@30235
   294
 "init_vals vs"    == "CONST Option.map default_val \<circ> vs"
schirmer@12854
   295
schirmer@12854
   296
lemma init_arr_comps_base [simp]: "init_vals (arr_comps T 0) = empty"
schirmer@12854
   297
apply (unfold arr_comps_def in_bounds_def)
schirmer@12854
   298
apply (rule ext)
schirmer@12854
   299
apply auto
schirmer@12854
   300
done
schirmer@12854
   301
schirmer@12854
   302
lemma init_arr_comps_step [simp]: 
schirmer@12854
   303
"0 < j \<Longrightarrow> init_vals (arr_comps T  j    ) =  
schirmer@12854
   304
           init_vals (arr_comps T (j - 1))(j - 1\<mapsto>default_val T)"
schirmer@12854
   305
apply (unfold arr_comps_def in_bounds_def)
schirmer@12854
   306
apply (rule ext)
schirmer@12854
   307
apply auto
schirmer@12854
   308
done
schirmer@12854
   309
schirmer@12854
   310
subsection "update"
schirmer@12854
   311
schirmer@12854
   312
constdefs
schirmer@12854
   313
  gupd       :: "oref  \<Rightarrow> obj \<Rightarrow> st \<Rightarrow> st"        ("gupd'(_\<mapsto>_')"[10,10]1000)
schirmer@12854
   314
 "gupd r obj  \<equiv> st_case (\<lambda>g l. st (g(r\<mapsto>obj)) l)"
schirmer@12854
   315
schirmer@12854
   316
  lupd       :: "lname \<Rightarrow> val \<Rightarrow> st \<Rightarrow> st"        ("lupd'(_\<mapsto>_')"[10,10]1000)
schirmer@12854
   317
 "lupd vn v   \<equiv> st_case (\<lambda>g l. st g (l(vn\<mapsto>v)))"
schirmer@12854
   318
nipkow@30235
   319
  upd_gobj   :: "oref \<Rightarrow> vn \<Rightarrow> val \<Rightarrow> st \<Rightarrow> st"
schirmer@12854
   320
 "upd_gobj r n v \<equiv> st_case (\<lambda>g l. st (chg_map (upd_obj n v) r g) l)"
schirmer@12854
   321
schirmer@12854
   322
  set_locals  :: "locals \<Rightarrow> st \<Rightarrow> st"
schirmer@12854
   323
 "set_locals l \<equiv> st_case (\<lambda>g l'. st g l)"
nipkow@30235
   324
schirmer@12854
   325
  init_obj    :: "prog \<Rightarrow> obj_tag \<Rightarrow> oref \<Rightarrow> st \<Rightarrow> st"
schirmer@12854
   326
 "init_obj G oi r \<equiv> gupd(r\<mapsto>\<lparr>tag=oi, values=init_vals (var_tys G oi r)\<rparr>)"
schirmer@12854
   327
schirmer@12854
   328
syntax
schirmer@12854
   329
  init_class_obj :: "prog \<Rightarrow> qtname \<Rightarrow> st \<Rightarrow> st"
schirmer@12854
   330
schirmer@12854
   331
translations
haftmann@33965
   332
 "init_class_obj G C" == "init_obj G CONST undefined (CONST Inr C)"
schirmer@12854
   333
schirmer@12854
   334
lemma gupd_def2 [simp]: "gupd(r\<mapsto>obj) (st g l) = st (g(r\<mapsto>obj)) l"
schirmer@12854
   335
apply (unfold gupd_def)
schirmer@12854
   336
apply (simp (no_asm))
schirmer@12854
   337
done
schirmer@12854
   338
schirmer@12854
   339
lemma lupd_def2 [simp]: "lupd(vn\<mapsto>v) (st g l) = st g (l(vn\<mapsto>v))"
schirmer@12854
   340
apply (unfold lupd_def)
schirmer@12854
   341
apply (simp (no_asm))
schirmer@12854
   342
done
schirmer@12854
   343
schirmer@12854
   344
lemma globs_gupd [simp]: "globs  (gupd(r\<mapsto>obj) s) = globs s(r\<mapsto>obj)"
schirmer@12854
   345
apply (induct "s")
schirmer@12854
   346
by (simp add: gupd_def)
schirmer@12854
   347
schirmer@12854
   348
lemma globs_lupd [simp]: "globs  (lupd(vn\<mapsto>v ) s) = globs  s"
schirmer@12854
   349
apply (induct "s")
schirmer@12854
   350
by (simp add: lupd_def)
schirmer@12854
   351
schirmer@12854
   352
lemma locals_gupd [simp]: "locals (gupd(r\<mapsto>obj) s) = locals s"
schirmer@12854
   353
apply (induct "s")
schirmer@12854
   354
by (simp add: gupd_def)
schirmer@12854
   355
schirmer@12854
   356
lemma locals_lupd [simp]: "locals (lupd(vn\<mapsto>v ) s) = locals s(vn\<mapsto>v )"
schirmer@12854
   357
apply (induct "s")
schirmer@12854
   358
by (simp add: lupd_def)
schirmer@12854
   359
schirmer@12854
   360
lemma globs_upd_gobj_new [rule_format (no_asm), simp]: 
schirmer@12854
   361
  "globs s r = None \<longrightarrow> globs (upd_gobj r n v s) = globs s"
schirmer@12854
   362
apply (unfold upd_gobj_def)
schirmer@12854
   363
apply (induct "s")
schirmer@12854
   364
apply auto
schirmer@12854
   365
done
schirmer@12854
   366
schirmer@12854
   367
lemma globs_upd_gobj_upd [rule_format (no_asm), simp]: 
schirmer@12854
   368
"globs s r=Some obj\<longrightarrow> globs (upd_gobj r n v s) = globs s(r\<mapsto>upd_obj n v obj)"
schirmer@12854
   369
apply (unfold upd_gobj_def)
schirmer@12854
   370
apply (induct "s")
schirmer@12854
   371
apply auto
schirmer@12854
   372
done
schirmer@12854
   373
schirmer@12854
   374
lemma locals_upd_gobj [simp]: "locals (upd_gobj r n v s) = locals s"
schirmer@12854
   375
apply (induct "s")
schirmer@12854
   376
by (simp add: upd_gobj_def) 
schirmer@12854
   377
schirmer@12854
   378
schirmer@12854
   379
lemma globs_init_obj [simp]: "globs (init_obj G oi r s) t =  
schirmer@12854
   380
  (if t=r then Some \<lparr>tag=oi,values=init_vals (var_tys G oi r)\<rparr> else globs s t)"
schirmer@12854
   381
apply (unfold init_obj_def)
schirmer@12854
   382
apply (simp (no_asm))
schirmer@12854
   383
done
schirmer@12854
   384
schirmer@12854
   385
lemma locals_init_obj [simp]: "locals (init_obj G oi r s) = locals s"
schirmer@12854
   386
by (simp add: init_obj_def)
schirmer@12854
   387
  
schirmer@12854
   388
lemma surjective_st [simp]: "st (globs s) (locals s) = s"
schirmer@12854
   389
apply (induct "s")
schirmer@12854
   390
by auto
schirmer@12854
   391
schirmer@12854
   392
lemma surjective_st_init_obj: 
schirmer@12854
   393
 "st (globs (init_obj G oi r s)) (locals s) = init_obj G oi r s"
schirmer@12854
   394
apply (subst locals_init_obj [THEN sym])
schirmer@12854
   395
apply (rule surjective_st)
schirmer@12854
   396
done
schirmer@12854
   397
schirmer@12854
   398
lemma heap_heap_upd [simp]: 
schirmer@12854
   399
  "heap (st (g(Inl a\<mapsto>obj)) l) = heap (st g l)(a\<mapsto>obj)"
schirmer@12854
   400
apply (rule ext)
schirmer@12854
   401
apply (simp (no_asm))
schirmer@12854
   402
done
schirmer@12854
   403
lemma heap_stat_upd [simp]: "heap (st (g(Inr C\<mapsto>obj)) l) = heap (st g l)"
schirmer@12854
   404
apply (rule ext)
schirmer@12854
   405
apply (simp (no_asm))
schirmer@12854
   406
done
schirmer@12854
   407
lemma heap_local_upd [simp]: "heap (st g (l(vn\<mapsto>v))) = heap (st g l)"
schirmer@12854
   408
apply (rule ext)
schirmer@12854
   409
apply (simp (no_asm))
schirmer@12854
   410
done
schirmer@12854
   411
schirmer@12854
   412
lemma heap_gupd_Heap [simp]: "heap (gupd(Heap a\<mapsto>obj) s) = heap s(a\<mapsto>obj)"
schirmer@12854
   413
apply (rule ext)
schirmer@12854
   414
apply (simp (no_asm))
schirmer@12854
   415
done
schirmer@12854
   416
lemma heap_gupd_Stat [simp]: "heap (gupd(Stat C\<mapsto>obj) s) = heap s"
schirmer@12854
   417
apply (rule ext)
schirmer@12854
   418
apply (simp (no_asm))
schirmer@12854
   419
done
schirmer@12854
   420
lemma heap_lupd [simp]: "heap (lupd(vn\<mapsto>v) s) = heap s"
schirmer@12854
   421
apply (rule ext)
schirmer@12854
   422
apply (simp (no_asm))
schirmer@12854
   423
done
schirmer@12854
   424
schirmer@12854
   425
lemma heap_upd_gobj_Stat [simp]: "heap (upd_gobj (Stat C) n v s) = heap s"
schirmer@12854
   426
apply (rule ext)
schirmer@12854
   427
apply (simp (no_asm))
schirmer@12854
   428
apply (case_tac "globs s (Stat C)")
schirmer@12854
   429
apply  auto
schirmer@12854
   430
done
schirmer@12854
   431
schirmer@12854
   432
lemma set_locals_def2 [simp]: "set_locals l (st g l') = st g l"
schirmer@12854
   433
apply (unfold set_locals_def)
schirmer@12854
   434
apply (simp (no_asm))
schirmer@12854
   435
done
schirmer@12854
   436
schirmer@12854
   437
lemma set_locals_id [simp]: "set_locals (locals s) s = s"
schirmer@12854
   438
apply (unfold set_locals_def)
schirmer@12854
   439
apply (induct_tac "s")
schirmer@12854
   440
apply (simp (no_asm))
schirmer@12854
   441
done
schirmer@12854
   442
schirmer@12854
   443
lemma set_set_locals [simp]: "set_locals l (set_locals l' s) = set_locals l s"
schirmer@12854
   444
apply (unfold set_locals_def)
schirmer@12854
   445
apply (induct_tac "s")
schirmer@12854
   446
apply (simp (no_asm))
schirmer@12854
   447
done
schirmer@12854
   448
schirmer@12854
   449
lemma locals_set_locals [simp]: "locals (set_locals l s) = l"
schirmer@12854
   450
apply (unfold set_locals_def)
schirmer@12854
   451
apply (induct_tac "s")
schirmer@12854
   452
apply (simp (no_asm))
schirmer@12854
   453
done
schirmer@12854
   454
schirmer@12854
   455
lemma globs_set_locals [simp]: "globs (set_locals l s) = globs s"
schirmer@12854
   456
apply (unfold set_locals_def)
schirmer@12854
   457
apply (induct_tac "s")
schirmer@12854
   458
apply (simp (no_asm))
schirmer@12854
   459
done
schirmer@12854
   460
schirmer@12854
   461
lemma heap_set_locals [simp]: "heap (set_locals l s) = heap s"
schirmer@12854
   462
apply (unfold heap_def)
schirmer@12854
   463
apply (induct_tac "s")
schirmer@12854
   464
apply (simp (no_asm))
schirmer@12854
   465
done
schirmer@12854
   466
schirmer@12854
   467
schirmer@12854
   468
section "abrupt completion"
schirmer@12854
   469
schirmer@12854
   470
schirmer@12854
   471
schirmer@12854
   472
consts
schirmer@12854
   473
schirmer@12854
   474
  the_Xcpt :: "abrupt \<Rightarrow> xcpt"
schirmer@12854
   475
  the_Jump :: "abrupt => jump"
schirmer@12854
   476
  the_Loc  :: "xcpt \<Rightarrow> loc"
schirmer@12854
   477
  the_Std  :: "xcpt \<Rightarrow> xname"
schirmer@12854
   478
schirmer@12854
   479
primrec "the_Xcpt (Xcpt x) = x"
schirmer@12854
   480
primrec "the_Jump (Jump j) = j"
schirmer@12854
   481
primrec "the_Loc (Loc a) = a"
schirmer@12854
   482
primrec "the_Std (Std x) = x"
schirmer@12854
   483
schirmer@13337
   484
wenzelm@32960
   485
        
schirmer@12854
   486
schirmer@12854
   487
constdefs
schirmer@12854
   488
  abrupt_if    :: "bool \<Rightarrow> abopt \<Rightarrow> abopt \<Rightarrow> abopt"
schirmer@12854
   489
 "abrupt_if c x' x \<equiv> if c \<and> (x = None) then x' else x"
schirmer@12854
   490
schirmer@12854
   491
lemma abrupt_if_True_None [simp]: "abrupt_if True x None = x"
schirmer@12854
   492
by (simp add: abrupt_if_def)
schirmer@12854
   493
schirmer@12854
   494
lemma abrupt_if_True_not_None [simp]: "x \<noteq> None \<Longrightarrow> abrupt_if True x y \<noteq> None"
schirmer@12854
   495
by (simp add: abrupt_if_def)
schirmer@12854
   496
schirmer@12854
   497
lemma abrupt_if_False [simp]: "abrupt_if False x y = y"
schirmer@12854
   498
by (simp add: abrupt_if_def)
schirmer@12854
   499
schirmer@12854
   500
lemma abrupt_if_Some [simp]: "abrupt_if c x (Some y) = Some y"
schirmer@12854
   501
by (simp add: abrupt_if_def)
schirmer@12854
   502
schirmer@12854
   503
lemma abrupt_if_not_None [simp]: "y \<noteq> None \<Longrightarrow> abrupt_if c x y = y"
schirmer@12854
   504
apply (simp add: abrupt_if_def)
schirmer@12854
   505
by auto
schirmer@12854
   506
schirmer@12854
   507
schirmer@12854
   508
lemma split_abrupt_if: 
schirmer@12854
   509
"P (abrupt_if c x' x) = 
schirmer@12854
   510
      ((c \<and> x = None \<longrightarrow> P x') \<and> (\<not> (c \<and> x = None) \<longrightarrow> P x))"
schirmer@12854
   511
apply (unfold abrupt_if_def)
schirmer@12854
   512
apply (split split_if)
schirmer@12854
   513
apply auto
schirmer@12854
   514
done
schirmer@12854
   515
schirmer@12854
   516
syntax
schirmer@12854
   517
schirmer@12854
   518
  raise_if :: "bool \<Rightarrow> xname \<Rightarrow> abopt \<Rightarrow> abopt"
schirmer@12854
   519
  np       :: "val  \<spacespace>        \<Rightarrow> abopt \<Rightarrow> abopt"
schirmer@12854
   520
  check_neg:: "val  \<spacespace>        \<Rightarrow> abopt \<Rightarrow> abopt"
schirmer@12925
   521
  error_if :: "bool \<Rightarrow> error \<Rightarrow> abopt \<Rightarrow> abopt"
schirmer@12854
   522
  
schirmer@12854
   523
translations
schirmer@12854
   524
schirmer@12854
   525
 "raise_if c xn" == "abrupt_if c (Some (Xcpt (Std xn)))"
schirmer@12854
   526
 "np v"          == "raise_if (v = Null)      NullPointer"
schirmer@12854
   527
 "check_neg i'"  == "raise_if (the_Intg i'<0) NegArrSize"
schirmer@12925
   528
 "error_if c e"  == "abrupt_if c (Some (Error e))"
schirmer@12854
   529
schirmer@12854
   530
lemma raise_if_None [simp]: "(raise_if c x y = None) = (\<not>c \<and> y = None)"
schirmer@12854
   531
apply (simp add: abrupt_if_def)
schirmer@12854
   532
by auto
schirmer@12854
   533
declare raise_if_None [THEN iffD1, dest!]
schirmer@12854
   534
schirmer@12854
   535
lemma if_raise_if_None [simp]: 
schirmer@12854
   536
  "((if b then y else raise_if c x y) = None) = ((c \<longrightarrow> b) \<and> y = None)"
schirmer@12854
   537
apply (simp add: abrupt_if_def)
schirmer@12854
   538
apply auto
schirmer@12854
   539
done
schirmer@12854
   540
schirmer@12854
   541
lemma raise_if_SomeD [dest!]:
schirmer@12854
   542
  "raise_if c x y = Some z \<Longrightarrow> c \<and> z=(Xcpt (Std x)) \<and> y=None \<or> (y=Some z)"
schirmer@12854
   543
apply (case_tac y)
schirmer@12854
   544
apply (case_tac c)
schirmer@12854
   545
apply (simp add: abrupt_if_def)
schirmer@12854
   546
apply (simp add: abrupt_if_def)
schirmer@12854
   547
apply auto
schirmer@12854
   548
done
schirmer@12854
   549
schirmer@12925
   550
lemma error_if_None [simp]: "(error_if c e y = None) = (\<not>c \<and> y = None)"
schirmer@12925
   551
apply (simp add: abrupt_if_def)
schirmer@12925
   552
by auto
schirmer@12925
   553
declare error_if_None [THEN iffD1, dest!]
schirmer@12925
   554
schirmer@12925
   555
lemma if_error_if_None [simp]: 
schirmer@12925
   556
  "((if b then y else error_if c e y) = None) = ((c \<longrightarrow> b) \<and> y = None)"
schirmer@12925
   557
apply (simp add: abrupt_if_def)
schirmer@12925
   558
apply auto
schirmer@12925
   559
done
schirmer@12925
   560
wenzelm@13524
   561
lemma error_if_SomeD [dest!]:
schirmer@12925
   562
  "error_if c e y = Some z \<Longrightarrow> c \<and> z=(Error e) \<and> y=None \<or> (y=Some z)"
schirmer@12925
   563
apply (case_tac y)
schirmer@12925
   564
apply (case_tac c)
schirmer@12925
   565
apply (simp add: abrupt_if_def)
schirmer@12925
   566
apply (simp add: abrupt_if_def)
schirmer@12925
   567
apply auto
schirmer@12925
   568
done
schirmer@12925
   569
schirmer@12854
   570
constdefs
schirmer@12854
   571
   absorb :: "jump \<Rightarrow> abopt \<Rightarrow> abopt"
schirmer@12854
   572
  "absorb j a \<equiv> if a=Some (Jump j) then None else a"
schirmer@12854
   573
schirmer@12854
   574
lemma absorb_SomeD [dest!]: "absorb j a = Some x \<Longrightarrow> a = Some x"
schirmer@12854
   575
by (auto simp add: absorb_def)
schirmer@12854
   576
schirmer@12854
   577
lemma absorb_same [simp]: "absorb j (Some (Jump j)) = None"
schirmer@12854
   578
by (auto simp add: absorb_def)
schirmer@12854
   579
schirmer@12854
   580
lemma absorb_other [simp]: "a \<noteq> Some (Jump j) \<Longrightarrow> absorb j a = a"
schirmer@12854
   581
by (auto simp add: absorb_def)
schirmer@12854
   582
schirmer@13688
   583
lemma absorb_Some_NoneD: "absorb j (Some abr) = None \<Longrightarrow> abr = Jump j"
schirmer@13688
   584
  by (simp add: absorb_def)
schirmer@13688
   585
schirmer@13688
   586
lemma absorb_Some_JumpD: "absorb j s = Some (Jump j') \<Longrightarrow> j'\<noteq>j"
schirmer@13688
   587
  by (simp add: absorb_def)
schirmer@13688
   588
schirmer@12854
   589
schirmer@12854
   590
section "full program state"
schirmer@12854
   591
schirmer@12854
   592
types
schirmer@13688
   593
  state = "abopt \<times> st"          --{* state including abruption information *}
schirmer@12854
   594
schirmer@12854
   595
syntax 
schirmer@12854
   596
  Norm   :: "st \<Rightarrow> state"
schirmer@12854
   597
  abrupt :: "state \<Rightarrow> abopt"
schirmer@12854
   598
  store  :: "state \<Rightarrow> st"
schirmer@12854
   599
schirmer@12854
   600
translations
schirmer@12854
   601
   
schirmer@12854
   602
  "Norm s"     == "(None,s)" 
schirmer@12854
   603
  "abrupt"     => "fst"
schirmer@12854
   604
  "store"      => "snd"
schirmer@12854
   605
  "abopt"       <= (type) "State.abrupt option"
schirmer@12854
   606
  "abopt"       <= (type) "abrupt option"
schirmer@12854
   607
  "state"      <= (type) "abopt \<times> State.st"
schirmer@12854
   608
  "state"      <= (type) "abopt \<times> st"
schirmer@12854
   609
schirmer@12854
   610
schirmer@12854
   611
schirmer@12854
   612
lemma single_stateE: "\<forall>Z. Z = (s::state) \<Longrightarrow> False"
schirmer@12854
   613
apply (erule_tac x = "(Some k,y)" in all_dupE)
schirmer@12854
   614
apply (erule_tac x = "(None,y)" in allE)
schirmer@12854
   615
apply clarify
schirmer@12854
   616
done
schirmer@12854
   617
schirmer@12854
   618
lemma state_not_single: "All (op = (x::state)) \<Longrightarrow> R"
schirmer@12854
   619
apply (drule_tac x = "(if abrupt x = None then Some ?x else None,?y)" in spec)
schirmer@12854
   620
apply clarsimp
schirmer@12854
   621
done
schirmer@12854
   622
schirmer@12854
   623
constdefs
schirmer@12854
   624
schirmer@12854
   625
  normal     :: "state \<Rightarrow> bool"
schirmer@12854
   626
 "normal \<equiv> \<lambda>s. abrupt s = None"
schirmer@12854
   627
schirmer@12854
   628
lemma normal_def2 [simp]: "normal s = (abrupt s = None)"
schirmer@12854
   629
apply (unfold normal_def)
schirmer@12854
   630
apply (simp (no_asm))
schirmer@12854
   631
done
schirmer@12854
   632
schirmer@12854
   633
constdefs
schirmer@12854
   634
  heap_free :: "nat \<Rightarrow> state \<Rightarrow> bool"
schirmer@12854
   635
 "heap_free n \<equiv> \<lambda>s. atleast_free (heap (store s)) n"
schirmer@12854
   636
schirmer@12854
   637
lemma heap_free_def2 [simp]: "heap_free n s = atleast_free (heap (store s)) n"
schirmer@12854
   638
apply (unfold heap_free_def)
schirmer@12854
   639
apply simp
schirmer@12854
   640
done
schirmer@12854
   641
schirmer@12854
   642
subsection "update"
schirmer@12854
   643
schirmer@12854
   644
constdefs
schirmer@12854
   645
 
schirmer@12854
   646
  abupd     :: "(abopt \<Rightarrow> abopt) \<Rightarrow> state \<Rightarrow> state"
schirmer@12854
   647
 "abupd f \<equiv> prod_fun f id"
schirmer@12854
   648
schirmer@12854
   649
  supd     :: "(st \<Rightarrow> st) \<Rightarrow> state \<Rightarrow> state" 
schirmer@12854
   650
 "supd \<equiv> prod_fun id"
schirmer@12854
   651
  
schirmer@12854
   652
lemma abupd_def2 [simp]: "abupd f (x,s) = (f x,s)"
schirmer@12854
   653
by (simp add: abupd_def)
schirmer@12854
   654
schirmer@12854
   655
lemma abupd_abrupt_if_False [simp]: "\<And> s. abupd (abrupt_if False xo) s = s"
schirmer@12854
   656
by simp
schirmer@12854
   657
schirmer@12854
   658
lemma supd_def2 [simp]: "supd f (x,s) = (x,f s)"
schirmer@12854
   659
by (simp add: supd_def)
schirmer@12854
   660
schirmer@12854
   661
lemma supd_lupd [simp]: 
schirmer@12854
   662
 "\<And> s. supd (lupd vn v ) s = (abrupt s,lupd vn v (store s))"
schirmer@12854
   663
apply (simp (no_asm_simp) only: split_tupled_all)
schirmer@12854
   664
apply (simp (no_asm))
schirmer@12854
   665
done
schirmer@12854
   666
schirmer@12854
   667
schirmer@12854
   668
lemma supd_gupd [simp]: 
schirmer@12854
   669
 "\<And> s. supd (gupd r obj) s = (abrupt s,gupd r obj (store s))"
schirmer@12854
   670
apply (simp (no_asm_simp) only: split_tupled_all)
schirmer@12854
   671
apply (simp (no_asm))
schirmer@12854
   672
done
schirmer@12854
   673
schirmer@12854
   674
lemma supd_init_obj [simp]: 
schirmer@12854
   675
 "supd (init_obj G oi r) s = (abrupt s,init_obj G oi r (store s))"
schirmer@12854
   676
apply (unfold init_obj_def)
schirmer@12854
   677
apply (simp (no_asm))
schirmer@12854
   678
done
schirmer@12854
   679
schirmer@13688
   680
lemma abupd_store_invariant [simp]: "store (abupd f s) = store s"
schirmer@13688
   681
  by (cases s) simp
schirmer@13688
   682
schirmer@13688
   683
lemma supd_abrupt_invariant [simp]: "abrupt (supd f s) = abrupt s"
schirmer@13688
   684
  by (cases s) simp
schirmer@13688
   685
schirmer@12854
   686
syntax
schirmer@12854
   687
schirmer@12854
   688
  set_lvars     :: "locals \<Rightarrow> state \<Rightarrow> state"
schirmer@12854
   689
  restore_lvars :: "state  \<Rightarrow> state \<Rightarrow> state"
schirmer@12854
   690
  
schirmer@12854
   691
translations
schirmer@12854
   692
schirmer@12854
   693
 "set_lvars l" == "supd (set_locals l)"
schirmer@12854
   694
 "restore_lvars s' s" == "set_lvars (locals (store s')) s"
schirmer@12854
   695
schirmer@12854
   696
lemma set_set_lvars [simp]: "\<And> s. set_lvars l (set_lvars l' s) = set_lvars l s"
schirmer@12854
   697
apply (simp (no_asm_simp) only: split_tupled_all)
schirmer@12854
   698
apply (simp (no_asm))
schirmer@12854
   699
done
schirmer@12854
   700
schirmer@12854
   701
lemma set_lvars_id [simp]: "\<And> s. set_lvars (locals (store s)) s = s"
schirmer@12854
   702
apply (simp (no_asm_simp) only: split_tupled_all)
schirmer@12854
   703
apply (simp (no_asm))
schirmer@12854
   704
done
schirmer@12854
   705
schirmer@12854
   706
section "initialisation test"
schirmer@12854
   707
schirmer@12854
   708
constdefs
schirmer@12854
   709
schirmer@12854
   710
  inited   :: "qtname \<Rightarrow> globs \<Rightarrow> bool"
schirmer@12854
   711
 "inited C g \<equiv> g (Stat C) \<noteq> None"
schirmer@12854
   712
schirmer@12854
   713
  initd    :: "qtname \<Rightarrow> state \<Rightarrow> bool"
schirmer@12854
   714
 "initd C \<equiv> inited C \<circ> globs \<circ> store"
schirmer@12854
   715
schirmer@12854
   716
lemma not_inited_empty [simp]: "\<not>inited C empty"
schirmer@12854
   717
apply (unfold inited_def)
schirmer@12854
   718
apply (simp (no_asm))
schirmer@12854
   719
done
schirmer@12854
   720
schirmer@12854
   721
lemma inited_gupdate [simp]: "inited C (g(r\<mapsto>obj)) = (inited C g \<or> r = Stat C)"
schirmer@12854
   722
apply (unfold inited_def)
schirmer@12854
   723
apply (auto split add: st.split)
schirmer@12854
   724
done
schirmer@12854
   725
schirmer@12854
   726
lemma inited_init_class_obj [intro!]: "inited C (globs (init_class_obj G C s))"
schirmer@12854
   727
apply (unfold inited_def)
schirmer@12854
   728
apply (simp (no_asm))
schirmer@12854
   729
done
schirmer@12854
   730
schirmer@12854
   731
lemma not_initedD: "\<not> inited C g \<Longrightarrow> g (Stat C) = None"
schirmer@12854
   732
apply (unfold inited_def)
schirmer@12854
   733
apply (erule notnotD)
schirmer@12854
   734
done
schirmer@12854
   735
schirmer@12854
   736
lemma initedD: "inited C g \<Longrightarrow> \<exists> obj. g (Stat C) = Some obj"
schirmer@12854
   737
apply (unfold inited_def)
schirmer@12854
   738
apply auto
schirmer@12854
   739
done
schirmer@12854
   740
schirmer@12854
   741
lemma initd_def2 [simp]: "initd C s = inited C (globs (store s))"
schirmer@12854
   742
apply (unfold initd_def)
schirmer@12854
   743
apply (simp (no_asm))
schirmer@12854
   744
done
schirmer@12854
   745
schirmer@12925
   746
section {* @{text error_free} *}
schirmer@12925
   747
constdefs error_free:: "state \<Rightarrow> bool"
schirmer@12925
   748
"error_free s \<equiv> \<not> (\<exists> err. abrupt s = Some (Error err))"
schirmer@12854
   749
schirmer@12925
   750
lemma error_free_Norm [simp,intro]: "error_free (Norm s)"
schirmer@12925
   751
by (simp add: error_free_def)
schirmer@12925
   752
schirmer@12925
   753
lemma error_free_normal [simp,intro]: "normal s \<Longrightarrow> error_free s"
schirmer@12925
   754
by (simp add: error_free_def)
schirmer@12925
   755
schirmer@12925
   756
lemma error_free_Xcpt [simp]: "error_free (Some (Xcpt x),s)"
schirmer@12925
   757
by (simp add: error_free_def)
schirmer@12925
   758
schirmer@12925
   759
lemma error_free_Jump [simp,intro]: "error_free (Some (Jump j),s)"
schirmer@12925
   760
by (simp add: error_free_def)
schirmer@12925
   761
schirmer@12925
   762
lemma error_free_Error [simp]: "error_free (Some (Error e),s) = False"
schirmer@12925
   763
by (simp add: error_free_def)  
schirmer@12925
   764
schirmer@12925
   765
lemma error_free_Some [simp,intro]: 
schirmer@12925
   766
 "\<not> (\<exists> err. x=Error err) \<Longrightarrow> error_free ((Some x),s)"
schirmer@12925
   767
by (auto simp add: error_free_def)
schirmer@12925
   768
wenzelm@13524
   769
lemma error_free_abupd_absorb [simp,intro]: 
schirmer@12925
   770
 "error_free s \<Longrightarrow> error_free (abupd (absorb j) s)"
schirmer@12925
   771
by (cases s) 
schirmer@12925
   772
   (auto simp add: error_free_def absorb_def
schirmer@12925
   773
         split: split_if_asm)
schirmer@12925
   774
schirmer@12925
   775
lemma error_free_absorb [simp,intro]: 
schirmer@12925
   776
 "error_free (a,s) \<Longrightarrow> error_free (absorb j a, s)"
schirmer@12925
   777
by (auto simp add: error_free_def absorb_def
schirmer@12925
   778
            split: split_if_asm)
schirmer@12925
   779
schirmer@12925
   780
lemma error_free_abrupt_if [simp,intro]:
schirmer@12925
   781
"\<lbrakk>error_free s; \<not> (\<exists> err. x=Error err)\<rbrakk>
schirmer@12925
   782
 \<Longrightarrow> error_free (abupd (abrupt_if p (Some x)) s)"
schirmer@12925
   783
by (cases s)
schirmer@12925
   784
   (auto simp add: abrupt_if_def
schirmer@12925
   785
            split: split_if)
schirmer@12925
   786
schirmer@12925
   787
lemma error_free_abrupt_if1 [simp,intro]:
schirmer@12925
   788
"\<lbrakk>error_free (a,s); \<not> (\<exists> err. x=Error err)\<rbrakk>
schirmer@12925
   789
 \<Longrightarrow> error_free (abrupt_if p (Some x) a, s)"
schirmer@12925
   790
by  (auto simp add: abrupt_if_def
schirmer@12925
   791
            split: split_if)
schirmer@12925
   792
schirmer@12925
   793
lemma error_free_abrupt_if_Xcpt [simp,intro]:
schirmer@12925
   794
 "error_free s 
schirmer@12925
   795
  \<Longrightarrow> error_free (abupd (abrupt_if p (Some (Xcpt x))) s)"
schirmer@12925
   796
by simp 
schirmer@12925
   797
schirmer@12925
   798
lemma error_free_abrupt_if_Xcpt1 [simp,intro]:
schirmer@12925
   799
 "error_free (a,s) 
schirmer@12925
   800
  \<Longrightarrow> error_free (abrupt_if p (Some (Xcpt x)) a, s)" 
schirmer@12925
   801
by simp 
schirmer@12925
   802
schirmer@12925
   803
lemma error_free_abrupt_if_Jump [simp,intro]:
schirmer@12925
   804
 "error_free s 
schirmer@12925
   805
  \<Longrightarrow> error_free (abupd (abrupt_if p (Some (Jump j))) s)" 
schirmer@12925
   806
by simp
schirmer@12925
   807
schirmer@12925
   808
lemma error_free_abrupt_if_Jump1 [simp,intro]:
schirmer@12925
   809
 "error_free (a,s) 
schirmer@12925
   810
  \<Longrightarrow> error_free (abrupt_if p (Some (Jump j)) a, s)" 
schirmer@12925
   811
by simp
schirmer@12925
   812
schirmer@12925
   813
lemma error_free_raise_if [simp,intro]:
schirmer@12925
   814
 "error_free s \<Longrightarrow> error_free (abupd (raise_if p x) s)"
schirmer@12925
   815
by simp 
schirmer@12925
   816
schirmer@12925
   817
lemma error_free_raise_if1 [simp,intro]:
schirmer@12925
   818
 "error_free (a,s) \<Longrightarrow> error_free ((raise_if p x a), s)"
schirmer@12925
   819
by simp 
schirmer@12925
   820
schirmer@12925
   821
lemma error_free_supd [simp,intro]:
schirmer@12925
   822
 "error_free s \<Longrightarrow> error_free (supd f s)"
schirmer@12925
   823
by (cases s) (simp add: error_free_def)
schirmer@12925
   824
schirmer@12925
   825
lemma error_free_supd1 [simp,intro]:
schirmer@12925
   826
 "error_free (a,s) \<Longrightarrow> error_free (a,f s)"
schirmer@12925
   827
by (simp add: error_free_def)
schirmer@12925
   828
schirmer@12925
   829
lemma error_free_set_lvars [simp,intro]:
schirmer@12925
   830
"error_free s \<Longrightarrow> error_free ((set_lvars l) s)"
schirmer@12925
   831
by (cases s) simp
schirmer@12925
   832
schirmer@12925
   833
lemma error_free_set_locals [simp,intro]: 
schirmer@12925
   834
"error_free (x, s)
schirmer@12925
   835
       \<Longrightarrow> error_free (x, set_locals l s')"
schirmer@12925
   836
by (simp add: error_free_def)
schirmer@12854
   837
schirmer@13688
   838
schirmer@12854
   839
end
schirmer@12854
   840