4 Copyright 1999 Technische Universitaet Muenchen |
4 Copyright 1999 Technische Universitaet Muenchen |
5 *) |
5 *) |
6 |
6 |
7 header {* \isaheader{Example MicroJava Program} *} |
7 header {* \isaheader{Example MicroJava Program} *} |
8 |
8 |
9 theory Example = Eval: |
9 theory Example = SystemClasses + Eval: |
10 |
10 |
11 text {* |
11 text {* |
12 The following example MicroJava program includes: |
12 The following example MicroJava program includes: |
13 class declarations with inheritance, hiding of fields, and overriding of |
13 class declarations with inheritance, hiding of fields, and overriding of |
14 methods (with refined result type), |
14 methods (with refined result type), |
70 "e" == "VName (vnam_ e_)" |
70 "e" == "VName (vnam_ e_)" |
71 |
71 |
72 axioms |
72 axioms |
73 Base_not_Object: "Base \<noteq> Object" |
73 Base_not_Object: "Base \<noteq> Object" |
74 Ext_not_Object: "Ext \<noteq> Object" |
74 Ext_not_Object: "Ext \<noteq> Object" |
75 e_not_This: "e \<noteq> This" |
75 Base_not_Xcpt: "Base \<noteq> Xcpt z" |
|
76 Ext_not_Xcpt: "Ext \<noteq> Xcpt z" |
|
77 e_not_This: "e \<noteq> This" |
76 |
78 |
77 declare Base_not_Object [simp] Ext_not_Object [simp] |
79 declare Base_not_Object [simp] Ext_not_Object [simp] |
|
80 declare Base_not_Xcpt [simp] Ext_not_Xcpt [simp] |
78 declare e_not_This [simp] |
81 declare e_not_This [simp] |
79 declare Base_not_Object [THEN not_sym, simp] |
82 declare Base_not_Object [symmetric, simp] |
80 declare Ext_not_Object [THEN not_sym, simp] |
83 declare Ext_not_Object [symmetric, simp] |
|
84 declare Base_not_Xcpt [symmetric, simp] |
|
85 declare Ext_not_Xcpt [symmetric, simp] |
81 |
86 |
82 consts |
87 consts |
83 foo_Base:: java_mb |
88 foo_Base:: java_mb |
84 foo_Ext :: java_mb |
89 foo_Ext :: java_mb |
85 BaseC :: "java_mb cdecl" |
90 BaseC :: "java_mb cdecl" |
117 s3 :: state |
122 s3 :: state |
118 s4 :: state |
123 s4 :: state |
119 |
124 |
120 translations |
125 translations |
121 "NP" == "NullPointer" |
126 "NP" == "NullPointer" |
122 "tprg" == "[ObjectC, BaseC, ExtC]" |
127 "tprg" == "[ObjectC, BaseC, ExtC, ClassCastC, NullPointerC, OutOfMemoryC]" |
123 "obj1" <= "(Ext, empty((vee, Base)\<mapsto>Bool False) |
128 "obj1" <= "(Ext, empty((vee, Base)\<mapsto>Bool False) |
124 ((vee, Ext )\<mapsto>Intg 0))" |
129 ((vee, Ext )\<mapsto>Intg 0))" |
125 "s0" == " Norm (empty, empty)" |
130 "s0" == " Norm (empty, empty)" |
126 "s1" == " Norm (empty(a\<mapsto>obj1),empty(e\<mapsto>Addr a))" |
131 "s1" == " Norm (empty(a\<mapsto>obj1),empty(e\<mapsto>Addr a))" |
127 "s2" == " Norm (empty(a\<mapsto>obj1),empty(x\<mapsto>Null)(This\<mapsto>Addr a))" |
132 "s2" == " Norm (empty(a\<mapsto>obj1),empty(x\<mapsto>Null)(This\<mapsto>Addr a))" |
140 lemma class_tprg_Object [simp]: "class tprg Object = Some (arbitrary, [], [])" |
145 lemma class_tprg_Object [simp]: "class tprg Object = Some (arbitrary, [], [])" |
141 apply (unfold ObjectC_def class_def) |
146 apply (unfold ObjectC_def class_def) |
142 apply (simp (no_asm)) |
147 apply (simp (no_asm)) |
143 done |
148 done |
144 |
149 |
|
150 lemma class_tprg_NP [simp]: "class tprg (Xcpt NP) = Some (Object, [], [])" |
|
151 apply (unfold ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def BaseC_def ExtC_def class_def) |
|
152 apply (simp (no_asm)) |
|
153 done |
|
154 |
|
155 lemma class_tprg_OM [simp]: "class tprg (Xcpt OutOfMemory) = Some (Object, [], [])" |
|
156 apply (unfold ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def BaseC_def ExtC_def class_def) |
|
157 apply (simp (no_asm)) |
|
158 done |
|
159 |
|
160 lemma class_tprg_CC [simp]: "class tprg (Xcpt ClassCast) = Some (Object, [], [])" |
|
161 apply (unfold ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def BaseC_def ExtC_def class_def) |
|
162 apply (simp (no_asm)) |
|
163 done |
|
164 |
145 lemma class_tprg_Base [simp]: |
165 lemma class_tprg_Base [simp]: |
146 "class tprg Base = Some (Object, |
166 "class tprg Base = Some (Object, |
147 [(vee, PrimT Boolean)], |
167 [(vee, PrimT Boolean)], |
148 [((foo, [Class Base]), Class Base, foo_Base)])" |
168 [((foo, [Class Base]), Class Base, foo_Base)])" |
149 apply (unfold ObjectC_def BaseC_def ExtC_def class_def) |
169 apply (unfold ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def BaseC_def ExtC_def class_def) |
150 apply (simp (no_asm)) |
170 apply (simp (no_asm)) |
151 done |
171 done |
152 |
172 |
153 lemma class_tprg_Ext [simp]: |
173 lemma class_tprg_Ext [simp]: |
154 "class tprg Ext = Some (Base, |
174 "class tprg Ext = Some (Base, |
172 lemma not_Base_subcls_Ext [elim!]: "(Base, Ext) \<in> (subcls1 tprg)^+ ==> R" |
192 lemma not_Base_subcls_Ext [elim!]: "(Base, Ext) \<in> (subcls1 tprg)^+ ==> R" |
173 apply (auto dest!: tranclD subcls1D) |
193 apply (auto dest!: tranclD subcls1D) |
174 done |
194 done |
175 |
195 |
176 lemma class_tprgD: |
196 lemma class_tprgD: |
177 "class tprg C = Some z ==> C=Object \<or> C=Base \<or> C=Ext" |
197 "class tprg C = Some z ==> C=Object \<or> C=Base \<or> C=Ext \<or> C=Xcpt NP \<or> C=Xcpt ClassCast \<or> C=Xcpt OutOfMemory" |
178 apply (unfold ObjectC_def BaseC_def ExtC_def class_def) |
198 apply (unfold ObjectC_def ClassCastC_def NullPointerC_def OutOfMemoryC_def BaseC_def ExtC_def class_def) |
179 apply (auto split add: split_if_asm simp add: map_of_Cons) |
199 apply (auto split add: split_if_asm simp add: map_of_Cons) |
180 done |
200 done |
181 |
201 |
182 lemma not_class_subcls_class [elim!]: "(C,C) \<in> (subcls1 tprg)^+ ==> R" |
202 lemma not_class_subcls_class [elim!]: "(C,C) \<in> (subcls1 tprg)^+ ==> R" |
183 apply (auto dest!: tranclD subcls1D) |
203 apply (auto dest!: tranclD subcls1D) |
186 apply (drule rtranclD) |
206 apply (drule rtranclD) |
187 apply auto |
207 apply auto |
188 done |
208 done |
189 |
209 |
190 lemma unique_classes: "unique tprg" |
210 lemma unique_classes: "unique tprg" |
191 apply (simp (no_asm) add: ObjectC_def BaseC_def ExtC_def) |
211 apply (simp (no_asm) add: ObjectC_def BaseC_def ExtC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def) |
192 done |
212 done |
193 |
213 |
194 lemmas subcls_direct = subcls1I [THEN r_into_rtrancl] |
214 lemmas subcls_direct = subcls1I [THEN r_into_rtrancl] |
195 |
215 |
196 lemma Ext_subcls_Base [simp]: "tprg\<turnstile>Ext\<preceq>C Base" |
216 lemma Ext_subcls_Base [simp]: "tprg\<turnstile>Ext\<preceq>C Base" |
276 "wf_cdecl wf_java_mdecl tprg ObjectC" |
296 "wf_cdecl wf_java_mdecl tprg ObjectC" |
277 apply (unfold wf_cdecl_def wf_fdecl_def ObjectC_def) |
297 apply (unfold wf_cdecl_def wf_fdecl_def ObjectC_def) |
278 apply (simp (no_asm)) |
298 apply (simp (no_asm)) |
279 done |
299 done |
280 |
300 |
|
301 lemma wf_NP: |
|
302 "wf_cdecl wf_java_mdecl tprg NullPointerC" |
|
303 apply (unfold wf_cdecl_def wf_fdecl_def NullPointerC_def) |
|
304 apply (simp add: class_def) |
|
305 apply (fold NullPointerC_def class_def) |
|
306 apply auto |
|
307 done |
|
308 |
|
309 lemma wf_OM: |
|
310 "wf_cdecl wf_java_mdecl tprg OutOfMemoryC" |
|
311 apply (unfold wf_cdecl_def wf_fdecl_def OutOfMemoryC_def) |
|
312 apply (simp add: class_def) |
|
313 apply (fold OutOfMemoryC_def class_def) |
|
314 apply auto |
|
315 done |
|
316 |
|
317 lemma wf_CC: |
|
318 "wf_cdecl wf_java_mdecl tprg ClassCastC" |
|
319 apply (unfold wf_cdecl_def wf_fdecl_def ClassCastC_def) |
|
320 apply (simp add: class_def) |
|
321 apply (fold ClassCastC_def class_def) |
|
322 apply auto |
|
323 done |
|
324 |
281 lemma wf_BaseC: |
325 lemma wf_BaseC: |
282 "wf_cdecl wf_java_mdecl tprg BaseC" |
326 "wf_cdecl wf_java_mdecl tprg BaseC" |
283 apply (unfold wf_cdecl_def wf_fdecl_def BaseC_def) |
327 apply (unfold wf_cdecl_def wf_fdecl_def BaseC_def) |
284 apply (simp (no_asm)) |
328 apply (simp (no_asm)) |
285 apply (fold BaseC_def) |
329 apply (fold BaseC_def) |
296 apply auto |
340 apply auto |
297 apply (drule rtranclD) |
341 apply (drule rtranclD) |
298 apply auto |
342 apply auto |
299 done |
343 done |
300 |
344 |
|
345 lemma [simp]: "fst ObjectC = Object" by (simp add: ObjectC_def) |
|
346 |
301 lemma wf_tprg: |
347 lemma wf_tprg: |
302 "wf_prog wf_java_mdecl tprg" |
348 "wf_prog wf_java_mdecl tprg" |
303 apply (unfold wf_prog_def Let_def) |
349 apply (unfold wf_prog_def Let_def) |
304 apply(simp add: wf_ObjectC wf_BaseC wf_ExtC unique_classes) |
350 apply (simp add: wf_ObjectC wf_BaseC wf_ExtC wf_NP wf_OM wf_CC unique_classes) |
|
351 apply (rule wf_syscls) |
|
352 apply (simp add: SystemClasses_def) |
305 done |
353 done |
306 |
354 |
307 lemma appl_methds_foo_Base: |
355 lemma appl_methds_foo_Base: |
308 "appl_methds tprg Base (foo, [NT]) = |
356 "appl_methds tprg Base (foo, [NT]) = |
309 {((Class Base, Class Base), [Class Base])}" |
357 {((Class Base, Class Base), [Class Base])}" |