src/HOL/MicroJava/Comp/LemmasComp.thy
changeset 33954 1bc3b688548c
parent 33640 0d82107dc07a
child 35102 cc7a0b9f938c
equal deleted inserted replaced
33930:6a973bd43949 33954:1bc3b688548c
   108 lemma comp_classname: "is_class G C 
   108 lemma comp_classname: "is_class G C 
   109   \<Longrightarrow> fst (the (class G C)) = fst (the (class (comp G) C))"
   109   \<Longrightarrow> fst (the (class G C)) = fst (the (class (comp G) C))"
   110 by (case_tac "class G C", auto simp: is_class_def dest: comp_class_imp)
   110 by (case_tac "class G C", auto simp: is_class_def dest: comp_class_imp)
   111 
   111 
   112 lemma comp_subcls1: "subcls1 (comp G) = subcls1 G"
   112 lemma comp_subcls1: "subcls1 (comp G) = subcls1 G"
   113 by (auto simp add: subcls1_def2 comp_classname comp_is_class expand_fun_eq)
   113 by (auto simp add: subcls1_def2 comp_classname comp_is_class)
   114 
   114 
   115 lemma comp_widen: "widen (comp G) = widen G"
   115 lemma comp_widen: "widen (comp G) = widen G"
   116   apply (simp add: expand_fun_eq)
   116   apply (simp add: expand_fun_eq)
   117   apply (intro allI iffI)
   117   apply (intro allI iffI)
   118   apply (erule widen.cases) 
   118   apply (erule widen.cases) 
   181 apply (simp add: comp_wf_syscls)
   181 apply (simp add: comp_wf_syscls)
   182 apply (auto simp add: comp_ws_cdecl [THEN sym] TranslComp.comp_def)
   182 apply (auto simp add: comp_ws_cdecl [THEN sym] TranslComp.comp_def)
   183 done
   183 done
   184 
   184 
   185 
   185 
   186 lemma comp_class_rec: " wfP ((subcls1 G)^--1) \<Longrightarrow> 
   186 lemma comp_class_rec: " wf ((subcls1 G)^-1) \<Longrightarrow> 
   187 class_rec (comp G) C t f = 
   187 class_rec (comp G) C t f = 
   188   class_rec G C t (\<lambda> C' fs' ms' r'. f C' fs' (map (compMethod G C') ms') r')"
   188   class_rec G C t (\<lambda> C' fs' ms' r'. f C' fs' (map (compMethod G C') ms') r')"
   189 apply (rule_tac a = C in  wfP_induct) apply assumption
   189 apply (rule_tac a = C in  wf_induct) apply assumption
   190 apply (subgoal_tac "wfP ((subcls1 (comp G))\<inverse>\<inverse>)")
   190 apply (subgoal_tac "wf ((subcls1 (comp G))^-1)")
   191 apply (subgoal_tac "(class G x = None) \<or> (\<exists> D fs ms. (class G x = Some (D, fs, ms)))")
   191 apply (subgoal_tac "(class G x = None) \<or> (\<exists> D fs ms. (class G x = Some (D, fs, ms)))")
   192 apply (erule disjE)
   192 apply (erule disjE)
   193 
   193 
   194   (* case class G x = None *)
   194   (* case class G x = None *)
   195 apply (simp (no_asm_simp) add: class_rec_def comp_subcls1
   195 apply (simp (no_asm_simp) add: class_rec_def comp_subcls1
   196   wfrec [to_pred, where r="(subcls1 G)^--1", simplified])
   196   wfrec [where r="(subcls1 G)^-1", simplified])
   197 apply (simp add: comp_class_None)
   197 apply (simp add: comp_class_None)
   198 
   198 
   199   (* case \<exists> D fs ms. (class G x = Some (D, fs, ms)) *)
   199   (* case \<exists> D fs ms. (class G x = Some (D, fs, ms)) *)
   200 apply (erule exE)+
   200 apply (erule exE)+
   201 apply (frule comp_class_imp)
   201 apply (frule comp_class_imp)
   216 apply (case_tac "class G x")
   216 apply (case_tac "class G x")
   217 apply auto
   217 apply auto
   218 apply (simp add: comp_subcls1)
   218 apply (simp add: comp_subcls1)
   219 done
   219 done
   220 
   220 
   221 lemma comp_fields: "wfP ((subcls1 G)^--1) \<Longrightarrow> 
   221 lemma comp_fields: "wf ((subcls1 G)^-1) \<Longrightarrow> 
   222   fields (comp G,C) = fields (G,C)" 
   222   fields (comp G,C) = fields (G,C)" 
   223 by (simp add: fields_def comp_class_rec)
   223 by (simp add: fields_def comp_class_rec)
   224 
   224 
   225 lemma comp_field: "wfP ((subcls1 G)^--1) \<Longrightarrow> 
   225 lemma comp_field: "wf ((subcls1 G)^-1) \<Longrightarrow> 
   226   field (comp G,C) = field (G,C)" 
   226   field (comp G,C) = field (G,C)" 
   227 by (simp add: TypeRel.field_def comp_fields)
   227 by (simp add: TypeRel.field_def comp_fields)
   228 
   228 
   229 
   229 
   230 
   230 
   232   \<forall> fs ms. R (f1 Object fs ms t1) (f2 Object fs ms t2);
   232   \<forall> fs ms. R (f1 Object fs ms t1) (f2 Object fs ms t2);
   233    \<forall> C fs ms r1 r2. (R r1 r2) \<longrightarrow> (R (f1 C fs ms r1) (f2 C fs ms r2)) \<rbrakk>
   233    \<forall> C fs ms r1 r2. (R r1 r2) \<longrightarrow> (R (f1 C fs ms r1) (f2 C fs ms r2)) \<rbrakk>
   234   \<Longrightarrow> ((class G C) \<noteq> None) \<longrightarrow> 
   234   \<Longrightarrow> ((class G C) \<noteq> None) \<longrightarrow> 
   235   R (class_rec G C t1 f1) (class_rec G C t2 f2)"
   235   R (class_rec G C t1 f1) (class_rec G C t2 f2)"
   236 apply (frule wf_subcls1) (* establish wf ((subcls1 G)^-1) *)
   236 apply (frule wf_subcls1) (* establish wf ((subcls1 G)^-1) *)
   237 apply (rule_tac a = C in  wfP_induct) apply assumption
   237 apply (rule_tac a = C in  wf_induct) apply assumption
   238 apply (intro strip)
   238 apply (intro strip)
   239 apply (subgoal_tac "(\<exists>D rT mb. class G x = Some (D, rT, mb))")
   239 apply (subgoal_tac "(\<exists>D rT mb. class G x = Some (D, rT, mb))")
   240   apply (erule exE)+
   240   apply (erule exE)+
   241 apply (frule_tac C=x and t=t1 and f=f1 in class_rec_lemma)
   241 apply (frule_tac C=x and t=t1 and f=f1 in class_rec_lemma)
   242   apply assumption
   242   apply assumption