src/HOL/MicroJava/J/WellForm.thy
changeset 14045 a34d89ce6097
parent 14025 d9b155757dc8
child 14174 f3cafd2929d5
--- a/src/HOL/MicroJava/J/WellForm.thy	Mon May 26 11:42:41 2003 +0200
+++ b/src/HOL/MicroJava/J/WellForm.thy	Mon May 26 18:36:15 2003 +0200
@@ -27,12 +27,40 @@
 types 'c wf_mb = "'c prog => cname => 'c mdecl => bool"
 
 constdefs
+ wf_syscls :: "'c prog => bool"
+"wf_syscls G == let cs = set G in Object \<in> fst ` cs \<and> (\<forall>x. Xcpt x \<in> fst ` cs)"
+
  wf_fdecl :: "'c prog => fdecl => bool"
 "wf_fdecl G == \<lambda>(fn,ft). is_type G ft"
 
  wf_mhead :: "'c prog => sig => ty => bool"
 "wf_mhead G == \<lambda>(mn,pTs) rT. (\<forall>T\<in>set pTs. is_type G T) \<and> is_type G rT"
 
+ ws_cdecl :: "'c prog => 'c cdecl => bool"
+"ws_cdecl G ==
+   \<lambda>(C,(D,fs,ms)).
+  (\<forall>f\<in>set fs. wf_fdecl G         f) \<and>  unique fs \<and>
+  (\<forall>(sig,rT,mb)\<in>set ms. wf_mhead G sig rT) \<and> unique ms \<and>
+  (C \<noteq> Object \<longrightarrow> is_class G D \<and>  \<not>G\<turnstile>D\<preceq>C C)"
+
+ ws_prog :: "'c prog => bool"
+"ws_prog G == 
+  wf_syscls G \<and> (\<forall>c\<in>set G. ws_cdecl G c) \<and> unique G"
+
+ wf_mrT   :: "'c prog => 'c cdecl => bool"
+"wf_mrT G ==
+   \<lambda>(C,(D,fs,ms)).
+  (C \<noteq> Object \<longrightarrow> (\<forall>(sig,rT,b)\<in>set ms. \<forall>D' rT' b'.
+                      method(G,D) sig = Some(D',rT',b') --> G\<turnstile>rT\<preceq>rT'))"
+
+ wf_cdecl_mdecl :: "'c wf_mb => 'c prog => 'c cdecl => bool"
+"wf_cdecl_mdecl wf_mb G ==
+   \<lambda>(C,(D,fs,ms)). (\<forall>m\<in>set ms. wf_mb G C m)"
+
+ wf_prog :: "'c wf_mb => 'c prog => bool"
+"wf_prog wf_mb G == 
+     ws_prog G \<and> (\<forall>c\<in> set G. wf_mrT G c \<and> wf_cdecl_mdecl wf_mb G c)"
+
  wf_mdecl :: "'c wf_mb => 'c wf_mb"
 "wf_mdecl wf_mb G C == \<lambda>(sig,rT,mb). wf_mhead G sig rT \<and> wf_mb G C (sig,rT,mb)"
 
@@ -45,33 +73,62 @@
                    (\<forall>(sig,rT,b)\<in>set ms. \<forall>D' rT' b'.
                       method(G,D) sig = Some(D',rT',b') --> G\<turnstile>rT\<preceq>rT'))"
 
- wf_syscls :: "'c prog => bool"
-"wf_syscls G == let cs = set G in Object \<in> fst ` cs \<and> (\<forall>x. Xcpt x \<in> fst ` cs)"
+lemma wf_cdecl_mrT_cdecl_mdecl:
+  "(wf_cdecl wf_mb G c) = (ws_cdecl G c \<and> wf_mrT G c \<and> wf_cdecl_mdecl wf_mb G c)"
+apply (rule iffI)
+apply (simp add: wf_cdecl_def ws_cdecl_def wf_mrT_def wf_cdecl_mdecl_def 
+  wf_mdecl_def wf_mhead_def split_beta)+
+done
 
- wf_prog :: "'c wf_mb => 'c prog => bool"
-"wf_prog wf_mb G == 
-   let cs = set G in wf_syscls G \<and> (\<forall>c\<in>cs. wf_cdecl wf_mb G c) \<and> unique G"
+lemma wf_cdecl_ws_cdecl [intro]: "wf_cdecl wf_mb G cd \<Longrightarrow> ws_cdecl G cd"
+by (simp add: wf_cdecl_mrT_cdecl_mdecl)
+
+lemma wf_prog_ws_prog [intro]: "wf_prog wf_mb G \<Longrightarrow> ws_prog G"
+by (simp add: wf_prog_def ws_prog_def)
+
+lemma wf_prog_wf_mdecl: 
+  "\<lbrakk> wf_prog wf_mb G; (C,S,fs,mdecls) \<in> set G; ((mn,pTs),rT,code) \<in> set mdecls\<rbrakk>
+  \<Longrightarrow> wf_mdecl wf_mb G C ((mn,pTs),rT,code)"
+by (auto simp add: wf_prog_def ws_prog_def wf_mdecl_def  
+  wf_cdecl_mdecl_def ws_cdecl_def)
 
 lemma class_wf: 
- "[|class G C = Some c; wf_prog wf_mb G|] ==> wf_cdecl wf_mb G (C,c)"
-apply (unfold wf_prog_def class_def)
-apply (simp)
+ "[|class G C = Some c; wf_prog wf_mb G|] 
+  ==> wf_cdecl wf_mb G (C,c) \<and> wf_mrT G (C,c)"
+apply (unfold wf_prog_def ws_prog_def wf_cdecl_def class_def)
+apply clarify
+apply (drule_tac x="(C,c)" in bspec, fast dest: map_of_SomeD)
+apply (drule_tac x="(C,c)" in bspec, fast dest: map_of_SomeD)
+apply (simp add: wf_cdecl_def ws_cdecl_def wf_mdecl_def
+  wf_cdecl_mdecl_def wf_mrT_def split_beta)
+done
+
+lemma class_wf_struct: 
+ "[|class G C = Some c; ws_prog G|] 
+  ==> ws_cdecl G (C,c)"
+apply (unfold ws_prog_def class_def)
 apply (fast dest: map_of_SomeD)
 done
 
 lemma class_Object [simp]: 
-  "wf_prog wf_mb G ==> \<exists>X fs ms. class G Object = Some (X,fs,ms)"
-apply (unfold wf_prog_def wf_syscls_def class_def)
+  "ws_prog G ==> \<exists>X fs ms. class G Object = Some (X,fs,ms)"
+apply (unfold ws_prog_def wf_syscls_def class_def)
 apply (auto simp: map_of_SomeI)
 done
 
-lemma is_class_Object [simp]: "wf_prog wf_mb G ==> is_class G Object"
+lemma class_Object_syscls [simp]: 
+  "wf_syscls G ==> unique G \<Longrightarrow> \<exists>X fs ms. class G Object = Some (X,fs,ms)"
+apply (unfold wf_syscls_def class_def)
+apply (auto simp: map_of_SomeI)
+done
+
+lemma is_class_Object [simp]: "ws_prog G ==> is_class G Object"
 apply (unfold is_class_def)
 apply (simp (no_asm_simp))
 done
 
-lemma is_class_xcpt [simp]: "wf_prog wf_mb G \<Longrightarrow> is_class G (Xcpt x)"
-  apply (simp add: wf_prog_def wf_syscls_def)
+lemma is_class_xcpt [simp]: "ws_prog G \<Longrightarrow> is_class G (Xcpt x)"
+  apply (simp add: ws_prog_def wf_syscls_def)
   apply (simp add: is_class_def class_def)
   apply clarify
   apply (erule_tac x = x in allE)
@@ -79,38 +136,38 @@
   apply (auto intro!: map_of_SomeI)
   done
 
-lemma subcls1_wfD: "[|G\<turnstile>C\<prec>C1D; wf_prog wf_mb G|] ==> D \<noteq> C \<and> \<not>(D,C)\<in>(subcls1 G)^+"
+lemma subcls1_wfD: "[|G\<turnstile>C\<prec>C1D; ws_prog G|] ==> D \<noteq> C \<and> \<not>(D,C)\<in>(subcls1 G)^+"
 apply( frule r_into_trancl)
 apply( drule subcls1D)
 apply(clarify)
-apply( drule (1) class_wf)
-apply( unfold wf_cdecl_def)
+apply( drule (1) class_wf_struct)
+apply( unfold ws_cdecl_def)
 apply(force simp add: reflcl_trancl [THEN sym] simp del: reflcl_trancl)
 done
 
 lemma wf_cdecl_supD: 
-"!!r. \<lbrakk>wf_cdecl wf_mb G (C,D,r); C \<noteq> Object\<rbrakk> \<Longrightarrow> is_class G D"
-apply (unfold wf_cdecl_def)
+"!!r. \<lbrakk>ws_cdecl G (C,D,r); C \<noteq> Object\<rbrakk> \<Longrightarrow> is_class G D"
+apply (unfold ws_cdecl_def)
 apply (auto split add: option.split_asm)
 done
 
-lemma subcls_asym: "[|wf_prog wf_mb G; (C,D)\<in>(subcls1 G)^+|] ==> \<not>(D,C)\<in>(subcls1 G)^+"
+lemma subcls_asym: "[|ws_prog G; (C,D)\<in>(subcls1 G)^+|] ==> \<not>(D,C)\<in>(subcls1 G)^+"
 apply(erule tranclE)
 apply(fast dest!: subcls1_wfD )
 apply(fast dest!: subcls1_wfD intro: trancl_trans)
 done
 
-lemma subcls_irrefl: "[|wf_prog wf_mb G; (C,D)\<in>(subcls1 G)^+|] ==> C \<noteq> D"
+lemma subcls_irrefl: "[|ws_prog G; (C,D)\<in>(subcls1 G)^+|] ==> C \<noteq> D"
 apply (erule trancl_trans_induct)
 apply  (auto dest: subcls1_wfD subcls_asym)
 done
 
-lemma acyclic_subcls1: "wf_prog wf_mb G ==> acyclic (subcls1 G)"
+lemma acyclic_subcls1: "ws_prog G ==> acyclic (subcls1 G)"
 apply (unfold acyclic_def)
 apply (fast dest: subcls_irrefl)
 done
 
-lemma wf_subcls1: "wf_prog wf_mb G ==> wf ((subcls1 G)^-1)"
+lemma wf_subcls1: "ws_prog G ==> wf ((subcls1 G)^-1)"
 apply (rule finite_acyclic_wf)
 apply ( subst finite_converse)
 apply ( rule finite_subcls1)
@@ -118,12 +175,14 @@
 apply (erule acyclic_subcls1)
 done
 
+
 lemma subcls_induct: 
 "[|wf_prog wf_mb G; !!C. \<forall>D. (C,D)\<in>(subcls1 G)^+ --> P D ==> P C|] ==> P C"
 (is "?A \<Longrightarrow> PROP ?P \<Longrightarrow> _")
 proof -
   assume p: "PROP ?P"
   assume ?A thus ?thesis apply -
+apply (drule wf_prog_ws_prog)
 apply(drule wf_subcls1)
 apply(drule wf_trancl)
 apply(simp only: trancl_converse)
@@ -155,7 +214,57 @@
 apply( case_tac "C = Object")
 apply(  fast)
 apply safe
-apply( frule (1) class_wf)
+apply( frule (1) class_wf) apply (erule conjE)+
+apply (frule wf_cdecl_ws_cdecl)
+apply( frule (1) wf_cdecl_supD)
+
+apply( subgoal_tac "G\<turnstile>C\<prec>C1a")
+apply( erule_tac [2] subcls1I)
+apply(  rule p)
+apply (unfold is_class_def)
+apply auto
+done
+qed
+
+lemma subcls_induct_struct: 
+"[|ws_prog G; !!C. \<forall>D. (C,D)\<in>(subcls1 G)^+ --> P D ==> P C|] ==> P C"
+(is "?A \<Longrightarrow> PROP ?P \<Longrightarrow> _")
+proof -
+  assume p: "PROP ?P"
+  assume ?A thus ?thesis apply -
+apply(drule wf_subcls1)
+apply(drule wf_trancl)
+apply(simp only: trancl_converse)
+apply(erule_tac a = C in wf_induct)
+apply(rule p)
+apply(auto)
+done
+qed
+
+
+lemma subcls1_induct_struct:
+"[|is_class G C; ws_prog G; P Object;  
+   !!C D fs ms. [|C \<noteq> Object; is_class G C; class G C = Some (D,fs,ms) \<and>  
+    ws_cdecl G (C,D,fs,ms) \<and> G\<turnstile>C\<prec>C1D \<and> is_class G D \<and> P D|] ==> P C 
+ |] ==> P C"
+(is "?A \<Longrightarrow> ?B \<Longrightarrow> ?C \<Longrightarrow> PROP ?P \<Longrightarrow> _")
+proof -
+  assume p: "PROP ?P"
+  assume ?A ?B ?C thus ?thesis apply -
+apply(unfold is_class_def)
+apply( rule impE)
+prefer 2
+apply(   assumption)
+prefer 2
+apply(  assumption)
+apply( erule thin_rl)
+apply( rule subcls_induct_struct)
+apply(  assumption)
+apply( rule impI)
+apply( case_tac "C = Object")
+apply(  fast)
+apply safe
+apply( frule (1) class_wf_struct)
 apply( frule (1) wf_cdecl_supD)
 
 apply( subgoal_tac "G\<turnstile>C\<prec>C1a")
