src/HOL/MicroJava/J/WellForm.thy
changeset 22271 51a80e238b29
parent 18576 8d98b7711e47
child 22633 a47e4fd7ebc1
equal deleted inserted replaced
22270:4ccb7e6be929 22271:51a80e238b29
   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 
   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_rtrancl' [THEN rtrancl_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|] ==>  
   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>   
   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 rtrancl_trans')
   441 prefer 2
   441 prefer 2
   442 apply(  assumption)
   442 apply(  assumption)
   443 apply( rule r_into_rtrancl)
   443 apply( rule r_into_rtrancl')
   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 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