src/HOL/MicroJava/BV/BVExample.thy
author kleing
Thu, 28 Feb 2002 13:38:49 +0100
changeset 12972 da7345ff18e1
parent 12951 a9fdcb71d252
child 13006 51c5f3f11d16
permissions -rw-r--r--
fixed document
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12951
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
     1
(*  Title:      HOL/MicroJava/BV/BVExample.thy
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
     2
    ID:         $Id$
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
     3
    Author:     Gerwin Klein
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
     4
*)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
     5
12972
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
     6
header {* \isaheader{Example Welltypings}\label{sec:BVExample} *}
12951
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
     7
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
     8
theory BVExample = JVMListExample + Correct:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
     9
12972
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
    10
text {*
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
    11
  This theory shows type correctness of the example program in section 
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
    12
  \ref{sec:JVMListExample} (p. \pageref{sec:JVMListExample}) by
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
    13
  explicitly providing a welltyping. It also shows that the start
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
    14
  state of the program conforms to the welltyping; hence type safe
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
    15
  execution is guaranteed.
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
    16
*}
da7345ff18e1 fixed document
kleing
parents: 12951
diff changeset
    17
12951
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    18
section "Setup"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    19
text {*
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    20
  Since the types @{typ cnam}, @{text vnam}, and @{text mname} are 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    21
  anonymous, we describe distinctness of names in the example by axioms:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    22
*}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    23
axioms 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    24
  distinct_classes: "list_nam \<noteq> test_nam"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    25
  distinct_fields:  "val_nam \<noteq> next_nam"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    26
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    27
text {* Shorthands for definitions we will have to use often in the
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    28
proofs below: *}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    29
lemmas name_defs   = list_name_def test_name_def val_name_def next_name_def
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    30
lemmas system_defs = SystemClasses_def ObjectC_def NullPointerC_def 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    31
                     OutOfMemoryC_def ClassCastC_def
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    32
lemmas class_defs  = list_class_def test_class_def
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    33
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    34
text {* These auxiliary proofs are for efficiency: class lookup,
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    35
subclass relation, method and field lookup are computed only once:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    36
*}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    37
lemma class_Object [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    38
  "class E Object = Some (arbitrary, [],[])"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    39
  by (simp add: class_def system_defs E_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    40
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    41
lemma class_NullPointer [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    42
  "class E (Xcpt NullPointer) = Some (Object, [], [])"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    43
  by (simp add: class_def system_defs E_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    44
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    45
lemma class_OutOfMemory [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    46
  "class E (Xcpt OutOfMemory) = Some (Object, [], [])"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    47
  by (simp add: class_def system_defs E_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    48
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    49
lemma class_ClassCast [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    50
  "class E (Xcpt ClassCast) = Some (Object, [], [])"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    51
  by (simp add: class_def system_defs E_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    52
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    53
lemma class_list [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    54
  "class E list_name = Some list_class"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    55
  by (simp add: class_def system_defs E_def name_defs distinct_classes [symmetric])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    56
 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    57
lemma class_test [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    58
  "class E test_name = Some test_class"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    59
  by (simp add: class_def system_defs E_def name_defs distinct_classes [symmetric])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    60
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    61
lemma E_classes [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    62
  "{C. is_class E C} = {list_name, test_name, Xcpt NullPointer, 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    63
                        Xcpt ClassCast, Xcpt OutOfMemory, Object}"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    64
  by (auto simp add: is_class_def class_def system_defs E_def name_defs class_defs)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    65
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    66
text {* The subclass releation spelled out: *}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    67
lemma subcls1:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    68
  "subcls1 E = {(list_name,Object), (test_name,Object), (Xcpt NullPointer, Object),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    69
                (Xcpt ClassCast, Object), (Xcpt OutOfMemory, Object)}"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    70
  apply (simp add: subcls1_def2)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    71
  apply (simp add: name_defs class_defs system_defs E_def class_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    72
  apply (auto split: split_if_asm)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    73
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    74
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    75
text {* The subclass relation is acyclic; hence its converse is well founded: *}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    76
lemma notin_rtrancl:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    77
  "(a,b) \<in> r\<^sup>* \<Longrightarrow> a \<noteq> b \<Longrightarrow> (\<And>y. (a,y) \<notin> r) \<Longrightarrow> False"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    78
  by (auto elim: converse_rtranclE)  
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    79
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    80
lemma acyclic_subcls1_E: "acyclic (subcls1 E)"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    81
  apply (rule acyclicI)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    82
  apply (simp add: subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    83
  apply (auto dest!: tranclD)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    84
  apply (auto elim!: notin_rtrancl simp add: name_defs distinct_classes)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    85
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    86
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    87
lemma wf_subcls1_E: "wf ((subcls1 E)\<inverse>)"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    88
  apply (rule finite_acyclic_wf_converse)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    89
  apply (simp add: subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    90
  apply (rule acyclic_subcls1_E)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    91
  done  
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    92
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    93
text {* Method and field lookup: *}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    94
lemma method_Object [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    95
  "method (E, Object) = empty"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    96
  by (simp add: method_rec_lemma [OF class_Object wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    97
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    98
lemma method_append [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
    99
  "method (E, list_name) (append_name, [Class list_name]) =
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   100
  Some (list_name, PrimT Void, 3, 0, append_ins, [(1, 2, 8, Xcpt NullPointer)])"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   101
  apply (insert class_list)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   102
  apply (unfold list_class_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   103
  apply (drule method_rec_lemma [OF _ wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   104
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   105
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   106
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   107
lemma method_makelist [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   108
  "method (E, test_name) (makelist_name, []) = 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   109
  Some (test_name, PrimT Void, 3, 2, make_list_ins, [])"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   110
  apply (insert class_test)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   111
  apply (unfold test_class_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   112
  apply (drule method_rec_lemma [OF _ wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   113
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   114
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   115
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   116
lemma field_val [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   117
  "field (E, list_name) val_name = Some (list_name, PrimT Integer)"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   118
  apply (unfold field_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   119
  apply (insert class_list)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   120
  apply (unfold list_class_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   121
  apply (drule fields_rec_lemma [OF _ wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   122
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   123
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   124
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   125
lemma field_next [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   126
  "field (E, list_name) next_name = Some (list_name, Class list_name)"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   127
  apply (unfold field_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   128
  apply (insert class_list)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   129
  apply (unfold list_class_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   130
  apply (drule fields_rec_lemma [OF _ wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   131
  apply (simp add: name_defs distinct_fields [symmetric])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   132
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   133
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   134
lemma [simp]: "fields (E, Object) = []"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   135
   by (simp add: fields_rec_lemma [OF class_Object wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   136
 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   137
lemma [simp]: "fields (E, Xcpt NullPointer) = []"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   138
  by (simp add: fields_rec_lemma [OF class_NullPointer wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   139
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   140
lemma [simp]: "fields (E, Xcpt ClassCast) = []"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   141
  by (simp add: fields_rec_lemma [OF class_ClassCast wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   142
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   143
lemma [simp]: "fields (E, Xcpt OutOfMemory) = []"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   144
  by (simp add: fields_rec_lemma [OF class_OutOfMemory wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   145
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   146
lemma [simp]: "fields (E, test_name) = []"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   147
  apply (insert class_test)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   148
  apply (unfold test_class_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   149
  apply (drule fields_rec_lemma [OF _ wf_subcls1_E])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   150
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   151
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   152
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   153
lemmas [simp] = is_class_def
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   154
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   155
text {*
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   156
  The next definition and three proof rules implement an algorithm to
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   157
  enumarate natural numbers. The command @{text "apply (elim pc_end pc_next pc_0"} 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   158
  transforms a goal of the form
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   159
  @{prop [display] "pc < n \<Longrightarrow> P pc"} 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   160
  into a series of goals
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   161
  @{prop [display] "P 0"} 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   162
  @{prop [display] "P (Suc 0)"} 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   163
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   164
  @{text "\<dots>"}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   165
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   166
  @{prop [display] "P n"} 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   167
*}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   168
constdefs 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   169
  intervall :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> bool" ("_ \<in> [_, _')")
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   170
  "x \<in> [a, b) \<equiv> a \<le> x \<and> x < b"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   171
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   172
lemma pc_0: "x < n \<Longrightarrow> (x \<in> [0, n) \<Longrightarrow> P x) \<Longrightarrow> P x"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   173
  by (simp add: intervall_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   174
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   175
lemma pc_next: "x \<in> [n0, n) \<Longrightarrow> P n0 \<Longrightarrow> (x \<in> [Suc n0, n) \<Longrightarrow> P x) \<Longrightarrow> P x"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   176
  apply (cases "x=n0")
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   177
  apply (auto simp add: intervall_def) 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   178
  apply arith
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   179
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   180
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   181
lemma pc_end: "x \<in> [n,n) \<Longrightarrow> P x" 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   182
  by (unfold intervall_def) arith
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   183
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   184
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   185
section "Program structure"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   186
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   187
text {*
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   188
  The program is structurally wellformed:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   189
*}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   190
lemma wf_struct:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   191
  "wf_prog (\<lambda>G C mb. True) E" (is "wf_prog ?mb E")
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   192
proof -
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   193
  have "unique E" 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   194
    by (simp add: system_defs E_def class_defs name_defs distinct_classes)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   195
  moreover
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   196
  have "set SystemClasses \<subseteq> set E" by (simp add: system_defs E_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   197
  hence "wf_syscls E" by (rule wf_syscls)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   198
  moreover
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   199
  have "wf_cdecl ?mb E ObjectC" by (simp add: wf_cdecl_def ObjectC_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   200
  moreover
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   201
  have "wf_cdecl ?mb E NullPointerC" 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   202
    by (auto elim: notin_rtrancl 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   203
            simp add: wf_cdecl_def name_defs NullPointerC_def subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   204
  moreover
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   205
  have "wf_cdecl ?mb E ClassCastC" 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   206
    by (auto elim: notin_rtrancl 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   207
            simp add: wf_cdecl_def name_defs ClassCastC_def subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   208
  moreover
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   209
  have "wf_cdecl ?mb E OutOfMemoryC" 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   210
    by (auto elim: notin_rtrancl 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   211
            simp add: wf_cdecl_def name_defs OutOfMemoryC_def subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   212
  moreover
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   213
  have "wf_cdecl ?mb E (list_name, list_class)"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   214
    apply (auto elim!: notin_rtrancl 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   215
            simp add: wf_cdecl_def wf_fdecl_def list_class_def 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   216
                      wf_mdecl_def wf_mhead_def subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   217
    apply (auto simp add: name_defs distinct_classes distinct_fields)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   218
    done    
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   219
  moreover
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   220
  have "wf_cdecl ?mb E (test_name, test_class)" 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   221
    apply (auto elim!: notin_rtrancl 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   222
            simp add: wf_cdecl_def wf_fdecl_def test_class_def 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   223
                      wf_mdecl_def wf_mhead_def subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   224
    apply (auto simp add: name_defs distinct_classes distinct_fields)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   225
    done       
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   226
  ultimately
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   227
  show ?thesis by (simp add: wf_prog_def E_def SystemClasses_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   228
qed
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   229
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   230
section "Welltypings"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   231
text {*
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   232
  We show welltypings of the methods @{term append_name} in class @{term list_name}, 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   233
  and @{term makelist_name} in class @{term test_name}:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   234
*}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   235
lemmas eff_simps [simp] = eff_def norm_eff_def xcpt_eff_def
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   236
declare appInvoke [simp del]
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   237
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   238
constdefs
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   239
  phi_append :: method_type ("\<phi>\<^sub>a")
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   240
  "\<phi>\<^sub>a \<equiv> map (\<lambda>(x,y). Some (x, map OK y)) [ 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   241
   (                                    [], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   242
   (                     [Class list_name], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   243
   (                     [Class list_name], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   244
   (    [Class list_name, Class list_name], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   245
   ([NT, Class list_name, Class list_name], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   246
   (                     [Class list_name], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   247
   (    [Class list_name, Class list_name], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   248
   (                          [PrimT Void], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   249
   (                        [Class Object], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   250
   (                                    [], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   251
   (                     [Class list_name], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   252
   (    [Class list_name, Class list_name], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   253
   (                                    [], [Class list_name, Class list_name]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   254
   (                          [PrimT Void], [Class list_name, Class list_name])]"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   255
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   256
lemma wt_append [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   257
  "wt_method E list_name [Class list_name] (PrimT Void) 3 0 append_ins
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   258
             [(Suc 0, 2, 8, Xcpt NullPointer)] \<phi>\<^sub>a"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   259
  apply (simp add: wt_method_def append_ins_def phi_append_def 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   260
                   wt_start_def wt_instr_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   261
  apply clarify
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   262
  apply (elim pc_end pc_next pc_0)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   263
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   264
  apply (fastsimp simp add: match_exception_entry_def sup_state_conv subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   265
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   266
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   267
  apply (fastsimp simp add: sup_state_conv subcls1)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   268
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   269
  apply (simp add: app_def xcpt_app_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   270
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   271
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   272
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   273
  apply (simp add: match_exception_entry_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   274
  apply (simp add: match_exception_entry_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   275
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   276
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   277
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   278
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   279
text {* Some shorthands to make the welltyping of method @{term
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   280
makelist_name} easier to read *} 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   281
syntax
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   282
  list :: ty 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   283
  test :: ty
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   284
translations
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   285
  "list" == "Class list_name"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   286
  "test" == "Class test_name"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   287
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   288
constdefs
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   289
  phi_makelist :: method_type ("\<phi>\<^sub>m")
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   290
  "\<phi>\<^sub>m \<equiv> map (\<lambda>(x,y). Some (x, y)) [ 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   291
    (                                   [], [OK test, Err    , Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   292
    (                               [list], [OK test, Err    , Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   293
    (                         [list, list], [OK test, Err    , Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   294
    (                               [list], [OK list, Err    , Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   295
    (                [PrimT Integer, list], [OK list, Err    , Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   296
    (                                   [], [OK list, Err    , Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   297
    (                               [list], [OK list, Err    , Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   298
    (                         [list, list], [OK list, Err    , Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   299
    (                               [list], [OK list, OK list, Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   300
    (                [PrimT Integer, list], [OK list, OK list, Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   301
    (                                   [], [OK list, OK list, Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   302
    (                               [list], [OK list, OK list, Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   303
    (                         [list, list], [OK list, OK list, Err    ]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   304
    (                               [list], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   305
    (                [PrimT Integer, list], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   306
    (                                   [], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   307
    (                               [list], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   308
    (                         [list, list], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   309
    (                         [PrimT Void], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   310
    (                   [list, PrimT Void], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   311
    (             [list, list, PrimT Void], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   312
    (             [PrimT Void, PrimT Void], [OK list, OK list, OK list]),
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   313
    ( [PrimT Void, PrimT Void, PrimT Void], [OK list, OK list, OK list])]"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   314
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   315
lemma wt_makelist [simp]:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   316
  "wt_method E test_name [] (PrimT Void) 3 2 make_list_ins [] \<phi>\<^sub>m"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   317
  apply (simp add: wt_method_def make_list_ins_def phi_makelist_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   318
  apply (simp add: wt_start_def nat_number_of)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   319
  apply (simp add: wt_instr_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   320
  apply clarify
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   321
  apply (elim pc_end pc_next pc_0)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   322
  apply (simp add: match_exception_entry_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   323
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   324
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   325
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   326
  apply (simp add: match_exception_entry_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   327
  apply (simp add: match_exception_entry_def) 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   328
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   329
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   330
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   331
  apply (simp add: match_exception_entry_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   332
  apply (simp add: match_exception_entry_def) 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   333
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   334
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   335
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   336
  apply (simp add: match_exception_entry_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   337
  apply (simp add: match_exception_entry_def) 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   338
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   339
  apply (simp add: app_def xcpt_app_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   340
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   341
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   342
  apply (simp add: app_def xcpt_app_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   343
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   344
  apply simp
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   345
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   346
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   347
text {* The whole program is welltyped: *}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   348
constdefs 
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   349
  Phi :: prog_type ("\<Phi>")
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   350
  "\<Phi> C sig \<equiv> if C = test_name \<and> sig = (makelist_name, []) then \<phi>\<^sub>m else
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   351
              if C = list_name \<and> sig = (append_name, [Class list_name]) then \<phi>\<^sub>a else []"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   352
  
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   353
lemma wf_prog:
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   354
  "wt_jvm_prog E \<Phi>"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   355
  apply (unfold wt_jvm_prog_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   356
  apply (rule wf_mb'E [OF wf_struct])
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   357
  apply (simp add: E_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   358
  apply clarify
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   359
  apply (fold E_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   360
  apply (simp add: system_defs class_defs Phi_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   361
  apply auto
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   362
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   363
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   364
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   365
section "Conformance"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   366
text {* Execution of the program will be typesafe, because its
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   367
  start state conforms to the welltyping: *}
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   368
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   369
lemma [simp]: "preallocated start_heap"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   370
  apply (unfold start_heap_def preallocated_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   371
  apply auto
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   372
  apply (case_tac x)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   373
  apply auto
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   374
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   375
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   376
lemma "E,\<Phi> \<turnstile>JVM start_state \<surd>"
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   377
  apply (simp add: correct_state_def start_state_def test_class_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   378
  apply (simp add: hconf_def start_heap_def oconf_def lconf_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   379
  apply (simp add: Phi_def phi_makelist_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   380
  apply (simp add: correct_frame_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   381
  apply (simp add: make_list_ins_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   382
  apply (simp add: conf_def start_heap_def)
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   383
  done
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   384
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents:
diff changeset
   385
end