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 |