src/HOL/MicroJava/J/Example.thy
changeset 33954 1bc3b688548c
parent 28524 644b62cf678f
child 35102 cc7a0b9f938c
equal deleted inserted replaced
33930:6a973bd43949 33954:1bc3b688548c
   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)