@@ -170,7 +279,7 @@
 
 lemmas fields_rec = wf_subcls1 [THEN [2] fields_rec_lemma];
 
-lemma field_rec: "\<lbrakk>class G C = Some (D, fs, ms); wf_prog wf_mb G\<rbrakk>
+lemma field_rec: "\<lbrakk>class G C = Some (D, fs, ms); ws_prog G\<rbrakk>
 \<Longrightarrow> field (G, C) =
    (if C = Object then empty else field (G, D)) ++
    map_of (map (\<lambda>(s, f). (s, C, f)) fs)"
@@ -183,14 +292,14 @@
 done
 
 lemma method_Object [simp]:
-  "method (G, Object) sig = Some (D, mh, code) \<Longrightarrow> wf_prog wf_mb G \<Longrightarrow> D = Object"  
+  "method (G, Object) sig = Some (D, mh, code) \<Longrightarrow> ws_prog G \<Longrightarrow> D = Object"  
   apply (frule class_Object, clarify)
   apply (drule method_rec, assumption)
   apply (auto dest: map_of_SomeD)
   done
 
 
-lemma fields_Object [simp]: "\<lbrakk> ((vn, C), T) \<in> set (fields (G, Object)); wf_prog wf_mb G \<rbrakk>
+lemma fields_Object [simp]: "\<lbrakk> ((vn, C), T) \<in> set (fields (G, Object)); ws_prog G \<rbrakk>
   \<Longrightarrow> C = Object"
 apply (frule class_Object)
 apply clarify
