171 [((foo, [Class Base]), Class Ext, foo_Ext)])" |
171 [((foo, [Class Base]), Class Ext, foo_Ext)])" |
172 apply (unfold ObjectC_def BaseC_def ExtC_def class_def) |
172 apply (unfold ObjectC_def BaseC_def ExtC_def class_def) |
173 apply (simp (no_asm)) |
173 apply (simp (no_asm)) |
174 done |
174 done |
175 |
175 |
176 lemma not_Object_subcls [elim!]: "(subcls1 tprg)^++ Object C ==> R" |
176 lemma not_Object_subcls [elim!]: "(Object, C) \<in> (subcls1 tprg)^+ ==> R" |
177 apply (auto dest!: tranclpD subcls1D) |
177 apply (auto dest!: tranclD subcls1D) |
178 done |
178 done |
179 |
179 |
180 lemma subcls_ObjectD [dest!]: "tprg\<turnstile>Object\<preceq>C C ==> C = Object" |
180 lemma subcls_ObjectD [dest!]: "tprg\<turnstile>Object\<preceq>C C ==> C = Object" |
181 apply (erule rtranclp_induct) |
181 apply (erule rtrancl_induct) |
182 apply auto |
182 apply auto |
183 apply (drule subcls1D) |
183 apply (drule subcls1D) |
184 apply auto |
184 apply auto |
185 done |
185 done |
186 |
186 |
187 lemma not_Base_subcls_Ext [elim!]: "(subcls1 tprg)^++ Base Ext ==> R" |
187 lemma not_Base_subcls_Ext [elim!]: "(Base, Ext) \<in> (subcls1 tprg)^+ ==> R" |
188 apply (auto dest!: tranclpD subcls1D) |
188 apply (auto dest!: tranclD subcls1D) |
189 done |
189 done |
190 |
190 |
191 lemma class_tprgD: |
191 lemma class_tprgD: |
192 "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" |
192 "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" |
193 apply (unfold ObjectC_def ClassCastC_def NullPointerC_def OutOfMemoryC_def BaseC_def ExtC_def class_def) |
193 apply (unfold ObjectC_def ClassCastC_def NullPointerC_def OutOfMemoryC_def BaseC_def ExtC_def class_def) |
194 apply (auto split add: split_if_asm simp add: map_of_Cons) |
194 apply (auto split add: split_if_asm simp add: map_of_Cons) |
195 done |
195 done |
196 |
196 |
197 lemma not_class_subcls_class [elim!]: "(subcls1 tprg)^++ C C ==> R" |
197 lemma not_class_subcls_class [elim!]: "(C, C) \<in> (subcls1 tprg)^+ ==> R" |
198 apply (auto dest!: tranclpD subcls1D) |
198 apply (auto dest!: tranclD subcls1D) |
199 apply (frule class_tprgD) |
199 apply (frule class_tprgD) |
200 apply (auto dest!:) |
200 apply (auto dest!:) |
201 apply (drule rtranclpD) |
201 apply (drule rtranclD) |
202 apply auto |
202 apply auto |
203 done |
203 done |
204 |
204 |
205 lemma unique_classes: "unique tprg" |
205 lemma unique_classes: "unique tprg" |
206 apply (simp (no_asm) add: ObjectC_def BaseC_def ExtC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def) |
206 apply (simp (no_asm) add: ObjectC_def BaseC_def ExtC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def) |
207 done |
207 done |
208 |
208 |
209 lemmas subcls_direct = subcls1I [THEN r_into_rtranclp [where r="subcls1 G"], standard] |
209 lemmas subcls_direct = subcls1I [THEN r_into_rtrancl [where r="subcls1 G"], standard] |
210 |
210 |
211 lemma Ext_subcls_Base [simp]: "tprg\<turnstile>Ext\<preceq>C Base" |
211 lemma Ext_subcls_Base [simp]: "tprg\<turnstile>Ext\<preceq>C Base" |
212 apply (rule subcls_direct) |
212 apply (rule subcls_direct) |
213 apply auto |
213 apply auto |
214 done |
214 done |
218 apply (simp (no_asm)) |
218 apply (simp (no_asm)) |
219 done |
219 done |
220 |
220 |
221 declare ty_expr_ty_exprs_wt_stmt.intros [intro!] |
221 declare ty_expr_ty_exprs_wt_stmt.intros [intro!] |
222 |
222 |
223 lemma acyclic_subcls1': "acyclicP (subcls1 tprg)" |
223 lemma acyclic_subcls1': "acyclic (subcls1 tprg)" |
224 apply (rule acyclicI [to_pred]) |
224 apply (rule acyclicI) |
225 apply safe |
225 apply safe |
226 done |
226 done |
227 |
227 |
228 lemmas wf_subcls1' = acyclic_subcls1' [THEN finite_subcls1 [THEN finite_acyclic_wf_converse [to_pred]]] |
228 lemmas wf_subcls1' = acyclic_subcls1' [THEN finite_subcls1 [THEN finite_acyclic_wf_converse]] |
229 |
229 |
230 lemmas fields_rec' = wf_subcls1' [THEN [2] fields_rec_lemma] |
230 lemmas fields_rec' = wf_subcls1' [THEN [2] fields_rec_lemma] |
231 |
231 |
232 lemma fields_Object [simp]: "fields (tprg, Object) = []" |
232 lemma fields_Object [simp]: "fields (tprg, Object) = []" |
233 apply (subst fields_rec') |
233 apply (subst fields_rec') |
344 wf_mrT_def wf_fdecl_def ExtC_def) |
344 wf_mrT_def wf_fdecl_def ExtC_def) |
345 apply (simp (no_asm)) |
345 apply (simp (no_asm)) |
346 apply (fold ExtC_def) |
346 apply (fold ExtC_def) |
347 apply (rule mp) defer apply (rule wf_foo_Ext) |
347 apply (rule mp) defer apply (rule wf_foo_Ext) |
348 apply (auto simp add: wf_mdecl_def) |
348 apply (auto simp add: wf_mdecl_def) |
349 apply (drule rtranclpD) |
349 apply (drule rtranclD) |
350 apply auto |
350 apply auto |
351 done |
351 done |
352 |
352 |
353 |
353 |
354 lemma [simp]: "fst ObjectC = Object" by (simp add: ObjectC_def) |
354 lemma [simp]: "fst ObjectC = Object" by (simp add: ObjectC_def) |