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> (subcls1 G)^++ D C" |
137 lemma subcls1_wfD: "[|G\<turnstile>C\<prec>C1D; ws_prog G|] ==> D \<noteq> C \<and> \<not> (subcls1 G)^++ D C" |
138 apply( frule trancl.r_into_trancl [where r="subcls1 G"]) |
138 apply( frule tranclp.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_tranclp [THEN sym] simp del: reflcl_tranclp) |
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; (subcls1 G)^++ C D|] ==> \<not> (subcls1 G)^++ D C" |
152 lemma subcls_asym: "[|ws_prog G; (subcls1 G)^++ C D|] ==> \<not> (subcls1 G)^++ D C" |
153 apply(erule trancl.cases) |
153 apply(erule tranclp.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: tranclp_trans) |
156 done |
156 done |
157 |
157 |
158 lemma subcls_irrefl: "[|ws_prog G; (subcls1 G)^++ C D|] ==> 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 tranclp_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 ==> acyclicP (subcls1 G)" |
163 lemma acyclic_subcls1: "ws_prog G ==> acyclicP (subcls1 G)" |
164 apply (simp add: acyclic_def [to_pred]) |
164 apply (simp add: acyclic_def [to_pred]) |
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 wfP_trancl) |
185 apply(drule wfP_trancl) |
186 apply(simp only: trancl_converse') |
186 apply(simp only: tranclp_converse) |
187 apply(erule_tac a = C in wfP_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 |
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 wfP_trancl) |
234 apply(drule wfP_trancl) |
235 apply(simp only: trancl_converse') |
235 apply(simp only: tranclp_converse) |
236 apply(erule_tac a = C in wfP_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 |
337 apply( rule ballI) |
337 apply( rule ballI) |
338 apply( simp (no_asm_simp) only: split_tupled_all) |
338 apply( simp (no_asm_simp) only: split_tupled_all) |
339 apply( simp (no_asm)) |
339 apply( simp (no_asm)) |
340 apply( erule UnE) |
340 apply( erule UnE) |
341 apply( force) |
341 apply( force) |
342 apply( erule r_into_rtrancl' [THEN rtrancl_trans']) |
342 apply( erule r_into_rtranclp [THEN rtranclp_trans]) |
343 apply auto |
343 apply auto |
344 done |
344 done |
345 |
345 |
346 lemma widen_fields_defpl: |
346 lemma widen_fields_defpl: |
347 "[|((fn,fd),fT) \<in> set (fields (G,C)); ws_prog G; is_class G C|] ==> |
347 "[|((fn,fd),fT) \<in> set (fields (G,C)); ws_prog G; is_class G C|] ==> |
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; (subcls1 G)^** C' C|] ==> |
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_rtranclp_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 rtranclpD) |
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 tranclp_into_rtranclp) |
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> |
435 apply( erule disjE) |
435 apply( erule disjE) |
436 apply( erule_tac V = "?P --> ?Q" in thin_rl) |
436 apply( erule_tac V = "?P --> ?Q" in thin_rl) |
437 apply (frule map_of_SomeD) |
437 apply (frule map_of_SomeD) |
438 apply (clarsimp simp add: wf_cdecl_def) |
438 apply (clarsimp simp add: wf_cdecl_def) |
439 apply( clarify) |
439 apply( clarify) |
440 apply( rule rtrancl_trans') |
440 apply( rule rtranclp_trans) |
441 prefer 2 |
441 prefer 2 |
442 apply( assumption) |
442 apply( assumption) |
443 apply( rule r_into_rtrancl') |
443 apply( rule r_into_rtranclp) |
444 apply( fast intro: subcls1I) |
444 apply( fast intro: subcls1I) |
445 done |
445 done |
446 |
446 |
447 |
447 |
448 lemma method_wf_mhead [rule_format (no_asm)]: |
448 lemma method_wf_mhead [rule_format (no_asm)]: |
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 rtranclp_trans) |
477 prefer 2 |
477 prefer 2 |
478 apply( assumption) |
478 apply( assumption) |
479 apply( rule r_into_rtrancl') |
479 apply( rule r_into_rtranclp) |
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 rtranclpD) |
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 tranclp_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 rtranclp_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 rtranclp_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 |