@@ -202,8 +311,8 @@
 apply simp
 done
 
-lemma subcls_C_Object: "[|is_class G C; wf_prog wf_mb G|] ==> G\<turnstile>C\<preceq>C Object"
-apply(erule subcls1_induct)
+lemma subcls_C_Object: "[|is_class G C; ws_prog G|] ==> G\<turnstile>C\<preceq>C Object"
+apply(erule subcls1_induct_struct)
 apply(  assumption)
 apply( fast)
 apply(auto dest!: wf_cdecl_supD)
@@ -215,9 +324,9 @@
 apply auto
 done
 
-lemma widen_fields_defpl': "[|is_class G C; wf_prog wf_mb G|] ==>  
+lemma widen_fields_defpl': "[|is_class G C; ws_prog G|] ==>  
   \<forall>((fn,fd),fT)\<in>set (fields (G,C)). G\<turnstile>C\<preceq>C fd"
-apply( erule subcls1_induct)
+apply( erule subcls1_induct_struct)
 apply(   assumption)
 apply(  frule class_Object)
 apply(  clarify)
@@ -238,21 +347,21 @@
 done
 
 lemma widen_fields_defpl: 
-  "[|((fn,fd),fT) \<in> set (fields (G,C)); wf_prog wf_mb G; is_class G C|] ==>  
+  "[|((fn,fd),fT) \<in> set (fields (G,C)); ws_prog G; is_class G C|] ==>  
   G\<turnstile>C\<preceq>C fd"
 apply( drule (1) widen_fields_defpl')
 apply (fast)
 done
 
 lemma unique_fields: 
-  "[|is_class G C; wf_prog wf_mb G|] ==> unique (fields (G,C))"
-apply( erule subcls1_induct)
+  "[|is_class G C; ws_prog G|] ==> unique (fields (G,C))"
+apply( erule subcls1_induct_struct)
 apply(   assumption)
 apply(  frule class_Object)
 apply(  clarify)
 apply(  frule fields_rec, assumption)
-apply(  drule class_wf, assumption)
-apply(  simp add: wf_cdecl_def)
+apply(  drule class_wf_struct, assumption)
+apply(  simp add: ws_cdecl_def)
 apply(  rule unique_map_inj)
 apply(   simp)
 apply(  rule inj_onI)
@@ -263,9 +372,9 @@
 apply( subst fields_rec)
 apply   auto
 apply( rotate_tac -1)
-apply( frule class_wf)
+apply( frule class_wf_struct)
 apply  auto
-apply( simp add: wf_cdecl_def)
+apply( simp add: ws_cdecl_def)
 apply( erule unique_append)
 apply(  rule unique_map_inj)
 apply(   clarsimp)
@@ -275,7 +384,7 @@
 done
 
 lemma fields_mono_lemma [rule_format (no_asm)]: 
-  "[|wf_prog wf_mb G; (C',C)\<in>(subcls1 G)^*|] ==>  
+  "[|ws_prog G; (C',C)\<in>(subcls1 G)^*|] ==>  
   x \<in> set (fields (G,C)) --> x \<in> set (fields (G,C'))"
 apply(erule converse_rtrancl_induct)
 apply( safe dest!: subcls1D)
@@ -284,7 +393,7 @@
 done
 
 lemma fields_mono: 
-"\<lbrakk>map_of (fields (G,C)) fn = Some f; G\<turnstile>D\<preceq>C C; is_class G D; wf_prog wf_mb G\<rbrakk> 
+"\<lbrakk>map_of (fields (G,C)) fn = Some f; G\<turnstile>D\<preceq>C C; is_class G D; ws_prog G\<rbrakk> 
   \<Longrightarrow> map_of (fields (G,D)) fn = Some f"
 apply (rule map_of_SomeI)
 apply  (erule (1) unique_fields)
@@ -293,7 +402,7 @@
 done
 
 lemma widen_cfs_fields: 
-"[|field (G,C) fn = Some (fd, fT); G\<turnstile>D\<preceq>C C; wf_prog wf_mb G|]==>  
+"[|field (G,C) fn = Some (fd, fT); G\<turnstile>D\<preceq>C C; ws_prog G|]==>  
   map_of (fields (G,D)) (fn, fd) = Some fT"
 apply (drule field_fields)
 apply (drule rtranclD)
@@ -307,6 +416,7 @@
   "wf_prog wf_mb G ==> is_class G C \<Longrightarrow>   
      method (G,C) sig = Some (md,mh,m) 
    --> G\<turnstile>C\<preceq>C md \<and> wf_mdecl wf_mb G md (sig,(mh,m))"
+apply (frule wf_prog_ws_prog)
 apply( erule subcls1_induct)
 apply(   assumption)
 apply(  clarify) 
@@ -317,7 +427,7 @@
 apply(  simp add: wf_cdecl_def)
 apply(  drule map_of_SomeD)
 apply(  subgoal_tac "md = Object")
-apply(   fastsimp)
+apply(   fastsimp) 
 apply(  fastsimp)
 apply( clarify)
 apply( frule_tac C = C in method_rec)
@@ -338,22 +448,45 @@
 done
 
 
-lemma wf_prog_wf_mhead: "\<lbrakk> wf_prog wf_mb G; (C, D, fds, mths) \<in> set G;
-  ((mn, pTs), rT, jmb) \<in> set mths \<rbrakk>
-  \<Longrightarrow> wf_mhead G (mn, pTs) rT"
-apply (simp add: wf_prog_def wf_cdecl_def)
-apply (erule conjE)+
-apply (drule bspec, assumption)
-apply simp
-apply (erule conjE)+
-apply (drule bspec, assumption)
-apply (simp add: wf_mdecl_def)
+lemma method_wf_mhead [rule_format (no_asm)]: 
+  "ws_prog G ==> is_class G C \<Longrightarrow>   
+     method (G,C) sig = Some (md,rT,mb) 
+   --> G\<turnstile>C\<preceq>C md \<and> wf_mhead G sig rT"
+apply( erule subcls1_induct_struct)
+apply(   assumption)
+apply(  clarify) 
+apply(  frule class_Object)
+apply(  clarify)
+apply(  frule method_rec, assumption)
+apply(  drule class_wf_struct, assumption)
+apply(  simp add: ws_cdecl_def)
+apply(  drule map_of_SomeD)
+apply(  subgoal_tac "md = Object")
+apply(   fastsimp)
+apply(  fastsimp)
+apply( clarify)
+apply( frule_tac C = C in method_rec)
+apply(  assumption)
+apply( rotate_tac -1)
+apply( simp)
+apply( drule map_add_SomeD)
+apply( erule disjE)
+apply(  erule_tac V = "?P --> ?Q" in thin_rl)
+apply (frule map_of_SomeD)
+apply (clarsimp simp add: ws_cdecl_def)
+apply blast
+apply clarify
+apply( rule rtrancl_trans)
+prefer 2
+apply(  assumption)
+apply( rule r_into_rtrancl)
+apply( fast intro: subcls1I)
 done
 
 lemma subcls_widen_methd [rule_format (no_asm)]: 
-  "[|G\<turnstile>T\<preceq>C T'; wf_prog wf_mb G|] ==>  
-   \<forall>D rT b. method (G,T') sig = Some (D,rT ,b) --> 
-  (\<exists>D' rT' b'. method (G,T) sig = Some (D',rT',b') \<and> G\<turnstile>rT'\<preceq>rT)"
+  "[|G\<turnstile>T'\<preceq>C T; wf_prog wf_mb G|] ==>  
+   \<forall>D rT b. method (G,T) sig = Some (D,rT ,b) --> 
+  (\<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)"
 apply( drule rtranclD)
 apply( erule disjE)
 apply(  fast)
@@ -362,14 +495,14 @@
 prefer 2
 apply(  clarify)
 apply(  drule spec, drule spec, drule spec, erule (1) impE)
-apply(  fast elim: widen_trans)
+apply(  fast elim: widen_trans rtrancl_trans)
 apply( clarify)
 apply( drule subcls1D)
 apply( clarify)
 apply( subst method_rec)
 apply(  assumption)
 apply( unfold map_add_def)
-apply( simp (no_asm_simp) del: split_paired_Ex)
+apply( simp (no_asm_simp) add: wf_prog_ws_prog del: split_paired_Ex)
 apply( case_tac "\<exists>z. map_of(map (\<lambda>(s,m). (s, ?C, m)) ms) sig = Some z")
 apply(  erule exE)
 apply(  rotate_tac -1, frule ssubst, erule_tac [2] asm_rl)
@@ -377,25 +510,34 @@
 apply(  rotate_tac -1, frule ssubst, erule_tac [2] asm_rl)
 apply(  tactic "asm_full_simp_tac (HOL_ss addsimps [not_None_eq RS sym]) 1")
 apply(  simp_all (no_asm_simp) del: split_paired_Ex)
-apply( drule (1) class_wf)
+apply( frule (1) class_wf)
 apply( simp (no_asm_simp) only: split_tupled_all)
 apply( unfold wf_cdecl_def)
 apply( drule map_of_SomeD)
-apply auto
+apply (auto simp add: wf_mrT_def)
+apply (rule rtrancl_trans)
+defer
+apply (rule method_wf_mhead [THEN conjunct1])
+apply (simp only: wf_prog_def)
+apply (simp add: is_class_def)
+apply assumption
+apply (auto intro: subcls1I)
 done
 
+
 lemma subtype_widen_methd: 
  "[| G\<turnstile> C\<preceq>C D; wf_prog wf_mb G;  
      method (G,D) sig = Some (md, rT, b) |]  
   ==> \<exists>mD' rT' b'. method (G,C) sig= Some(mD',rT',b') \<and> G\<turnstile>rT'\<preceq>rT"
-apply(auto dest: subcls_widen_methd method_wf_mdecl 
+apply(auto dest: subcls_widen_methd 
            simp add: wf_mdecl_def wf_mhead_def split_def)
 done
 
+
 lemma method_in_md [rule_format (no_asm)]: 
-  "wf_prog wf_mb G ==> is_class G C \<Longrightarrow> \<forall>D. method (G,C) sig = Some(D,mh,code) 
+  "ws_prog G ==> is_class G C \<Longrightarrow> \<forall>D. method (G,C) sig = Some(D,mh,code) 
   --> is_class G D \<and> method (G,D) sig = Some(D,mh,code)"
-apply (erule (1) subcls1_induct)
+apply (erule (1) subcls1_induct_struct)
  apply clarify
  apply (frule method_Object, assumption)
  apply hypsubst
@@ -416,18 +558,42 @@
 done
 
 
+lemma method_in_md_struct [rule_format (no_asm)]: 
+  "ws_prog G ==> is_class G C \<Longrightarrow> \<forall>D. method (G,C) sig = Some(D,mh,code) 
+  --> is_class G D \<and> method (G,D) sig = Some(D,mh,code)"
+apply (erule (1) subcls1_induct_struct)
+ apply clarify
+ apply (frule method_Object, assumption)
+ apply hypsubst
+ apply simp
+apply (erule conjE)
+apply (subst method_rec)
+  apply (assumption)
+ apply (assumption)
+apply (clarify)
+apply (erule_tac "x" = "Da" in allE)
+apply (clarsimp)
+ apply (simp add: map_of_map)
+ apply (clarify)
+ apply (subst method_rec)
+   apply (assumption)
+  apply (assumption)
+ apply (simp add: map_add_def map_of_map split add: option.split)
+done
+
 lemma fields_in_fd [rule_format (no_asm)]: "\<lbrakk> wf_prog wf_mb G; is_class G C\<rbrakk>
   \<Longrightarrow> \<forall> vn D T. (((vn,D),T) \<in> set (fields (G,C))
   \<longrightarrow> (is_class G D \<and> ((vn,D),T) \<in> set (fields (G,D))))"
 apply (erule (1) subcls1_induct)
 
 apply clarify
+apply (frule wf_prog_ws_prog)
 apply (frule fields_Object, assumption+)
 apply (simp only: is_class_Object) apply simp
 
 apply clarify
 apply (frule fields_rec)
-apply assumption
+apply (simp (no_asm_simp) add: wf_prog_ws_prog)
 
 apply (case_tac "Da=C")
 apply blast			(* case Da=C *)
@@ -448,6 +614,7 @@
 apply clarify
 apply (frule field_fields)
 apply (drule map_of_SomeD)
+apply (frule wf_prog_ws_prog)
 apply (drule fields_Object, assumption+)
 apply simp
 
@@ -460,6 +627,7 @@
 apply (rule trans [THEN sym], rule sym, assumption)
 apply (rule_tac x=vn in fun_cong)
 apply (rule trans, rule field_rec, assumption+)
+apply (simp (no_asm_simp) add: wf_prog_ws_prog) 
 apply (simp (no_asm_use)) apply blast
 done
 
@@ -478,6 +646,7 @@
 apply (rule map_of_SomeD)
 apply (rule table_of_remap_SomeD) 
 apply assumption+
+apply (simp (no_asm_simp) add: wf_prog_ws_prog)+
 done
 
 lemma Call_lemma: 
@@ -495,16 +664,15 @@
 apply auto
 done
 
-
 lemma fields_is_type_lemma [rule_format (no_asm)]: 
-  "[|is_class G C; wf_prog wf_mb G|] ==>  
+  "[|is_class G C; ws_prog G|] ==>  
   \<forall>f\<in>set (fields (G,C)). is_type G (snd f)"
-apply( erule (1) subcls1_induct)
+apply( erule (1) subcls1_induct_struct)
 apply(  frule class_Object)
 apply(  clarify)
 apply(  frule fields_rec, assumption)
-apply(  drule class_wf, assumption)
-apply(  simp add: wf_cdecl_def wf_fdecl_def)
+apply(  drule class_wf_struct, assumption)
+apply(  simp add: ws_cdecl_def wf_fdecl_def)
 apply(  fastsimp)
 apply( subst fields_rec)
 apply(   fast)
@@ -513,34 +681,43 @@
 apply( safe)
 prefer 2
 apply(  force)
-apply( drule (1) class_wf)
-apply( unfold wf_cdecl_def)
+apply( drule (1) class_wf_struct)
+apply( unfold ws_cdecl_def)
 apply( clarsimp)
 apply( drule (1) bspec)
 apply( unfold wf_fdecl_def)
 apply auto
 done
 
+
 lemma fields_is_type: 
-  "[|map_of (fields (G,C)) fn = Some f; wf_prog wf_mb G; is_class G C|] ==>  
+  "[|map_of (fields (G,C)) fn = Some f; ws_prog G; is_class G C|] ==>  
   is_type G f"
 apply(drule map_of_SomeD)
 apply(drule (2) fields_is_type_lemma)
 apply(auto)
 done
 
+
+lemma field_is_type: "\<lbrakk> ws_prog G; is_class G C; field (G, C) fn = Some (fd, fT) \<rbrakk>
+  \<Longrightarrow> is_type G fT"
+apply (frule_tac f="((fn, fd), fT)" in fields_is_type_lemma)
+apply (auto simp add: field_def dest: map_of_SomeD)
+done
+
+
 lemma methd:
-  "[| wf_prog wf_mb G; (C,S,fs,mdecls) \<in> set G; (sig,rT,code) \<in> set mdecls |]
+  "[| ws_prog G; (C,S,fs,mdecls) \<in> set G; (sig,rT,code) \<in> set mdecls |]
   ==> method (G,C) sig = Some(C,rT,code) \<and> is_class G C"
 proof -
-  assume wf: "wf_prog wf_mb G" and C:  "(C,S,fs,mdecls) \<in> set G" and
+  assume wf: "ws_prog G" and C:  "(C,S,fs,mdecls) \<in> set G" and
          m: "(sig,rT,code) \<in> set mdecls"
   moreover
   from wf C have "class G C = Some (S,fs,mdecls)"
-    by (auto simp add: wf_prog_def class_def is_class_def intro: map_of_SomeI)
+    by (auto simp add: ws_prog_def class_def is_class_def intro: map_of_SomeI)
   moreover
   from wf C 
-  have "unique mdecls" by (unfold wf_prog_def wf_cdecl_def) auto
+  have "unique mdecls" by (unfold ws_prog_def ws_cdecl_def) auto
   hence "unique (map (\<lambda>(s,m). (s,C,m)) mdecls)" by (induct mdecls, auto)  
   with m 
   have "map_of (map (\<lambda>(s,m). (s,C,m)) mdecls) sig = Some (C,rT,code)"
@@ -553,20 +730,11 @@
 lemma wf_mb'E:
   "\<lbrakk> wf_prog wf_mb G; \<And>C S fs ms m.\<lbrakk>(C,S,fs,ms) \<in> set G; m \<in> set ms\<rbrakk> \<Longrightarrow> wf_mb' G C m \<rbrakk>
   \<Longrightarrow> wf_prog wf_mb' G"
-  apply (simp add: wf_prog_def)
+  apply (simp only: wf_prog_def)
   apply auto
-  apply (simp add: wf_cdecl_def wf_mdecl_def)
+  apply (simp add: wf_cdecl_mdecl_def)
   apply safe
   apply (drule bspec, assumption) apply simp
-  apply (drule bspec, assumption) apply simp
-  apply (drule bspec, assumption) apply simp
-  apply clarify apply (drule bspec, assumption) apply simp
-  apply (drule bspec, assumption) apply simp
-  apply (drule bspec, assumption) apply simp
-  apply (drule bspec, assumption) apply simp
-  apply (drule bspec, assumption) apply simp
-  apply (drule bspec, assumption) apply simp
-  apply clarify apply (drule bspec, assumption)+ apply simp
   done