132 apply (erule_tac x = x in allE) |
132 apply (erule_tac x = x in allE) |
133 apply clarify |
133 apply clarify |
134 apply (auto intro!: map_of_SomeI) |
134 apply (auto intro!: map_of_SomeI) |
135 done |
135 done |
136 |
136 |
137 lemma subcls1_wfD: "[|G\<turnstile>C\<prec>C1D; ws_prog G|] ==> D \<noteq> C \<and> \<not>(D,C)\<in>(subcls1 G)^+" |
137 lemma subcls1_wfD: "[|G\<turnstile>C\<prec>C1D; ws_prog G|] ==> D \<noteq> C \<and> \<not> (subcls1 G)^++ D C" |
138 apply( frule r_into_trancl) |
138 apply( frule trancl.r_into_trancl [where r="subcls1 G"]) |
139 apply( drule subcls1D) |
139 apply( drule subcls1D) |
140 apply(clarify) |
140 apply(clarify) |
141 apply( drule (1) class_wf_struct) |
141 apply( drule (1) class_wf_struct) |
142 apply( unfold ws_cdecl_def) |
142 apply( unfold ws_cdecl_def) |
143 apply(force simp add: reflcl_trancl [THEN sym] simp del: reflcl_trancl) |
143 apply(force simp add: reflcl_trancl' [THEN sym] simp del: reflcl_trancl') |
144 done |
144 done |
145 |
145 |
146 lemma wf_cdecl_supD: |
146 lemma wf_cdecl_supD: |
147 "!!r. \<lbrakk>ws_cdecl G (C,D,r); C \<noteq> Object\<rbrakk> \<Longrightarrow> is_class G D" |
147 "!!r. \<lbrakk>ws_cdecl G (C,D,r); C \<noteq> Object\<rbrakk> \<Longrightarrow> is_class G D" |
148 apply (unfold ws_cdecl_def) |
148 apply (unfold ws_cdecl_def) |
149 apply (auto split add: option.split_asm) |
149 apply (auto split add: option.split_asm) |
150 done |
150 done |
151 |
151 |
152 lemma subcls_asym: "[|ws_prog G; (C,D)\<in>(subcls1 G)^+|] ==> \<not>(D,C)\<in>(subcls1 G)^+" |
152 lemma subcls_asym: "[|ws_prog G; (subcls1 G)^++ C D|] ==> \<not> (subcls1 G)^++ D C" |
153 apply(erule tranclE) |
153 apply(erule trancl.cases) |
154 apply(fast dest!: subcls1_wfD ) |
154 apply(fast dest!: subcls1_wfD ) |
155 apply(fast dest!: subcls1_wfD intro: trancl_trans) |
155 apply(fast dest!: subcls1_wfD intro: trancl_trans') |
156 done |
156 done |
157 |
157 |
158 lemma subcls_irrefl: "[|ws_prog G; (C,D)\<in>(subcls1 G)^+|] ==> C \<noteq> D" |
158 lemma subcls_irrefl: "[|ws_prog G; (subcls1 G)^++ C D|] ==> C \<noteq> D" |
159 apply (erule trancl_trans_induct) |
159 apply (erule trancl_trans_induct') |
160 apply (auto dest: subcls1_wfD subcls_asym) |
160 apply (auto dest: subcls1_wfD subcls_asym) |
161 done |
161 done |
162 |
162 |
163 lemma acyclic_subcls1: "ws_prog G ==> acyclic (subcls1 G)" |
163 lemma acyclic_subcls1: "ws_prog G ==> acyclicP (subcls1 G)" |
164 apply (unfold acyclic_def) |
164 apply (simp add: acyclic_def [to_pred]) |
165 apply (fast dest: subcls_irrefl) |
165 apply (fast dest: subcls_irrefl) |
166 done |
166 done |
167 |
167 |
168 lemma wf_subcls1: "ws_prog G ==> wf ((subcls1 G)^-1)" |
168 lemma wf_subcls1: "ws_prog G ==> wfP ((subcls1 G)^--1)" |
169 apply (rule finite_acyclic_wf) |
169 apply (rule finite_acyclic_wf [to_pred]) |
170 apply ( subst finite_converse) |
170 apply ( subst finite_converse [to_pred]) |
171 apply ( rule finite_subcls1) |
171 apply ( rule finite_subcls1) |
172 apply (subst acyclic_converse) |
172 apply (subst acyclic_converse [to_pred]) |
173 apply (erule acyclic_subcls1) |
173 apply (erule acyclic_subcls1) |
174 done |
174 done |
175 |
175 |
176 |
176 |
177 lemma subcls_induct: |
177 lemma subcls_induct: |
178 "[|wf_prog wf_mb G; !!C. \<forall>D. (C,D)\<in>(subcls1 G)^+ --> P D ==> P C|] ==> P C" |
178 "[|wf_prog wf_mb G; !!C. \<forall>D. (subcls1 G)^++ C D --> P D ==> P C|] ==> P C" |
179 (is "?A \<Longrightarrow> PROP ?P \<Longrightarrow> _") |
179 (is "?A \<Longrightarrow> PROP ?P \<Longrightarrow> _") |
180 proof - |
180 proof - |
181 assume p: "PROP ?P" |
181 assume p: "PROP ?P" |
182 assume ?A thus ?thesis apply - |
182 assume ?A thus ?thesis apply - |
183 apply (drule wf_prog_ws_prog) |
183 apply (drule wf_prog_ws_prog) |
184 apply(drule wf_subcls1) |
184 apply(drule wf_subcls1) |
185 apply(drule wf_trancl) |
185 apply(drule wfP_trancl) |
186 apply(simp only: trancl_converse) |
186 apply(simp only: trancl_converse') |
187 apply(erule_tac a = C in wf_induct) |
187 apply(erule_tac a = C in wfP_induct) |
188 apply(rule p) |
188 apply(rule p) |
189 apply(auto) |
189 apply(auto) |
190 done |
190 done |
191 qed |
191 qed |
192 |
192 |
223 apply auto |
223 apply auto |
224 done |
224 done |
225 qed |
225 qed |
226 |
226 |
227 lemma subcls_induct_struct: |
227 lemma subcls_induct_struct: |
228 "[|ws_prog G; !!C. \<forall>D. (C,D)\<in>(subcls1 G)^+ --> P D ==> P C|] ==> P C" |
228 "[|ws_prog G; !!C. \<forall>D. (subcls1 G)^++ C D --> P D ==> P C|] ==> P C" |
229 (is "?A \<Longrightarrow> PROP ?P \<Longrightarrow> _") |
229 (is "?A \<Longrightarrow> PROP ?P \<Longrightarrow> _") |
230 proof - |
230 proof - |
231 assume p: "PROP ?P" |
231 assume p: "PROP ?P" |
232 assume ?A thus ?thesis apply - |
232 assume ?A thus ?thesis apply - |
233 apply(drule wf_subcls1) |
233 apply(drule wf_subcls1) |
234 apply(drule wf_trancl) |
234 apply(drule wfP_trancl) |
235 apply(simp only: trancl_converse) |
235 apply(simp only: trancl_converse') |
236 apply(erule_tac a = C in wf_induct) |
236 apply(erule_tac a = C in wfP_induct) |
237 apply(rule p) |
237 apply(rule p) |
238 apply(auto) |
238 apply(auto) |
239 done |
239 done |
240 qed |
240 qed |
241 |
241 |
379 apply( simp) |
379 apply( simp) |
380 apply(auto dest!: widen_fields_defpl) |
380 apply(auto dest!: widen_fields_defpl) |
381 done |
381 done |
382 |
382 |
383 lemma fields_mono_lemma [rule_format (no_asm)]: |
383 lemma fields_mono_lemma [rule_format (no_asm)]: |
384 "[|ws_prog G; (C',C)\<in>(subcls1 G)^*|] ==> |
384 "[|ws_prog G; (subcls1 G)^** C' C|] ==> |
385 x \<in> set (fields (G,C)) --> x \<in> set (fields (G,C'))" |
385 x \<in> set (fields (G,C)) --> x \<in> set (fields (G,C'))" |
386 apply(erule converse_rtrancl_induct) |
386 apply(erule converse_rtrancl_induct') |
387 apply( safe dest!: subcls1D) |
387 apply( safe dest!: subcls1D) |
388 apply(subst fields_rec) |
388 apply(subst fields_rec) |
389 apply( auto) |
389 apply( auto) |
390 done |
390 done |
391 |
391 |
400 |
400 |
401 lemma widen_cfs_fields: |
401 lemma widen_cfs_fields: |
402 "[|field (G,C) fn = Some (fd, fT); G\<turnstile>D\<preceq>C C; ws_prog G|]==> |
402 "[|field (G,C) fn = Some (fd, fT); G\<turnstile>D\<preceq>C C; ws_prog G|]==> |
403 map_of (fields (G,D)) (fn, fd) = Some fT" |
403 map_of (fields (G,D)) (fn, fd) = Some fT" |
404 apply (drule field_fields) |
404 apply (drule field_fields) |
405 apply (drule rtranclD) |
405 apply (drule rtranclD') |
406 apply safe |
406 apply safe |
407 apply (frule subcls_is_class) |
407 apply (frule subcls_is_class) |
408 apply (drule trancl_into_rtrancl) |
408 apply (drule trancl_into_rtrancl') |
409 apply (fast dest: fields_mono) |
409 apply (fast dest: fields_mono) |
410 done |
410 done |
411 |
411 |
412 lemma method_wf_mdecl [rule_format (no_asm)]: |
412 lemma method_wf_mdecl [rule_format (no_asm)]: |
413 "wf_prog wf_mb G ==> is_class G C \<Longrightarrow> |
413 "wf_prog wf_mb G ==> is_class G C \<Longrightarrow> |
471 apply( erule_tac V = "?P --> ?Q" in thin_rl) |
471 apply( erule_tac V = "?P --> ?Q" in thin_rl) |
472 apply (frule map_of_SomeD) |
472 apply (frule map_of_SomeD) |
473 apply (clarsimp simp add: ws_cdecl_def) |
473 apply (clarsimp simp add: ws_cdecl_def) |
474 apply blast |
474 apply blast |
475 apply clarify |
475 apply clarify |
476 apply( rule rtrancl_trans) |
476 apply( rule rtrancl_trans') |
477 prefer 2 |
477 prefer 2 |
478 apply( assumption) |
478 apply( assumption) |
479 apply( rule r_into_rtrancl) |
479 apply( rule r_into_rtrancl') |
480 apply( fast intro: subcls1I) |
480 apply( fast intro: subcls1I) |
481 done |
481 done |
482 |
482 |
483 lemma subcls_widen_methd [rule_format (no_asm)]: |
483 lemma subcls_widen_methd [rule_format (no_asm)]: |
484 "[|G\<turnstile>T'\<preceq>C T; wf_prog wf_mb G|] ==> |
484 "[|G\<turnstile>T'\<preceq>C T; wf_prog wf_mb G|] ==> |
485 \<forall>D rT b. method (G,T) sig = Some (D,rT ,b) --> |
485 \<forall>D rT b. method (G,T) sig = Some (D,rT ,b) --> |
486 (\<exists>D' rT' b'. method (G,T') sig = Some (D',rT',b') \<and> G\<turnstile>D'\<preceq>C D \<and> G\<turnstile>rT'\<preceq>rT)" |
486 (\<exists>D' rT' b'. method (G,T') sig = Some (D',rT',b') \<and> G\<turnstile>D'\<preceq>C D \<and> G\<turnstile>rT'\<preceq>rT)" |
487 apply( drule rtranclD) |
487 apply( drule rtranclD') |
488 apply( erule disjE) |
488 apply( erule disjE) |
489 apply( fast) |
489 apply( fast) |
490 apply( erule conjE) |
490 apply( erule conjE) |
491 apply( erule trancl_trans_induct) |
491 apply( erule trancl_trans_induct') |
492 prefer 2 |
492 prefer 2 |
493 apply( clarify) |
493 apply( clarify) |
494 apply( drule spec, drule spec, drule spec, erule (1) impE) |
494 apply( drule spec, drule spec, drule spec, erule (1) impE) |
495 apply( fast elim: widen_trans rtrancl_trans) |
495 apply( fast elim: widen_trans rtrancl_trans') |
496 apply( clarify) |
496 apply( clarify) |
497 apply( drule subcls1D) |
497 apply( drule subcls1D) |
498 apply( clarify) |
498 apply( clarify) |
499 apply( subst method_rec) |
499 apply( subst method_rec) |
500 apply( assumption) |
500 apply( assumption) |
510 apply( frule (1) class_wf) |
510 apply( frule (1) class_wf) |
511 apply( simp (no_asm_simp) only: split_tupled_all) |
511 apply( simp (no_asm_simp) only: split_tupled_all) |
512 apply( unfold wf_cdecl_def) |
512 apply( unfold wf_cdecl_def) |
513 apply( drule map_of_SomeD) |
513 apply( drule map_of_SomeD) |
514 apply (auto simp add: wf_mrT_def) |
514 apply (auto simp add: wf_mrT_def) |
515 apply (rule rtrancl_trans) |
515 apply (rule rtrancl_trans') |
516 defer |
516 defer |
517 apply (rule method_wf_mhead [THEN conjunct1]) |
517 apply (rule method_wf_mhead [THEN conjunct1]) |
518 apply (simp only: wf_prog_def) |
518 apply (simp only: wf_prog_def) |
519 apply (simp add: is_class_def) |
519 apply (simp add: is_class_def) |
520 apply assumption |
520 apply assumption |