src/HOL/MicroJava/Comp/CorrCompTp.thy
changeset 60304 3f429b7d8eb5
parent 59199 cb8e5f7a5e4a
child 61361 8b5f00202e1a
equal deleted inserted replaced
60303:00c06f1315d0 60304:3f429b7d8eb5
    21 definition local_env :: "[java_mb prog, cname, sig, vname list,(vname \<times> ty) list] \<Rightarrow> java_mb env" where
    21 definition local_env :: "[java_mb prog, cname, sig, vname list,(vname \<times> ty) list] \<Rightarrow> java_mb env" where
    22   "local_env G C S pns lvars == 
    22   "local_env G C S pns lvars == 
    23      let (mn, pTs) = S in (G,map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C))"
    23      let (mn, pTs) = S in (G,map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C))"
    24 
    24 
    25 lemma local_env_fst [simp]: "fst (local_env G C S pns lvars) = G"
    25 lemma local_env_fst [simp]: "fst (local_env G C S pns lvars) = G"
    26 by (simp add: local_env_def split_beta)
    26   by (simp add: local_env_def split_beta)
    27 
    27 
    28 
    28 
    29 lemma wt_class_expr_is_class: "\<lbrakk> ws_prog G; E \<turnstile> expr :: Class cname;
    29 lemma wt_class_expr_is_class:
    30   E = local_env G C (mn, pTs) pns lvars\<rbrakk>
    30   "\<lbrakk> ws_prog G; E \<turnstile> expr :: Class cname; E = local_env G C (mn, pTs) pns lvars\<rbrakk>
    31   \<Longrightarrow> is_class G cname "
    31   \<Longrightarrow> is_class G cname "
    32 apply (subgoal_tac "((fst E), (snd E)) \<turnstile> expr :: Class cname")
    32   apply (subgoal_tac "((fst E), (snd E)) \<turnstile> expr :: Class cname")
    33 apply (frule ty_expr_is_type) apply simp
    33    apply (frule ty_expr_is_type)
    34 apply simp apply (simp (no_asm_use))
    34     apply simp
    35 done
    35    apply simp
       
    36   apply (simp (no_asm_use))
       
    37   done
    36 
    38 
    37 
    39 
    38 
    40 
    39 (********************************************************************************)
    41 (********************************************************************************)
    40 subsection "index"
    42 subsection "index"
    41 
    43 
    42 lemma local_env_snd: "
    44 lemma local_env_snd:
    43   snd (local_env G C (mn, pTs) pns lvars) = map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C)"
    45   "snd (local_env G C (mn, pTs) pns lvars) = map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C)"
    44 by (simp add: local_env_def)
    46   by (simp add: local_env_def)
    45 
    47 
    46 
    48 
    47 
    49 
    48 lemma index_in_bounds: " length pns = length pTs \<Longrightarrow>
    50 lemma index_in_bounds:
       
    51   "length pns = length pTs \<Longrightarrow>
    49   snd (local_env G C (mn, pTs) pns lvars) vname = Some T
    52   snd (local_env G C (mn, pTs) pns lvars) vname = Some T
    50        \<Longrightarrow> index (pns, lvars, blk, res) vname < length (inited_LT C pTs lvars)"
    53        \<Longrightarrow> index (pns, lvars, blk, res) vname < length (inited_LT C pTs lvars)"
    51 apply (simp add: local_env_snd index_def split_beta)
    54   apply (simp add: local_env_snd index_def split_beta)
    52 apply (case_tac "vname = This")
    55   apply (case_tac "vname = This")
    53 apply (simp add: inited_LT_def)
    56    apply (simp add: inited_LT_def)
    54 apply simp
    57   apply simp
    55 apply (drule map_of_upds_SomeD)
    58   apply (drule map_of_upds_SomeD)
    56 apply (drule length_takeWhile)
    59   apply (drule length_takeWhile)
    57 apply (simp add: inited_LT_def)
    60   apply (simp add: inited_LT_def)
    58 done
    61   done
    59 
    62 
    60 
    63 
    61 lemma map_upds_append [rule_format (no_asm)]: 
    64 lemma map_upds_append: 
    62   "\<forall> x1s m. (length k1s = length x1s 
    65   "length k1s = length x1s \<Longrightarrow> m(k1s[\<mapsto>]x1s)(k2s[\<mapsto>]x2s) = m ((k1s@k2s)[\<mapsto>](x1s@x2s))"
    63   \<longrightarrow> m(k1s[\<mapsto>]x1s)(k2s[\<mapsto>]x2s) = m ((k1s@k2s)[\<mapsto>](x1s@x2s)))"
    66   apply (induct k1s arbitrary: x1s m)
    64 apply (induct k1s)
    67    apply simp
    65 apply simp
    68   apply (subgoal_tac "\<exists>x xr. x1s = x # xr")
    66 apply (intro strip)
    69    apply clarsimp
    67 apply (subgoal_tac "\<exists> x xr. x1s = x # xr")
       
    68 apply clarify
       
    69 apply simp
       
    70   (* subgoal *)
    70   (* subgoal *)
    71 apply (case_tac x1s)
    71   apply (case_tac x1s)
    72 apply auto
    72    apply auto
    73 done
    73   done
    74 
    74 
    75 
    75 
    76 lemma map_of_append [rule_format]: 
    76 lemma map_of_append: 
    77   "\<forall> ys. (map_of ((rev xs) @ ys) = (map_of ys) ((map fst xs) [\<mapsto>] (map snd xs)))"
    77   "map_of ((rev xs) @ ys) = (map_of ys) ((map fst xs) [\<mapsto>] (map snd xs))"
    78 apply (induct xs)
    78   apply (induct xs arbitrary: ys)
    79 apply simp
    79    apply simp
    80 apply (rule allI)
    80   apply (rename_tac a xs ys)
    81 apply (drule_tac x="a # ys" in spec)
    81   apply (drule_tac x="a # ys" in meta_spec)
    82 apply (simp only: rev.simps append_assoc append_Cons append_Nil
    82   apply (simp only: rev.simps append_assoc append_Cons append_Nil
    83   list.map map_of.simps map_upds_Cons list.sel)
    83                     list.map map_of.simps map_upds_Cons list.sel)
    84 done
    84   done
    85 
    85 
    86 lemma map_of_as_map_upds: "map_of (rev xs) = empty ((map fst xs) [\<mapsto>] (map snd xs))"
    86 lemma map_of_as_map_upds: "map_of (rev xs) = empty ((map fst xs) [\<mapsto>] (map snd xs))"
    87 by (rule map_of_append [of _ "[]", simplified])
    87   by (rule map_of_append [of _ "[]", simplified])
    88 
    88 
    89 lemma map_of_rev: "unique xs \<Longrightarrow> map_of (rev xs) = map_of xs"
    89 lemma map_of_rev: "unique xs \<Longrightarrow> map_of (rev xs) = map_of xs"
    90 apply (induct xs)
    90   apply (induct xs)
    91 apply simp
    91    apply simp
    92 apply (simp add: unique_def map_of_append map_of_as_map_upds [symmetric]
    92   apply (simp add: unique_def map_of_append map_of_as_map_upds [symmetric]
    93                  Map.map_of_append[symmetric] del:Map.map_of_append)
    93                    Map.map_of_append[symmetric] del:Map.map_of_append)
    94 done
    94   done
    95 
    95 
    96 lemma map_upds_rev [rule_format]: "\<forall> xs. (distinct ks \<longrightarrow> length ks = length xs 
    96 lemma map_upds_rev:
    97   \<longrightarrow> m (rev ks [\<mapsto>] rev xs) = m (ks [\<mapsto>] xs))"
    97   "\<lbrakk> distinct ks; length ks = length xs \<rbrakk> \<Longrightarrow> m (rev ks [\<mapsto>] rev xs) = m (ks [\<mapsto>] xs)"
    98 apply (induct ks)
    98   apply (induct ks arbitrary: xs)
    99 apply simp
    99    apply simp
   100 apply (intro strip)
   100   apply (subgoal_tac "\<exists>x xr. xs = x # xr")
   101 apply (subgoal_tac "\<exists> x xr. xs = x # xr")
   101    apply clarify
   102 apply clarify
   102    apply (drule_tac x=xr in meta_spec)
   103 apply (drule_tac x=xr in spec)
   103    apply (simp add: map_upds_append [symmetric])
   104 apply (simp add: map_upds_append [symmetric])
   104   apply (case_tac xs, auto)
   105   (* subgoal *)
   105   done
   106 apply (case_tac xs)
       
   107 apply auto
       
   108 done
       
   109 
   106 
   110 lemma map_upds_takeWhile [rule_format]:
   107 lemma map_upds_takeWhile [rule_format]:
   111   "\<forall> ks. (empty(rev ks[\<mapsto>]rev xs)) k = Some x \<longrightarrow> length ks = length xs \<longrightarrow>
   108   "\<forall>ks. (empty(rev ks[\<mapsto>]rev xs)) k = Some x \<longrightarrow> length ks = length xs \<longrightarrow>
   112     xs ! length (takeWhile (\<lambda>z. z \<noteq> k) ks) = x"
   109     xs ! length (takeWhile (\<lambda>z. z \<noteq> k) ks) = x"
   113 apply (induct xs)
   110   apply (induct xs)
   114  apply simp
   111    apply simp
   115 apply (intro strip)
   112   apply (intro strip)
   116 apply (subgoal_tac "\<exists> k' kr. ks = k' # kr")
   113   apply (subgoal_tac "\<exists>k' kr. ks = k' # kr")
   117  apply (clarify)
   114    apply (clarify)
   118  apply (drule_tac x=kr in spec)
   115    apply (drule_tac x=kr in spec)
   119  apply (simp only: rev.simps)
   116    apply (simp only: rev.simps)
   120  apply (subgoal_tac "(empty(rev kr @ [k'][\<mapsto>]rev xs @ [a])) = empty (rev kr[\<mapsto>]rev xs)([k'][\<mapsto>][a])")
   117    apply (subgoal_tac "(empty(rev kr @ [k'][\<mapsto>]rev xs @ [a])) = empty (rev kr[\<mapsto>]rev xs)([k'][\<mapsto>][a])")
   121   apply (simp split:split_if_asm)
   118     apply (simp split:split_if_asm)
   122  apply (simp add: map_upds_append [symmetric])
   119    apply (simp add: map_upds_append [symmetric])
   123 apply (case_tac ks)
   120   apply (case_tac ks)
   124  apply auto
   121    apply auto
   125 done
   122   done
   126 
   123 
   127 
   124 
   128 lemma local_env_inited_LT: "\<lbrakk> snd (local_env G C (mn, pTs) pns lvars) vname = Some T;
   125 lemma local_env_inited_LT:
       
   126   "\<lbrakk> snd (local_env G C (mn, pTs) pns lvars) vname = Some T;
   129   length pns = length pTs; distinct pns; unique lvars \<rbrakk>
   127   length pns = length pTs; distinct pns; unique lvars \<rbrakk>
   130   \<Longrightarrow> (inited_LT C pTs lvars ! index (pns, lvars, blk, res) vname) = OK T"
   128   \<Longrightarrow> (inited_LT C pTs lvars ! index (pns, lvars, blk, res) vname) = OK T"
   131 apply (simp add: local_env_snd index_def)
   129   apply (simp add: local_env_snd index_def)
   132 apply (case_tac "vname = This")
   130   apply (case_tac "vname = This")
   133 apply (simp add: inited_LT_def)
   131    apply (simp add: inited_LT_def)
   134 apply (simp add: inited_LT_def)
   132   apply (simp add: inited_LT_def)
   135 apply (simp (no_asm_simp) only: map_map [symmetric] map_append [symmetric] list.map [symmetric])
   133   apply (simp (no_asm_simp) only: map_map [symmetric] map_append [symmetric] list.map [symmetric])
   136 apply (subgoal_tac "length (takeWhile (\<lambda>z. z \<noteq> vname) (pns @ map fst lvars)) < length (pTs @ map snd lvars)")
   134   apply (subgoal_tac "length (takeWhile (\<lambda>z. z \<noteq> vname) (pns @ map fst lvars)) < length (pTs @ map snd lvars)")
   137 apply (simp (no_asm_simp) only: List.nth_map ok_val.simps)
   135    apply (simp (no_asm_simp) only: List.nth_map ok_val.simps)
   138 apply (subgoal_tac "map_of lvars = map_of (map (\<lambda> p. (fst p, snd p)) lvars)")
   136    apply (subgoal_tac "map_of lvars = map_of (map (\<lambda> p. (fst p, snd p)) lvars)")
   139 apply (simp only:)
   137     apply (simp only:)
   140 apply (subgoal_tac "distinct (map fst lvars)") 
   138     apply (subgoal_tac "distinct (map fst lvars)")
   141 apply (frule_tac g=snd in AuxLemmas.map_of_map_as_map_upd)
   139      apply (frule_tac g=snd in AuxLemmas.map_of_map_as_map_upd)
   142 apply (simp only:)
   140      apply (simp only:)
   143 apply (simp add: map_upds_append)
   141      apply (simp add: map_upds_append)
   144 apply (frule map_upds_SomeD)
   142      apply (frule map_upds_SomeD)
   145 apply (rule map_upds_takeWhile)
   143      apply (rule map_upds_takeWhile)
   146 apply (simp (no_asm_simp))
   144       apply (simp (no_asm_simp))
   147 apply (simp add: map_upds_append [symmetric])
   145       apply (simp add: map_upds_append [symmetric])
   148 apply (simp add: map_upds_rev)
   146       apply (simp add: map_upds_rev)
   149 
   147 
   150   (* show length (pns @ map fst lvars) = length (pTs @ map snd lvars) *)
   148      (* show length (pns @ map fst lvars) = length (pTs @ map snd lvars) *)
   151 apply simp
   149      apply simp
   152 
   150 
   153   (* show distinct (map fst lvars) *)
   151     (* show distinct (map fst lvars) *)
   154 apply (simp only: unique_def Fun.comp_def)
   152     apply (simp only: unique_def Fun.comp_def)
   155 
   153 
   156   (* show map_of lvars = map_of (map (\<lambda>p. (fst p, snd p)) lvars) *)
   154    (* show map_of lvars = map_of (map (\<lambda>p. (fst p, snd p)) lvars) *)
   157 apply simp
   155    apply simp
   158 
   156 
   159   (* show length (takeWhile (\<lambda>z. z \<noteq> vname) (pns @ map fst lvars)) < length (pTs @ map snd lvars) *)
   157   (* show length (takeWhile (\<lambda>z. z \<noteq> vname) (pns @ map fst lvars)) < length (pTs @ map snd lvars) *)
   160 apply (drule map_of_upds_SomeD)
   158   apply (drule map_of_upds_SomeD)
   161 apply (drule length_takeWhile)
   159   apply (drule length_takeWhile)
   162 apply simp
   160   apply simp
   163 done
   161   done
   164 
   162 
   165 
   163 
   166 lemma inited_LT_at_index_no_err: " i < length (inited_LT C pTs lvars)
   164 lemma inited_LT_at_index_no_err:
   167   \<Longrightarrow> inited_LT C pTs lvars ! i \<noteq> Err"
   165   "i < length (inited_LT C pTs lvars) \<Longrightarrow> inited_LT C pTs lvars ! i \<noteq> Err"
   168 apply (simp only: inited_LT_def)
   166   apply (simp only: inited_LT_def)
   169 apply (simp only: map_map [symmetric] map_append [symmetric] list.map [symmetric] length_map)
   167   apply (simp only: map_map [symmetric] map_append [symmetric] list.map [symmetric] length_map)
   170 apply (simp only: nth_map)
   168   apply (simp only: nth_map)
   171 apply simp
   169   apply simp
   172 done
   170   done
   173 
   171 
   174 
   172 
   175 lemma sup_loc_update_index: "
   173 lemma sup_loc_update_index: "
   176   \<lbrakk> G \<turnstile> T \<preceq> T'; is_type G T'; length pns = length pTs; distinct pns; unique lvars;
   174   \<lbrakk> G \<turnstile> T \<preceq> T'; is_type G T'; length pns = length pTs; distinct pns; unique lvars;
   177   snd (local_env G C (mn, pTs) pns lvars) vname = Some T' \<rbrakk>
   175   snd (local_env G C (mn, pTs) pns lvars) vname = Some T' \<rbrakk>
   178   \<Longrightarrow> 
   176   \<Longrightarrow> 
   179   comp G \<turnstile> 
   177   comp G \<turnstile> inited_LT C pTs lvars [index (pns, lvars, blk, res) vname := OK T] <=l 
   180   inited_LT C pTs lvars [index (pns, lvars, blk, res) vname := OK T] <=l 
   178            inited_LT C pTs lvars"
   181   inited_LT C pTs lvars"
   179   apply (subgoal_tac " index (pns, lvars, blk, res) vname < length (inited_LT C pTs lvars)")
   182 apply (subgoal_tac " index (pns, lvars, blk, res) vname < length (inited_LT C pTs lvars)")
   180    apply (frule_tac blk=blk and res=res in local_env_inited_LT, assumption+)
   183 apply (frule_tac blk=blk and res=res in local_env_inited_LT, assumption+)
   181    apply (rule sup_loc_trans)
   184 apply (rule sup_loc_trans)
   182     apply (rule_tac b="OK T'" in sup_loc_update)
   185 apply (rule_tac b="OK T'" in sup_loc_update)
   183       apply (simp add: comp_widen)
   186 apply (simp add: comp_widen) 
   184      apply assumption
   187 apply assumption
   185     apply (rule sup_loc_refl)
   188 apply (rule sup_loc_refl)
   186    apply (simp add: list_update_same_conv [THEN iffD2])
   189 apply (simp add: list_update_same_conv [THEN iffD2])
       
   190   (* subgoal *)
   187   (* subgoal *)
   191 apply (rule index_in_bounds)
   188   apply (rule index_in_bounds)
   192 apply simp+
   189    apply simp+
   193 done
   190   done
   194 
   191 
   195 
   192 
   196 (********************************************************************************)
   193 (********************************************************************************)
   197 
   194 
   198 subsection "Preservation of ST and LT by compTpExpr / compTpStmt"
   195 subsection "Preservation of ST and LT by compTpExpr / compTpStmt"
   199 
   196 
   200 lemma sttp_of_comb_nil [simp]: "sttp_of (comb_nil sttp) = sttp"
   197 lemma sttp_of_comb_nil [simp]: "sttp_of (comb_nil sttp) = sttp"
   201 by (simp add: comb_nil_def)
   198   by (simp add: comb_nil_def)
   202 
   199 
   203 lemma mt_of_comb_nil [simp]: "mt_of (comb_nil sttp) = []"
   200 lemma mt_of_comb_nil [simp]: "mt_of (comb_nil sttp) = []"
   204 by (simp add: comb_nil_def)
   201   by (simp add: comb_nil_def)
   205 
   202 
   206 
   203 
   207 lemma sttp_of_comb [simp]: "sttp_of ((f1 \<box> f2) sttp) = sttp_of (f2 (sttp_of (f1 sttp)))"
   204 lemma sttp_of_comb [simp]: "sttp_of ((f1 \<box> f2) sttp) = sttp_of (f2 (sttp_of (f1 sttp)))"
   208 apply (case_tac "f1 sttp")
   205   apply (case_tac "f1 sttp")
   209 apply (case_tac "(f2 (sttp_of (f1 sttp)))")
   206   apply (case_tac "(f2 (sttp_of (f1 sttp)))")
   210 apply (simp add: comb_def)
   207   apply (simp add: comb_def)
   211 done
   208   done
   212 
   209 
   213 lemma mt_of_comb: "(mt_of ((f1 \<box> f2) sttp)) = 
   210 lemma mt_of_comb: "(mt_of ((f1 \<box> f2) sttp)) = 
   214   (mt_of (f1 sttp)) @ (mt_of (f2 (sttp_of (f1 sttp))))"
   211   (mt_of (f1 sttp)) @ (mt_of (f2 (sttp_of (f1 sttp))))"
   215 by (simp add: comb_def split_beta)
   212   by (simp add: comb_def split_beta)
   216 
   213 
   217 
   214 
   218 lemma mt_of_comb_length [simp]: "\<lbrakk> n1 = length (mt_of (f1 sttp)); n1 \<le> n \<rbrakk>
   215 lemma mt_of_comb_length [simp]: "\<lbrakk> n1 = length (mt_of (f1 sttp)); n1 \<le> n \<rbrakk>
   219   \<Longrightarrow> (mt_of ((f1 \<box> f2) sttp) ! n) = (mt_of (f2 (sttp_of (f1 sttp))) ! (n - n1))"
   216   \<Longrightarrow> (mt_of ((f1 \<box> f2) sttp) ! n) = (mt_of (f2 (sttp_of (f1 sttp))) ! (n - n1))"
   220 by (simp add: comb_def nth_append split_beta)
   217   by (simp add: comb_def nth_append split_beta)
   221 
   218 
   222 
   219 
   223 lemma compTpExpr_Exprs_LT_ST: "
   220 lemma compTpExpr_Exprs_LT_ST: "
   224   \<lbrakk>jmb = (pns, lvars, blk, res); 
   221   \<lbrakk>jmb = (pns, lvars, blk, res);
   225   wf_prog wf_java_mdecl G;
   222   wf_prog wf_java_mdecl G;
   226   wf_java_mdecl G C ((mn, pTs), rT, jmb);
   223   wf_java_mdecl G C ((mn, pTs), rT, jmb);
   227   E = local_env G C (mn, pTs) pns lvars \<rbrakk>
   224   E = local_env G C (mn, pTs) pns lvars \<rbrakk>
   228  \<Longrightarrow> 
   225   \<Longrightarrow>
   229   (\<forall> ST LT T. 
   226   (\<forall> ST LT T.
   230   E \<turnstile> ex :: T \<longrightarrow>
   227   E \<turnstile> ex :: T \<longrightarrow>
   231   is_inited_LT C pTs lvars LT \<longrightarrow>
   228   is_inited_LT C pTs lvars LT \<longrightarrow>
   232   sttp_of (compTpExpr jmb G ex (ST, LT)) = (T # ST, LT))
   229   sttp_of (compTpExpr jmb G ex (ST, LT)) = (T # ST, LT))
   233  \<and>
   230   \<and>
   234  (\<forall> ST LT Ts. 
   231   (\<forall> ST LT Ts.
   235   E \<turnstile> exs [::] Ts \<longrightarrow>
   232   E \<turnstile> exs [::] Ts \<longrightarrow>
   236   is_inited_LT C pTs lvars LT \<longrightarrow>
   233   is_inited_LT C pTs lvars LT \<longrightarrow>
   237   sttp_of (compTpExprs jmb G exs (ST, LT)) = ((rev Ts) @ ST, LT))"
   234   sttp_of (compTpExprs jmb G exs (ST, LT)) = ((rev Ts) @ ST, LT))"
   238 
   235 
   239 apply (rule compat_expr_expr_list.induct)
   236   apply (rule compat_expr_expr_list.induct)
   240 
   237 
   241 (* expresssions *)
   238             (* expresssions *)
   242 
   239 
   243 (* NewC *) 
   240             (* NewC *)
   244 apply (intro strip)
   241             apply (intro strip)
   245 apply (drule NewC_invers)
   242             apply (drule NewC_invers)
   246 apply (simp add: pushST_def)
   243             apply (simp add: pushST_def)
   247 
   244 
   248 (* Cast *)
   245            (* Cast *)
   249 apply (intro strip)
   246            apply (intro strip)
   250 apply (drule Cast_invers, clarify)
   247            apply (drule Cast_invers, clarify)
   251 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+)
   248            apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+)
   252 apply (simp add: replST_def split_beta)
   249            apply (simp add: replST_def split_beta)
   253 
   250 
   254 (* Lit *)
   251           (* Lit *)
   255 apply (intro strip)
   252           apply (intro strip)
   256 apply (drule Lit_invers)
   253           apply (drule Lit_invers)
   257 apply (simp add: pushST_def)
   254           apply (simp add: pushST_def)
   258 
   255 
   259 (* BinOp *)
   256          (* BinOp *)
   260 apply (intro strip)
   257          apply (intro strip)
   261 apply (drule BinOp_invers, clarify)
   258          apply (drule BinOp_invers, clarify)
   262 apply (drule_tac x=ST in spec)
   259          apply (drule_tac x=ST in spec)
   263 apply (drule_tac x="Ta # ST" in spec)
   260          apply (drule_tac x="Ta # ST" in spec)
   264 apply ((drule spec)+, (drule mp, assumption)+)
   261          apply ((drule spec)+, (drule mp, assumption)+)
   265   apply (rename_tac binop x2 x3 ST LT T Ta, case_tac binop)
   262          apply (rename_tac binop x2 x3 ST LT T Ta, case_tac binop)
   266   apply (simp (no_asm_simp))
   263           apply (simp (no_asm_simp))
   267     apply (simp (no_asm_simp) add: popST_def pushST_def)
   264           apply (simp (no_asm_simp) add: popST_def pushST_def)
   268   apply (simp)
   265          apply (simp)
   269     apply (simp (no_asm_simp) add: replST_def)
   266          apply (simp (no_asm_simp) add: replST_def)
   270 
   267 
   271 
   268 
   272 (* LAcc *)
   269         (* LAcc *)
   273 apply (intro strip)
   270         apply (intro strip)
   274 apply (drule LAcc_invers)
   271         apply (drule LAcc_invers)
   275 apply (simp add: pushST_def is_inited_LT_def)
   272         apply (simp add: pushST_def is_inited_LT_def)
   276 apply (simp add: wf_prog_def)
   273         apply (simp add: wf_prog_def)
   277 apply (frule wf_java_mdecl_disjoint_varnames) 
   274         apply (frule wf_java_mdecl_disjoint_varnames)
   278   apply (simp add: disjoint_varnames_def)
   275         apply (simp add: disjoint_varnames_def)
   279 apply (frule wf_java_mdecl_length_pTs_pns)
   276         apply (frule wf_java_mdecl_length_pTs_pns)
   280 apply (erule conjE)+
   277         apply (erule conjE)+
   281 apply (simp (no_asm_simp) add: local_env_inited_LT)
   278         apply (simp (no_asm_simp) add: local_env_inited_LT)
   282 
   279 
   283 (* LAss *)
   280        (* LAss *)
   284 apply (intro strip)
   281        apply (intro strip)
   285 apply (drule LAss_invers, clarify)
   282        apply (drule LAss_invers, clarify)
   286 apply (drule LAcc_invers)
   283        apply (drule LAcc_invers)
   287 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+)
   284        apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+)
   288 apply (simp add: popST_def dupST_def)
   285        apply (simp add: popST_def dupST_def)
   289 
   286 
   290 (* FAcc *)
   287       (* FAcc *)
   291 apply (intro strip)
   288       apply (intro strip)
   292 apply (drule FAcc_invers, clarify)
   289       apply (drule FAcc_invers, clarify)
   293 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+)
   290       apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+)
   294 apply (simp add: replST_def)
   291       apply (simp add: replST_def)
   295 
   292 
   296   (* show   snd (the (field (G, cname) vname)) = T *)
   293       (* show   snd (the (field (G, cname) vname)) = T *)
   297   apply (subgoal_tac "is_class G Ca")
   294       apply (subgoal_tac "is_class G Ca")
   298   apply (rename_tac cname x2 vname ST LT T Ca, subgoal_tac "is_class G cname \<and> field (G, cname) vname = Some (cname, T)")
   295        apply (rename_tac cname x2 vname ST LT T Ca, subgoal_tac "is_class G cname \<and> field (G, cname) vname = Some (cname, T)")
       
   296         apply simp
       
   297 
       
   298        (* show is_class G cname \<and> field (G, cname) vname = Some (cname, T) *)
       
   299        apply (rule field_in_fd) apply assumption+
       
   300       (* show is_class G Ca *)
       
   301       apply (fast intro: wt_class_expr_is_class)
       
   302 
       
   303      (* FAss *)
       
   304      apply (intro strip)
       
   305      apply (drule FAss_invers, clarify)
       
   306      apply (drule FAcc_invers, clarify)
       
   307      apply (drule_tac x=ST in spec)
       
   308      apply (drule_tac x="Class Ca # ST" in spec)
       
   309      apply ((drule spec)+, (drule mp, assumption)+)
       
   310      apply (simp add: popST_def dup_x1ST_def)
       
   311 
       
   312 
       
   313     (* Call *)
       
   314     apply (intro strip)
       
   315     apply (drule Call_invers, clarify)
       
   316     apply (drule_tac x=ST in spec)
       
   317     apply (rename_tac cname x2 x3 x4 x5 ST LT T pTsa md, drule_tac x="Class cname # ST" in spec)
       
   318     apply ((drule spec)+, (drule mp, assumption)+)
       
   319     apply (simp add: replST_def)
       
   320 
       
   321 
       
   322    (* expression lists *)
       
   323    (* nil *)
       
   324 
       
   325    apply (intro strip)
       
   326    apply (drule Nil_invers)
       
   327    apply (simp add: comb_nil_def)
       
   328 
       
   329   (* cons *)
       
   330 
       
   331   apply (intro strip)
       
   332   apply (drule Cons_invers, clarify)
       
   333   apply (drule_tac x=ST in spec)
       
   334   apply (drule_tac x="T # ST" in spec)
       
   335   apply ((drule spec)+, (drule mp, assumption)+)
   299   apply simp
   336   apply simp
   300 
   337 
   301   (* show is_class G cname \<and> field (G, cname) vname = Some (cname, T) *)
   338   done
   302   apply (rule field_in_fd) apply assumption+
       
   303   (* show is_class G Ca *)
       
   304   apply (fast intro: wt_class_expr_is_class)
       
   305 
       
   306 (* FAss *)
       
   307 apply (intro strip)
       
   308 apply (drule FAss_invers, clarify)
       
   309 apply (drule FAcc_invers, clarify)
       
   310 apply (drule_tac x=ST in spec)
       
   311 apply (drule_tac x="Class Ca # ST" in spec)
       
   312 apply ((drule spec)+, (drule mp, assumption)+)
       
   313 apply (simp add: popST_def dup_x1ST_def)
       
   314 
       
   315 
       
   316 (* Call *)
       
   317 apply (intro strip)
       
   318 apply (drule Call_invers, clarify)
       
   319 apply (drule_tac x=ST in spec)
       
   320 apply (rename_tac cname x2 x3 x4 x5 ST LT T pTsa md, drule_tac x="Class cname # ST" in spec)
       
   321 apply ((drule spec)+, (drule mp, assumption)+)
       
   322 apply (simp add: replST_def)
       
   323 
       
   324 
       
   325 (* expression lists *)
       
   326 (* nil *) 
       
   327 
       
   328 apply (intro strip)
       
   329 apply (drule Nil_invers)
       
   330 apply (simp add: comb_nil_def)
       
   331 
       
   332 (* cons *)
       
   333 
       
   334 apply (intro strip)
       
   335 apply (drule Cons_invers, clarify)
       
   336 apply (drule_tac x=ST in spec)
       
   337 apply (drule_tac x="T # ST" in spec)
       
   338 apply ((drule spec)+, (drule mp, assumption)+)
       
   339 apply simp
       
   340 
       
   341 done
       
   342 
   339 
   343 
   340 
   344 
   341 
   345 lemmas compTpExpr_LT_ST [rule_format (no_asm)] = 
   342 lemmas compTpExpr_LT_ST [rule_format (no_asm)] = 
   346   compTpExpr_Exprs_LT_ST [THEN conjunct1]
   343   compTpExpr_Exprs_LT_ST [THEN conjunct1]
   356 \<Longrightarrow> (\<forall> ST LT.
   353 \<Longrightarrow> (\<forall> ST LT.
   357   E \<turnstile> s\<surd> \<longrightarrow>
   354   E \<turnstile> s\<surd> \<longrightarrow>
   358   (is_inited_LT C pTs lvars LT)
   355   (is_inited_LT C pTs lvars LT)
   359 \<longrightarrow> sttp_of (compTpStmt jmb G s (ST, LT)) = (ST, LT))"
   356 \<longrightarrow> sttp_of (compTpStmt jmb G s (ST, LT)) = (ST, LT))"
   360 
   357 
   361 apply (rule stmt.induct)
   358   apply (rule stmt.induct)
   362 
   359 
   363 (* Skip *) 
   360       (* Skip *)
   364 apply (intro strip)
   361       apply (intro strip)
   365 apply simp
   362       apply simp
   366 
   363 
   367 (* Expr *)
   364      (* Expr *)
   368 apply (intro strip)
   365      apply (intro strip)
   369 apply (drule Expr_invers, erule exE)
   366      apply (drule Expr_invers, erule exE)
   370 apply (simp (no_asm_simp) add: compTpExpr_LT_ST)
   367      apply (simp (no_asm_simp) add: compTpExpr_LT_ST)
   371 apply (frule_tac ST=ST in compTpExpr_LT_ST, assumption+)
   368      apply (frule_tac ST=ST in compTpExpr_LT_ST, assumption+)
   372 apply (simp add: popST_def)
   369      apply (simp add: popST_def)
   373 
   370 
   374 (* Comp *)
   371     (* Comp *)
   375 apply (intro strip)
   372     apply (intro strip)
   376 apply (drule Comp_invers, clarify)
   373     apply (drule Comp_invers, clarify)
   377 apply (simp (no_asm_use))
   374     apply (simp (no_asm_use))
   378 apply simp
   375     apply simp
   379 
   376 
   380 (* Cond *)
   377    (* Cond *)
   381 apply (intro strip)
   378    apply (intro strip)
   382 apply (drule Cond_invers)
   379    apply (drule Cond_invers)
   383 apply (erule conjE)+
   380    apply (erule conjE)+
   384 apply (drule_tac x=ST in spec)
   381    apply (drule_tac x=ST in spec)
   385 apply (drule_tac x=ST in spec)
   382    apply (drule_tac x=ST in spec)
   386 apply (drule spec)+ apply (drule mp, assumption)+
   383    apply (drule spec)+ apply (drule mp, assumption)+
   387 apply (drule_tac ST="PrimT Boolean # ST" in compTpExpr_LT_ST, assumption+)
   384    apply (drule_tac ST="PrimT Boolean # ST" in compTpExpr_LT_ST, assumption+)
   388 apply (simp add: popST_def pushST_def nochangeST_def)
   385    apply (simp add: popST_def pushST_def nochangeST_def)
   389 
   386 
   390 (* Loop *)
   387   (* Loop *)
   391 apply (intro strip)
   388   apply (intro strip)
   392 apply (drule Loop_invers)
   389   apply (drule Loop_invers)
   393 apply (erule conjE)+
   390   apply (erule conjE)+
   394 apply (drule_tac x=ST in spec)
   391   apply (drule_tac x=ST in spec)
   395 apply (drule spec)+ apply (drule mp, assumption)+
   392   apply (drule spec)+ apply (drule mp, assumption)+
   396 apply (drule_tac ST="PrimT Boolean # ST" in compTpExpr_LT_ST, assumption+)
   393   apply (drule_tac ST="PrimT Boolean # ST" in compTpExpr_LT_ST, assumption+)
   397 apply (simp add: popST_def pushST_def nochangeST_def)
   394   apply (simp add: popST_def pushST_def nochangeST_def)
   398 done
   395   done
   399 
   396 
   400 
   397 
   401 
   398 
   402 lemma compTpInit_LT_ST: "
   399 lemma compTpInit_LT_ST: "
   403   sttp_of (compTpInit jmb (vn,ty) (ST, LT)) = (ST, LT[(index jmb vn):= OK ty])"
   400   sttp_of (compTpInit jmb (vn,ty) (ST, LT)) = (ST, LT[(index jmb vn):= OK ty])"
   404 by (simp add: compTpInit_def storeST_def pushST_def)
   401   by (simp add: compTpInit_def storeST_def pushST_def)
   405 
   402 
   406 
   403 
   407 lemma compTpInitLvars_LT_ST_aux [rule_format (no_asm)]:
   404 lemma compTpInitLvars_LT_ST_aux [rule_format (no_asm)]:
   408   "\<forall> pre lvars_pre lvars0.
   405   "\<forall> pre lvars_pre lvars0.
   409   jmb = (pns,lvars0,blk,res) \<and>
   406   jmb = (pns,lvars0,blk,res) \<and>
   411   (length pns) + (length lvars_pre) + 1 = length pre \<and>
   408   (length pns) + (length lvars_pre) + 1 = length pre \<and>
   412   disjoint_varnames pns (lvars_pre @ lvars)
   409   disjoint_varnames pns (lvars_pre @ lvars)
   413   \<longrightarrow>
   410   \<longrightarrow>
   414 sttp_of (compTpInitLvars jmb lvars (ST, pre @ replicate (length lvars) Err))
   411 sttp_of (compTpInitLvars jmb lvars (ST, pre @ replicate (length lvars) Err))
   415     = (ST, pre @ map (Fun.comp OK snd) lvars)"
   412     = (ST, pre @ map (Fun.comp OK snd) lvars)"
   416 apply (induct lvars)
   413   apply (induct lvars)
   417 apply simp
   414    apply simp
   418 
   415 
   419 apply (intro strip)
   416   apply (intro strip)
   420 apply (subgoal_tac "\<exists> vn ty. a = (vn, ty)")
   417   apply (subgoal_tac "\<exists>vn ty. a = (vn, ty)")
   421   prefer 2 apply (simp (no_asm_simp)) 
   418    prefer 2
       
   419    apply (simp (no_asm_simp))
   422   apply ((erule exE)+, simp (no_asm_simp))
   420   apply ((erule exE)+, simp (no_asm_simp))
   423 
   421 
   424 apply (drule_tac x="pre @ [OK ty]" in spec)
   422   apply (drule_tac x="pre @ [OK ty]" in spec)
   425 apply (drule_tac x="lvars_pre @ [a]" in spec)
   423   apply (drule_tac x="lvars_pre @ [a]" in spec)
   426 apply (drule_tac x="lvars0" in spec)
   424   apply (drule_tac x="lvars0" in spec)
   427 apply (simp add: compTpInit_LT_ST index_of_var2)
   425   apply (simp add: compTpInit_LT_ST index_of_var2)
   428 done
   426   done
   429 
   427 
   430 lemma compTpInitLvars_LT_ST: 
   428 lemma compTpInitLvars_LT_ST: 
   431   "\<lbrakk> jmb = (pns, lvars, blk, res); wf_java_mdecl G C ((mn, pTs), rT, jmb) \<rbrakk>
   429   "\<lbrakk> jmb = (pns, lvars, blk, res); wf_java_mdecl G C ((mn, pTs), rT, jmb) \<rbrakk>
   432 \<Longrightarrow>(sttp_of (compTpInitLvars jmb lvars (ST, start_LT C pTs (length lvars))))
   430   \<Longrightarrow> sttp_of (compTpInitLvars jmb lvars (ST, start_LT C pTs (length lvars)))
   433   = (ST, inited_LT C pTs lvars)"
   431       = (ST, inited_LT C pTs lvars)"
   434 apply (simp add: start_LT_def inited_LT_def)
   432   apply (simp add: start_LT_def inited_LT_def)
   435 apply (simp only: append_Cons [symmetric])
   433   apply (simp only: append_Cons [symmetric])
   436 apply (rule compTpInitLvars_LT_ST_aux)
   434   apply (rule compTpInitLvars_LT_ST_aux)
   437 apply (auto dest: wf_java_mdecl_length_pTs_pns wf_java_mdecl_disjoint_varnames)
   435   apply (auto dest: wf_java_mdecl_length_pTs_pns wf_java_mdecl_disjoint_varnames)
   438 done
   436   done
   439 
   437 
   440 
   438 
   441 
   439 
   442 (********************************************************************************)
   440 (********************************************************************************)
   443 
   441 
   444 lemma max_of_list_elem: "x \<in> set xs \<Longrightarrow> x \<le> (max_of_list xs)"
   442 lemma max_of_list_elem: "x \<in> set xs \<Longrightarrow> x \<le> (max_of_list xs)"
   445 by (induct xs, auto intro: max.cobounded1 simp: le_max_iff_disj max_of_list_def)
   443   by (induct xs, auto intro: max.cobounded1 simp: le_max_iff_disj max_of_list_def)
   446 
   444 
   447 lemma max_of_list_sublist: "set xs \<subseteq> set ys 
   445 lemma max_of_list_sublist: "set xs \<subseteq> set ys 
   448   \<Longrightarrow> (max_of_list xs) \<le> (max_of_list ys)"
   446   \<Longrightarrow> (max_of_list xs) \<le> (max_of_list ys)"
   449 by (induct xs, auto dest: max_of_list_elem simp: max_of_list_def)
   447   by (induct xs, auto dest: max_of_list_elem simp: max_of_list_def)
   450 
   448 
   451 lemma max_of_list_append [simp]:
   449 lemma max_of_list_append [simp]:
   452   "max_of_list (xs @ ys) = max (max_of_list xs) (max_of_list ys)" 
   450   "max_of_list (xs @ ys) = max (max_of_list xs) (max_of_list ys)" 
   453 apply (simp add: max_of_list_def)
   451   apply (simp add: max_of_list_def)
   454 apply (induct xs)
   452   apply (induct xs)
   455 apply simp
   453    apply simp
   456 using [[linarith_split_limit = 0]]
   454   using [[linarith_split_limit = 0]]
   457 apply simp
   455   apply simp
   458 apply arith
   456   apply arith
   459 done
   457   done
   460 
   458 
   461 
   459 
   462 lemma app_mono_mxs: "\<lbrakk> app i G mxs rT pc et s; mxs \<le> mxs' \<rbrakk> 
   460 lemma app_mono_mxs: "\<lbrakk> app i G mxs rT pc et s; mxs \<le> mxs' \<rbrakk> 
   463   \<Longrightarrow> app i G mxs' rT pc et s"
   461   \<Longrightarrow> app i G mxs' rT pc et s"
   464 apply (case_tac s)
   462   apply (case_tac s)
   465 apply (simp add: app_def)
   463    apply (simp add: app_def)
   466 apply (case_tac i)
   464   apply (case_tac i, auto intro: less_trans)
   467 apply (auto intro: less_trans)
   465   done
   468 done
       
   469 
   466 
   470 
   467 
   471 
   468 
   472 lemma err_mono [simp]: "A \<subseteq> B \<Longrightarrow> err A \<subseteq> err B"
   469 lemma err_mono [simp]: "A \<subseteq> B \<Longrightarrow> err A \<subseteq> err B"
   473 by (auto simp: err_def)
   470   by (auto simp: err_def)
   474 
   471 
   475 lemma opt_mono [simp]: "A \<subseteq> B \<Longrightarrow> opt A \<subseteq> opt B"
   472 lemma opt_mono [simp]: "A \<subseteq> B \<Longrightarrow> opt A \<subseteq> opt B"
   476 by (auto simp: opt_def)
   473   by (auto simp: opt_def)
   477 
   474 
   478 
   475 
   479 lemma states_mono: "\<lbrakk> mxs \<le> mxs' \<rbrakk>
   476 lemma states_mono: "\<lbrakk> mxs \<le> mxs' \<rbrakk>
   480   \<Longrightarrow> states G mxs mxr \<subseteq> states G mxs' mxr"
   477   \<Longrightarrow> states G mxs mxr \<subseteq> states G mxs' mxr"
   481 apply (simp add: states_def JVMType.sl_def)
   478   apply (simp add: states_def JVMType.sl_def)
   482 apply (simp add: Product.esl_def stk_esl_def reg_sl_def 
   479   apply (simp add: Product.esl_def stk_esl_def reg_sl_def
   483   upto_esl_def Listn.sl_def Err.sl_def  JType.esl_def)
   480                    upto_esl_def Listn.sl_def Err.sl_def  JType.esl_def)
   484 apply (simp add: Err.esl_def Err.le_def Listn.le_def)
   481   apply (simp add: Err.esl_def Err.le_def Listn.le_def)
   485 apply (simp add: Product.le_def Product.sup_def Err.sup_def)
   482   apply (simp add: Product.le_def Product.sup_def Err.sup_def)
   486 apply (simp add: Opt.esl_def Listn.sup_def)
   483   apply (simp add: Opt.esl_def Listn.sup_def)
   487 apply (rule err_mono)
   484   apply (rule err_mono)
   488 apply (rule opt_mono)
   485   apply (rule opt_mono)
   489 apply (rule Sigma_mono)
   486   apply (rule Sigma_mono)
   490 apply (rule Union_mono)
   487    apply (rule Union_mono)
   491 apply auto 
   488    apply auto
   492 done
   489   done
   493 
   490 
   494 
   491 
   495 lemma check_type_mono: "\<lbrakk> check_type G mxs mxr s; mxs \<le> mxs' \<rbrakk> 
   492 lemma check_type_mono:
   496   \<Longrightarrow> check_type G mxs' mxr s"
   493   "\<lbrakk> check_type G mxs mxr s; mxs \<le> mxs' \<rbrakk> \<Longrightarrow> check_type G mxs' mxr s"
   497 apply (simp add: check_type_def)
   494   apply (simp add: check_type_def)
   498 apply (frule_tac G=G and mxr=mxr in states_mono)
   495   apply (frule_tac G=G and mxr=mxr in states_mono)
   499 apply auto
   496   apply auto
   500 done
   497   done
   501 
   498 
   502 
   499 
   503   (* wt is preserved when adding instructions/state-types at the end *)
   500 (* wt is preserved when adding instructions/state-types at the end *)
   504 lemma wt_instr_prefix: "
   501 lemma wt_instr_prefix: "
   505  \<lbrakk> wt_instr_altern (bc ! pc) cG rT mt mxs mxr max_pc et pc; 
   502   \<lbrakk> wt_instr_altern (bc ! pc) cG rT mt mxs mxr max_pc et pc; 
   506   bc' = bc @ bc_post; mt' = mt @ mt_post; 
   503     bc' = bc @ bc_post; mt' = mt @ mt_post; 
   507   mxs \<le> mxs'; max_pc \<le> max_pc'; 
   504     mxs \<le> mxs'; max_pc \<le> max_pc'; 
   508   pc < length bc; pc < length mt; 
   505     pc < length bc; pc < length mt; 
   509   max_pc = (length mt)\<rbrakk>
   506     max_pc = (length mt)\<rbrakk>
   510 \<Longrightarrow> wt_instr_altern (bc' ! pc) cG rT mt' mxs' mxr max_pc' et pc"
   507   \<Longrightarrow> wt_instr_altern (bc' ! pc) cG rT mt' mxs' mxr max_pc' et pc"
   511 apply (simp add: wt_instr_altern_def nth_append)
   508   apply (simp add: wt_instr_altern_def nth_append)
   512 apply (auto intro: app_mono_mxs check_type_mono)
   509   apply (auto intro: app_mono_mxs check_type_mono)
   513 done
   510   done
   514 
   511 
   515 
   512 
   516 (************************************************************************)
   513 (************************************************************************)
   517 
   514 
   518 
   515 
   519 
   516 
   520 lemma pc_succs_shift: "pc'\<in>set (succs i (pc'' + n))
   517 lemma pc_succs_shift:
   521  \<Longrightarrow> ((pc' - n) \<in>set (succs i pc''))"
   518   "pc'\<in>set (succs i (pc'' + n)) \<Longrightarrow> ((pc' - n) \<in>set (succs i pc''))"
   522 apply (induct i)
   519   apply (induct i, simp_all)
   523 apply simp_all
   520   apply arith
   524 apply arith
   521   done
   525 done
   522 
   526 
   523 
   527 
   524 lemma pc_succs_le:
   528 lemma pc_succs_le: "\<lbrakk> pc' \<in> set (succs i (pc'' + n));   
   525   "\<lbrakk> pc' \<in> set (succs i (pc'' + n));   
   529   \<forall> b. ((i = (Goto b) \<or> i=(Ifcmpeq b)) \<longrightarrow> 0 \<le> (int pc'' + b)) \<rbrakk> 
   526      \<forall>b. ((i = (Goto b) \<or> i=(Ifcmpeq b)) \<longrightarrow> 0 \<le> (int pc'' + b)) \<rbrakk>
   530   \<Longrightarrow> n \<le> pc'"
   527   \<Longrightarrow> n \<le> pc'"
   531 apply (induct i)
   528   apply (induct i, simp_all)
   532 apply simp_all
   529   apply arith
   533 apply arith
   530   done
   534 done
       
   535 
   531 
   536 
   532 
   537 (**********************************************************************)
   533 (**********************************************************************)
   538 
   534 
   539 definition offset_xcentry :: "[nat, exception_entry] \<Rightarrow> exception_entry" where
   535 definition offset_xcentry :: "[nat, exception_entry] \<Rightarrow> exception_entry" where
   545   "offset_xctable n == (map (offset_xcentry n))"
   541   "offset_xctable n == (map (offset_xcentry n))"
   546 
   542 
   547 lemma match_xcentry_offset [simp]: "
   543 lemma match_xcentry_offset [simp]: "
   548   match_exception_entry G cn (pc + n) (offset_xcentry n ee) = 
   544   match_exception_entry G cn (pc + n) (offset_xcentry n ee) = 
   549   match_exception_entry G cn pc ee"
   545   match_exception_entry G cn pc ee"
   550 by (simp add: match_exception_entry_def offset_xcentry_def split_beta)
   546   by (simp add: match_exception_entry_def offset_xcentry_def split_beta)
   551 
   547 
   552 lemma match_xctable_offset: "
   548 lemma match_xctable_offset: "
   553   (match_exception_table G cn (pc + n) (offset_xctable n et)) =
   549   (match_exception_table G cn (pc + n) (offset_xctable n et)) =
   554   (map_option (\<lambda> pc'. pc' + n) (match_exception_table G cn pc et))"
   550   (map_option (\<lambda> pc'. pc' + n) (match_exception_table G cn pc et))"
   555 apply (induct et)
   551   apply (induct et)
   556 apply (simp add: offset_xctable_def)+
   552    apply (simp add: offset_xctable_def)+
   557 apply (case_tac "match_exception_entry G cn pc a")
   553   apply (case_tac "match_exception_entry G cn pc a")
   558 apply (simp add: offset_xcentry_def split_beta)+
   554    apply (simp add: offset_xcentry_def split_beta)+
   559 done
   555   done
   560 
   556 
   561 
   557 
   562 lemma match_offset [simp]: "
   558 lemma match_offset [simp]: "
   563   match G cn (pc + n) (offset_xctable n et) = match G cn pc et"
   559   match G cn (pc + n) (offset_xctable n et) = match G cn pc et"
   564 apply (induct et)
   560   apply (induct et)
   565 apply (simp add: offset_xctable_def)+
   561    apply (simp add: offset_xctable_def)+
   566 done
   562   done
   567 
   563 
   568 lemma match_any_offset [simp]: "
   564 lemma match_any_offset [simp]: "
   569   match_any G (pc + n) (offset_xctable n et) = match_any G pc et"
   565   match_any G (pc + n) (offset_xctable n et) = match_any G pc et"
   570 apply (induct et)
   566   apply (induct et)
   571 apply (simp add: offset_xctable_def offset_xcentry_def split_beta)+
   567    apply (simp add: offset_xctable_def offset_xcentry_def split_beta)+
   572 done
   568   done
   573 
   569 
   574 lemma app_mono_pc: "\<lbrakk> app i G mxs rT pc et s; pc'= pc + n \<rbrakk> 
   570 lemma app_mono_pc: "\<lbrakk> app i G mxs rT pc et s; pc'= pc + n \<rbrakk> 
   575   \<Longrightarrow> app i G mxs rT pc' (offset_xctable n et) s"
   571   \<Longrightarrow> app i G mxs rT pc' (offset_xctable n et) s"
   576 apply (case_tac s)
   572   apply (case_tac s)
   577 apply (simp add: app_def)
   573    apply (simp add: app_def)
   578 apply (case_tac i)
   574   apply (case_tac i, auto)
   579 apply (auto)
   575   done
   580 done
       
   581 
   576 
   582 (**********************************************************************)
   577 (**********************************************************************)
   583 
   578 
   584   (* Currently: empty exception_table *)
   579   (* Currently: empty exception_table *)
   585 
   580 
   589 
   584 
   590 
   585 
   591 
   586 
   592   (* move into Effect.thy *)
   587   (* move into Effect.thy *)
   593 lemma xcpt_names_Nil [simp]: "(xcpt_names (i, G, pc, [])) = []"
   588 lemma xcpt_names_Nil [simp]: "(xcpt_names (i, G, pc, [])) = []"
   594 by (induct i, simp_all)
   589   by (induct i, simp_all)
   595 
   590 
   596 lemma xcpt_eff_Nil [simp]: "(xcpt_eff i G pc s []) = []"
   591 lemma xcpt_eff_Nil [simp]: "(xcpt_eff i G pc s []) = []"
   597 by (simp add: xcpt_eff_def)
   592   by (simp add: xcpt_eff_def)
   598 
   593 
   599 
   594 
   600 lemma app_jumps_lem: "\<lbrakk> app i cG mxs rT pc empty_et s; s=(Some st) \<rbrakk>
   595 lemma app_jumps_lem: "\<lbrakk> app i cG mxs rT pc empty_et s; s=(Some st) \<rbrakk>
   601   \<Longrightarrow>  \<forall> b. ((i = (Goto b) \<or> i=(Ifcmpeq b)) \<longrightarrow> 0 \<le> (int pc + b))"
   596   \<Longrightarrow>  \<forall> b. ((i = (Goto b) \<or> i=(Ifcmpeq b)) \<longrightarrow> 0 \<le> (int pc + b))"
   602 apply (simp only:)
   597   by (induct i) auto
   603 apply (induct i)
       
   604 apply auto
       
   605 done
       
   606 
   598 
   607 
   599 
   608 (* wt is preserved when adding instructions/state-types to the front *)
   600 (* wt is preserved when adding instructions/state-types to the front *)
   609 lemma wt_instr_offset: "
   601 lemma wt_instr_offset: "
   610  \<lbrakk> \<forall> pc'' < length mt. 
   602  \<lbrakk> \<forall> pc'' < length mt. 
   612   bc' = bc_pre @ bc @ bc_post; mt' = mt_pre @ mt @ mt_post; 
   604   bc' = bc_pre @ bc @ bc_post; mt' = mt_pre @ mt @ mt_post; 
   613   length bc_pre = length mt_pre; length bc = length mt;
   605   length bc_pre = length mt_pre; length bc = length mt;
   614   length mt_pre \<le> pc; pc < length (mt_pre @ mt); 
   606   length mt_pre \<le> pc; pc < length (mt_pre @ mt); 
   615   mxs \<le> mxs'; max_pc + length mt_pre \<le> max_pc' \<rbrakk>
   607   mxs \<le> mxs'; max_pc + length mt_pre \<le> max_pc' \<rbrakk>
   616 \<Longrightarrow> wt_instr_altern (bc' ! pc) cG rT mt' mxs' mxr max_pc' empty_et pc"
   608 \<Longrightarrow> wt_instr_altern (bc' ! pc) cG rT mt' mxs' mxr max_pc' empty_et pc"
   617 
   609   apply (simp add: wt_instr_altern_def)
   618 apply (simp add: wt_instr_altern_def)
   610   apply (subgoal_tac "\<exists> pc''. pc = pc'' + length mt_pre", erule exE)
   619 apply (subgoal_tac "\<exists> pc''. pc = pc'' + length mt_pre", erule exE)
   611    prefer 2
   620 prefer 2 apply (rule_tac x="pc - length mt_pre" in exI, arith)
   612    apply (rule_tac x="pc - length mt_pre" in exI, arith)
   621 
   613 
   622 apply (drule_tac x=pc'' in spec)
   614   apply (drule_tac x=pc'' in spec)
   623 apply (drule mp) apply arith    (* show pc'' < length mt *)
   615   apply (drule mp) 
   624 apply clarify
   616    apply arith    (* show pc'' < length mt *)
   625 
   617   apply clarify
   626 apply (rule conjI)
   618 
   627   (* app *)
   619   apply (rule conjI)
   628   apply (simp add: nth_append)
   620    (* app *)
   629   apply (rule app_mono_mxs)
   621    apply (simp add: nth_append)
   630   apply (frule app_mono_pc) apply (rule HOL.refl) apply (simp add: offset_xctable_def)
   622    apply (rule app_mono_mxs)
   631   apply assumption+
   623     apply (frule app_mono_pc)
       
   624      apply (rule HOL.refl)
       
   625     apply (simp add: offset_xctable_def)
       
   626    apply assumption+
   632 
   627 
   633   (* check_type *)
   628   (* check_type *)
   634 apply (rule conjI)
   629   apply (rule conjI)
   635 apply (simp add: nth_append)
   630    apply (simp add: nth_append)
   636 apply (rule  check_type_mono) apply assumption+
   631    apply (rule  check_type_mono)
       
   632     apply assumption+
   637 
   633 
   638   (* ..eff.. *)
   634   (* ..eff.. *)
   639 apply (intro ballI)
   635   apply (intro ballI)
   640 apply (subgoal_tac "\<exists> pc' s'. x = (pc', s')", (erule exE)+, simp)
   636   apply (subgoal_tac "\<exists> pc' s'. x = (pc', s')", (erule exE)+, simp)
   641 
   637 
   642 apply (case_tac s')
   638    apply (case_tac s')
   643   (* s' = None *)
   639     (* s' = None *)
   644 apply (simp add: eff_def nth_append norm_eff_def)
   640     apply (simp add: eff_def nth_append norm_eff_def)
   645 apply (frule_tac x="(pc', None)" and  f=fst and b=pc' in rev_image_eqI) 
   641     apply (frule_tac x="(pc', None)" and  f=fst and b=pc' in rev_image_eqI)
   646   apply (simp (no_asm_simp))
   642      apply (simp (no_asm_simp))
   647   apply (simp add: image_comp Fun.comp_def)
   643     apply (simp add: image_comp Fun.comp_def)
   648   apply (frule pc_succs_shift)
   644     apply (frule pc_succs_shift)
   649 apply (drule bspec, assumption)
   645     apply (drule bspec, assumption)
   650 apply arith
   646     apply arith
   651 
   647 
   652   (* s' = Some a *)
   648    (* s' = Some a *)
   653 apply (drule_tac x="(pc' - length mt_pre, s')" in bspec)
   649    apply (drule_tac x="(pc' - length mt_pre, s')" in bspec)
   654 
   650 
   655   (* show  (pc' - length mt_pre, s') \<in> set (eff \<dots>) *)
   651     (* show  (pc' - length mt_pre, s') \<in> set (eff \<dots>) *)
   656 apply (simp add: eff_def)
   652     apply (simp add: eff_def)
   657     (* norm_eff *)
   653     (* norm_eff *)
   658   apply (clarsimp simp: nth_append pc_succs_shift)
   654     apply (clarsimp simp: nth_append pc_succs_shift)
   659 
   655 
   660   (* show P x of bspec *)
   656    (* show P x of bspec *)
   661 apply simp
   657    apply simp
   662   apply (subgoal_tac "length mt_pre \<le> pc'")
   658    apply (subgoal_tac "length mt_pre \<le> pc'")
   663   apply (simp add: nth_append) apply arith
   659     apply (simp add: nth_append)
   664 
   660     apply arith
   665   (* subgoals *)
   661 
   666 apply (simp add: eff_def xcpt_eff_def)
   662    (* subgoals *)
   667 apply (clarsimp)
   663    apply (simp add: eff_def xcpt_eff_def)
   668 apply (rule pc_succs_le) apply assumption+
   664    apply (clarsimp)
   669 apply (subgoal_tac "\<exists> st. mt ! pc'' = Some st", erule exE)
   665    apply (rule pc_succs_le,  assumption+)
   670  apply (rule_tac s="Some st" and st=st and cG=cG and mxs=mxs and rT=rT
   666    apply (subgoal_tac "\<exists> st. mt ! pc'' = Some st", erule exE)
   671         in app_jumps_lem)
   667     apply (rule_tac s="Some st" and st=st and cG=cG and mxs=mxs and rT=rT in app_jumps_lem)
   672   apply (simp add: nth_append)+
   668      apply (simp add: nth_append)+
   673     (* subgoal \<exists> st. mt ! pc'' = Some st *)
   669    (* subgoal \<exists> st. mt ! pc'' = Some st *)
   674   apply (simp add: norm_eff_def map_option_case nth_append)
   670    apply (simp add: norm_eff_def map_option_case nth_append)
   675   apply (case_tac "mt ! pc''")
   671    apply (case_tac "mt ! pc''")
   676 apply simp+
   672     apply simp+
   677 done
   673   done
   678 
   674 
   679 
   675 
   680 (**********************************************************************)
   676 (**********************************************************************)
   681 
   677 
   682 
   678 
   686 
   682 
   687 definition start_sttp_resp :: "[state_type \<Rightarrow> method_type \<times> state_type] \<Rightarrow> bool" where
   683 definition start_sttp_resp :: "[state_type \<Rightarrow> method_type \<times> state_type] \<Rightarrow> bool" where
   688   "start_sttp_resp f == (f = comb_nil) \<or> (start_sttp_resp_cons f)"
   684   "start_sttp_resp f == (f = comb_nil) \<or> (start_sttp_resp_cons f)"
   689 
   685 
   690 lemma start_sttp_resp_comb_nil [simp]: "start_sttp_resp comb_nil"
   686 lemma start_sttp_resp_comb_nil [simp]: "start_sttp_resp comb_nil"
   691 by (simp add: start_sttp_resp_def)
   687   by (simp add: start_sttp_resp_def)
   692 
   688 
   693 lemma start_sttp_resp_cons_comb_cons [simp]: "start_sttp_resp_cons f 
   689 lemma start_sttp_resp_cons_comb_cons [simp]: "start_sttp_resp_cons f 
   694   \<Longrightarrow> start_sttp_resp_cons (f \<box> f')"
   690   \<Longrightarrow> start_sttp_resp_cons (f \<box> f')"
   695 apply (simp add: start_sttp_resp_cons_def comb_def split_beta)
   691   apply (simp add: start_sttp_resp_cons_def comb_def split_beta)
   696 apply (rule allI)
   692   apply (rule allI)
   697 apply (drule_tac x=sttp in spec)
   693   apply (drule_tac x=sttp in spec)
   698 apply auto
   694   apply auto
   699 done
   695   done
   700 
   696 
   701 lemma start_sttp_resp_cons_comb_cons_r: "\<lbrakk> start_sttp_resp f; start_sttp_resp_cons f'\<rbrakk>
   697 lemma start_sttp_resp_cons_comb_cons_r: "\<lbrakk> start_sttp_resp f; start_sttp_resp_cons f'\<rbrakk>
   702   \<Longrightarrow> start_sttp_resp_cons (f \<box> f')"
   698   \<Longrightarrow> start_sttp_resp_cons (f \<box> f')"
   703 apply (simp add: start_sttp_resp_def)
   699   by (auto simp: start_sttp_resp_def)
   704 apply (erule disjE)
       
   705 apply simp+
       
   706 done
       
   707 
   700 
   708 lemma start_sttp_resp_cons_comb [simp]: "start_sttp_resp_cons f 
   701 lemma start_sttp_resp_cons_comb [simp]: "start_sttp_resp_cons f 
   709   \<Longrightarrow> start_sttp_resp (f \<box> f')"
   702   \<Longrightarrow> start_sttp_resp (f \<box> f')"
   710 by (simp add: start_sttp_resp_def)
   703   by (simp add: start_sttp_resp_def)
   711 
   704 
   712 lemma start_sttp_resp_comb: "\<lbrakk> start_sttp_resp f; start_sttp_resp f' \<rbrakk>
   705 lemma start_sttp_resp_comb: "\<lbrakk> start_sttp_resp f; start_sttp_resp f' \<rbrakk>
   713   \<Longrightarrow> start_sttp_resp (f \<box> f')"
   706   \<Longrightarrow> start_sttp_resp (f \<box> f')"
   714 apply (simp add: start_sttp_resp_def)
   707   by (auto simp: start_sttp_resp_def)
   715 apply (erule disjE)
       
   716 apply simp
       
   717 apply (erule disjE)
       
   718 apply simp+
       
   719 done
       
   720 
   708 
   721 lemma start_sttp_resp_cons_nochangeST [simp]: "start_sttp_resp_cons nochangeST"
   709 lemma start_sttp_resp_cons_nochangeST [simp]: "start_sttp_resp_cons nochangeST"
   722 by (simp add: start_sttp_resp_cons_def nochangeST_def)
   710   by (simp add: start_sttp_resp_cons_def nochangeST_def)
   723 
   711 
   724 lemma start_sttp_resp_cons_pushST [simp]: "start_sttp_resp_cons (pushST Ts)"
   712 lemma start_sttp_resp_cons_pushST [simp]: "start_sttp_resp_cons (pushST Ts)"
   725 by (simp add: start_sttp_resp_cons_def pushST_def split_beta)
   713   by (simp add: start_sttp_resp_cons_def pushST_def split_beta)
   726 
   714 
   727 lemma start_sttp_resp_cons_dupST [simp]: "start_sttp_resp_cons dupST"
   715 lemma start_sttp_resp_cons_dupST [simp]: "start_sttp_resp_cons dupST"
   728 by (simp add: start_sttp_resp_cons_def dupST_def split_beta)
   716   by (simp add: start_sttp_resp_cons_def dupST_def split_beta)
   729 
   717 
   730 lemma start_sttp_resp_cons_dup_x1ST [simp]: "start_sttp_resp_cons dup_x1ST"
   718 lemma start_sttp_resp_cons_dup_x1ST [simp]: "start_sttp_resp_cons dup_x1ST"
   731 by (simp add: start_sttp_resp_cons_def dup_x1ST_def split_beta)
   719   by (simp add: start_sttp_resp_cons_def dup_x1ST_def split_beta)
   732 
   720 
   733 lemma start_sttp_resp_cons_popST [simp]: "start_sttp_resp_cons (popST n)"
   721 lemma start_sttp_resp_cons_popST [simp]: "start_sttp_resp_cons (popST n)"
   734 by (simp add: start_sttp_resp_cons_def popST_def split_beta)
   722   by (simp add: start_sttp_resp_cons_def popST_def split_beta)
   735 
   723 
   736 lemma start_sttp_resp_cons_replST [simp]: "start_sttp_resp_cons (replST n tp)"
   724 lemma start_sttp_resp_cons_replST [simp]: "start_sttp_resp_cons (replST n tp)"
   737 by (simp add: start_sttp_resp_cons_def replST_def split_beta)
   725   by (simp add: start_sttp_resp_cons_def replST_def split_beta)
   738 
   726 
   739 lemma start_sttp_resp_cons_storeST [simp]: "start_sttp_resp_cons (storeST i tp)"
   727 lemma start_sttp_resp_cons_storeST [simp]: "start_sttp_resp_cons (storeST i tp)"
   740 by (simp add: start_sttp_resp_cons_def storeST_def split_beta)
   728   by (simp add: start_sttp_resp_cons_def storeST_def split_beta)
   741 
   729 
   742 lemma start_sttp_resp_cons_compTpExpr [simp]: "start_sttp_resp_cons (compTpExpr jmb G ex)"
   730 lemma start_sttp_resp_cons_compTpExpr [simp]: "start_sttp_resp_cons (compTpExpr jmb G ex)"
   743 apply (induct ex)
   731   apply (induct ex)
   744 apply simp+
   732           apply simp+
   745 apply (simp add: start_sttp_resp_cons_def comb_def pushST_def split_beta) (* LAcc *)
   733       apply (simp add: start_sttp_resp_cons_def comb_def pushST_def split_beta) (* LAcc *)
   746 apply simp+
   734      apply simp+
   747 done
   735   done
   748 
   736 
   749 lemma start_sttp_resp_cons_compTpInit [simp]: "start_sttp_resp_cons (compTpInit jmb lv)"
   737 lemma start_sttp_resp_cons_compTpInit [simp]: "start_sttp_resp_cons (compTpInit jmb lv)"
   750 by (simp add: compTpInit_def split_beta)
   738   by (simp add: compTpInit_def split_beta)
   751 
   739 
   752 
   740 
   753 lemma start_sttp_resp_nochangeST [simp]: "start_sttp_resp nochangeST"
   741 lemma start_sttp_resp_nochangeST [simp]: "start_sttp_resp nochangeST"
   754 by (simp add: start_sttp_resp_def)
   742   by (simp add: start_sttp_resp_def)
   755 
   743 
   756 lemma start_sttp_resp_pushST [simp]: "start_sttp_resp (pushST Ts)"
   744 lemma start_sttp_resp_pushST [simp]: "start_sttp_resp (pushST Ts)"
   757 by (simp add: start_sttp_resp_def)
   745   by (simp add: start_sttp_resp_def)
   758 
   746 
   759 lemma start_sttp_resp_dupST [simp]: "start_sttp_resp dupST"
   747 lemma start_sttp_resp_dupST [simp]: "start_sttp_resp dupST"
   760 by (simp add: start_sttp_resp_def)
   748   by (simp add: start_sttp_resp_def)
   761 
   749 
   762 lemma start_sttp_resp_dup_x1ST [simp]: "start_sttp_resp dup_x1ST"
   750 lemma start_sttp_resp_dup_x1ST [simp]: "start_sttp_resp dup_x1ST"
   763 by (simp add: start_sttp_resp_def)
   751   by (simp add: start_sttp_resp_def)
   764 
   752 
   765 lemma start_sttp_resp_popST [simp]: "start_sttp_resp (popST n)"
   753 lemma start_sttp_resp_popST [simp]: "start_sttp_resp (popST n)"
   766 by (simp add: start_sttp_resp_def)
   754   by (simp add: start_sttp_resp_def)
   767 
   755 
   768 lemma start_sttp_resp_replST [simp]: "start_sttp_resp (replST n tp)"
   756 lemma start_sttp_resp_replST [simp]: "start_sttp_resp (replST n tp)"
   769 by (simp add: start_sttp_resp_def)
   757   by (simp add: start_sttp_resp_def)
   770 
   758 
   771 lemma start_sttp_resp_storeST [simp]: "start_sttp_resp (storeST i tp)"
   759 lemma start_sttp_resp_storeST [simp]: "start_sttp_resp (storeST i tp)"
   772 by (simp add: start_sttp_resp_def)
   760   by (simp add: start_sttp_resp_def)
   773 
   761 
   774 lemma start_sttp_resp_compTpExpr [simp]: "start_sttp_resp (compTpExpr jmb G ex)"
   762 lemma start_sttp_resp_compTpExpr [simp]: "start_sttp_resp (compTpExpr jmb G ex)"
   775 by (simp add: start_sttp_resp_def)
   763   by (simp add: start_sttp_resp_def)
   776 
   764 
   777 lemma start_sttp_resp_compTpExprs [simp]: "start_sttp_resp (compTpExprs jmb G exs)"
   765 lemma start_sttp_resp_compTpExprs [simp]: "start_sttp_resp (compTpExprs jmb G exs)"
   778 by (induct exs, (simp add: start_sttp_resp_comb)+)
   766   by (induct exs, (simp add: start_sttp_resp_comb)+)
   779 
   767 
   780 lemma start_sttp_resp_compTpStmt [simp]: "start_sttp_resp (compTpStmt jmb G s)"
   768 lemma start_sttp_resp_compTpStmt [simp]: "start_sttp_resp (compTpStmt jmb G s)"
   781 by (induct s, (simp add: start_sttp_resp_comb)+)
   769   by (induct s, (simp add: start_sttp_resp_comb)+)
   782 
   770 
   783 lemma start_sttp_resp_compTpInitLvars [simp]: "start_sttp_resp (compTpInitLvars jmb lvars)"
   771 lemma start_sttp_resp_compTpInitLvars [simp]: "start_sttp_resp (compTpInitLvars jmb lvars)"
   784 by (induct lvars, simp+)
   772   by (induct lvars, simp+)
   785 
   773 
   786 
   774 
   787 
   775 
   788 
   776 
   789   (* ********************************************************************** *)
   777   (* ********************************************************************** *)
   790 subsection "length of compExpr/ compTpExprs"
   778 subsection "length of compExpr/ compTpExprs"
   791   (* ********************************************************************** *)
   779   (* ********************************************************************** *)
   792 
   780 
   793 lemma length_comb [simp]:  "length (mt_of ((f1 \<box> f2) sttp)) = 
   781 lemma length_comb [simp]:  "length (mt_of ((f1 \<box> f2) sttp)) = 
   794   length (mt_of (f1 sttp)) + length (mt_of (f2 (sttp_of (f1 sttp))))"
   782   length (mt_of (f1 sttp)) + length (mt_of (f2 (sttp_of (f1 sttp))))"
   795 by (simp add: comb_def split_beta)
   783   by (simp add: comb_def split_beta)
   796 
   784 
   797 
   785 
   798 lemma length_comb_nil [simp]: "length (mt_of (comb_nil sttp)) = 0"
   786 lemma length_comb_nil [simp]: "length (mt_of (comb_nil sttp)) = 0"
   799 by (simp add: comb_nil_def)
   787   by (simp add: comb_nil_def)
   800 
   788 
   801 lemma length_nochangeST [simp]: "length (mt_of (nochangeST sttp)) = 1"
   789 lemma length_nochangeST [simp]: "length (mt_of (nochangeST sttp)) = 1"
   802 by (simp add: nochangeST_def)
   790   by (simp add: nochangeST_def)
   803 
   791 
   804 lemma length_pushST [simp]: "length (mt_of (pushST Ts sttp)) = 1"
   792 lemma length_pushST [simp]: "length (mt_of (pushST Ts sttp)) = 1"
   805 by (simp add: pushST_def split_beta)
   793   by (simp add: pushST_def split_beta)
   806 
   794 
   807 lemma length_dupST [simp]: "length (mt_of (dupST sttp)) = 1"
   795 lemma length_dupST [simp]: "length (mt_of (dupST sttp)) = 1"
   808 by (simp add: dupST_def split_beta)
   796   by (simp add: dupST_def split_beta)
   809 
   797 
   810 lemma length_dup_x1ST [simp]: "length (mt_of (dup_x1ST sttp)) = 1"
   798 lemma length_dup_x1ST [simp]: "length (mt_of (dup_x1ST sttp)) = 1"
   811 by (simp add: dup_x1ST_def split_beta)
   799   by (simp add: dup_x1ST_def split_beta)
   812 
   800 
   813 lemma length_popST [simp]: "length (mt_of (popST n sttp)) = 1"
   801 lemma length_popST [simp]: "length (mt_of (popST n sttp)) = 1"
   814 by (simp add: popST_def split_beta)
   802   by (simp add: popST_def split_beta)
   815 
   803 
   816 lemma length_replST [simp]: "length (mt_of (replST n tp sttp)) = 1"
   804 lemma length_replST [simp]: "length (mt_of (replST n tp sttp)) = 1"
   817 by (simp add: replST_def split_beta)
   805   by (simp add: replST_def split_beta)
   818 
   806 
   819 lemma length_storeST [simp]: "length (mt_of (storeST i tp sttp)) = 1"
   807 lemma length_storeST [simp]: "length (mt_of (storeST i tp sttp)) = 1"
   820 by (simp add: storeST_def split_beta)
   808   by (simp add: storeST_def split_beta)
   821 
   809 
   822 
   810 
   823 lemma length_compTpExpr_Exprs [rule_format]: "
   811 lemma length_compTpExpr_Exprs [rule_format]: "
   824   (\<forall> sttp. (length (mt_of (compTpExpr jmb G ex sttp)) = length (compExpr jmb ex)))
   812   (\<forall>sttp. (length (mt_of (compTpExpr jmb G ex sttp)) = length (compExpr jmb ex)))
   825   \<and> (\<forall> sttp. (length (mt_of (compTpExprs jmb G exs sttp)) = length (compExprs jmb exs)))"
   813   \<and> (\<forall>sttp. (length (mt_of (compTpExprs jmb G exs sttp)) = length (compExprs jmb exs)))"
   826 apply (rule compat_expr_expr_list.induct)
   814   apply (rule compat_expr_expr_list.induct)
   827 apply simp+
   815             apply (simp_all)[3]
   828 apply (rename_tac binop a b, case_tac binop)
   816          apply (rename_tac binop a b, case_tac binop)
   829 apply simp+
   817           apply (auto simp add: pushST_def split_beta)
   830 apply (simp add: pushST_def split_beta)
   818   done
   831 apply simp+
       
   832 done
       
   833 
   819 
   834 lemma length_compTpExpr: "length (mt_of (compTpExpr jmb G ex sttp)) = length (compExpr jmb ex)"
   820 lemma length_compTpExpr: "length (mt_of (compTpExpr jmb G ex sttp)) = length (compExpr jmb ex)"
   835 by (rule length_compTpExpr_Exprs [THEN conjunct1 [THEN spec]])
   821   by (rule length_compTpExpr_Exprs [THEN conjunct1 [THEN spec]])
   836 
   822 
   837 lemma length_compTpExprs: "length (mt_of (compTpExprs jmb G exs sttp)) = length (compExprs jmb exs)"
   823 lemma length_compTpExprs: "length (mt_of (compTpExprs jmb G exs sttp)) = length (compExprs jmb exs)"
   838 by (rule length_compTpExpr_Exprs [THEN conjunct2 [THEN spec]])
   824   by (rule length_compTpExpr_Exprs [THEN conjunct2 [THEN spec]])
   839 
   825 
   840 lemma length_compTpStmt [rule_format]: "
   826 lemma length_compTpStmt [rule_format]: "
   841   (\<forall> sttp. (length (mt_of (compTpStmt jmb G s sttp)) = length (compStmt jmb s)))"
   827   (\<forall> sttp. (length (mt_of (compTpStmt jmb G s sttp)) = length (compStmt jmb s)))"
   842 apply (rule stmt.induct)
   828   by (rule stmt.induct) (auto simp: length_compTpExpr)
   843 apply (simp add: length_compTpExpr)+
       
   844 done
       
   845 
       
   846 
   829 
   847 lemma length_compTpInit: "length (mt_of (compTpInit jmb lv sttp)) = length (compInit jmb lv)"
   830 lemma length_compTpInit: "length (mt_of (compTpInit jmb lv sttp)) = length (compInit jmb lv)"
   848 by (simp add: compTpInit_def compInit_def split_beta)
   831   by (simp add: compTpInit_def compInit_def split_beta)
   849 
   832 
   850 lemma length_compTpInitLvars [rule_format]: 
   833 lemma length_compTpInitLvars [rule_format]: 
   851   "\<forall> sttp. length (mt_of (compTpInitLvars jmb lvars sttp)) = length (compInitLvars jmb lvars)"
   834   "\<forall> sttp. length (mt_of (compTpInitLvars jmb lvars sttp)) = length (compInitLvars jmb lvars)"
   852 by (induct lvars,  (simp add: compInitLvars_def length_compTpInit split_beta)+)
   835   by (induct lvars, (simp add: compInitLvars_def length_compTpInit split_beta)+)
   853 
   836 
   854 
   837 
   855   (* ********************************************************************** *)
   838   (* ********************************************************************** *)
   856 subsection "Correspondence bytecode - method types"
   839 subsection "Correspondence bytecode - method types"
   857   (* ********************************************************************** *)
   840   (* ********************************************************************** *)
   865   where "LT_of == snd"
   848   where "LT_of == snd"
   866 
   849 
   867 lemma states_lower:
   850 lemma states_lower:
   868   "\<lbrakk> OK (Some (ST, LT)) \<in> states cG mxs mxr; length ST \<le> mxs\<rbrakk>
   851   "\<lbrakk> OK (Some (ST, LT)) \<in> states cG mxs mxr; length ST \<le> mxs\<rbrakk>
   869   \<Longrightarrow> OK (Some (ST, LT)) \<in> states cG (length ST) mxr"
   852   \<Longrightarrow> OK (Some (ST, LT)) \<in> states cG (length ST) mxr"
   870 apply (simp add: states_def JVMType.sl_def)
   853   apply (simp add: states_def JVMType.sl_def)
   871 apply (simp add: Product.esl_def stk_esl_def reg_sl_def upto_esl_def Listn.sl_def Err.sl_def
   854   apply (simp add: Product.esl_def stk_esl_def reg_sl_def upto_esl_def Listn.sl_def Err.sl_def
   872   JType.esl_def)
   855                    JType.esl_def)
   873 apply (simp add: Err.esl_def Err.le_def Listn.le_def)
   856   apply (simp add: Err.esl_def Err.le_def Listn.le_def)
   874 apply (simp add: Product.le_def Product.sup_def Err.sup_def)
   857   apply (simp add: Product.le_def Product.sup_def Err.sup_def)
   875 apply (simp add: Opt.esl_def Listn.sup_def)
   858   apply (simp add: Opt.esl_def Listn.sup_def)
   876 apply clarify
   859   apply clarify
   877 apply auto
   860   apply auto
   878 done
   861   done
   879 
   862 
   880 lemma check_type_lower:
   863 lemma check_type_lower:
   881   "\<lbrakk> check_type cG mxs mxr (OK (Some (ST, LT))); length ST \<le> mxs\<rbrakk>
   864   "\<lbrakk> check_type cG mxs mxr (OK (Some (ST, LT))); length ST \<le> mxs\<rbrakk>
   882   \<Longrightarrow>check_type cG (length ST) mxr (OK (Some (ST, LT)))"
   865   \<Longrightarrow>check_type cG (length ST) mxr (OK (Some (ST, LT)))"
   883 by (simp add: check_type_def states_lower)
   866   by (simp add: check_type_def states_lower)
   884 
   867 
   885   (* ******************************************************************* *)
   868   (* ******************************************************************* *)
   886 
   869 
   887 definition bc_mt_corresp :: "
   870 definition bc_mt_corresp :: "
   888   [bytecode, state_type \<Rightarrow> method_type \<times> state_type, state_type, jvm_prog, ty, nat, p_count]
   871   [bytecode, state_type \<Rightarrow> method_type \<times> state_type, state_type, jvm_prog, ty, nat, p_count]
   904   \<lbrakk> bc' = (bc1@bc2); l' = (length bc');
   887   \<lbrakk> bc' = (bc1@bc2); l' = (length bc');
   905   bc_mt_corresp bc1 f1 sttp0 cG rT mxr (length bc1);
   888   bc_mt_corresp bc1 f1 sttp0 cG rT mxr (length bc1);
   906   bc_mt_corresp bc2 f2 (sttp_of (f1 sttp0)) cG rT mxr (length bc2);
   889   bc_mt_corresp bc2 f2 (sttp_of (f1 sttp0)) cG rT mxr (length bc2);
   907   start_sttp_resp f2\<rbrakk>
   890   start_sttp_resp f2\<rbrakk>
   908 \<Longrightarrow> bc_mt_corresp bc' (f1 \<box> f2) sttp0 cG rT mxr l'"
   891 \<Longrightarrow> bc_mt_corresp bc' (f1 \<box> f2) sttp0 cG rT mxr l'"
   909 apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+)
   892   apply (subgoal_tac "\<exists>mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+)
   910 apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+)
   893    apply (subgoal_tac "\<exists>mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+)
   911 
   894 
   912   (* unfold start_sttp_resp and make case distinction *)
   895     (* unfold start_sttp_resp and make case distinction *)
   913 apply (simp only: start_sttp_resp_def)
   896     apply (simp only: start_sttp_resp_def)
   914 apply (erule disjE)
   897     apply (erule disjE)
   915   (* case f2 = comb_nil *)
   898      (* case f2 = comb_nil *)
   916 apply (simp add: bc_mt_corresp_def comb_nil_def start_sttp_resp_cons_def)
   899      apply (simp add: bc_mt_corresp_def comb_nil_def start_sttp_resp_cons_def)
   917 apply (erule conjE)+
   900      apply (erule conjE)+
   918 apply (intro strip)
   901      apply (intro strip)
   919 apply simp
   902      apply simp
   920 
   903 
   921   (* case start_sttp_resp_cons f2 *)
   904     (* case start_sttp_resp_cons f2 *)
   922 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def del: all_simps)
   905     apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def del: all_simps)
   923 apply (intro strip)
   906     apply (intro strip)
   924 apply (erule conjE)+
   907     apply (erule conjE)+
   925 apply (drule mp, assumption)
   908     apply (drule mp, assumption)
   926 apply (subgoal_tac "check_type cG (length (fst sttp1)) mxr (OK (Some sttp1))")
   909     apply (subgoal_tac "check_type cG (length (fst sttp1)) mxr (OK (Some sttp1))")
   927 apply (erule conjE)+
   910      apply (erule conjE)+
   928 apply (drule mp, assumption)
   911      apply (drule mp, assumption)
   929 apply (erule conjE)+
   912      apply (erule conjE)+
   930 
   913 
   931 apply (rule conjI)
   914      apply (rule conjI)
   932   (* show wt_instr  \<dots> *)
   915       (* show wt_instr  \<dots> *)
   933 
   916 
   934 apply (drule_tac x=sttp1 in spec, simp)
   917       apply (drule_tac x=sttp1 in spec, simp)
   935 apply (erule exE)
   918       apply (erule exE)
   936 apply (intro strip)
   919       apply (intro strip)
   937 apply (case_tac "pc < length mt1")
   920       apply (case_tac "pc < length mt1")
   938 
   921 
   939   (* case pc < length mt1 *)
   922        (* case pc < length mt1 *)
   940 apply (drule spec, drule mp, simp)
   923        apply (drule spec, drule mp, simp)
   941 apply simp 
   924        apply simp
   942 apply (rule_tac mt="mt1 @ [Some sttp1]" in wt_instr_prefix)
   925        apply (rule_tac mt="mt1 @ [Some sttp1]" in wt_instr_prefix)
   943   apply assumption+ apply (rule HOL.refl)
   926               apply assumption+ apply (rule HOL.refl)
   944   apply (simp (no_asm_simp))
   927             apply (simp (no_asm_simp))
   945   apply (simp (no_asm_simp) add: max_ssize_def)
   928            apply (simp (no_asm_simp) add: max_ssize_def)
   946   apply (simp add: max_of_list_def ac_simps)
   929            apply (simp add: max_of_list_def ac_simps)
   947   apply arith
   930           apply arith
   948   apply (simp (no_asm_simp))+
   931          apply (simp (no_asm_simp))+
   949 
   932 
   950   (* case pc \<ge> length mt1 *)
   933       (* case pc \<ge> length mt1 *)
   951 apply (rule_tac bc=bc2 and mt=mt2 and bc_post="[]" and mt_post="[Some sttp2]" 
   934       apply (rule_tac bc=bc2 and mt=mt2 and bc_post="[]" and mt_post="[Some sttp2]"
   952   and mxr=mxr 
   935               and mxr=mxr
   953   in wt_instr_offset)
   936               in wt_instr_offset)
   954 apply simp
   937               apply simp
   955 apply (simp (no_asm_simp))+
   938              apply (simp (no_asm_simp))+
   956 apply simp
   939         apply simp
   957 apply (simp add: max_ssize_def) apply (simp (no_asm_simp))
   940        apply (simp add: max_ssize_def) apply (simp (no_asm_simp))
   958 
   941 
   959   (* show check_type \<dots> *)
   942      (* show check_type \<dots> *)
   960 apply (subgoal_tac "((mt2 @ [Some sttp2]) ! length bc2) = Some sttp2")
   943      apply (subgoal_tac "((mt2 @ [Some sttp2]) ! length bc2) = Some sttp2")
   961 apply (simp only:)
   944       apply (simp only:)
   962 apply (rule check_type_mono) apply assumption
   945       apply (rule check_type_mono) apply assumption
   963 apply (simp (no_asm_simp) add: max_ssize_def ac_simps)
   946       apply (simp (no_asm_simp) add: max_ssize_def ac_simps)
   964 apply (simp add: nth_append)
   947      apply (simp add: nth_append)
   965 
   948 
   966 apply (erule conjE)+
   949     apply (erule conjE)+
   967 apply (case_tac sttp1)
   950     apply (case_tac sttp1)
   968 apply (simp add: check_type_def)
   951     apply (simp add: check_type_def)
   969 apply (rule states_lower, assumption)
   952     apply (rule states_lower, assumption)
   970 apply (simp (no_asm_simp) add: max_ssize_def)
   953     apply (simp (no_asm_simp) add: max_ssize_def)
   971 apply (simp (no_asm_simp) add: max_of_list_def ssize_sto_def)
   954     apply (simp (no_asm_simp) add: max_of_list_def ssize_sto_def)
   972 apply (simp (no_asm_simp))+
   955    apply (simp (no_asm_simp))+
   973 done
   956   done
   974 
   957 
   975 
   958 
   976 lemma bc_mt_corresp_zero [simp]: "\<lbrakk> length (mt_of (f sttp)) = length bc; start_sttp_resp f\<rbrakk>
   959 lemma bc_mt_corresp_zero [simp]:
       
   960   "\<lbrakk> length (mt_of (f sttp)) = length bc; start_sttp_resp f\<rbrakk>
   977   \<Longrightarrow> bc_mt_corresp bc f sttp cG rT mxr 0"
   961   \<Longrightarrow> bc_mt_corresp bc f sttp cG rT mxr 0"
   978 apply (simp add: bc_mt_corresp_def start_sttp_resp_def split_beta)
   962   apply (simp add: bc_mt_corresp_def start_sttp_resp_def split_beta)
   979 apply (erule disjE)
   963   apply (erule disjE)
   980 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def split: prod.split)
   964    apply (simp add: max_ssize_def max_of_list_def ssize_sto_def split: prod.split)
   981 apply (intro strip)
   965   apply (intro strip)
   982 apply (simp add: start_sttp_resp_cons_def split_beta)
   966   apply (simp add: start_sttp_resp_cons_def split_beta)
   983 apply (drule_tac x=sttp in spec, erule exE)
   967   apply (drule_tac x=sttp in spec, erule exE)
   984 apply simp
   968   apply simp
   985 apply (rule check_type_mono, assumption)
   969   apply (rule check_type_mono, assumption)
   986 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def split: prod.split)
   970   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def split: prod.split)
   987 done
   971   done
   988 
   972 
   989   (* ********************************************************************** *)
   973   (* ********************************************************************** *)
   990 
   974 
   991 
   975 
   992 definition mt_sttp_flatten :: "method_type \<times> state_type \<Rightarrow> method_type" where
   976 definition mt_sttp_flatten :: "method_type \<times> state_type \<Rightarrow> method_type" where
   993   "mt_sttp_flatten mt_sttp == (mt_of mt_sttp) @ [Some (sttp_of mt_sttp)]"
   977   "mt_sttp_flatten mt_sttp == (mt_of mt_sttp) @ [Some (sttp_of mt_sttp)]"
   994 
   978 
   995 
   979 
   996 lemma mt_sttp_flatten_length [simp]: "n = (length (mt_of (f sttp)))
   980 lemma mt_sttp_flatten_length [simp]: "n = (length (mt_of (f sttp)))
   997  \<Longrightarrow> (mt_sttp_flatten (f sttp)) ! n = Some (sttp_of (f sttp))"
   981   \<Longrightarrow> (mt_sttp_flatten (f sttp)) ! n = Some (sttp_of (f sttp))"
   998 by (simp add: mt_sttp_flatten_def)
   982   by (simp add: mt_sttp_flatten_def)
   999 
   983 
  1000 lemma mt_sttp_flatten_comb: "(mt_sttp_flatten ((f1 \<box> f2) sttp)) = 
   984 lemma mt_sttp_flatten_comb: "(mt_sttp_flatten ((f1 \<box> f2) sttp)) = 
  1001   (mt_of (f1 sttp)) @ (mt_sttp_flatten (f2 (sttp_of (f1 sttp))))"
   985   (mt_of (f1 sttp)) @ (mt_sttp_flatten (f2 (sttp_of (f1 sttp))))"
  1002 by (simp add: mt_sttp_flatten_def comb_def split_beta)
   986   by (simp add: mt_sttp_flatten_def comb_def split_beta)
  1003 
   987 
  1004 lemma mt_sttp_flatten_comb_length [simp]: "\<lbrakk> n1 = length (mt_of (f1 sttp)); n1 \<le> n \<rbrakk>
   988 lemma mt_sttp_flatten_comb_length [simp]: "\<lbrakk> n1 = length (mt_of (f1 sttp)); n1 \<le> n \<rbrakk>
  1005   \<Longrightarrow> (mt_sttp_flatten ((f1 \<box> f2) sttp) ! n) = (mt_sttp_flatten (f2 (sttp_of (f1 sttp))) ! (n - n1))"
   989   \<Longrightarrow> (mt_sttp_flatten ((f1 \<box> f2) sttp) ! n) = (mt_sttp_flatten (f2 (sttp_of (f1 sttp))) ! (n - n1))"
  1006 by (simp add: mt_sttp_flatten_comb nth_append)
   990   by (simp add: mt_sttp_flatten_comb nth_append)
  1007 
   991 
  1008 lemma mt_sttp_flatten_comb_zero [simp]: "start_sttp_resp f 
   992 lemma mt_sttp_flatten_comb_zero [simp]:
  1009   \<Longrightarrow> (mt_sttp_flatten (f sttp)) ! 0 = Some sttp"
   993   "start_sttp_resp f \<Longrightarrow> (mt_sttp_flatten (f sttp)) ! 0 = Some sttp"
  1010 apply (simp only: start_sttp_resp_def)
   994   apply (simp only: start_sttp_resp_def)
  1011 apply (erule disjE)
   995   apply (erule disjE)
  1012 apply (simp add: comb_nil_def mt_sttp_flatten_def)
   996    apply (simp add: comb_nil_def mt_sttp_flatten_def)
  1013 apply (simp add: start_sttp_resp_cons_def mt_sttp_flatten_def split_beta)
   997   apply (simp add: start_sttp_resp_cons_def mt_sttp_flatten_def split_beta)
  1014 apply (drule_tac x=sttp in spec)
   998   apply (drule_tac x=sttp in spec)
  1015 apply (erule exE)
   999   apply (erule exE)
  1016 apply simp
  1000   apply simp
  1017 done
  1001   done
  1018 
  1002 
  1019 
  1003 
  1020 (* move into prelude -- compare with nat_int_length *)
  1004 (* move into prelude -- compare with nat_int_length *)
  1021 lemma int_outside_right: "0 \<le> (m::int) \<Longrightarrow> m + (int n) = int ((nat m) + n)"
  1005 lemma int_outside_right: "0 \<le> (m::int) \<Longrightarrow> m + (int n) = int ((nat m) + n)"
  1022 by simp
  1006   by simp
  1023 
  1007 
  1024 lemma int_outside_left: "0 \<le> (m::int) \<Longrightarrow> (int n) + m = int (n + (nat m))"
  1008 lemma int_outside_left: "0 \<le> (m::int) \<Longrightarrow> (int n) + m = int (n + (nat m))"
  1025 by simp
  1009   by simp
  1026 
  1010 
  1027 
  1011 
  1028 
  1012 
  1029 
  1013 
  1030   (* ********************************************************************** *)
  1014   (* ********************************************************************** *)
  1038    Product.esl_def stk_esl_def reg_sl_def upto_esl_def Listn.sl_def Err.sl_def
  1022    Product.esl_def stk_esl_def reg_sl_def upto_esl_def Listn.sl_def Err.sl_def
  1039   JType.esl_def Err.esl_def Err.le_def Listn.le_def Product.le_def Product.sup_def Err.sup_def
  1023   JType.esl_def Err.esl_def Err.le_def Listn.le_def Product.le_def Product.sup_def Err.sup_def
  1040   Opt.esl_def Listn.sup_def
  1024   Opt.esl_def Listn.sup_def
  1041 
  1025 
  1042 
  1026 
  1043 lemma check_type_push: "\<lbrakk> 
  1027 lemma check_type_push: 
  1044   is_class cG cname; check_type cG (length ST) mxr (OK (Some (ST, LT))) \<rbrakk>
  1028   "\<lbrakk> is_class cG cname; check_type cG (length ST) mxr (OK (Some (ST, LT))) \<rbrakk>
  1045   \<Longrightarrow> check_type cG (Suc (length ST)) mxr (OK (Some (Class cname # ST, LT)))"
  1029   \<Longrightarrow> check_type cG (Suc (length ST)) mxr (OK (Some (Class cname # ST, LT)))"
  1046 apply (simp add: check_type_simps)
  1030   apply (simp add: check_type_simps)
  1047 apply clarify
  1031   apply clarify
  1048 apply (rule_tac x="Suc (length ST)" in exI)
  1032   apply (rule_tac x="Suc (length ST)" in exI)
  1049 apply simp+
  1033   apply simp+
  1050 done
  1034   done
  1051 
  1035 
  1052 lemma bc_mt_corresp_New: "\<lbrakk>is_class cG cname \<rbrakk>
  1036 lemma bc_mt_corresp_New: "\<lbrakk>is_class cG cname \<rbrakk>
  1053   \<Longrightarrow> bc_mt_corresp [New cname] (pushST [Class cname]) (ST, LT) cG rT mxr (Suc 0)"
  1037   \<Longrightarrow> bc_mt_corresp [New cname] (pushST [Class cname]) (ST, LT) cG rT mxr (Suc 0)"
  1054 apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def
  1038   apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def
  1055     max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1039                    max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1056 apply (intro strip)
  1040   apply (intro strip)
  1057 apply (rule conjI)
  1041   apply (rule conjI)
  1058 apply (rule check_type_mono, assumption, simp)
  1042    apply (rule check_type_mono, assumption, simp)
  1059 apply (simp add: check_type_push)
  1043   apply (simp add: check_type_push)
  1060 done
  1044   done
  1061 
  1045 
  1062 lemma bc_mt_corresp_Pop: "
  1046 lemma bc_mt_corresp_Pop: "
  1063   bc_mt_corresp [Pop] (popST (Suc 0)) (T # ST, LT) cG rT mxr (Suc 0)"
  1047   bc_mt_corresp [Pop] (popST (Suc 0)) (T # ST, LT) cG rT mxr (Suc 0)"
  1064   apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def)
  1048   apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def)
  1065   apply (simp add: max_ssize_def ssize_sto_def max_of_list_def) 
  1049   apply (simp add: max_ssize_def ssize_sto_def max_of_list_def)
  1066   apply (simp add: check_type_simps max.absorb1)
  1050   apply (simp add: check_type_simps max.absorb1)
  1067   apply clarify
  1051   apply clarify
  1068   apply (rule_tac x="(length ST)" in exI)
  1052   apply (rule_tac x="(length ST)" in exI)
  1069   apply simp+
  1053   apply simp
  1070   done
  1054   done
  1071 
  1055 
  1072 lemma bc_mt_corresp_Checkcast: "\<lbrakk> is_class cG cname; sttp = (ST, LT); 
  1056 lemma bc_mt_corresp_Checkcast: "\<lbrakk> is_class cG cname; sttp = (ST, LT); 
  1073   (\<exists>rT STo. ST = RefT rT # STo) \<rbrakk>
  1057   (\<exists>rT STo. ST = RefT rT # STo) \<rbrakk>
  1074   \<Longrightarrow> bc_mt_corresp [Checkcast cname] (replST (Suc 0) (Class cname)) sttp cG rT mxr (Suc 0)"
  1058   \<Longrightarrow> bc_mt_corresp [Checkcast cname] (replST (Suc 0) (Class cname)) sttp cG rT mxr (Suc 0)"
  1076   apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def)
  1060   apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def)
  1077   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1061   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1078   apply (simp add: check_type_simps)
  1062   apply (simp add: check_type_simps)
  1079   apply clarify
  1063   apply clarify
  1080   apply (rule_tac x="Suc (length STo)" in exI)
  1064   apply (rule_tac x="Suc (length STo)" in exI)
  1081   apply simp+
  1065   apply simp
  1082   done
  1066   done
  1083 
  1067 
  1084 
  1068 
  1085 lemma bc_mt_corresp_LitPush: "\<lbrakk> typeof (\<lambda>v. None) val = Some T \<rbrakk>
  1069 lemma bc_mt_corresp_LitPush: "\<lbrakk> typeof (\<lambda>v. None) val = Some T \<rbrakk>
  1086   \<Longrightarrow> bc_mt_corresp [LitPush val] (pushST [T]) sttp cG rT mxr (Suc 0)"
  1070   \<Longrightarrow> bc_mt_corresp [LitPush val] (pushST [T]) sttp cG rT mxr (Suc 0)"
  1087 apply (subgoal_tac "\<exists> ST LT. sttp= (ST, LT)", (erule exE)+)
  1071   apply (subgoal_tac "\<exists>ST LT. sttp= (ST, LT)", (erule exE)+)
  1088   apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def
  1072    apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def
  1089               max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1073                     max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1090   apply (intro strip)
  1074    apply (intro strip)
  1091   apply (rule conjI)
  1075    apply (rule conjI)
  1092   apply (rule check_type_mono, assumption, simp)
  1076     apply (rule check_type_mono, assumption, simp)
  1093   apply (simp add: check_type_simps)
  1077    apply (simp add: check_type_simps)
  1094 apply clarify
  1078    apply clarify
  1095 apply (rule_tac x="Suc (length ST)" in exI)
  1079    apply (rule_tac x="Suc (length ST)" in exI)
  1096 apply simp
  1080    apply simp
  1097 apply (drule sym)
  1081    apply (drule sym)
  1098 apply (case_tac val)
  1082    apply (case_tac val)
  1099 apply simp+
  1083        apply simp+
  1100 done
  1084   done
  1101 
  1085 
  1102 
  1086 
  1103 lemma bc_mt_corresp_LitPush_CT: "\<lbrakk> typeof (\<lambda>v. None) val = Some T \<and> cG \<turnstile> T \<preceq> T';
  1087 lemma bc_mt_corresp_LitPush_CT:
  1104   is_type cG T' \<rbrakk>
  1088   "\<lbrakk> typeof (\<lambda>v. None) val = Some T \<and> cG \<turnstile> T \<preceq> T'; is_type cG T' \<rbrakk>
  1105   \<Longrightarrow> bc_mt_corresp [LitPush val] (pushST [T']) sttp cG rT mxr (Suc 0)"
  1089   \<Longrightarrow> bc_mt_corresp [LitPush val] (pushST [T']) sttp cG rT mxr (Suc 0)"
  1106 apply (subgoal_tac "\<exists> ST LT. sttp= (ST, LT)", (erule exE)+)
  1090   apply (subgoal_tac "\<exists>ST LT. sttp= (ST, LT)", (erule exE)+)
  1107   apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def
  1091    apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def max_ssize_def
  1108               max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1092                     max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1109   apply (intro strip)
  1093    apply (intro strip)
  1110   apply (rule conjI)
  1094    apply (rule conjI)
  1111   apply (rule check_type_mono, assumption, simp)
  1095     apply (rule check_type_mono, assumption, simp)
  1112   apply (simp add: check_type_simps)
  1096    apply (simp add: check_type_simps)
  1113   apply (simp add: sup_state_Cons)
  1097    apply (simp add: sup_state_Cons)
  1114 apply clarify
  1098    apply clarify
  1115 apply (rule_tac x="Suc (length ST)" in exI)
  1099    apply (rule_tac x="Suc (length ST)" in exI)
  1116 apply simp
  1100    apply simp
  1117 apply simp+
  1101   apply simp
  1118 done
  1102   done
  1119 
  1103 
  1120 declare not_Err_eq [iff del]
  1104 declare not_Err_eq [iff del]
  1121 
  1105 
  1122 lemma bc_mt_corresp_Load: "\<lbrakk> i < length LT; LT ! i \<noteq> Err; mxr = length LT \<rbrakk>
  1106 lemma bc_mt_corresp_Load: "\<lbrakk> i < length LT; LT ! i \<noteq> Err; mxr = length LT \<rbrakk>
  1123   \<Longrightarrow> bc_mt_corresp [Load i] 
  1107   \<Longrightarrow> bc_mt_corresp [Load i] 
  1124          (\<lambda>(ST, LT). pushST [ok_val (LT ! i)] (ST, LT)) (ST, LT) cG rT mxr (Suc 0)"
  1108          (\<lambda>(ST, LT). pushST [ok_val (LT ! i)] (ST, LT)) (ST, LT) cG rT mxr (Suc 0)"
  1125 apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def
  1109   apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def max_ssize_def max_of_list_def
  1126             max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1110                    ssize_sto_def eff_def norm_eff_def max.absorb2)
  1127   apply (intro strip)
  1111   apply (intro strip)
  1128   apply (rule conjI)
  1112   apply (rule conjI)
  1129   apply (rule check_type_mono, assumption, simp)
  1113    apply (rule check_type_mono, assumption, simp)
  1130 apply (simp add: check_type_simps)
  1114   apply (simp add: check_type_simps)
  1131 apply clarify
  1115   apply clarify
  1132 apply (rule_tac x="Suc (length ST)" in exI)
  1116   apply (rule_tac x="Suc (length ST)" in exI)
  1133 apply (simp (no_asm_simp))
  1117   apply (simp (no_asm_simp))
  1134   apply (simp only: err_def)
  1118   apply (simp only: err_def)
  1135   apply (frule listE_nth_in) apply assumption
  1119   apply (frule listE_nth_in)
  1136 apply (subgoal_tac "LT ! i \<in> {x. \<exists>y\<in>types cG. x = OK y}")
  1120    apply assumption
  1137 apply (drule CollectD) apply (erule bexE)
  1121   apply (subgoal_tac "LT ! i \<in> {x. \<exists>y\<in>types cG. x = OK y}")
  1138 apply (simp (no_asm_simp))
  1122    apply (drule CollectD)
  1139 apply blast
  1123    apply (erule bexE)
  1140 apply blast
  1124    apply (simp (no_asm_simp))
  1141 done
  1125    apply blast
  1142 
  1126   apply blast
  1143 
  1127   done
  1144 lemma bc_mt_corresp_Store_init: "\<lbrakk> i < length LT \<rbrakk>
  1128 
  1145   \<Longrightarrow> bc_mt_corresp [Store i] (storeST i T) (T # ST, LT) cG rT mxr (Suc 0)"
  1129 
  1146  apply (simp add: bc_mt_corresp_def storeST_def wt_instr_altern_def eff_def norm_eff_def)
  1130 lemma bc_mt_corresp_Store_init:
       
  1131   "i < length LT \<Longrightarrow> bc_mt_corresp [Store i] (storeST i T) (T # ST, LT) cG rT mxr (Suc 0)"
       
  1132   apply (simp add: bc_mt_corresp_def storeST_def wt_instr_altern_def eff_def norm_eff_def)
  1147   apply (simp add: max_ssize_def  max_of_list_def)
  1133   apply (simp add: max_ssize_def  max_of_list_def)
  1148   apply (simp add: ssize_sto_def)
  1134   apply (simp add: ssize_sto_def)
  1149   apply (intro strip)
  1135   apply (intro strip)
  1150 apply (simp add: check_type_simps max.absorb1)
  1136   apply (simp add: check_type_simps max.absorb1)
  1151 apply clarify
  1137   apply clarify
  1152 apply (rule conjI)
  1138   apply (rule conjI)
  1153 apply (rule_tac x="(length ST)" in exI)
  1139    apply (rule_tac x="(length ST)" in exI)
  1154 apply simp+
  1140    apply simp+
  1155 done
  1141   done
  1156 
  1142 
  1157 
  1143 
  1158 lemma bc_mt_corresp_Store: "\<lbrakk> i < length LT; cG  \<turnstile>  LT[i := OK T] <=l LT \<rbrakk>
  1144 lemma bc_mt_corresp_Store:
       
  1145   "\<lbrakk> i < length LT; cG  \<turnstile>  LT[i := OK T] <=l LT \<rbrakk>
  1159   \<Longrightarrow> bc_mt_corresp [Store i] (popST (Suc 0)) (T # ST, LT) cG rT mxr (Suc 0)"
  1146   \<Longrightarrow> bc_mt_corresp [Store i] (popST (Suc 0)) (T # ST, LT) cG rT mxr (Suc 0)"
  1160   apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def)
  1147   apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def)
  1161   apply (simp add: sup_state_conv)
  1148   apply (simp add: sup_state_conv)
  1162   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1149   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1163  apply (intro strip)
  1150   apply (intro strip)
  1164 apply (simp add: check_type_simps max.absorb1)
  1151   apply (simp add: check_type_simps max.absorb1)
  1165 apply clarify
  1152   apply clarify
  1166 apply (rule_tac x="(length ST)" in exI)
  1153   apply (rule_tac x="(length ST)" in exI)
  1167 apply simp+
  1154   apply simp
  1168 done
  1155   done
  1169 
  1156 
  1170 
  1157 
  1171 lemma bc_mt_corresp_Dup: "
  1158 lemma bc_mt_corresp_Dup: "
  1172   bc_mt_corresp [Dup] dupST (T # ST, LT) cG rT mxr (Suc 0)"
  1159   bc_mt_corresp [Dup] dupST (T # ST, LT) cG rT mxr (Suc 0)"
  1173  apply (simp add: bc_mt_corresp_def dupST_def wt_instr_altern_def
  1160   apply (simp add: bc_mt_corresp_def dupST_def wt_instr_altern_def
  1174              max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1161                    max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1175   apply (intro strip)
  1162   apply (intro strip)
  1176   apply (rule conjI)
  1163   apply (rule conjI)
  1177   apply (rule check_type_mono, assumption, simp)
  1164    apply (rule check_type_mono, assumption, simp)
  1178 apply (simp add: check_type_simps)
  1165   apply (simp add: check_type_simps)
  1179 apply clarify
  1166   apply clarify
  1180 apply (rule_tac x="Suc (Suc (length ST))" in exI)
  1167   apply (rule_tac x="Suc (Suc (length ST))" in exI)
  1181 apply simp+
  1168   apply simp
  1182 done
  1169   done
  1183 
  1170 
  1184 lemma bc_mt_corresp_Dup_x1: "
  1171 lemma bc_mt_corresp_Dup_x1: "
  1185   bc_mt_corresp [Dup_x1] dup_x1ST (T1 # T2 # ST, LT) cG rT mxr (Suc 0)"
  1172   bc_mt_corresp [Dup_x1] dup_x1ST (T1 # T2 # ST, LT) cG rT mxr (Suc 0)"
  1186   apply (simp add: bc_mt_corresp_def dup_x1ST_def wt_instr_altern_def
  1173   apply (simp add: bc_mt_corresp_def dup_x1ST_def wt_instr_altern_def
  1187               max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1174               max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2)
  1188   apply (intro strip)
  1175   apply (intro strip)
  1189   apply (rule conjI)
  1176   apply (rule conjI)
  1190   apply (rule check_type_mono, assumption, simp)
  1177    apply (rule check_type_mono, assumption, simp)
  1191 apply (simp add: check_type_simps)
  1178   apply (simp add: check_type_simps)
  1192 apply clarify
  1179   apply clarify
  1193 apply (rule_tac x="Suc (Suc (Suc (length ST)))" in exI)
  1180   apply (rule_tac x="Suc (Suc (Suc (length ST)))" in exI)
  1194 apply simp+
  1181   apply simp+
  1195 done
  1182   done
  1196 
  1183 
  1197 
  1184 
  1198 
  1185 
  1199 lemma bc_mt_corresp_IAdd: "
  1186 lemma bc_mt_corresp_IAdd: "
  1200   bc_mt_corresp [IAdd] (replST 2 (PrimT Integer)) 
  1187   bc_mt_corresp [IAdd] (replST 2 (PrimT Integer)) 
  1202   apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def)
  1189   apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def)
  1203   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1190   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1204   apply (simp add: check_type_simps max.absorb1)
  1191   apply (simp add: check_type_simps max.absorb1)
  1205   apply clarify
  1192   apply clarify
  1206   apply (rule_tac x="Suc (length ST)" in exI)
  1193   apply (rule_tac x="Suc (length ST)" in exI)
  1207   apply simp+
  1194   apply simp
  1208   done
  1195   done
  1209 
  1196 
  1210 lemma bc_mt_corresp_Getfield: "\<lbrakk> wf_prog wf_mb G; 
  1197 lemma bc_mt_corresp_Getfield: "\<lbrakk> wf_prog wf_mb G; 
  1211   field (G, C) vname = Some (cname, T);  is_class G C \<rbrakk>
  1198   field (G, C) vname = Some (cname, T);  is_class G C \<rbrakk>
  1212   \<Longrightarrow> bc_mt_corresp [Getfield vname cname] 
  1199   \<Longrightarrow> bc_mt_corresp [Getfield vname cname] 
  1217   apply (frule widen_field, assumption+)
  1204   apply (frule widen_field, assumption+)
  1218   apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def)
  1205   apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def)
  1219   apply (simp add: comp_field comp_subcls1 comp_widen comp_is_class)
  1206   apply (simp add: comp_field comp_subcls1 comp_widen comp_is_class)
  1220   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1207   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1221   apply (intro strip)
  1208   apply (intro strip)
  1222 apply (simp add: check_type_simps)
  1209   apply (simp add: check_type_simps)
  1223 apply clarify
  1210   apply clarify
  1224 apply (rule_tac x="Suc (length ST)" in exI)
  1211   apply (rule_tac x="Suc (length ST)" in exI)
  1225 apply simp+
  1212   apply simp+
  1226 apply (simp only: comp_is_type)
  1213   apply (simp only: comp_is_type)
  1227 apply (rule_tac C=cname in fields_is_type)
  1214   apply (rule_tac C=cname in fields_is_type)
  1228 apply (simp add: TypeRel.field_def)
  1215     apply (simp add: TypeRel.field_def)
  1229 apply (drule JBasis.table_of_remap_SomeD)+
  1216     apply (drule JBasis.table_of_remap_SomeD)+
  1230 apply assumption+
  1217     apply assumption+
  1231 apply (erule wf_prog_ws_prog)
  1218    apply (erule wf_prog_ws_prog)
  1232 apply assumption
  1219   apply assumption
  1233 done
  1220   done
  1234 
  1221 
  1235 lemma bc_mt_corresp_Putfield: "\<lbrakk> wf_prog wf_mb G; 
  1222 lemma bc_mt_corresp_Putfield: "\<lbrakk> wf_prog wf_mb G; 
  1236   field (G, C) vname = Some (cname, Ta); G \<turnstile> T \<preceq> Ta; is_class G C \<rbrakk>
  1223   field (G, C) vname = Some (cname, Ta); G \<turnstile> T \<preceq> Ta; is_class G C \<rbrakk>
  1237   \<Longrightarrow> bc_mt_corresp [Putfield vname cname] (popST 2) (T # Class C # T # ST, LT)
  1224   \<Longrightarrow> bc_mt_corresp [Putfield vname cname] (popST 2) (T # Class C # T # ST, LT)
  1238            (comp G) rT mxr (Suc 0)"
  1225            (comp G) rT mxr (Suc 0)"
  1242   apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def)
  1229   apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def)
  1243   apply (simp add: comp_field comp_subcls1 comp_widen comp_is_class)
  1230   apply (simp add: comp_field comp_subcls1 comp_widen comp_is_class)
  1244   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1231   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1245 
  1232 
  1246   apply (intro strip)
  1233   apply (intro strip)
  1247 apply (simp add: check_type_simps max.absorb1)
  1234   apply (simp add: check_type_simps max.absorb1)
  1248 apply clarify
  1235   apply clarify
  1249 apply (rule_tac x="Suc (length ST)" in exI)
  1236   apply (rule_tac x="Suc (length ST)" in exI)
  1250 apply simp+
  1237   apply simp+
  1251 done
  1238   done
  1252 
  1239 
  1253 
  1240 
  1254 
  1241 
  1255 lemma Call_app: "\<lbrakk> wf_prog wf_mb G; is_class G cname;
  1242 lemma Call_app:
  1256 STs = rev pTsa @ Class cname # ST;
  1243   "\<lbrakk> wf_prog wf_mb G; is_class G cname;
  1257 max_spec G cname (mname, pTsa) = {((md, T), pTs')} \<rbrakk>
  1244      STs = rev pTsa @ Class cname # ST;
       
  1245      max_spec G cname (mname, pTsa) = {((md, T), pTs')} \<rbrakk>
  1258   \<Longrightarrow> app (Invoke cname mname pTs') (comp G) (length (T # ST)) rT 0 empty_et (Some (STs, LTs))"
  1246   \<Longrightarrow> app (Invoke cname mname pTs') (comp G) (length (T # ST)) rT 0 empty_et (Some (STs, LTs))"
  1259   apply (subgoal_tac "(\<exists>mD' rT' comp_b. 
  1247   apply (subgoal_tac "(\<exists>mD' rT' comp_b. 
  1260     method (comp G, cname) (mname, pTs') = Some (mD', rT', comp_b))")
  1248                         method (comp G, cname) (mname, pTs') = Some (mD', rT', comp_b))")
  1261   apply (simp add: comp_is_class)
  1249    apply (simp add: comp_is_class)
  1262   apply (rule_tac x=pTsa in exI)
  1250    apply (rule_tac x=pTsa in exI)
  1263   apply (rule_tac x="Class cname" in exI)
  1251    apply (rule_tac x="Class cname" in exI)
  1264   apply (simp add: max_spec_preserves_length comp_is_class)
  1252    apply (simp add: max_spec_preserves_length comp_is_class)
  1265   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1253    apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1266   apply (simp add: split_paired_all comp_widen list_all2_iff)
  1254    apply (simp add: split_paired_all comp_widen list_all2_iff)
  1267   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1255   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1268   apply (rule exI)+
  1256   apply (rule exI)+
  1269   apply (simp add: wf_prog_ws_prog [THEN comp_method])
  1257   apply (simp add: wf_prog_ws_prog [THEN comp_method])
  1270   done
  1258   done
  1271 
  1259 
  1272 
  1260 
  1273 lemma bc_mt_corresp_Invoke: "\<lbrakk> wf_prog wf_mb G; 
  1261 lemma bc_mt_corresp_Invoke:
       
  1262   "\<lbrakk> wf_prog wf_mb G; 
  1274   max_spec G cname (mname, pTsa) = {((md, T), fpTs)};
  1263   max_spec G cname (mname, pTsa) = {((md, T), fpTs)};
  1275   is_class G cname \<rbrakk>
  1264   is_class G cname \<rbrakk>
  1276  \<Longrightarrow> bc_mt_corresp [Invoke cname mname fpTs] (replST (Suc (length pTsa)) T)
  1265  \<Longrightarrow> bc_mt_corresp [Invoke cname mname fpTs] (replST (Suc (length pTsa)) T)
  1277            (rev pTsa @ Class cname # ST, LT) (comp G) rT mxr (Suc 0)"
  1266            (rev pTsa @ Class cname # ST, LT) (comp G) rT mxr (Suc 0)"
  1278   apply (simp add: bc_mt_corresp_def wt_instr_altern_def eff_def norm_eff_def)
  1267   apply (simp add: bc_mt_corresp_def wt_instr_altern_def eff_def norm_eff_def)
  1279   apply (simp add: replST_def del: appInvoke)
  1268   apply (simp add: replST_def del: appInvoke)
  1280   apply (intro strip)
  1269   apply (intro strip)
  1281   apply (rule conjI)
  1270   apply (rule conjI)
  1282 
  1271 
  1283   -- "app"
  1272    -- "app"
  1284   apply (rule Call_app [THEN app_mono_mxs]) apply assumption+
  1273    apply (rule Call_app [THEN app_mono_mxs])
  1285     apply (rule HOL.refl) apply assumption
  1274        apply assumption+
  1286     apply (simp add: max_ssize_def max_of_list_elem ssize_sto_def)
  1275      apply (rule HOL.refl)
       
  1276     apply assumption
       
  1277    apply (simp add: max_ssize_def max_of_list_elem ssize_sto_def)
  1287 
  1278 
  1288   -- {* @{text "<=s"} *}
  1279   -- {* @{text "<=s"} *}
  1289   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1280   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1290   apply (simp add: wf_prog_ws_prog [THEN comp_method])
  1281   apply (simp add: wf_prog_ws_prog [THEN comp_method])
  1291   apply (simp add: max_spec_preserves_length [symmetric])
  1282   apply (simp add: max_spec_preserves_length [symmetric])
  1292 
  1283 
  1293   -- "@{text check_type}"
  1284   -- "@{text check_type}"
  1294 apply (simp add: max_ssize_def ssize_sto_def)
  1285   apply (simp add: max_ssize_def ssize_sto_def)
  1295 apply (simp add: max_of_list_def)
  1286   apply (simp add: max_of_list_def)
  1296 apply (subgoal_tac "(max (length pTsa + length ST) (length ST)) = (length pTsa + length ST)")
  1287   apply (subgoal_tac "(max (length pTsa + length ST) (length ST)) = (length pTsa + length ST)")
  1297 apply simp
  1288    apply simp
  1298 apply (simp add: check_type_simps)
  1289    apply (simp add: check_type_simps)
  1299 apply clarify
  1290    apply clarify
  1300 apply (rule_tac x="Suc (length ST)" in exI)
  1291    apply (rule_tac x="Suc (length ST)" in exI)
  1301 apply simp+
  1292    apply simp+
  1302 apply (simp only: comp_is_type)
  1293    apply (simp only: comp_is_type)
  1303 apply (frule method_wf_mdecl) apply assumption apply assumption
  1294    apply (frule method_wf_mdecl) apply assumption apply assumption
  1304 apply (simp add: wf_mdecl_def wf_mhead_def)
  1295    apply (simp add: wf_mdecl_def wf_mhead_def)
  1305 apply (simp)
  1296   apply (simp)
  1306   done
  1297   done
  1307 
  1298 
  1308 
  1299 
  1309 lemma wt_instr_Ifcmpeq: "\<lbrakk>Suc pc < max_pc; 
  1300 lemma wt_instr_Ifcmpeq: "\<lbrakk>Suc pc < max_pc; 
  1310   0 \<le> (int pc + i);  nat (int pc + i) < max_pc;
  1301   0 \<le> (int pc + i);  nat (int pc + i) < max_pc;
  1312   ((\<exists>p. ts = PrimT p \<and> ts' = PrimT p) \<or> (\<exists>r r'. ts = RefT r \<and> ts' = RefT r'));
  1303   ((\<exists>p. ts = PrimT p \<and> ts' = PrimT p) \<or> (\<exists>r r'. ts = RefT r \<and> ts' = RefT r'));
  1313   mt_sttp_flatten f ! Suc pc = Some (ST,LT);
  1304   mt_sttp_flatten f ! Suc pc = Some (ST,LT);
  1314   mt_sttp_flatten f ! nat (int pc + i) = Some (ST,LT);
  1305   mt_sttp_flatten f ! nat (int pc + i) = Some (ST,LT);
  1315   check_type (TranslComp.comp G) mxs mxr (OK (Some (ts # ts' # ST, LT))) \<rbrakk>
  1306   check_type (TranslComp.comp G) mxs mxr (OK (Some (ts # ts' # ST, LT))) \<rbrakk>
  1316     \<Longrightarrow>  wt_instr_altern (Ifcmpeq i) (comp G) rT  (mt_sttp_flatten f) mxs mxr max_pc empty_et pc"
  1307     \<Longrightarrow>  wt_instr_altern (Ifcmpeq i) (comp G) rT  (mt_sttp_flatten f) mxs mxr max_pc empty_et pc"
  1317 by (simp  add: wt_instr_altern_def eff_def norm_eff_def)
  1308   by (simp  add: wt_instr_altern_def eff_def norm_eff_def)
  1318 
  1309 
  1319 
  1310 
  1320 lemma wt_instr_Goto: "\<lbrakk> 0 \<le> (int pc + i); nat (int pc + i) < max_pc;
  1311 lemma wt_instr_Goto: "\<lbrakk> 0 \<le> (int pc + i); nat (int pc + i) < max_pc;
  1321   mt_sttp_flatten f ! nat (int pc + i) = (mt_sttp_flatten f ! pc);
  1312   mt_sttp_flatten f ! nat (int pc + i) = (mt_sttp_flatten f ! pc);
  1322   check_type (TranslComp.comp G) mxs mxr (OK (mt_sttp_flatten f ! pc)) \<rbrakk>
  1313   check_type (TranslComp.comp G) mxs mxr (OK (mt_sttp_flatten f ! pc)) \<rbrakk>
  1323   \<Longrightarrow> wt_instr_altern (Goto i) (comp G) rT  (mt_sttp_flatten f) mxs mxr max_pc empty_et pc"
  1314   \<Longrightarrow> wt_instr_altern (Goto i) (comp G) rT  (mt_sttp_flatten f) mxs mxr max_pc empty_et pc"
  1324 apply (case_tac "(mt_sttp_flatten f ! pc)")
  1315   apply (case_tac "(mt_sttp_flatten f ! pc)")
  1325 apply (simp  add: wt_instr_altern_def eff_def norm_eff_def app_def xcpt_app_def)+
  1316    apply (simp  add: wt_instr_altern_def eff_def norm_eff_def app_def xcpt_app_def)+
  1326 done
  1317   done
  1327 
  1318 
  1328 
  1319 
  1329 
  1320 
  1330 
  1321 
  1331   (* ********************************************************************** *)
  1322   (* ********************************************************************** *)
  1339   l1 = (length bc1); l12 = (length (bc1@bc2));
  1330   l1 = (length bc1); l12 = (length (bc1@bc2));
  1340   bc_mt_corresp bc2 f2 (sttp_of (f1 sttp0)) cG rT mxr (length bc2);
  1331   bc_mt_corresp bc2 f2 (sttp_of (f1 sttp0)) cG rT mxr (length bc2);
  1341   length bc1 = length (mt_of (f1 sttp0));
  1332   length bc1 = length (mt_of (f1 sttp0));
  1342   start_sttp_resp f2; start_sttp_resp f3\<rbrakk>
  1333   start_sttp_resp f2; start_sttp_resp f3\<rbrakk>
  1343 \<Longrightarrow> bc_mt_corresp bc' f' sttp0 cG rT mxr l12"
  1334 \<Longrightarrow> bc_mt_corresp bc' f' sttp0 cG rT mxr l12"
  1344 apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+)
  1335   apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+)
  1345 apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+)
  1336    apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+)
  1346 apply (subgoal_tac "\<exists> mt3 sttp3. (f3 sttp2) = (mt3, sttp3)", (erule exE)+)
  1337     apply (subgoal_tac "\<exists> mt3 sttp3. (f3 sttp2) = (mt3, sttp3)", (erule exE)+)
  1347 
  1338 
  1348   (* unfold start_sttp_resp and make case distinction *)
  1339      (* unfold start_sttp_resp and make case distinction *)
  1349 apply (simp only: start_sttp_resp_def)
  1340      apply (simp only: start_sttp_resp_def)
  1350 apply (erule_tac Q="start_sttp_resp_cons f2" in disjE)
  1341      apply (erule_tac Q="start_sttp_resp_cons f2" in disjE)
  1351   (* case f2 = comb_nil *)
  1342       (* case f2 = comb_nil *)
  1352 apply (simp add: bc_mt_corresp_def comb_nil_def start_sttp_resp_cons_def)
  1343       apply (simp add: bc_mt_corresp_def comb_nil_def start_sttp_resp_cons_def)
  1353 
  1344 
  1354   (* case start_sttp_resp_cons f2 *)
  1345      (* case start_sttp_resp_cons f2 *)
  1355 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def)
  1346      apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def)
  1356 apply (drule_tac x=sttp1 in spec, simp, erule exE)
  1347      apply (drule_tac x=sttp1 in spec, simp, erule exE)
  1357 apply (intro strip, (erule conjE)+)
  1348      apply (intro strip, (erule conjE)+)
  1358 
  1349 
  1359 
  1350 
  1360   (* get rid of all check_type info *)
  1351      (* get rid of all check_type info *)
  1361 apply (subgoal_tac "check_type cG (length (fst sttp1)) mxr (OK (Some sttp1))")
  1352      apply (subgoal_tac "check_type cG (length (fst sttp1)) mxr (OK (Some sttp1))")
  1362 apply (subgoal_tac "check_type cG (max_ssize (mt2 @ [Some sttp2])) mxr (OK (Some sttp2))")
  1353       apply (subgoal_tac "check_type cG (max_ssize (mt2 @ [Some sttp2])) mxr (OK (Some sttp2))")
  1363 apply (subgoal_tac "check_type cG (max_ssize (mt1 @ mt2 @ mt3 @ [Some sttp3])) mxr
  1354        apply (subgoal_tac "check_type cG (max_ssize (mt1 @ mt2 @ mt3 @ [Some sttp3])) mxr
  1364            (OK ((mt2 @ mt3 @ [Some sttp3]) ! length mt2))")
  1355                                          (OK ((mt2 @ mt3 @ [Some sttp3]) ! length mt2))")
  1365 apply simp
  1356         apply simp
  1366 
  1357 
  1367 
  1358 
  1368 
  1359 
  1369 apply (intro strip, (erule conjE)+)
  1360         apply (intro strip, (erule conjE)+)
  1370 apply (case_tac "pc < length mt1")
  1361         apply (case_tac "pc < length mt1")
  1371 
  1362 
  1372   (* case pc < length mt1 *)
  1363          (* case pc < length mt1 *)
  1373 apply (drule spec, drule mp, assumption)
  1364          apply (drule spec, drule mp, assumption)
  1374 apply assumption
  1365          apply assumption
  1375 
  1366 
  1376   (* case pc \<ge> length mt1 *)
  1367         (* case pc \<ge> length mt1 *)
  1377   (* case distinction on start_sttp_resp f3 *)
  1368         (* case distinction on start_sttp_resp f3 *)
  1378 apply (erule_tac P="f3 = comb_nil" in disjE)
  1369         apply (erule_tac P="f3 = comb_nil" in disjE)
  1379 
  1370 
  1380   (* case f3 = comb_nil *)
  1371          (* case f3 = comb_nil *)
  1381 apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3")  apply (erule conjE)+
  1372          apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3")  apply (erule conjE)+
  1382 apply (subgoal_tac "bc3=[]")
  1373           apply (subgoal_tac "bc3=[]")
  1383 
  1374 
  1384 apply (rule_tac bc_pre=bc1 and bc=bc2 and bc_post=bc3
  1375            apply (rule_tac bc_pre=bc1 and bc=bc2 and bc_post=bc3
  1385   and mt_pre=mt1 and mt=mt2 and mt_post="mt3@ [Some sttp3]" 
  1376                        and mt_pre=mt1 and mt=mt2 and mt_post="mt3@ [Some sttp3]"
  1386   and mxs="(max_ssize (mt2 @ [(Some sttp2)]))"
  1377                        and mxs="(max_ssize (mt2 @ [(Some sttp2)]))"
  1387   and max_pc="(Suc (length mt2))"
  1378                        and max_pc="(Suc (length mt2))"
  1388   in wt_instr_offset)
  1379                         in wt_instr_offset)
  1389   apply simp
  1380                    apply simp
  1390   apply (rule HOL.refl)+
  1381                   apply (rule HOL.refl)+
  1391   apply (simp (no_asm_simp))+
  1382                  apply (simp (no_asm_simp))+
  1392 
  1383 
  1393   apply (simp (no_asm_simp) add: max_ssize_def del: max_of_list_append)
  1384             apply (simp (no_asm_simp) add: max_ssize_def del: max_of_list_append)
  1394     apply (rule max_of_list_sublist)
  1385             apply (rule max_of_list_sublist)
  1395     apply (simp (no_asm_simp) only: set_append list.set list.map) apply blast
  1386             apply (simp (no_asm_simp) only: set_append list.set list.map) apply blast
  1396   apply (simp (no_asm_simp))
  1387            apply (simp (no_asm_simp))
  1397   apply simp                    (* subgoal bc3 = [] *)
  1388           apply simp                    (* subgoal bc3 = [] *)
  1398   apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *)
  1389          apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *)
  1399 
  1390 
  1400   (* case start_sttp_resp_cons f3 *)
  1391         (* case start_sttp_resp_cons f3 *)
  1401 apply (subgoal_tac "\<exists>mt3_rest. (mt3 = Some sttp2 # mt3_rest)", erule exE)
  1392         apply (subgoal_tac "\<exists>mt3_rest. (mt3 = Some sttp2 # mt3_rest)", erule exE)
  1402 apply (rule_tac bc_pre=bc1 and bc=bc2 and bc_post=bc3
  1393          apply (rule_tac bc_pre=bc1 and bc=bc2 and bc_post=bc3
  1403   and mt_pre=mt1 and mt=mt2 and mt_post="mt3@ [Some sttp3]" 
  1394                      and mt_pre=mt1 and mt=mt2 and mt_post="mt3@ [Some sttp3]"
  1404   and mxs="(max_ssize (mt2 @ [Some sttp2]))"
  1395                      and mxs="(max_ssize (mt2 @ [Some sttp2]))"
  1405   and max_pc="(Suc (length mt2))"
  1396                      and max_pc="(Suc (length mt2))"
  1406   in wt_instr_offset)
  1397                       in wt_instr_offset)
  1407 apply (intro strip)
  1398                  apply (intro strip)
  1408 apply (rule_tac bc=bc2 and mt="(mt2 @ [Some sttp2])"
  1399                  apply (rule_tac bc=bc2 and mt="(mt2 @ [Some sttp2])"
  1409   and mxs="(max_ssize (mt2 @ [Some sttp2]))"
  1400                              and mxs="(max_ssize (mt2 @ [Some sttp2]))"
  1410   and max_pc="(Suc (length mt2))"
  1401                              and max_pc="(Suc (length mt2))"
  1411   in wt_instr_prefix)
  1402                               in wt_instr_prefix)
  1412 
  1403 
  1413 
  1404                         (* preconditions of  wt_instr_prefix *)
  1414      (* preconditions of  wt_instr_prefix *)
  1405                         apply simp
  1415   apply simp
  1406                        apply (rule HOL.refl)
  1416   apply (rule HOL.refl)
  1407                       apply (simp (no_asm_simp))+
  1417   apply (simp (no_asm_simp))+
  1408                    apply simp+
  1418   apply simp+
  1409           (* (some) preconditions of  wt_instr_offset *)
  1419      (* (some) preconditions of  wt_instr_offset *)
  1410           apply (simp (no_asm_simp) add: max_ssize_def del: max_of_list_append)
  1420   apply (simp (no_asm_simp) add: max_ssize_def del: max_of_list_append)
  1411           apply (rule max_of_list_sublist)
  1421   apply (rule max_of_list_sublist)
  1412           apply (simp (no_asm_simp) only: set_append list.set list.map)
  1422     apply (simp (no_asm_simp) only: set_append list.set list.map) apply blast
  1413           apply blast
  1423   apply (simp (no_asm_simp))
  1414          apply (simp (no_asm_simp))
  1424 
  1415 
  1425 apply (drule_tac x=sttp2 in spec, simp) (* subgoal \<exists>mt3_rest. \<dots> *)
  1416         apply (drule_tac x=sttp2 in spec, simp) (* subgoal \<exists>mt3_rest. \<dots> *)
  1426 
  1417 
  1427   (* subgoals check_type*)
  1418        (* subgoals check_type*)
  1428   (* \<dots> ! length mt2 *)
  1419        (* \<dots> ! length mt2 *)
  1429 apply simp
  1420        apply simp
  1430 
  1421 
  1431 apply (erule_tac P="f3 = comb_nil" in disjE)
  1422        apply (erule_tac P="f3 = comb_nil" in disjE)
  1432 
  1423 
  1433   (* -- case f3 = comb_nil *)
  1424         (* -- case f3 = comb_nil *)
  1434 apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3")  apply (erule conjE)+
  1425         apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3")  apply (erule conjE)+
  1435 apply simp
  1426          apply simp
  1436 apply (rule check_type_mono, assumption)
  1427          apply (rule check_type_mono, assumption)
  1437 apply (simp only: max_ssize_def) apply (rule max_of_list_sublist) apply (simp (no_asm_simp))
  1428          apply (simp only: max_ssize_def)
  1438 apply blast
  1429          apply (rule max_of_list_sublist)
  1439   apply simp                    (* subgoal bc3 = [] *)
  1430          apply (simp (no_asm_simp))
  1440   apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *)
  1431          apply blast
  1441 
  1432         apply simp                    (* subgoal bc3 = [] *)
  1442 
  1433         apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *)
  1443   (* -- case start_sttp_resp_cons f3 *)
  1434 
  1444 apply (subgoal_tac "\<exists>mt3_rest. (mt3 = Some sttp2 # mt3_rest)", erule exE)
  1435 
  1445 apply (simp (no_asm_simp) add: nth_append)
  1436        (* -- case start_sttp_resp_cons f3 *)
  1446 apply (erule conjE)+
  1437        apply (subgoal_tac "\<exists>mt3_rest. (mt3 = Some sttp2 # mt3_rest)", erule exE)
  1447 apply (rule check_type_mono, assumption)
  1438         apply (simp (no_asm_simp) add: nth_append)
  1448 apply (simp only: max_ssize_def) apply (rule max_of_list_sublist) apply (simp (no_asm_simp))
  1439         apply (erule conjE)+
  1449 apply blast
  1440         apply (rule check_type_mono, assumption)
  1450 apply (drule_tac x=sttp2 in spec, simp) (* subgoal \<exists>mt3_rest. \<dots> *)
  1441         apply (simp only: max_ssize_def)
  1451 
  1442         apply (rule max_of_list_sublist)
  1452 
  1443         apply (simp (no_asm_simp))
  1453   (* subgoal check_type \<dots> Some sttp2 *)
  1444         apply blast
  1454 apply (simp add: nth_append)
  1445        apply (drule_tac x=sttp2 in spec, simp) (* subgoal \<exists>mt3_rest. \<dots> *)
  1455 
  1446 
  1456   (* subgoal check_type \<dots> Some sttp1 *)
  1447 
  1457 apply (simp add: nth_append)
  1448       (* subgoal check_type \<dots> Some sttp2 *)
  1458 apply (erule conjE)+
  1449       apply (simp add: nth_append)
  1459 apply (case_tac "sttp1", simp)
  1450 
  1460 apply (rule check_type_lower) apply assumption
  1451      (* subgoal check_type \<dots> Some sttp1 *)
  1461 apply (simp (no_asm_simp) add: max_ssize_def ssize_sto_def)
  1452      apply (simp add: nth_append)
  1462 apply (simp (no_asm_simp) add: max_of_list_def)
  1453      apply (erule conjE)+
  1463 
  1454      apply (case_tac "sttp1", simp)
  1464   (* subgoals \<exists> ... *)
  1455      apply (rule check_type_lower, assumption)
  1465 apply (rule surj_pair)+
  1456      apply (simp (no_asm_simp) add: max_ssize_def ssize_sto_def)
  1466 done
  1457      apply (simp (no_asm_simp) add: max_of_list_def)
       
  1458 
       
  1459     (* subgoals \<exists> ... *)
       
  1460     apply (rule surj_pair)+
       
  1461   done
  1467 
  1462 
  1468 
  1463 
  1469   (* ******************** *)
  1464   (* ******************** *)
  1470 definition contracting :: "(state_type \<Rightarrow> method_type \<times> state_type) \<Rightarrow> bool" where
  1465 definition contracting :: "(state_type \<Rightarrow> method_type \<times> state_type) \<Rightarrow> bool" where
  1471   "contracting f == (\<forall> ST LT. 
  1466   "contracting f == (\<forall> ST LT. 
  1473                     in (length ST' \<le> length ST \<and> set ST' \<subseteq> set ST  \<and>
  1468                     in (length ST' \<le> length ST \<and> set ST' \<subseteq> set ST  \<and>
  1474                         length LT' = length LT \<and> set LT' \<subseteq> set LT))"
  1469                         length LT' = length LT \<and> set LT' \<subseteq> set LT))"
  1475 
  1470 
  1476 
  1471 
  1477   (* ### possibly move into HOL *)
  1472   (* ### possibly move into HOL *)
  1478 lemma set_drop_Suc [rule_format]: "\<forall> xs. set (drop (Suc n) xs) \<subseteq> set (drop n xs)"
  1473 lemma set_drop_Suc [rule_format]: "\<forall>xs. set (drop (Suc n) xs) \<subseteq> set (drop n xs)"
  1479 apply (induct n)
  1474   apply (induct n)
  1480 apply simp
  1475    apply simp
  1481 apply (intro strip)
  1476    apply (intro strip)
  1482 apply (rule list.induct)
  1477    apply (rule list.induct)
  1483 apply simp
  1478     apply simp
  1484 apply simp apply blast
  1479    apply simp
  1485 apply (intro strip)
  1480    apply blast
  1486 apply (rule_tac 
  1481   apply (intro strip)
  1487   P="\<lambda> xs. set (drop (Suc (Suc n)) xs) \<subseteq> set (drop (Suc n) xs)" in list.induct)
  1482   apply (rule_tac P="\<lambda> xs. set (drop (Suc (Suc n)) xs) \<subseteq> set (drop (Suc n) xs)" in list.induct)
  1488 apply simp+
  1483    apply simp+
  1489 done
  1484   done
  1490 
  1485 
  1491 lemma set_drop_le [rule_format,simp]: "\<forall> n xs. n \<le> m \<longrightarrow> set (drop m xs) \<subseteq> set (drop n xs)"
  1486 lemma set_drop_le [rule_format,simp]: "\<forall>n xs. n \<le> m \<longrightarrow> set (drop m xs) \<subseteq> set (drop n xs)"
  1492 apply (induct m)
  1487   apply (induct m)
  1493 apply simp
  1488    apply simp
  1494 apply (intro strip)
  1489   apply (intro strip)
  1495 apply (subgoal_tac "n \<le> m \<or> n = Suc m")
  1490   apply (subgoal_tac "n \<le> m \<or> n = Suc m")
  1496 apply (erule disjE)
  1491    apply (erule disjE)
  1497 apply (frule_tac x=n in spec, drule_tac x=xs in spec, drule mp, assumption)
  1492     apply (frule_tac x=n in spec, drule_tac x=xs in spec, drule mp, assumption)
  1498 apply (rule set_drop_Suc [THEN subset_trans], assumption)
  1493     apply (rule set_drop_Suc [THEN subset_trans], assumption)
  1499 apply auto
  1494    apply auto
  1500 done
  1495   done
  1501 
  1496 
  1502 lemma set_drop [simp] : "set (drop m xs) \<subseteq> set xs"
  1497 declare set_drop_subset [simp]
  1503 apply (rule_tac B="set (drop 0 xs)" in subset_trans)
       
  1504 apply (rule set_drop_le)
       
  1505 apply simp+
       
  1506 done
       
  1507 
       
  1508 
       
  1509 
  1498 
  1510 lemma contracting_popST [simp]: "contracting (popST n)"
  1499 lemma contracting_popST [simp]: "contracting (popST n)"
  1511 by (simp add: contracting_def popST_def)
  1500   by (simp add: contracting_def popST_def)
  1512 
  1501 
  1513 lemma contracting_nochangeST [simp]: "contracting nochangeST"
  1502 lemma contracting_nochangeST [simp]: "contracting nochangeST"
  1514 by (simp add: contracting_def nochangeST_def)
  1503   by (simp add: contracting_def nochangeST_def)
  1515 
  1504 
  1516 
  1505 
  1517 lemma check_type_contracting: "\<lbrakk> check_type cG mxs mxr (OK (Some sttp)); contracting f\<rbrakk> 
  1506 lemma check_type_contracting: "\<lbrakk> check_type cG mxs mxr (OK (Some sttp)); contracting f\<rbrakk> 
  1518   \<Longrightarrow> check_type cG mxs mxr (OK (Some (sttp_of (f sttp))))"
  1507   \<Longrightarrow> check_type cG mxs mxr (OK (Some (sttp_of (f sttp))))"
  1519 apply (subgoal_tac "\<exists> ST LT. sttp = (ST, LT)", (erule exE)+)
  1508   apply (subgoal_tac "\<exists> ST LT. sttp = (ST, LT)", (erule exE)+)
  1520 apply (simp add: check_type_simps contracting_def)
  1509    apply (simp add: check_type_simps contracting_def)
  1521 apply clarify
  1510    apply clarify
  1522 apply (drule_tac x=ST in spec, drule_tac x=LT in spec)
  1511    apply (drule_tac x=ST in spec, drule_tac x=LT in spec)
  1523 apply (case_tac "(sttp_of (f (ST, LT)))")
  1512    apply (case_tac "(sttp_of (f (ST, LT)))")
  1524 apply simp
  1513    apply simp
  1525 apply (erule conjE)+
  1514    apply (erule conjE)+
  1526 
  1515 
  1527 apply (drule listE_set)+
  1516    apply (drule listE_set)+
  1528 apply (rule conjI)
  1517    apply (rule conjI)
  1529 apply (rule_tac x="length a" in exI) apply simp
  1518     apply (rule_tac x="length a" in exI)
  1530 apply (rule listI) apply simp apply blast
  1519     apply simp
  1531 apply (rule listI) apply simp apply blast
  1520     apply (rule listI)
  1532 apply auto
  1521      apply simp
  1533 done
  1522     apply blast
       
  1523    apply (rule listI)
       
  1524     apply simp
       
  1525    apply blast
       
  1526   apply auto
       
  1527   done
  1534 
  1528 
  1535   (* ******************** *)
  1529   (* ******************** *)
  1536 
  1530 
  1537 
  1531 
  1538 lemma bc_mt_corresp_comb_wt_instr: "
  1532 lemma bc_mt_corresp_comb_wt_instr: "
  1554       empty_et
  1548       empty_et
  1555       (length bc1);
  1549       (length bc1);
  1556   contracting f2
  1550   contracting f2
  1557  \<rbrakk>
  1551  \<rbrakk>
  1558 \<Longrightarrow> bc_mt_corresp bc' f' sttp0 cG rT mxr (length (bc1@[inst]))"
  1552 \<Longrightarrow> bc_mt_corresp bc' f' sttp0 cG rT mxr (length (bc1@[inst]))"
  1559 apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+)
  1553   apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+)
  1560 apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+)
  1554    apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+)
  1561 apply (subgoal_tac "\<exists> mt3 sttp3. (f3 sttp2) = (mt3, sttp3)", (erule exE)+)
  1555     apply (subgoal_tac "\<exists> mt3 sttp3. (f3 sttp2) = (mt3, sttp3)", (erule exE)+)
  1562 
  1556 
  1563 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def
  1557      apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def
  1564   mt_sttp_flatten_def)
  1558                       mt_sttp_flatten_def)
  1565 
  1559 
  1566 apply (intro strip, (erule conjE)+)
  1560      apply (intro strip, (erule conjE)+)
  1567 apply (drule mp, assumption)+ apply (erule conjE)+
  1561      apply (drule mp, assumption)+
  1568 apply (drule mp, assumption)
  1562      apply (erule conjE)+
  1569 apply (rule conjI)
  1563      apply (drule mp, assumption)
  1570 
  1564      apply (rule conjI)
  1571   (* wt_instr \<dots> *)
  1565 
  1572 apply (intro strip)
  1566       (* wt_instr \<dots> *)
  1573 apply (case_tac "pc < length mt1")
  1567       apply (intro strip)
  1574 
  1568       apply (case_tac "pc < length mt1")
  1575   (* case pc < length mt1 *)
  1569 
  1576 apply (drule spec, drule mp, assumption)
  1570        (* case pc < length mt1 *)
  1577 apply assumption
  1571        apply (drule spec, drule mp, assumption)
  1578 
  1572        apply assumption
  1579   (* case pc \<ge> length mt1 *)
  1573 
  1580 apply (subgoal_tac "pc = length mt1") prefer 2 apply arith
  1574       (* case pc \<ge> length mt1 *)
  1581 apply (simp only:)
  1575       apply (subgoal_tac "pc = length mt1") prefer 2 apply arith
  1582 apply (simp add: nth_append mt_sttp_flatten_def)
  1576       apply (simp only:)
  1583 
  1577       apply (simp add: nth_append mt_sttp_flatten_def)
  1584 
  1578 
  1585   (* check_type \<dots> *)
  1579 
  1586 apply (simp add: start_sttp_resp_def)
  1580      (* check_type \<dots> *)
  1587 apply (drule_tac x="sttp0" in spec, simp, erule exE)
  1581      apply (simp add: start_sttp_resp_def)
  1588 apply (drule_tac x="sttp1" in spec, simp, erule exE)
  1582      apply (drule_tac x="sttp0" in spec, simp, erule exE)
  1589 
  1583      apply (drule_tac x="sttp1" in spec, simp, erule exE)
  1590 apply (subgoal_tac "check_type cG (max_ssize (mt1 @ mt2 @ mt3 @ [Some sttp3])) mxr 
  1584 
  1591                     (OK (Some (sttp_of (f2 sttp1))))")
  1585      apply (subgoal_tac "check_type cG (max_ssize (mt1 @ mt2 @ mt3 @ [Some sttp3])) mxr
  1592 
  1586                                        (OK (Some (sttp_of (f2 sttp1))))")
  1593 apply (simp only:)
  1587 
  1594 
  1588       apply (simp only:)
  1595 apply (erule disjE)
  1589 
  1596     (* case f3 = comb_nil *)
  1590       apply (erule disjE)
  1597 apply (subgoal_tac "((mt1 @ mt2 @ mt3 @ [Some sttp3]) ! Suc (length mt1)) = (Some (snd (f2 sttp1)))")apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3")  apply (erule conjE)+
  1591        (* case f3 = comb_nil *)
  1598 apply (simp add: nth_append)
  1592        apply (subgoal_tac "((mt1 @ mt2 @ mt3 @ [Some sttp3]) ! Suc (length mt1)) = (Some (snd (f2 sttp1)))")
  1599 apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *)
  1593         apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3")
  1600 apply (simp add: nth_append comb_nil_def) (* subgoal \<dots> ! Suc (length mt1) *)
  1594          apply (erule conjE)+
  1601 
  1595          apply (simp add: nth_append)
  1602     (* case start_sttp_resp_cons f3 *)
  1596         apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *)
  1603 apply (simp add: start_sttp_resp_cons_def)  
  1597        apply (simp add: nth_append comb_nil_def) (* subgoal \<dots> ! Suc (length mt1) *)
  1604 apply (drule_tac x="sttp2" in spec, simp, erule exE)
  1598 
  1605 apply (simp  add: nth_append)
  1599       (* case start_sttp_resp_cons f3 *)
  1606 
  1600       apply (simp add: start_sttp_resp_cons_def)
  1607   (* subgoal check_type *)
  1601       apply (drule_tac x="sttp2" in spec, simp, erule exE)
  1608 apply (rule check_type_contracting)
  1602       apply (simp  add: nth_append)
  1609 apply (subgoal_tac "((mt1 @ mt2 @ mt3 @ [Some sttp3]) ! length mt1) = (Some sttp1)")
  1603 
  1610 apply (simp add: nth_append)
  1604      (* subgoal check_type *)
  1611 apply (simp add: nth_append)
  1605      apply (rule check_type_contracting)
  1612 
  1606       apply (subgoal_tac "((mt1 @ mt2 @ mt3 @ [Some sttp3]) ! length mt1) = (Some sttp1)")
  1613 apply assumption
  1607        apply (simp add: nth_append)
  1614 
  1608       apply (simp add: nth_append)
  1615 (* subgoals *)
  1609 
  1616 apply (rule surj_pair)+
  1610      apply assumption
  1617 done
  1611 
  1618 
  1612     (* subgoals *)
  1619 
  1613     apply (rule surj_pair)+
  1620 lemma compTpExpr_LT_ST_rewr [simp]: "\<lbrakk>
  1614   done
  1621   wf_java_prog G;
  1615 
  1622   wf_java_mdecl G C ((mn, pTs), rT, (pns, lvars, blk, res));
  1616 
  1623   local_env G C (mn, pTs) pns lvars \<turnstile> ex :: T;
  1617 lemma compTpExpr_LT_ST_rewr [simp]:
  1624   is_inited_LT C pTs lvars LT\<rbrakk>
  1618   "\<lbrakk> wf_java_prog G; wf_java_mdecl G C ((mn, pTs), rT, (pns, lvars, blk, res));
  1625 \<Longrightarrow> sttp_of (compTpExpr (pns, lvars, blk, res) G ex (ST, LT)) = (T # ST, LT)"
  1619      local_env G C (mn, pTs) pns lvars \<turnstile> ex :: T;
  1626 apply (rule compTpExpr_LT_ST)
  1620      is_inited_LT C pTs lvars LT\<rbrakk>
  1627 apply auto
  1621   \<Longrightarrow> sttp_of (compTpExpr (pns, lvars, blk, res) G ex (ST, LT)) = (T # ST, LT)"
  1628 done
  1622   by (rule compTpExpr_LT_ST) auto
  1629 
       
  1630 
       
  1631 
  1623 
  1632 
  1624 
  1633 lemma wt_method_compTpExpr_Exprs_corresp: "
  1625 lemma wt_method_compTpExpr_Exprs_corresp: "
  1634   \<lbrakk> jmb = (pns,lvars,blk,res); 
  1626   \<lbrakk> jmb = (pns,lvars,blk,res); 
  1635   wf_prog wf_java_mdecl G;
  1627   wf_prog wf_java_mdecl G;
  1645  \<and>
  1637  \<and>
  1646  (\<forall> ST LT Ts.
  1638  (\<forall> ST LT Ts.
  1647   E \<turnstile> exs [::] Ts \<longrightarrow>
  1639   E \<turnstile> exs [::] Ts \<longrightarrow>
  1648   (is_inited_LT C pTs lvars LT) 
  1640   (is_inited_LT C pTs lvars LT) 
  1649   \<longrightarrow> bc_mt_corresp (compExprs jmb exs) (compTpExprs jmb G exs) (ST, LT) (comp G) rT (length LT) (length (compExprs jmb exs)))"
  1641   \<longrightarrow> bc_mt_corresp (compExprs jmb exs) (compTpExprs jmb G exs) (ST, LT) (comp G) rT (length LT) (length (compExprs jmb exs)))"
  1650 
  1642   apply (rule compat_expr_expr_list.induct)
  1651 apply (rule compat_expr_expr_list.induct)
  1643 
  1652 
  1644             (* expresssions *)
  1653 
  1645 
  1654 (* expresssions *)
  1646             (* NewC *)
  1655 
  1647             apply (intro allI impI)
  1656 (* NewC *)
  1648             apply (simp only:)
  1657 apply (intro allI impI)
  1649             apply (drule NewC_invers)
  1658 apply (simp only:)
  1650             apply (simp (no_asm_use))
  1659 apply (drule NewC_invers)
  1651             apply (rule bc_mt_corresp_New)
  1660 apply (simp (no_asm_use))
  1652             apply (simp add: comp_is_class)
  1661 apply (rule bc_mt_corresp_New)
  1653 
  1662 apply (simp add: comp_is_class)
  1654            (* Cast *)
  1663 
  1655            apply (intro allI impI)
  1664 (* Cast *)
  1656            apply (simp only:)
  1665 apply (intro allI impI)
  1657            apply (drule Cast_invers)
  1666 apply (simp only:)
  1658            apply clarify
  1667 apply (drule Cast_invers)
  1659            apply (simp (no_asm_use))
  1668 apply clarify
  1660            apply (rule bc_mt_corresp_comb)
  1669 apply (simp (no_asm_use))
  1661                apply (rule HOL.refl, simp (no_asm_simp), blast)
  1670 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast)
  1662             apply (simp (no_asm_simp), rule bc_mt_corresp_Checkcast)
  1671 apply (simp (no_asm_simp), rule bc_mt_corresp_Checkcast)
  1663               apply (simp add: comp_is_class)
  1672 apply (simp add: comp_is_class)
  1664              apply (simp only: compTpExpr_LT_ST)
  1673 apply (simp only: compTpExpr_LT_ST)
  1665             apply (drule cast_RefT)
  1674 apply (drule cast_RefT)
  1666             apply blast
  1675 apply blast
  1667            apply (simp add: start_sttp_resp_def)
  1676 apply (simp add: start_sttp_resp_def)
  1668 
  1677 
  1669           (* Lit *)
  1678 (* Lit *)
  1670           apply (intro allI impI)
  1679 apply (intro allI impI)
  1671           apply (simp only:)
  1680 apply (simp only:)
  1672           apply (drule Lit_invers)
  1681 apply (drule Lit_invers)
  1673           apply simp
  1682 (* apply (simp (no_asm_use)) *)
  1674           apply (rule bc_mt_corresp_LitPush)
  1683 apply simp
  1675           apply assumption
  1684 apply (rule bc_mt_corresp_LitPush)
  1676 
  1685    apply assumption
  1677 
  1686 
  1678          (* BinOp *)
  1687 
  1679 
  1688 (* BinOp *)
  1680          apply (intro allI impI)
  1689 
  1681          apply (simp (no_asm_simp) only:)
  1690 apply (intro allI impI)
  1682          apply (drule BinOp_invers, erule exE, (erule conjE)+)
  1691 apply (simp (no_asm_simp) only:)
  1683          apply (rename_tac binop expr1 expr2 ST LT T bc' f' Ta, case_tac binop)
  1692 apply (drule BinOp_invers, erule exE, (erule conjE)+)
  1684           apply (simp (no_asm_simp))
  1693 apply (rename_tac binop expr1 expr2 ST LT T bc' f' Ta, case_tac binop)
  1685 
  1694 apply (simp (no_asm_simp))
  1686           (* case Eq *)
  1695 
  1687           apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0")
  1696   (* case Eq *)
  1688            prefer 2
  1697 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0")
  1689            apply (rule bc_mt_corresp_zero)
  1698 prefer 2
  1690             apply (simp add: length_compTpExpr)
  1699   apply (rule bc_mt_corresp_zero) apply (simp add: length_compTpExpr) 
  1691            apply (simp (no_asm_simp))
  1700   apply (simp (no_asm_simp))
  1692 
  1701 
  1693           apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "compExpr jmb expr1"
  1702 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "compExpr jmb expr1" 
  1694                        and ?f1.0=comb_nil and ?f2.0 = "compTpExpr jmb G expr1"
  1703   and ?f1.0=comb_nil and ?f2.0 = "compTpExpr jmb G expr1" 
  1695                         in bc_mt_corresp_comb_inside)
  1704   in bc_mt_corresp_comb_inside)
  1696                   apply (simp (no_asm_simp))+
  1705   apply (simp (no_asm_simp))+
  1697               apply blast
  1706   apply blast
  1698              apply (simp (no_asm_simp) add: length_compTpExpr)+
  1707   apply (simp (no_asm_simp) add: length_compTpExpr)+
  1699 
  1708 
  1700           apply (drule_tac ?bc2.0 = "compExpr jmb expr2" and ?f2.0 = "compTpExpr jmb G expr2"
  1709 apply (drule_tac ?bc2.0 = "compExpr jmb expr2" and ?f2.0 = "compTpExpr jmb G expr2" 
  1701                         in bc_mt_corresp_comb_inside)
  1710   in bc_mt_corresp_comb_inside)
  1702                   apply (simp (no_asm_simp))+
  1711   apply (simp (no_asm_simp))+
  1703               apply (simp only: compTpExpr_LT_ST)
  1712   apply (simp only: compTpExpr_LT_ST)
  1704              apply (simp (no_asm_simp) add: length_compTpExpr)
  1713   apply (simp (no_asm_simp) add: length_compTpExpr)
  1705             apply (simp (no_asm_simp))
  1714   apply (simp (no_asm_simp))
  1706            apply (simp (no_asm_simp))
  1715   apply (simp (no_asm_simp))
  1707 
  1716 
  1708           apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2"
  1717 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2" 
  1709                         and inst = "Ifcmpeq 3" and ?bc3.0 = "[LitPush (Bool False),Goto 2, LitPush (Bool True)]"
  1718     and inst = "Ifcmpeq 3" and ?bc3.0 = "[LitPush (Bool False),Goto 2, LitPush (Bool True)]"
  1710                         and ?f1.0="compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2"
  1719   and ?f1.0="compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2"
  1711                         and ?f2.0="popST 2" and ?f3.0="pushST [PrimT Boolean] \<box> popST 1 \<box> pushST [PrimT Boolean]"
  1720   and ?f2.0="popST 2" and ?f3.0="pushST [PrimT Boolean] \<box> popST 1 \<box> pushST [PrimT Boolean]"
  1712                          in bc_mt_corresp_comb_wt_instr)
  1721   in bc_mt_corresp_comb_wt_instr)
  1713                     apply (simp (no_asm_simp) add: length_compTpExpr)+
  1722   apply (simp (no_asm_simp) add: length_compTpExpr)+
  1714 
  1723 
  1715             (* wt_instr *)
  1724     (* wt_instr *)
  1716             apply (intro strip)
  1725   apply (intro strip)
  1717             apply (simp (no_asm_simp) add: wt_instr_altern_def length_compTpExpr eff_def)
  1726   apply (simp (no_asm_simp) add: wt_instr_altern_def length_compTpExpr eff_def)
  1718             apply (simp (no_asm_simp) add: norm_eff_def)
  1727   apply (simp (no_asm_simp) add: norm_eff_def)
  1719             apply (simp (no_asm_simp) only: int_outside_left nat_int)
  1728   apply (simp (no_asm_simp) only: int_outside_left nat_int)
  1720             apply (simp (no_asm_simp) add: length_compTpExpr)
  1729   apply (simp (no_asm_simp) add: length_compTpExpr)
  1721             apply (simp only: compTpExpr_LT_ST)+
  1730   apply (simp only: compTpExpr_LT_ST)+
  1722             apply (simp add: eff_def norm_eff_def popST_def pushST_def mt_sttp_flatten_def)
  1731   apply (simp add: eff_def norm_eff_def popST_def pushST_def mt_sttp_flatten_def)
  1723             apply (case_tac Ta)
  1732   apply (case_tac Ta) apply (simp (no_asm_simp)) apply (simp (no_asm_simp))
  1724              apply (simp (no_asm_simp))
  1733   apply (rule contracting_popST)                (* contracting (popST 2)  *)
  1725             apply (simp (no_asm_simp))
  1734 
  1726            apply (rule contracting_popST)                (* contracting (popST 2)  *)
  1735 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3]"
  1727 
  1736   and ?bc2.0 = "[LitPush (Bool False)]" 
  1728           apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3]"
  1737   and ?bc3.0 = "[Goto 2, LitPush (Bool True)]" 
  1729                        and ?bc2.0 = "[LitPush (Bool False)]"
  1738   and ?f1.0 = "compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2"
  1730                        and ?bc3.0 = "[Goto 2, LitPush (Bool True)]"
  1739   and ?f2.0 = "pushST [PrimT Boolean]" 
  1731                        and ?f1.0 = "compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2"
  1740   and ?f3.0 = "popST (Suc 0) \<box> pushST [PrimT Boolean]"
  1732                        and ?f2.0 = "pushST [PrimT Boolean]"
  1741   in bc_mt_corresp_comb_inside)
  1733                        and ?f3.0 = "popST (Suc 0) \<box> pushST [PrimT Boolean]"
  1742   apply (simp (no_asm_simp))+
  1734                         in bc_mt_corresp_comb_inside)
       
  1735                   apply (simp (no_asm_simp))+
       
  1736               apply simp
       
  1737               apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) apply (simp (no_asm_simp))
       
  1738              apply (simp (no_asm_simp) add: length_compTpExpr)
       
  1739             apply (simp (no_asm_simp))
       
  1740            apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1741 
       
  1742 
       
  1743           apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3, LitPush (Bool False)]"
       
  1744                        and inst = "Goto 2" and ?bc3.0 = "[LitPush (Bool True)]"
       
  1745                        and ?f1.0="compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2 \<box> pushST [PrimT Boolean]"
       
  1746                        and ?f2.0="popST 1" and ?f3.0="pushST [PrimT Boolean]"
       
  1747                         in bc_mt_corresp_comb_wt_instr)
       
  1748                     apply (simp (no_asm_simp) add: length_compTpExpr)+
       
  1749 
       
  1750             (* wt_instr *)
       
  1751             apply (simp (no_asm_simp) add: wt_instr_altern_def length_compTpExpr)
       
  1752             apply (simp (no_asm_simp) add: eff_def norm_eff_def)
       
  1753             apply (simp (no_asm_simp) only: int_outside_right nat_int)
       
  1754             apply (simp (no_asm_simp) add: length_compTpExpr)
       
  1755             apply (simp only: compTpExpr_LT_ST)+
       
  1756             apply (simp add: eff_def norm_eff_def popST_def pushST_def)
       
  1757            apply (rule contracting_popST)                (* contracting (popST 1) *)
       
  1758 
       
  1759           apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3, LitPush (Bool False), Goto 2]"
       
  1760                        and ?bc2.0 = "[LitPush (Bool True)]"
       
  1761                        and ?bc3.0 = "[]"
       
  1762                        and ?f1.0 = "compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2 \<box>
       
  1763                                     pushST [PrimT Boolean] \<box> popST (Suc 0)"
       
  1764                        and ?f2.0 = "pushST [PrimT Boolean]"
       
  1765                        and ?f3.0 = "comb_nil"
       
  1766                         in bc_mt_corresp_comb_inside)
       
  1767                   apply (simp (no_asm_simp))+
       
  1768               apply simp
       
  1769               apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush)
       
  1770               apply (simp (no_asm_simp))
       
  1771              apply (simp (no_asm_simp) add: length_compTpExpr)
       
  1772             apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1773            apply (simp (no_asm_simp))
       
  1774 
       
  1775           apply simp
       
  1776 
       
  1777          (* case Add *)
       
  1778          apply simp
       
  1779          apply (rule bc_mt_corresp_comb)
       
  1780              apply (rule HOL.refl)
       
  1781             apply simp
       
  1782            apply blast
       
  1783           apply (rule bc_mt_corresp_comb, rule HOL.refl)
       
  1784              apply (simp only: compTpExpr_LT_ST)
       
  1785             apply (simp only: compTpExpr_LT_ST)
       
  1786             apply blast
       
  1787 
       
  1788            apply (simp only: compTpExpr_LT_ST)
       
  1789            apply simp
       
  1790            apply (rule bc_mt_corresp_IAdd)
       
  1791           apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1792          apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1793 
       
  1794 
       
  1795         (* LAcc *)
       
  1796         apply (intro allI impI)
       
  1797         apply (simp only:)
       
  1798         apply (drule LAcc_invers)
       
  1799         apply (frule wf_java_mdecl_length_pTs_pns)
       
  1800         apply clarify
       
  1801         apply (simp add: is_inited_LT_def)
       
  1802         apply (rule bc_mt_corresp_Load)
       
  1803           apply (rule index_in_bounds)
       
  1804            apply simp
       
  1805           apply assumption
       
  1806          apply (rule inited_LT_at_index_no_err)
       
  1807          apply (rule index_in_bounds)
       
  1808           apply simp
       
  1809          apply assumption
       
  1810         apply (rule HOL.refl)
       
  1811 
       
  1812 
       
  1813        (* LAss *)
       
  1814        apply (intro allI impI)
       
  1815        apply (simp only:)
       
  1816        apply (drule LAss_invers, erule exE, (erule conjE)+)
       
  1817        apply (drule LAcc_invers)
       
  1818        apply (frule wf_java_mdecl_disjoint_varnames, simp add: disjoint_varnames_def)
       
  1819        apply (frule wf_java_mdecl_length_pTs_pns)
       
  1820        apply clarify
       
  1821        apply (simp (no_asm_use))
       
  1822        apply (rule bc_mt_corresp_comb)
       
  1823            apply (rule HOL.refl, simp (no_asm_simp), blast)
       
  1824         apply (rename_tac vname x2 ST LT T Ta)
       
  1825         apply (rule_tac ?bc1.0="[Dup]" and ?bc2.0="[Store (index (pns, lvars, blk, res) vname)]"
       
  1826                     and ?f1.0="dupST" and ?f2.0="popST (Suc 0)"
       
  1827                      in bc_mt_corresp_comb)
       
  1828             apply (simp (no_asm_simp))+
       
  1829           apply (rule bc_mt_corresp_Dup)
       
  1830          apply (simp only: compTpExpr_LT_ST)
       
  1831          apply (simp add: dupST_def is_inited_LT_def)
       
  1832          apply (rule bc_mt_corresp_Store)
       
  1833           apply (rule index_in_bounds)
       
  1834            apply simp
       
  1835           apply assumption
       
  1836          apply (rule sup_loc_update_index, assumption+)
       
  1837             apply simp
       
  1838            apply assumption+
       
  1839         apply (simp add: start_sttp_resp_def)
       
  1840        apply (simp add: start_sttp_resp_def)
       
  1841 
       
  1842       (* FAcc *)
       
  1843       apply (intro allI impI)
       
  1844       apply (simp only:)
       
  1845       apply (drule FAcc_invers)
       
  1846       apply clarify
       
  1847       apply (simp (no_asm_use))
       
  1848       apply (rule bc_mt_corresp_comb)
       
  1849           apply (rule HOL.refl, simp (no_asm_simp), blast)
       
  1850        apply (simp (no_asm_simp))
       
  1851        apply (rule bc_mt_corresp_Getfield)
       
  1852          apply assumption+
       
  1853        apply (fast intro: wt_class_expr_is_class)
       
  1854       apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1855 
       
  1856 
       
  1857      (* FAss *)
       
  1858      apply (intro allI impI)
       
  1859      apply (simp only:)
       
  1860      apply (drule FAss_invers, erule exE, (erule conjE)+)
       
  1861      apply (drule FAcc_invers)
       
  1862      apply clarify
       
  1863      apply (simp (no_asm_use))
       
  1864      apply (rule bc_mt_corresp_comb)
       
  1865          apply (rule HOL.refl)
       
  1866         apply simp
       
  1867        apply blast
       
  1868       apply (simp only: compTpExpr_LT_ST)
       
  1869       apply (rule bc_mt_corresp_comb, (rule HOL.refl)+)
       
  1870         apply blast
       
  1871        apply (simp only: compTpExpr_LT_ST)
       
  1872        apply (rename_tac cname x2 vname x4 ST LT T Ta Ca)
       
  1873        apply (rule_tac ?bc1.0="[Dup_x1]" and ?bc2.0="[Putfield vname cname]" in bc_mt_corresp_comb)
       
  1874            apply (simp (no_asm_simp))+
       
  1875          apply (rule bc_mt_corresp_Dup_x1)
       
  1876         apply (simp (no_asm_simp) add: dup_x1ST_def)
       
  1877         apply (rule bc_mt_corresp_Putfield, assumption+)
       
  1878         apply (fast intro: wt_class_expr_is_class)
       
  1879        apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1880       apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1881      apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1882 
       
  1883     (* Call *)
       
  1884     apply (intro allI impI)
       
  1885     apply (simp only:)
       
  1886     apply (drule Call_invers)
       
  1887     apply clarify
       
  1888     apply (simp (no_asm_use))
       
  1889     apply (rule bc_mt_corresp_comb)
       
  1890         apply (rule HOL.refl)
       
  1891        apply simp
       
  1892       apply blast
       
  1893      apply (simp only: compTpExpr_LT_ST)
       
  1894      apply (rule bc_mt_corresp_comb, (rule HOL.refl)+)
       
  1895        apply blast
       
  1896       apply (simp only: compTpExprs_LT_ST)
       
  1897       apply (simp (no_asm_simp))
       
  1898       apply (rule bc_mt_corresp_Invoke)
       
  1899         apply assumption+
       
  1900       apply (fast intro: wt_class_expr_is_class)
       
  1901      apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1902     apply (rule start_sttp_resp_comb)
       
  1903      apply (simp (no_asm_simp))
       
  1904     apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1905 
       
  1906 
       
  1907    (* expression lists *)
       
  1908    (* nil *)
       
  1909 
       
  1910    apply (intro allI impI)
       
  1911    apply (drule Nil_invers)
       
  1912    apply simp
       
  1913 
       
  1914   (* cons *)
       
  1915 
       
  1916   apply (intro allI impI)
       
  1917   apply (drule Cons_invers, (erule exE)+, (erule conjE)+)
       
  1918   apply clarify
       
  1919   apply (simp (no_asm_use))
       
  1920   apply (rule bc_mt_corresp_comb)
       
  1921       apply (rule HOL.refl)
       
  1922      apply simp
       
  1923     apply blast
       
  1924    apply (simp only: compTpExpr_LT_ST)
       
  1925    apply blast
  1743   apply simp
  1926   apply simp
  1744   apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) apply (simp (no_asm_simp))
       
  1745   apply (simp (no_asm_simp) add: length_compTpExpr)
       
  1746   apply (simp (no_asm_simp))
       
  1747   apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1748 
       
  1749 
       
  1750 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3, LitPush (Bool False)]" 
       
  1751     and inst = "Goto 2" and ?bc3.0 = "[LitPush (Bool True)]"
       
  1752   and ?f1.0="compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2 \<box> pushST [PrimT Boolean]"
       
  1753   and ?f2.0="popST 1" and ?f3.0="pushST [PrimT Boolean]"
       
  1754   in bc_mt_corresp_comb_wt_instr)
       
  1755   apply (simp (no_asm_simp) add: length_compTpExpr)+
       
  1756 
       
  1757     (* wt_instr *)
       
  1758   apply (simp (no_asm_simp) add: wt_instr_altern_def length_compTpExpr)
       
  1759   apply (simp (no_asm_simp) add: eff_def norm_eff_def)
       
  1760   apply (simp (no_asm_simp) only: int_outside_right nat_int)
       
  1761   apply (simp (no_asm_simp) add: length_compTpExpr)
       
  1762   apply (simp only: compTpExpr_LT_ST)+
       
  1763   apply (simp add: eff_def norm_eff_def popST_def pushST_def)
       
  1764   apply (rule contracting_popST)                (* contracting (popST 1) *)
       
  1765 
       
  1766 apply (drule_tac 
       
  1767   ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3, LitPush (Bool False), Goto 2]" 
       
  1768   and ?bc2.0 = "[LitPush (Bool True)]"
       
  1769   and ?bc3.0 = "[]"
       
  1770   and ?f1.0 = "compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2 \<box> 
       
  1771                 pushST [PrimT Boolean] \<box> popST (Suc 0)"
       
  1772   and ?f2.0 = "pushST [PrimT Boolean]"
       
  1773   and ?f3.0 = "comb_nil" 
       
  1774   in bc_mt_corresp_comb_inside)
       
  1775   apply (simp (no_asm_simp))+
       
  1776   apply simp
       
  1777   apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) apply (simp (no_asm_simp))
       
  1778   apply (simp (no_asm_simp) add: length_compTpExpr)
       
  1779   apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1780   apply (simp (no_asm_simp))
       
  1781 
       
  1782 apply simp
       
  1783 
       
  1784   (* case Add *)
       
  1785 apply simp
       
  1786 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) apply simp apply blast
       
  1787 apply (rule bc_mt_corresp_comb, rule HOL.refl) 
       
  1788    apply (simp only: compTpExpr_LT_ST) 
       
  1789 apply (simp only: compTpExpr_LT_ST) apply blast
       
  1790 
       
  1791 apply (simp only: compTpExpr_LT_ST)
       
  1792 apply simp
       
  1793 apply (rule bc_mt_corresp_IAdd)
       
  1794 apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1795 apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1796 
       
  1797 
       
  1798   (* LAcc *)
       
  1799 apply (intro allI impI)
       
  1800 apply (simp only:)
       
  1801 apply (drule LAcc_invers)
       
  1802 apply (frule wf_java_mdecl_length_pTs_pns)
       
  1803 apply clarify
       
  1804 apply (simp add: is_inited_LT_def)
       
  1805 apply (rule bc_mt_corresp_Load)
       
  1806   apply (rule index_in_bounds) apply simp apply assumption
       
  1807   apply (rule inited_LT_at_index_no_err)
       
  1808   apply (rule index_in_bounds) apply simp apply assumption
       
  1809 apply (rule HOL.refl)
       
  1810 
       
  1811 
       
  1812   (* LAss *)
       
  1813 apply (intro allI impI)
       
  1814 apply (simp only:)
       
  1815 apply (drule LAss_invers, erule exE, (erule conjE)+)
       
  1816 apply (drule LAcc_invers)
       
  1817 apply (frule wf_java_mdecl_disjoint_varnames, simp add: disjoint_varnames_def)
       
  1818 apply (frule wf_java_mdecl_length_pTs_pns)
       
  1819 apply clarify
       
  1820 apply (simp (no_asm_use))
       
  1821 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast)
       
  1822 apply (rename_tac vname x2 ST LT T Ta)
       
  1823 apply (rule_tac ?bc1.0="[Dup]" and ?bc2.0="[Store (index (pns, lvars, blk, res) vname)]" 
       
  1824        and ?f1.0="dupST" and ?f2.0="popST (Suc 0)"
       
  1825        in bc_mt_corresp_comb)
       
  1826   apply (simp (no_asm_simp))+
       
  1827   apply (rule bc_mt_corresp_Dup)
       
  1828   apply (simp only: compTpExpr_LT_ST)
       
  1829   apply (simp add: dupST_def is_inited_LT_def)
       
  1830   apply (rule bc_mt_corresp_Store)
       
  1831   apply (rule index_in_bounds)
       
  1832     apply simp apply assumption
       
  1833   apply (rule sup_loc_update_index, assumption+) 
       
  1834     apply simp apply assumption+
       
  1835 apply (simp add: start_sttp_resp_def)
       
  1836 apply (simp add: start_sttp_resp_def)
       
  1837 
       
  1838   (* FAcc *)
       
  1839 apply (intro allI impI)
       
  1840 apply (simp only:)
       
  1841 apply (drule FAcc_invers)
       
  1842 apply clarify
       
  1843 apply (simp (no_asm_use))
       
  1844 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast) 
       
  1845   apply (simp (no_asm_simp))
       
  1846   apply (rule bc_mt_corresp_Getfield) apply assumption+
       
  1847      apply (fast intro: wt_class_expr_is_class)
       
  1848 apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1849 
       
  1850 
       
  1851   (* FAss *)
       
  1852 apply (intro allI impI)
       
  1853 apply (simp only:)
       
  1854 apply (drule FAss_invers, erule exE, (erule conjE)+)
       
  1855 apply (drule FAcc_invers)
       
  1856 apply clarify
       
  1857 apply (simp (no_asm_use))
       
  1858 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) apply simp apply blast
       
  1859   apply (simp only: compTpExpr_LT_ST)
       
  1860 apply (rule bc_mt_corresp_comb, (rule HOL.refl)+) apply blast
       
  1861   apply (simp only: compTpExpr_LT_ST)
       
  1862 apply (rename_tac cname x2 vname x4 ST LT T Ta Ca)
       
  1863 apply (rule_tac ?bc1.0="[Dup_x1]" and ?bc2.0="[Putfield vname cname]" in bc_mt_corresp_comb) 
       
  1864   apply (simp (no_asm_simp))+
       
  1865 apply (rule bc_mt_corresp_Dup_x1)
       
  1866   apply (simp (no_asm_simp) add: dup_x1ST_def)
       
  1867 apply (rule bc_mt_corresp_Putfield) apply assumption+
       
  1868      apply (fast intro: wt_class_expr_is_class)
       
  1869 apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1870 apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1871 apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1872 
       
  1873 (* Call *)
       
  1874 apply (intro allI impI)
       
  1875 apply (simp only:)
       
  1876 apply (drule Call_invers)
       
  1877 apply clarify
       
  1878 apply (simp (no_asm_use))
       
  1879 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) apply simp apply blast
       
  1880   apply (simp only: compTpExpr_LT_ST)
       
  1881 apply (rule bc_mt_corresp_comb, (rule HOL.refl)+) apply blast
       
  1882   apply (simp only: compTpExprs_LT_ST)
       
  1883   apply (simp (no_asm_simp))
       
  1884 apply (rule bc_mt_corresp_Invoke) apply assumption+
       
  1885      apply (fast intro: wt_class_expr_is_class)
       
  1886 apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1887 apply (rule start_sttp_resp_comb) 
       
  1888   apply (simp (no_asm_simp))
       
  1889   apply (simp (no_asm_simp) add: start_sttp_resp_def)
       
  1890 
       
  1891 
       
  1892 (* expression lists *)
       
  1893 (* nil *) 
       
  1894 
       
  1895 apply (intro allI impI)
       
  1896 apply (drule Nil_invers)
       
  1897 apply simp
       
  1898 
       
  1899 (* cons *)
       
  1900 
       
  1901 apply (intro allI impI)
       
  1902 apply (drule Cons_invers, (erule exE)+, (erule conjE)+)
       
  1903 apply clarify
       
  1904 apply (simp (no_asm_use))
       
  1905 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) apply simp apply blast
       
  1906   apply (simp only: compTpExpr_LT_ST)
       
  1907 apply blast
       
  1908 apply simp
       
  1909 
  1927 
  1910 done
  1928 done
  1911 
  1929 
  1912 
  1930 
  1913 lemmas wt_method_compTpExpr_corresp [rule_format (no_asm)] = 
  1931 lemmas wt_method_compTpExpr_corresp [rule_format (no_asm)] = 
  1930   (is_inited_LT C pTs lvars LT) \<longrightarrow>
  1948   (is_inited_LT C pTs lvars LT) \<longrightarrow>
  1931   bc' = (compStmt jmb s) \<longrightarrow>
  1949   bc' = (compStmt jmb s) \<longrightarrow>
  1932   f' = (compTpStmt jmb G s)
  1950   f' = (compTpStmt jmb G s)
  1933   \<longrightarrow> bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) (length bc'))"
  1951   \<longrightarrow> bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) (length bc'))"
  1934 
  1952 
  1935 apply (rule stmt.induct)
  1953   apply (rule stmt.induct)
  1936 
  1954 
  1937 (* Skip *) 
  1955       (* Skip *)
  1938 apply (intro allI impI)
  1956       apply (intro allI impI)
  1939 apply simp
  1957       apply simp
  1940 
  1958 
  1941 
  1959 
  1942 (* Expr *)
  1960      (* Expr *)
  1943 apply (intro allI impI)
  1961      apply (intro allI impI)
  1944 apply (drule Expr_invers, erule exE)
  1962      apply (drule Expr_invers, erule exE)
  1945 apply (simp (no_asm_simp))
  1963      apply (simp (no_asm_simp))
  1946 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp))
  1964      apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp))
  1947 apply (rule wt_method_compTpExpr_corresp) apply assumption+
  1965        apply (rule wt_method_compTpExpr_corresp) apply assumption+
  1948 apply (simp add: compTpExpr_LT_ST [of _ pns lvars blk res])+
  1966         apply (simp add: compTpExpr_LT_ST [of _ pns lvars blk res])+
  1949 apply (rule bc_mt_corresp_Pop)
  1967       apply (rule bc_mt_corresp_Pop)
  1950 apply (simp add: start_sttp_resp_def)
  1968      apply (simp add: start_sttp_resp_def)
  1951 
  1969 
  1952 
  1970 
  1953 (* Comp *)
  1971     (* Comp *)
  1954 apply (intro allI impI)
  1972     apply (intro allI impI)
  1955 apply (drule Comp_invers)
  1973     apply (drule Comp_invers)
  1956 apply clarify
  1974     apply clarify
  1957 apply (simp (no_asm_use))
  1975     apply (simp (no_asm_use))
  1958 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) 
  1976     apply (rule bc_mt_corresp_comb) apply (rule HOL.refl)
  1959    apply (simp (no_asm_simp)) apply blast
  1977        apply (simp (no_asm_simp)) apply blast
  1960 apply (simp only: compTpStmt_LT_ST) 
  1978      apply (simp only: compTpStmt_LT_ST)
  1961 apply (simp (no_asm_simp))
  1979     apply (simp (no_asm_simp))
  1962 
  1980 
  1963 (* Cond *)
  1981    (* Cond *)
  1964 apply (intro allI impI)
  1982    apply (intro allI impI)
  1965 apply (simp (no_asm_simp) only:)
  1983    apply (simp (no_asm_simp) only:)
  1966 apply (drule Cond_invers, (erule conjE)+)
  1984    apply (drule Cond_invers, (erule conjE)+)
  1967 apply (simp (no_asm_simp))
  1985    apply (simp (no_asm_simp))
  1968 
  1986 
  1969 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0")
  1987    apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0")
  1970 prefer 2 
  1988     prefer 2
  1971 apply (rule bc_mt_corresp_zero) 
  1989     apply (rule bc_mt_corresp_zero)
  1972   apply (simp (no_asm_simp) add: length_compTpStmt length_compTpExpr)
  1990      apply (simp (no_asm_simp) add: length_compTpStmt length_compTpExpr)
       
  1991     apply (simp (no_asm_simp))
       
  1992 
       
  1993    apply (rename_tac expr stmt1 stmt2 ST LT bc' f')
       
  1994    apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "[LitPush (Bool False)]"
       
  1995                 and ?bc3.0="compExpr jmb expr @ Ifcmpeq (2 + int (length (compStmt jmb stmt1))) #
       
  1996                             compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) #
       
  1997                             compStmt jmb stmt2"
       
  1998                 and ?f1.0=comb_nil and ?f2.0 = "pushST [PrimT Boolean]"
       
  1999                 and ?f3.0="compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt1 \<box>
       
  2000                            nochangeST \<box> compTpStmt jmb G stmt2"
       
  2001                  in bc_mt_corresp_comb_inside)
       
  2002            apply (simp (no_asm_simp))+
       
  2003        apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush)
       
  2004        apply (simp (no_asm_simp) add: start_sttp_resp_def)+
       
  2005 
       
  2006    apply (drule_tac ?bc1.0="[LitPush (Bool False)]" and ?bc2.0 = "compExpr jmb expr"
       
  2007                 and ?bc3.0="Ifcmpeq (2 + int (length (compStmt jmb stmt1))) #
       
  2008                             compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) #
       
  2009                             compStmt jmb stmt2"
       
  2010                 and ?f1.0="pushST [PrimT Boolean]" and ?f2.0 = "compTpExpr jmb G expr"
       
  2011                 and ?f3.0="popST 2 \<box> compTpStmt jmb G stmt1 \<box> nochangeST \<box> compTpStmt jmb G stmt2"
       
  2012                  in bc_mt_corresp_comb_inside)
       
  2013            apply (simp (no_asm_simp))+
       
  2014        apply (simp (no_asm_simp)  add: pushST_def)
       
  2015        apply (rule  wt_method_compTpExpr_corresp, assumption+)
       
  2016         apply (simp (no_asm_simp))+
       
  2017 
       
  2018 
       
  2019    apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr"
       
  2020                 and inst = "Ifcmpeq (2 + int (length (compStmt jmb stmt1)))"
       
  2021                 and ?bc3.0 = "compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) #
       
  2022                               compStmt jmb stmt2"
       
  2023                 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr" and ?f2.0 = "popST 2"
       
  2024                 and ?f3.0="compTpStmt jmb G stmt1 \<box> nochangeST \<box> compTpStmt jmb G stmt2"
       
  2025                  in bc_mt_corresp_comb_wt_instr)
       
  2026              apply (simp (no_asm_simp) add: length_compTpExpr)+
       
  2027       apply (simp (no_asm_simp) add: start_sttp_resp_comb)
       
  2028 
       
  2029      (* wt_instr *)
       
  2030      apply (intro strip)
       
  2031      apply (rule_tac ts="PrimT Boolean" and ts'="PrimT Boolean" and ST=ST and LT=LT
       
  2032                   in wt_instr_Ifcmpeq)
       
  2033            apply (simp (no_asm_simp))
       
  2034           apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
       
  2035         apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
       
  2036         (* current pc *)
       
  2037         apply (simp add: length_compTpExpr pushST_def)
       
  2038        apply (simp only: compTpExpr_LT_ST)
       
  2039        (* Suc pc *)
       
  2040        apply (simp add: length_compTpExpr pushST_def)
       
  2041        apply (simp add: popST_def start_sttp_resp_comb)
       
  2042       (* jump goal *)
       
  2043       apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
       
  2044       apply (simp add: length_compTpExpr pushST_def)
       
  2045       apply (simp add: popST_def start_sttp_resp_comb length_compTpStmt)
       
  2046       apply (simp only: compTpStmt_LT_ST)
       
  2047       apply (simp add: nochangeST_def)
       
  2048      (* check_type *)
       
  2049      apply (subgoal_tac "
       
  2050       (mt_sttp_flatten (f' (ST, LT)) ! length ([LitPush (Bool False)] @ compExpr jmb expr)) =
       
  2051       (Some (PrimT Boolean # PrimT Boolean # ST, LT))")
       
  2052       apply (simp only:)
       
  2053      apply (simp (no_asm_simp)) apply (rule trans, rule mt_sttp_flatten_comb_length)
       
  2054        apply (rule HOL.refl) apply (simp (no_asm_simp) add: length_compTpExpr)
       
  2055      apply (simp (no_asm_simp) add: length_compTpExpr pushST_def)
       
  2056      apply (simp only: compTpExpr_LT_ST_rewr)
       
  2057     (* contracting\<dots> *)
       
  2058     apply (rule contracting_popST)
       
  2059 
       
  2060    apply (drule_tac ?bc1.0="[LitPush (Bool False)] @ compExpr jmb expr @
       
  2061                             [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] "
       
  2062                 and ?bc2.0 = "compStmt jmb stmt1"
       
  2063                 and ?bc3.0="Goto (1 + int (length (compStmt jmb stmt2))) # compStmt jmb stmt2"
       
  2064                 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2"
       
  2065                 and ?f2.0 = "compTpStmt jmb G stmt1"
       
  2066                 and ?f3.0="nochangeST \<box> compTpStmt jmb G stmt2"
       
  2067                  in bc_mt_corresp_comb_inside)
       
  2068            apply (simp (no_asm_simp))+
       
  2069        apply (simp (no_asm_simp) add: pushST_def popST_def compTpExpr_LT_ST)
       
  2070        apply (simp only: compTpExpr_LT_ST)
       
  2071        apply (simp (no_asm_simp))
       
  2072       apply (simp (no_asm_simp) add: length_compTpExpr)+
       
  2073 
       
  2074 
       
  2075    apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr @ [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] @ compStmt jmb stmt1"
       
  2076                 and inst = "Goto (1 + int (length (compStmt jmb stmt2)))"
       
  2077                 and ?bc3.0 = "compStmt jmb stmt2"
       
  2078                 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt1"
       
  2079                 and ?f2.0 = "nochangeST"
       
  2080                 and ?f3.0="compTpStmt jmb G stmt2"
       
  2081                  in bc_mt_corresp_comb_wt_instr)
       
  2082              apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+
       
  2083      apply (intro strip)
       
  2084      apply (rule wt_instr_Goto)
       
  2085         apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
       
  2086       apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
       
  2087       (* \<dots> ! nat (int pc + i) = \<dots> ! pc *)
       
  2088       apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
       
  2089       apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
       
  2090       apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
       
  2091       apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
       
  2092       apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
       
  2093      apply (simp only:)
       
  2094      apply (simp add: length_compTpExpr length_compTpStmt)
       
  2095     apply (rule contracting_nochangeST)
       
  2096 
       
  2097 
       
  2098    apply (drule_tac
       
  2099            ?bc1.0= "[LitPush (Bool False)] @ compExpr jmb expr @
       
  2100                     [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] @
       
  2101                     compStmt jmb stmt1 @ [Goto (1 + int (length (compStmt jmb stmt2)))]"
       
  2102            and ?bc2.0 = "compStmt jmb stmt2"
       
  2103            and ?bc3.0="[]"
       
  2104            and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt1 \<box> nochangeST"
       
  2105            and ?f2.0 = "compTpStmt jmb G stmt2"
       
  2106            and ?f3.0="comb_nil"
       
  2107            in bc_mt_corresp_comb_inside)
       
  2108            apply (simp (no_asm_simp))+
       
  2109        apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def compTpExpr_LT_ST)
       
  2110        apply (simp only: compTpExpr_LT_ST)
       
  2111        apply (simp (no_asm_simp))
       
  2112        apply (simp only: compTpStmt_LT_ST)
       
  2113       apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+
       
  2114 
       
  2115    apply simp
       
  2116 
       
  2117 
       
  2118   (* Loop *)
       
  2119   apply (intro allI impI)
       
  2120   apply (simp (no_asm_simp) only:)
       
  2121   apply (drule Loop_invers, (erule conjE)+)
  1973   apply (simp (no_asm_simp))
  2122   apply (simp (no_asm_simp))
  1974 
  2123 
  1975 apply (rename_tac expr stmt1 stmt2 ST LT bc' f')
  2124   apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0")
  1976 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "[LitPush (Bool False)]" 
  2125    prefer 2
  1977   and ?bc3.0="compExpr jmb expr @ Ifcmpeq (2 + int (length (compStmt jmb stmt1))) #
  2126    apply (rule bc_mt_corresp_zero)
  1978             compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) #
  2127     apply (simp (no_asm_simp) add: length_compTpStmt length_compTpExpr)
  1979             compStmt jmb stmt2" 
  2128    apply (simp (no_asm_simp))
  1980   and ?f1.0=comb_nil and ?f2.0 = "pushST [PrimT Boolean]" 
  2129 
  1981   and ?f3.0="compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt1 \<box>
  2130   apply (rename_tac expr stmt ST LT bc' f')
  1982             nochangeST \<box> compTpStmt jmb G stmt2"
  2131   apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "[LitPush (Bool False)]"
  1983   in bc_mt_corresp_comb_inside)
  2132                and ?bc3.0="compExpr jmb expr @ Ifcmpeq (2 + int (length (compStmt jmb stmt))) #
  1984   apply (simp (no_asm_simp))+
  2133                            compStmt jmb stmt @
  1985   apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush)
  2134                            [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]"
  1986   apply (simp (no_asm_simp) add: start_sttp_resp_def)+
  2135                and ?f1.0=comb_nil and ?f2.0 = "pushST [PrimT Boolean]"
  1987 
  2136                and ?f3.0="compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt \<box> nochangeST"
  1988 apply (drule_tac ?bc1.0="[LitPush (Bool False)]" and ?bc2.0 = "compExpr jmb expr"
  2137                 in bc_mt_corresp_comb_inside)
  1989   and ?bc3.0="Ifcmpeq (2 + int (length (compStmt jmb stmt1))) #
  2138           apply (simp (no_asm_simp))+
  1990             compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) #
  2139       apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush)
  1991             compStmt jmb stmt2" 
  2140       apply (simp (no_asm_simp) add: start_sttp_resp_def)+
  1992   and ?f1.0="pushST [PrimT Boolean]" and ?f2.0 = "compTpExpr jmb G expr"
  2141 
  1993   and ?f3.0="popST 2 \<box> compTpStmt jmb G stmt1 \<box>
  2142   apply (drule_tac ?bc1.0="[LitPush (Bool False)]" and ?bc2.0 = "compExpr jmb expr"
  1994             nochangeST \<box> compTpStmt jmb G stmt2"
  2143                and ?bc3.0="Ifcmpeq (2 + int (length (compStmt jmb stmt))) #
  1995   in bc_mt_corresp_comb_inside)
  2144                            compStmt jmb stmt @
  1996   apply (simp (no_asm_simp))+
  2145                            [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]"
  1997   apply (simp (no_asm_simp)  add: pushST_def)
  2146                and ?f1.0="pushST [PrimT Boolean]" and ?f2.0 = "compTpExpr jmb G expr"
  1998   apply (rule  wt_method_compTpExpr_corresp) apply assumption+ 
  2147                and ?f3.0="popST 2 \<box> compTpStmt jmb G stmt \<box> nochangeST"
  1999       apply (simp (no_asm_simp))+
  2148                 in bc_mt_corresp_comb_inside)
  2000 
  2149           apply (simp (no_asm_simp))+
  2001 
  2150       apply (simp (no_asm_simp)  add: pushST_def)
  2002 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr" 
  2151       apply (rule  wt_method_compTpExpr_corresp, assumption+)
  2003     and inst = "Ifcmpeq (2 + int (length (compStmt jmb stmt1)))" 
  2152        apply (simp (no_asm_simp))+
  2004   and ?bc3.0 = "compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) #
  2153 
  2005             compStmt jmb stmt2"
  2154 
  2006   and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr" and ?f2.0 = "popST 2"
  2155   apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr"
  2007   and ?f3.0="compTpStmt jmb G stmt1 \<box> nochangeST \<box> compTpStmt jmb G stmt2"
  2156                and inst = "Ifcmpeq (2 + int (length (compStmt jmb stmt)))"
  2008   in bc_mt_corresp_comb_wt_instr)
  2157                and ?bc3.0 = "compStmt jmb stmt @
  2009   apply (simp (no_asm_simp) add: length_compTpExpr)+
  2158                              [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]"
  2010   apply (simp (no_asm_simp) add: start_sttp_resp_comb)
  2159                and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr" and ?f2.0 = "popST 2"
       
  2160                and ?f3.0="compTpStmt jmb G stmt \<box> nochangeST"
       
  2161                 in bc_mt_corresp_comb_wt_instr)
       
  2162             apply (simp (no_asm_simp) add: length_compTpExpr)+
       
  2163      apply (simp (no_asm_simp) add: start_sttp_resp_comb)
  2011 
  2164 
  2012     (* wt_instr *)
  2165     (* wt_instr *)
  2013   apply (intro strip)
  2166     apply (intro strip)
  2014   apply (rule_tac ts="PrimT Boolean" and ts'="PrimT Boolean" 
  2167     apply (rule_tac ts="PrimT Boolean" and ts'="PrimT Boolean"
  2015     and ST=ST and LT=LT 
  2168           and ST=ST and LT=LT
  2016     in wt_instr_Ifcmpeq)
  2169           in wt_instr_Ifcmpeq)
  2017   apply (simp (no_asm_simp))
  2170           apply (simp (no_asm_simp))
  2018   apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
  2171          apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
  2019   apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
  2172        apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
  2020     (* current pc *)
  2173        (* current pc *)
  2021   apply (simp add: length_compTpExpr pushST_def)
  2174        apply (simp add: length_compTpExpr pushST_def)
  2022   apply (simp only: compTpExpr_LT_ST) 
  2175       apply (simp only: compTpExpr_LT_ST)
  2023     (* Suc pc *)
  2176       (* Suc pc *)
  2024   apply (simp add: length_compTpExpr pushST_def)
  2177       apply (simp add: length_compTpExpr pushST_def)
  2025   apply (simp add: popST_def start_sttp_resp_comb)
  2178       apply (simp add: popST_def start_sttp_resp_comb)
  2026     (* jump goal *)
  2179      (* jump goal *)
  2027   apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
  2180      apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
  2028   apply (simp add: length_compTpExpr pushST_def)
  2181      apply (simp add: length_compTpExpr pushST_def)
  2029   apply (simp add: popST_def start_sttp_resp_comb length_compTpStmt)
  2182      apply (simp add: popST_def start_sttp_resp_comb length_compTpStmt)
  2030   apply (simp only: compTpStmt_LT_ST)
  2183      apply (simp only: compTpStmt_LT_ST)
  2031   apply (simp add: nochangeST_def)
  2184      apply (simp add: nochangeST_def)
  2032     (* check_type *)
  2185     (* check_type *)
  2033   apply (subgoal_tac "
  2186     apply (subgoal_tac "
  2034     (mt_sttp_flatten (f' (ST, LT)) ! length ([LitPush (Bool False)] @ compExpr jmb expr)) = 
  2187      (mt_sttp_flatten (f' (ST, LT)) ! length ([LitPush (Bool False)] @ compExpr jmb expr)) =
  2035     (Some (PrimT Boolean # PrimT Boolean # ST, LT))")
  2188      (Some (PrimT Boolean # PrimT Boolean # ST, LT))")
  2036   apply (simp only:)
  2189      apply (simp only:)
  2037   apply (simp (no_asm_simp)) apply (rule trans, rule mt_sttp_flatten_comb_length) 
  2190     apply (simp (no_asm_simp)) apply (rule trans, rule mt_sttp_flatten_comb_length)
  2038     apply (rule HOL.refl) apply (simp (no_asm_simp) add: length_compTpExpr)
  2191       apply (rule HOL.refl) apply (simp (no_asm_simp) add: length_compTpExpr)
  2039     apply (simp (no_asm_simp) add: length_compTpExpr pushST_def)
  2192     apply (simp (no_asm_simp) add: length_compTpExpr pushST_def)
  2040     apply (simp only: compTpExpr_LT_ST_rewr) 
  2193     apply (simp only: compTpExpr_LT_ST_rewr)
  2041     (* contracting\<dots> *)
  2194    (* contracting\<dots> *)
  2042   apply (rule contracting_popST)
  2195    apply (rule contracting_popST)
  2043 
  2196 
  2044 apply (drule_tac 
  2197   apply (drule_tac
  2045   ?bc1.0="[LitPush (Bool False)] @ compExpr jmb expr @ 
  2198           ?bc1.0="[LitPush (Bool False)] @ compExpr jmb expr @
  2046            [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] " 
  2199                   [Ifcmpeq (2 + int (length (compStmt jmb stmt)))] "
  2047   and ?bc2.0 = "compStmt jmb stmt1"
  2200           and ?bc2.0 = "compStmt jmb stmt"
  2048   and ?bc3.0="Goto (1 + int (length (compStmt jmb stmt2))) # compStmt jmb stmt2"
  2201           and ?bc3.0="[Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]"
  2049   and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2" 
  2202           and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2"
  2050   and ?f2.0 = "compTpStmt jmb G stmt1"
  2203           and ?f2.0 = "compTpStmt jmb G stmt"
  2051   and ?f3.0="nochangeST \<box> compTpStmt jmb G stmt2"
  2204           and ?f3.0="nochangeST"
  2052   in bc_mt_corresp_comb_inside)
  2205           in bc_mt_corresp_comb_inside)
  2053   apply (simp (no_asm_simp))+
  2206           apply (simp (no_asm_simp))+
  2054   apply (simp (no_asm_simp) add: pushST_def popST_def compTpExpr_LT_ST)
  2207       apply (simp (no_asm_simp) add: pushST_def popST_def compTpExpr_LT_ST)
  2055   apply (simp only: compTpExpr_LT_ST)
  2208       apply (simp only: compTpExpr_LT_ST)
  2056   apply (simp (no_asm_simp))
  2209       apply (simp (no_asm_simp))
  2057   apply (simp (no_asm_simp) add: length_compTpExpr)+
  2210      apply (simp (no_asm_simp) add: length_compTpExpr)+
  2058 
  2211 
  2059 
  2212 
  2060 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr @ [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] @ compStmt jmb stmt1" 
  2213   apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr @ [Ifcmpeq (2 + int (length (compStmt jmb stmt)))] @ compStmt jmb stmt"
  2061     and inst = "Goto (1 + int (length (compStmt jmb stmt2)))"
  2214             and inst = "Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))"
  2062   and ?bc3.0 = "compStmt jmb stmt2"
  2215             and ?bc3.0 = "[]"
  2063   and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> 
  2216             and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt"
  2064               compTpStmt jmb G stmt1" 
  2217             and ?f2.0 = "nochangeST"
  2065   and ?f2.0 = "nochangeST"
  2218             and ?f3.0="comb_nil"
  2066   and ?f3.0="compTpStmt jmb G stmt2"
  2219             in bc_mt_corresp_comb_wt_instr)
  2067   in bc_mt_corresp_comb_wt_instr)
  2220             apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+
  2068   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+
  2221     apply (intro strip)
  2069   apply (intro strip)
  2222     apply (rule wt_instr_Goto)
  2070   apply (rule wt_instr_Goto)
  2223        apply arith
  2071   apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
  2224       apply arith
  2072   apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
  2225      (* \<dots> ! nat (int pc + i) = \<dots> ! pc *)
  2073     (* \<dots> ! nat (int pc + i) = \<dots> ! pc *)
  2226      apply (simp (no_asm_simp))
  2074   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2227      apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2075   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
  2228      apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
  2076   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2229      apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2077   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
  2230      apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2078   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2231      apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2079   apply (simp only:)
  2232     apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
  2080   apply (simp add: length_compTpExpr length_compTpStmt)
  2233     apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2081   apply (rule contracting_nochangeST)
  2234     apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2082 
  2235 
  2083 
  2236     apply (simp add: length_compTpExpr length_compTpStmt) (* check_type *)
  2084 apply (drule_tac 
       
  2085   ?bc1.0= "[LitPush (Bool False)] @ compExpr jmb expr @ 
       
  2086             [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] @ 
       
  2087             compStmt jmb stmt1 @ [Goto (1 + int (length (compStmt jmb stmt2)))]"
       
  2088   and ?bc2.0 = "compStmt jmb stmt2"
       
  2089   and ?bc3.0="[]"
       
  2090   and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> 
       
  2091               compTpStmt jmb G stmt1 \<box> nochangeST"
       
  2092   and ?f2.0 = "compTpStmt jmb G stmt2"
       
  2093   and ?f3.0="comb_nil"
       
  2094   in bc_mt_corresp_comb_inside)
       
  2095   apply (simp (no_asm_simp))+
       
  2096   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def compTpExpr_LT_ST)
       
  2097   apply (simp only: compTpExpr_LT_ST)
       
  2098   apply (simp (no_asm_simp))
       
  2099   apply (simp only: compTpStmt_LT_ST)
       
  2100   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+
       
  2101 
       
  2102 apply simp
       
  2103 
       
  2104 
       
  2105 (* Loop *)
       
  2106 apply (intro allI impI)
       
  2107 apply (simp (no_asm_simp) only:)
       
  2108 apply (drule Loop_invers, (erule conjE)+)
       
  2109 apply (simp (no_asm_simp))
       
  2110 
       
  2111 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0")
       
  2112 prefer 2 
       
  2113 apply (rule bc_mt_corresp_zero) 
       
  2114   apply (simp (no_asm_simp) add: length_compTpStmt length_compTpExpr)
       
  2115   apply (simp (no_asm_simp))
       
  2116 
       
  2117 apply (rename_tac expr stmt ST LT bc' f')
       
  2118 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "[LitPush (Bool False)]" 
       
  2119   and ?bc3.0="compExpr jmb expr @ Ifcmpeq (2 + int (length (compStmt jmb stmt))) #
       
  2120             compStmt jmb stmt @ 
       
  2121             [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" 
       
  2122   and ?f1.0=comb_nil and ?f2.0 = "pushST [PrimT Boolean]" 
       
  2123   and ?f3.0="compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt \<box> nochangeST"
       
  2124   in bc_mt_corresp_comb_inside)
       
  2125   apply (simp (no_asm_simp))+
       
  2126   apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush)
       
  2127   apply (simp (no_asm_simp) add: start_sttp_resp_def)+
       
  2128 
       
  2129 apply (drule_tac ?bc1.0="[LitPush (Bool False)]" and ?bc2.0 = "compExpr jmb expr"
       
  2130   and ?bc3.0="Ifcmpeq (2 + int (length (compStmt jmb stmt))) #
       
  2131             compStmt jmb stmt @ 
       
  2132             [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" 
       
  2133   and ?f1.0="pushST [PrimT Boolean]" and ?f2.0 = "compTpExpr jmb G expr"
       
  2134   and ?f3.0="popST 2 \<box> compTpStmt jmb G stmt \<box> nochangeST"
       
  2135   in bc_mt_corresp_comb_inside)
       
  2136   apply (simp (no_asm_simp))+
       
  2137   apply (simp (no_asm_simp)  add: pushST_def)
       
  2138   apply (rule  wt_method_compTpExpr_corresp) apply assumption+ 
       
  2139       apply (simp (no_asm_simp))+
       
  2140 
       
  2141 
       
  2142 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr" 
       
  2143     and inst = "Ifcmpeq (2 + int (length (compStmt jmb stmt)))" 
       
  2144   and ?bc3.0 = "compStmt jmb stmt @ 
       
  2145        [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]"
       
  2146   and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr" and ?f2.0 = "popST 2"
       
  2147   and ?f3.0="compTpStmt jmb G stmt \<box> nochangeST"
       
  2148   in bc_mt_corresp_comb_wt_instr)
       
  2149   apply (simp (no_asm_simp) add: length_compTpExpr)+
       
  2150   apply (simp (no_asm_simp) add: start_sttp_resp_comb)
       
  2151 
       
  2152     (* wt_instr *)
       
  2153   apply (intro strip)
       
  2154   apply (rule_tac ts="PrimT Boolean" and ts'="PrimT Boolean" 
       
  2155     and ST=ST and LT=LT 
       
  2156     in wt_instr_Ifcmpeq)
       
  2157   apply (simp (no_asm_simp))
       
  2158   apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
       
  2159   apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
       
  2160     (* current pc *)
       
  2161   apply (simp add: length_compTpExpr pushST_def)
       
  2162   apply (simp only: compTpExpr_LT_ST) 
       
  2163     (* Suc pc *)
       
  2164   apply (simp add: length_compTpExpr pushST_def)
       
  2165   apply (simp add: popST_def start_sttp_resp_comb)
       
  2166     (* jump goal *)
       
  2167   apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp))
       
  2168   apply (simp add: length_compTpExpr pushST_def)
       
  2169   apply (simp add: popST_def start_sttp_resp_comb length_compTpStmt)
       
  2170   apply (simp only: compTpStmt_LT_ST)
       
  2171   apply (simp add: nochangeST_def)
       
  2172     (* check_type *)
       
  2173   apply (subgoal_tac "
       
  2174     (mt_sttp_flatten (f' (ST, LT)) ! length ([LitPush (Bool False)] @ compExpr jmb expr)) = 
       
  2175     (Some (PrimT Boolean # PrimT Boolean # ST, LT))")
       
  2176   apply (simp only:)
       
  2177   apply (simp (no_asm_simp)) apply (rule trans, rule mt_sttp_flatten_comb_length) 
       
  2178     apply (rule HOL.refl) apply (simp (no_asm_simp) add: length_compTpExpr)
       
  2179     apply (simp (no_asm_simp) add: length_compTpExpr pushST_def)
       
  2180     apply (simp only: compTpExpr_LT_ST_rewr) 
       
  2181     (* contracting\<dots> *)
       
  2182   apply (rule contracting_popST)
       
  2183 
       
  2184 apply (drule_tac 
       
  2185   ?bc1.0="[LitPush (Bool False)] @ compExpr jmb expr @ 
       
  2186            [Ifcmpeq (2 + int (length (compStmt jmb stmt)))] " 
       
  2187   and ?bc2.0 = "compStmt jmb stmt"
       
  2188   and ?bc3.0="[Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]"
       
  2189   and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2" 
       
  2190   and ?f2.0 = "compTpStmt jmb G stmt"
       
  2191   and ?f3.0="nochangeST"
       
  2192   in bc_mt_corresp_comb_inside)
       
  2193   apply (simp (no_asm_simp))+
       
  2194   apply (simp (no_asm_simp) add: pushST_def popST_def compTpExpr_LT_ST)
       
  2195   apply (simp only: compTpExpr_LT_ST)
       
  2196   apply (simp (no_asm_simp))
       
  2197   apply (simp (no_asm_simp) add: length_compTpExpr)+
       
  2198 
       
  2199 
       
  2200 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr @ [Ifcmpeq (2 + int (length (compStmt jmb stmt)))] @ compStmt jmb stmt" 
       
  2201     and inst = "Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))"
       
  2202   and ?bc3.0 = "[]"
       
  2203   and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> 
       
  2204               compTpStmt jmb G stmt" 
       
  2205   and ?f2.0 = "nochangeST"
       
  2206   and ?f3.0="comb_nil"
       
  2207   in bc_mt_corresp_comb_wt_instr)
       
  2208   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ 
       
  2209   apply (intro strip)
       
  2210   apply (rule wt_instr_Goto)
       
  2211   apply arith
       
  2212   apply arith
       
  2213     (* \<dots> ! nat (int pc + i) = \<dots> ! pc *)
       
  2214   apply (simp (no_asm_simp))
       
  2215   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
       
  2216   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
       
  2217   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
       
  2218   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
       
  2219   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
       
  2220   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
       
  2221   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
       
  2222   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
       
  2223 
       
  2224   apply (simp add: length_compTpExpr length_compTpStmt) (* check_type *)
       
  2225     apply (simp add: pushST_def popST_def compTpExpr_LT_ST compTpStmt_LT_ST)
  2237     apply (simp add: pushST_def popST_def compTpExpr_LT_ST compTpStmt_LT_ST)
  2226   apply (rule contracting_nochangeST)
  2238    apply (rule contracting_nochangeST)
  2227 apply simp
  2239   apply simp
  2228 
  2240 
  2229 done
  2241   done
  2230 
  2242 
  2231 
  2243 
  2232   (**********************************************************************************)
  2244   (**********************************************************************************)
  2233 
  2245 
  2234 
  2246 
  2237   wf_java_mdecl G C ((mn, pTs), rT, jmb); mxr = length LT;
  2249   wf_java_mdecl G C ((mn, pTs), rT, jmb); mxr = length LT;
  2238   length LT = (length pns) + (length lvars) + 1;  vn \<in> set (map fst lvars);
  2250   length LT = (length pns) + (length lvars) + 1;  vn \<in> set (map fst lvars);
  2239   bc = (compInit jmb (vn,ty)); f = (compTpInit jmb (vn,ty));
  2251   bc = (compInit jmb (vn,ty)); f = (compTpInit jmb (vn,ty));
  2240   is_type G ty \<rbrakk>
  2252   is_type G ty \<rbrakk>
  2241   \<Longrightarrow> bc_mt_corresp bc f (ST, LT) (comp G) rT mxr (length bc)"
  2253   \<Longrightarrow> bc_mt_corresp bc f (ST, LT) (comp G) rT mxr (length bc)"
  2242 apply (simp add: compInit_def compTpInit_def split_beta)
  2254   apply (simp add: compInit_def compTpInit_def split_beta)
  2243 apply (rule_tac ?bc1.0="[load_default_val ty]" and ?bc2.0="[Store (index jmb vn)]" 
  2255   apply (rule_tac ?bc1.0="[load_default_val ty]" and ?bc2.0="[Store (index jmb vn)]"
  2244   in bc_mt_corresp_comb) 
  2256       in bc_mt_corresp_comb)
  2245   apply simp+
  2257       apply simp+
  2246   apply (simp add: load_default_val_def)
  2258     apply (simp add: load_default_val_def)
  2247    apply (rule typeof_default_val [THEN exE]) 
  2259     apply (rule typeof_default_val [THEN exE])
  2248 
  2260 
  2249   apply (rule bc_mt_corresp_LitPush_CT) apply assumption
  2261     apply (rule bc_mt_corresp_LitPush_CT, assumption)
  2250     apply (simp add: comp_is_type)
  2262     apply (simp add: comp_is_type)
  2251 apply (simp add: pushST_def)
  2263    apply (simp add: pushST_def)
  2252   apply (rule bc_mt_corresp_Store_init)
  2264    apply (rule bc_mt_corresp_Store_init)
  2253   apply simp
  2265    apply simp
  2254   apply (rule index_length_lvars [THEN conjunct2])
  2266    apply (rule index_length_lvars [THEN conjunct2])
  2255 apply auto
  2267      apply auto
  2256 done
  2268   done
  2257 
  2269 
  2258 
  2270 
  2259 lemma wt_method_compTpInitLvars_corresp_aux [rule_format (no_asm)]: "
  2271 lemma wt_method_compTpInitLvars_corresp_aux [rule_format (no_asm)]: "
  2260   \<forall> lvars_pre lvars0 ST LT.
  2272   \<forall> lvars_pre lvars0 ST LT.
  2261   jmb = (pns,lvars0,blk,res) \<and>
  2273   jmb = (pns,lvars0,blk,res) \<and>
  2262   lvars0 = (lvars_pre @ lvars) \<and>
  2274   lvars0 = (lvars_pre @ lvars) \<and>
  2263   length LT = (length pns) + (length lvars0) + 1 \<and>
  2275   length LT = (length pns) + (length lvars0) + 1 \<and>
  2264   wf_java_mdecl G C ((mn, pTs), rT, jmb)
  2276   wf_java_mdecl G C ((mn, pTs), rT, jmb)
  2265  \<longrightarrow> bc_mt_corresp (compInitLvars jmb lvars) (compTpInitLvars jmb lvars) (ST, LT) (comp G) rT 
  2277  \<longrightarrow> bc_mt_corresp (compInitLvars jmb lvars) (compTpInitLvars jmb lvars) (ST, LT) (comp G) rT 
  2266        (length LT) (length (compInitLvars jmb lvars))"
  2278        (length LT) (length (compInitLvars jmb lvars))"
  2267 apply (induct lvars)
  2279   apply (induct lvars)
  2268 apply (simp add: compInitLvars_def)
  2280    apply (simp add: compInitLvars_def)
  2269 
  2281 
  2270 apply (intro strip, (erule conjE)+)
  2282   apply (intro strip, (erule conjE)+)
  2271 apply (subgoal_tac "\<exists> vn ty. a = (vn, ty)")
  2283   apply (subgoal_tac "\<exists> vn ty. a = (vn, ty)")
  2272   prefer 2 apply (simp (no_asm_simp)) 
  2284    prefer 2
       
  2285    apply (simp (no_asm_simp))
  2273   apply ((erule exE)+, simp (no_asm_simp))
  2286   apply ((erule exE)+, simp (no_asm_simp))
  2274 apply (drule_tac x="lvars_pre @ [a]" in spec)
  2287   apply (drule_tac x="lvars_pre @ [a]" in spec)
  2275 apply (drule_tac x="lvars0" in spec)
  2288   apply (drule_tac x="lvars0" in spec)
  2276 apply (simp (no_asm_simp) add: compInitLvars_def)
  2289   apply (simp (no_asm_simp) add: compInitLvars_def)
  2277 apply (rule_tac ?bc1.0="compInit jmb a" and ?bc2.0="compInitLvars jmb lvars"
  2290   apply (rule_tac ?bc1.0="compInit jmb a" and ?bc2.0="compInitLvars jmb lvars"
  2278   in bc_mt_corresp_comb)
  2291       in bc_mt_corresp_comb)
  2279 apply (simp (no_asm_simp) add: compInitLvars_def)+
  2292       apply (simp (no_asm_simp) add: compInitLvars_def)+
  2280 
  2293 
  2281 apply (rule_tac vn=vn and ty=ty in wt_method_compTpInit_corresp)
  2294     apply (rule_tac vn=vn and ty=ty in wt_method_compTpInit_corresp)
  2282 apply assumption+
  2295            apply assumption+
  2283 apply (simp (no_asm_simp))+ 
  2296          apply (simp (no_asm_simp))+
  2284 apply (simp add: wf_java_mdecl_def)     (* is_type G ty *)
  2297     apply (simp add: wf_java_mdecl_def)     (* is_type G ty *)
  2285 apply (simp add: compTpInit_def storeST_def pushST_def)
  2298    apply (simp add: compTpInit_def storeST_def pushST_def)
  2286 apply simp
  2299   apply simp
  2287 done
  2300   done
  2288 
  2301 
  2289 
  2302 
  2290 lemma wt_method_compTpInitLvars_corresp: "\<lbrakk> jmb = (pns,lvars,blk,res); 
  2303 lemma wt_method_compTpInitLvars_corresp: "\<lbrakk> jmb = (pns,lvars,blk,res); 
  2291   wf_java_mdecl G C ((mn, pTs), rT, jmb);
  2304   wf_java_mdecl G C ((mn, pTs), rT, jmb);
  2292   length LT = (length pns) + (length lvars) + 1; mxr = (length LT);
  2305   length LT = (length pns) + (length lvars) + 1; mxr = (length LT);
  2293   bc = (compInitLvars jmb lvars); f= (compTpInitLvars jmb lvars) \<rbrakk>
  2306   bc = (compInitLvars jmb lvars); f= (compTpInitLvars jmb lvars) \<rbrakk>
  2294   \<Longrightarrow> bc_mt_corresp bc f (ST, LT) (comp G) rT mxr (length bc)"
  2307   \<Longrightarrow> bc_mt_corresp bc f (ST, LT) (comp G) rT mxr (length bc)"
  2295 apply (simp only:)
  2308   apply (simp only:)
  2296 apply (subgoal_tac "bc_mt_corresp (compInitLvars (pns, lvars, blk, res) lvars)
  2309   apply (subgoal_tac "bc_mt_corresp (compInitLvars (pns, lvars, blk, res) lvars)
  2297         (compTpInitLvars (pns, lvars, blk, res) lvars) (ST, LT) (TranslComp.comp G) rT
  2310             (compTpInitLvars (pns, lvars, blk, res) lvars) (ST, LT) (TranslComp.comp G) rT
  2298         (length LT) (length (compInitLvars (pns, lvars, blk, res) lvars))")
  2311             (length LT) (length (compInitLvars (pns, lvars, blk, res) lvars))")
  2299 apply simp
  2312    apply simp
  2300 apply (rule_tac lvars_pre="[]" in wt_method_compTpInitLvars_corresp_aux)
  2313   apply (rule_tac lvars_pre="[]" in wt_method_compTpInitLvars_corresp_aux)
  2301 apply auto
  2314   apply auto
  2302 done
  2315   done
  2303 
  2316 
  2304 
  2317 
  2305   (**********************************************************************************)
  2318   (**********************************************************************************)
  2306 
  2319 
  2307 
  2320 
  2313   f = (compTpInitLvars jmb lvars \<box> compTpStmt jmb G blk \<box> compTpExpr jmb G res);
  2326   f = (compTpInitLvars jmb lvars \<box> compTpStmt jmb G blk \<box> compTpExpr jmb G res);
  2314   sttp = (start_ST, start_LT C pTs (length lvars));
  2327   sttp = (start_ST, start_LT C pTs (length lvars));
  2315   li = (length (inited_LT C pTs lvars))
  2328   li = (length (inited_LT C pTs lvars))
  2316   \<rbrakk>
  2329   \<rbrakk>
  2317 \<Longrightarrow> bc_mt_corresp bc f sttp (comp G) rT  li (length bc)"
  2330 \<Longrightarrow> bc_mt_corresp bc f sttp (comp G) rT  li (length bc)"
  2318 apply (subgoal_tac "\<exists> E. (E = (local_env G C (mn, pTs) pns lvars) \<and> E \<turnstile> blk \<surd> \<and> 
  2331   apply (subgoal_tac "\<exists>E. (E = (local_env G C (mn, pTs) pns lvars) \<and> E \<turnstile> blk \<surd> \<and>
  2319                          (\<exists>T. E\<turnstile>res::T \<and> G\<turnstile>T\<preceq>rT))")
  2332                           (\<exists>T. E\<turnstile>res::T \<and> G\<turnstile>T\<preceq>rT))")
  2320    apply (erule exE, (erule conjE)+)+
  2333    apply (erule exE, (erule conjE)+)+
  2321 apply (simp only:)
       
  2322 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl)+
       
  2323 
       
  2324   (* InitLvars *)
       
  2325 apply (rule wt_method_compTpInitLvars_corresp) 
       
  2326    apply assumption+
       
  2327    apply (simp only:)
  2334    apply (simp only:)
  2328    apply (simp (no_asm_simp) add: start_LT_def) 
  2335    apply (rule bc_mt_corresp_comb, (rule HOL.refl)+)
  2329        apply (rule wf_java_mdecl_length_pTs_pns, assumption)
  2336 
  2330    apply (simp (no_asm_simp) only: start_LT_def)
  2337      (* InitLvars *)
  2331    apply (simp (no_asm_simp) add: inited_LT_def)+
  2338      apply (rule wt_method_compTpInitLvars_corresp)
  2332 
  2339           apply assumption+
  2333 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl)+
  2340          apply (simp only:)
  2334    apply (simp (no_asm_simp) add: compTpInitLvars_LT_ST)
  2341         apply (simp (no_asm_simp) add: start_LT_def)
  2335 
  2342         apply (rule wf_java_mdecl_length_pTs_pns, assumption)
  2336      (* stmt *)
  2343        apply (simp (no_asm_simp) only: start_LT_def)
  2337 apply (simp only: compTpInitLvars_LT_ST)
  2344        apply (simp (no_asm_simp) add: inited_LT_def)+
  2338 apply (subgoal_tac "(Suc (length pTs + length lvars)) = (length (inited_LT C pTs lvars))")
  2345 
  2339    prefer 2 apply (simp (no_asm_simp) add: inited_LT_def)
  2346     apply (rule bc_mt_corresp_comb, (rule HOL.refl)+)
  2340 apply (simp only:)
  2347        apply (simp (no_asm_simp) add: compTpInitLvars_LT_ST)
  2341 apply (rule_tac s=blk in wt_method_compTpStmt_corresp)
  2348 
  2342    apply assumption+
  2349       (* stmt *)
  2343    apply (simp only:)+
  2350       apply (simp only: compTpInitLvars_LT_ST)
  2344    apply (simp (no_asm_simp) add: is_inited_LT_def)
  2351       apply (subgoal_tac "(Suc (length pTs + length lvars)) = (length (inited_LT C pTs lvars))")
  2345    apply (simp only:)+
  2352        prefer 2 apply (simp (no_asm_simp) add: inited_LT_def)
       
  2353       apply (simp only:)
       
  2354       apply (rule_tac s=blk in wt_method_compTpStmt_corresp)
       
  2355              apply assumption+
       
  2356            apply (simp only:)+
       
  2357         apply (simp (no_asm_simp) add: is_inited_LT_def)
       
  2358        apply (simp only:)+
  2346 
  2359 
  2347      (* expr *)
  2360      (* expr *)
  2348 apply (simp only: compTpInitLvars_LT_ST compTpStmt_LT_ST is_inited_LT_def)
  2361      apply (simp only: compTpInitLvars_LT_ST compTpStmt_LT_ST is_inited_LT_def)
  2349 apply (subgoal_tac "(Suc (length pTs + length lvars)) = (length (inited_LT C pTs lvars))")
  2362      apply (subgoal_tac "(Suc (length pTs + length lvars)) = (length (inited_LT C pTs lvars))")
  2350    prefer 2 apply (simp (no_asm_simp) add: inited_LT_def)
  2363       prefer 2 apply (simp (no_asm_simp) add: inited_LT_def)
  2351 apply (simp only:)
  2364      apply (simp only:)
  2352 apply (rule_tac ex=res in wt_method_compTpExpr_corresp)
  2365      apply (rule_tac ex=res in wt_method_compTpExpr_corresp)
  2353    apply assumption+
  2366             apply assumption+
  2354    apply (simp only:)+
  2367           apply (simp only:)+
  2355    apply (simp (no_asm_simp) add: is_inited_LT_def)
  2368        apply (simp (no_asm_simp) add: is_inited_LT_def)
  2356    apply (simp only:)+
  2369       apply (simp only:)+
  2357 
  2370 
  2358      (* start_sttp_resp *)
  2371     (* start_sttp_resp *)
  2359 apply (simp add: start_sttp_resp_comb)+
  2372     apply (simp add: start_sttp_resp_comb)+
  2360 
  2373 
  2361   (* subgoal *)
  2374   (* subgoal *)
  2362 apply (simp add: wf_java_mdecl_def local_env_def) 
  2375   apply (simp add: wf_java_mdecl_def local_env_def)
  2363 done
  2376   done
  2364 
  2377 
  2365 
  2378 
  2366   (**********************************************************************************)
  2379   (**********************************************************************************)
  2367 
  2380 
  2368 
  2381 
  2369 
  2382 
  2370 lemma check_type_start: "\<lbrakk> wf_mhead cG (mn, pTs) rT; is_class cG C\<rbrakk>
  2383 lemma check_type_start:
       
  2384   "\<lbrakk> wf_mhead cG (mn, pTs) rT; is_class cG C\<rbrakk>
  2371   \<Longrightarrow> check_type cG (length start_ST) (Suc (length pTs + mxl))
  2385   \<Longrightarrow> check_type cG (length start_ST) (Suc (length pTs + mxl))
  2372               (OK (Some (start_ST, start_LT C pTs mxl)))"
  2386               (OK (Some (start_ST, start_LT C pTs mxl)))"
  2373 apply (simp add: check_type_def wf_mhead_def start_ST_def start_LT_def)
  2387   apply (simp add: check_type_def wf_mhead_def start_ST_def start_LT_def)
  2374 apply (simp add: check_type_simps)
  2388   apply (simp add: check_type_simps)
  2375 apply (simp only: list_def)
  2389   apply (simp only: list_def)
  2376 apply (auto simp: err_def)
  2390   apply (auto simp: err_def)
  2377 done
  2391   done
  2378 
  2392 
  2379 
  2393 
  2380 lemma wt_method_comp_aux: "\<lbrakk>   bc' = bc @ [Return]; f' = (f \<box> nochangeST);
  2394 lemma wt_method_comp_aux:
       
  2395   "\<lbrakk> bc' = bc @ [Return]; f' = (f \<box> nochangeST);
  2381   bc_mt_corresp bc f sttp0 cG rT (1+length pTs+mxl) (length bc);
  2396   bc_mt_corresp bc f sttp0 cG rT (1+length pTs+mxl) (length bc);
  2382   start_sttp_resp_cons f';
  2397   start_sttp_resp_cons f';
  2383   sttp0 = (start_ST, start_LT C pTs mxl);
  2398   sttp0 = (start_ST, start_LT C pTs mxl);
  2384   mxs = max_ssize (mt_of (f' sttp0));
  2399   mxs = max_ssize (mt_of (f' sttp0));
  2385   wf_mhead cG (mn, pTs) rT; is_class cG C;
  2400   wf_mhead cG (mn, pTs) rT; is_class cG C;
  2388   check_type cG mxs (1+length pTs+mxl) (OK (Some (T # ST, LT))) \<longrightarrow>
  2403   check_type cG mxs (1+length pTs+mxl) (OK (Some (T # ST, LT))) \<longrightarrow>
  2389   wt_instr_altern Return cG rT (mt_of (f' sttp0)) mxs (1+length pTs+mxl) 
  2404   wt_instr_altern Return cG rT (mt_of (f' sttp0)) mxs (1+length pTs+mxl) 
  2390          (Suc (length bc)) empty_et (length bc)
  2405          (Suc (length bc)) empty_et (length bc)
  2391 \<rbrakk>
  2406 \<rbrakk>
  2392 \<Longrightarrow> wt_method_altern cG C pTs rT mxs mxl bc' empty_et (mt_of (f' sttp0))"
  2407 \<Longrightarrow> wt_method_altern cG C pTs rT mxs mxl bc' empty_et (mt_of (f' sttp0))"
  2393 apply (subgoal_tac "check_type cG (length start_ST) (Suc (length pTs + mxl))
  2408   apply (subgoal_tac "check_type cG (length start_ST) (Suc (length pTs + mxl))
  2394               (OK (Some (start_ST, start_LT C pTs mxl)))")
  2409                                     (OK (Some (start_ST, start_LT C pTs mxl)))")
  2395 apply (subgoal_tac "check_type cG mxs (1+length pTs+mxl) (OK (Some (T # ST, LT)))")
  2410    apply (subgoal_tac "check_type cG mxs (1+length pTs+mxl) (OK (Some (T # ST, LT)))")
  2396 
  2411 
  2397 apply (simp add: wt_method_altern_def)
  2412     apply (simp add: wt_method_altern_def)
  2398 
  2413 
  2399   (* length (.. f ..) = length bc *)
  2414     (* length (.. f ..) = length bc *)
  2400 apply (rule conjI)
  2415     apply (rule conjI)
  2401 apply (simp add: bc_mt_corresp_def split_beta)
  2416      apply (simp add: bc_mt_corresp_def split_beta)
  2402 
  2417 
  2403   (* check_bounded *)
  2418     (* check_bounded *)
  2404 apply (rule conjI)
  2419     apply (rule conjI)
  2405 apply (simp add: bc_mt_corresp_def split_beta check_bounded_def) 
  2420      apply (simp add: bc_mt_corresp_def split_beta check_bounded_def)
  2406 apply (erule conjE)+
  2421      apply (erule conjE)+
  2407 apply (intro strip)
  2422      apply (intro strip)
  2408 apply (subgoal_tac "pc < (length bc) \<or> pc = length bc")
  2423      apply (subgoal_tac "pc < (length bc) \<or> pc = length bc")
  2409   apply (erule disjE)
  2424       apply (erule disjE)
  2410     (* case  pc < length bc *)
  2425        (* case  pc < length bc *)
  2411     apply (subgoal_tac "(bc' ! pc) = (bc ! pc)")
  2426        apply (subgoal_tac "(bc' ! pc) = (bc ! pc)")
  2412     apply (simp add: wt_instr_altern_def eff_def)
  2427         apply (simp add: wt_instr_altern_def eff_def)
       
  2428        (* subgoal *)
       
  2429        apply (simp add: nth_append)
       
  2430       (* case  pc = length bc *)
       
  2431       apply (subgoal_tac "(bc' ! pc) = Return")
       
  2432        apply (simp add: wt_instr_altern_def)
  2413       (* subgoal *)
  2433       (* subgoal *)
       
  2434       apply (simp add: nth_append)
       
  2435 
       
  2436      (* subgoal pc < length bc \<or> pc = length bc *)
       
  2437      apply arith
       
  2438 
       
  2439     (* wt_start *)
       
  2440     apply (rule conjI)
       
  2441      apply (simp add: wt_start_def start_sttp_resp_cons_def split_beta)
       
  2442      apply (drule_tac x=sttp0 in spec) apply (erule exE)
       
  2443      apply (simp add: mt_sttp_flatten_def start_ST_def start_LT_def)
       
  2444 
       
  2445     (* wt_instr *)
       
  2446     apply (intro strip)
       
  2447     apply (subgoal_tac "pc < (length bc) \<or> pc = length bc")
       
  2448      apply (erule disjE)
       
  2449 
       
  2450       (* pc < (length bc) *)
       
  2451       apply (simp (no_asm_use) add: bc_mt_corresp_def mt_sttp_flatten_def split_beta)
       
  2452       apply (erule conjE)+
       
  2453       apply (drule mp, assumption)+
       
  2454       apply (erule conjE)+
       
  2455       apply (drule spec, drule mp, assumption)
       
  2456       apply (simp add: nth_append)
       
  2457       apply (simp (no_asm_simp) add: comb_def split_beta nochangeST_def)
       
  2458 
       
  2459      (* pc = length bc *)
       
  2460      apply (simp add: nth_append)
       
  2461 
       
  2462     (* subgoal pc < (length bc) \<or> pc = length bc *)
       
  2463     apply arith
       
  2464 
       
  2465    (* subgoals *)
       
  2466    apply (simp (no_asm_use) add: bc_mt_corresp_def split_beta)
       
  2467    apply (subgoal_tac "check_type cG (length (fst sttp0)) (Suc (length pTs + mxl))
       
  2468                                      (OK (Some sttp0))")
       
  2469     apply ((erule conjE)+, drule mp, assumption)
  2414     apply (simp add: nth_append)
  2470     apply (simp add: nth_append)
  2415     (* case  pc = length bc *)
  2471     apply (simp (no_asm_simp) add: comb_def nochangeST_def split_beta)
  2416     apply (subgoal_tac "(bc' ! pc) = Return")
  2472    apply (simp (no_asm_simp))
  2417     apply (simp add: wt_instr_altern_def)
  2473 
  2418       (* subgoal *)
  2474   apply (rule check_type_start, assumption+)
  2419     apply (simp add: nth_append)
  2475   done
  2420 
       
  2421     (* subgoal pc < length bc \<or> pc = length bc *)
       
  2422 apply arith
       
  2423 
       
  2424   (* wt_start *)
       
  2425 apply (rule conjI)
       
  2426 apply (simp add: wt_start_def start_sttp_resp_cons_def split_beta)
       
  2427   apply (drule_tac x=sttp0 in spec) apply (erule exE)
       
  2428   apply (simp add: mt_sttp_flatten_def start_ST_def start_LT_def)
       
  2429 
       
  2430   (* wt_instr *)
       
  2431 apply (intro strip)
       
  2432 apply (subgoal_tac "pc < (length bc) \<or> pc = length bc")
       
  2433 apply (erule disjE)
       
  2434 
       
  2435   (* pc < (length bc) *)
       
  2436 apply (simp (no_asm_use) add: bc_mt_corresp_def mt_sttp_flatten_def split_beta)
       
  2437 apply (erule conjE)+
       
  2438 apply (drule mp, assumption)+
       
  2439 apply (erule conjE)+
       
  2440 apply (drule spec, drule mp, assumption)
       
  2441 apply (simp add: nth_append)
       
  2442 apply (simp (no_asm_simp) add: comb_def split_beta nochangeST_def)
       
  2443 
       
  2444   (* pc = length bc *)
       
  2445 apply (simp add: nth_append)
       
  2446 
       
  2447   (* subgoal pc < (length bc) \<or> pc = length bc *)
       
  2448 apply arith
       
  2449 
       
  2450   (* subgoals *)
       
  2451 apply (simp (no_asm_use) add: bc_mt_corresp_def split_beta)
       
  2452 apply (subgoal_tac "check_type cG (length (fst sttp0)) (Suc (length pTs + mxl))
       
  2453          (OK (Some sttp0))")
       
  2454 apply ((erule conjE)+, drule mp, assumption)
       
  2455 apply (simp add: nth_append)
       
  2456 apply (simp (no_asm_simp) add: comb_def nochangeST_def split_beta)
       
  2457 apply (simp (no_asm_simp))
       
  2458 
       
  2459 apply (rule check_type_start, assumption+)
       
  2460 done
       
  2461 
  2476 
  2462 
  2477 
  2463 lemma wt_instr_Return: "\<lbrakk>fst f ! pc = Some (T # ST, LT); (G \<turnstile> T \<preceq> rT); pc < max_pc;
  2478 lemma wt_instr_Return: "\<lbrakk>fst f ! pc = Some (T # ST, LT); (G \<turnstile> T \<preceq> rT); pc < max_pc;
  2464   check_type (TranslComp.comp G) mxs mxr (OK (Some (T # ST, LT)))
  2479   check_type (TranslComp.comp G) mxs mxr (OK (Some (T # ST, LT)))
  2465   \<rbrakk>
  2480   \<rbrakk>
  2466   \<Longrightarrow> wt_instr_altern Return (comp G) rT  (mt_of f) mxs mxr max_pc empty_et pc"
  2481   \<Longrightarrow> wt_instr_altern Return (comp G) rT  (mt_of f) mxs mxr max_pc empty_et pc"
  2467   apply (case_tac "(mt_of f ! pc)")
  2482   apply (case_tac "(mt_of f ! pc)")
  2468   apply (simp  add: wt_instr_altern_def eff_def norm_eff_def app_def)+
  2483    apply (simp  add: wt_instr_altern_def eff_def norm_eff_def app_def)+
  2469   apply (drule sym)
  2484   apply (drule sym)
  2470   apply (simp add: comp_widen xcpt_app_def)
  2485   apply (simp add: comp_widen xcpt_app_def)
  2471   done
  2486   done
  2472 
  2487 
  2473 
  2488 
  2477   mt = (compTpMethod G C jmdcl);
  2492   mt = (compTpMethod G C jmdcl);
  2478   (mxs, mxl, bc, et) = mtd_mb (compMethod G C jmdcl) \<rbrakk>
  2493   (mxs, mxl, bc, et) = mtd_mb (compMethod G C jmdcl) \<rbrakk>
  2479   \<Longrightarrow> wt_method (comp G) C pTs rT mxs mxl bc et mt"
  2494   \<Longrightarrow> wt_method (comp G) C pTs rT mxs mxl bc et mt"
  2480 
  2495 
  2481   (* show statement for wt_method_altern *)
  2496   (* show statement for wt_method_altern *)
  2482 apply (rule wt_method_altern_wt_method)
  2497   apply (rule wt_method_altern_wt_method)
  2483 
  2498 
  2484 apply (subgoal_tac "wf_java_mdecl G C jmdcl")
  2499   apply (subgoal_tac "wf_java_mdecl G C jmdcl")
  2485 apply (subgoal_tac "wf_mhead G (mn, pTs) rT")
  2500    apply (subgoal_tac "wf_mhead G (mn, pTs) rT")
  2486 apply (subgoal_tac "is_class G C")
  2501     apply (subgoal_tac "is_class G C")
  2487 apply (subgoal_tac "\<forall> jmb. \<exists> pns lvars blk res. jmb = (pns, lvars, blk, res)")
  2502      apply (subgoal_tac "\<forall>jmb. \<exists> pns lvars blk res. jmb = (pns, lvars, blk, res)")
  2488    apply (drule_tac x=jmb in spec, (erule exE)+)
  2503       apply (drule_tac x=jmb in spec, (erule exE)+)
  2489 apply (subgoal_tac "\<exists> E. (E = (local_env G C (mn, pTs) pns lvars) \<and> E \<turnstile> blk \<surd> \<and> 
  2504       apply (subgoal_tac "\<exists>E. (E = (local_env G C (mn, pTs) pns lvars) \<and> E \<turnstile> blk \<surd> \<and>
  2490                          (\<exists>T. E\<turnstile>res::T \<and> G\<turnstile>T\<preceq>rT))")
  2505                               (\<exists>T. E\<turnstile>res::T \<and> G\<turnstile>T\<preceq>rT))")
  2491    apply (erule exE, (erule conjE)+)+
  2506        apply (erule exE, (erule conjE)+)+
  2492 apply (simp add: compMethod_def compTpMethod_def split_beta)
  2507        apply (simp add: compMethod_def compTpMethod_def split_beta)
  2493 apply (rule_tac T=T and LT="inited_LT C pTs lvars" and ST=start_ST in wt_method_comp_aux)
  2508        apply (rule_tac T=T and LT="inited_LT C pTs lvars" and ST=start_ST in wt_method_comp_aux)
  2494 
  2509 
  2495   (* bc *)
  2510                 (* bc *)
  2496 apply (simp only: append_assoc [symmetric])
  2511                 apply (simp only: append_assoc [symmetric])
  2497 
  2512 
  2498   (* comb *)
  2513                (* comb *)
  2499 apply (simp only: comb_assoc [symmetric])
  2514                apply (simp only: comb_assoc [symmetric])
  2500 
  2515 
  2501   (* bc_corresp *)
  2516               (* bc_corresp *)
  2502 apply (rule wt_method_comp_wo_return)
  2517               apply (rule wt_method_comp_wo_return)
  2503   apply assumption+
  2518                     apply assumption+
  2504   apply (simp (no_asm_use) only: append_assoc)
  2519                   apply (simp (no_asm_use) only: append_assoc)
  2505   apply (rule HOL.refl)
  2520                  apply (rule HOL.refl)
  2506   apply (simp (no_asm_simp))+
  2521                 apply (simp (no_asm_simp))+
  2507   apply (simp (no_asm_simp) add: inited_LT_def)
  2522               apply (simp (no_asm_simp) add: inited_LT_def)
  2508 
  2523 
  2509   (* start_sttp_resp *)
  2524              (* start_sttp_resp *)
  2510 apply (simp add: start_sttp_resp_cons_comb_cons_r)+
  2525              apply (simp add: start_sttp_resp_cons_comb_cons_r)+
  2511 
  2526 
  2512   (* wf_mhead / is_class *)
  2527           (* wf_mhead / is_class *)
  2513 apply (simp add: wf_mhead_def comp_is_type)
  2528           apply (simp add: wf_mhead_def comp_is_type)
  2514 apply (simp add: comp_is_class)
  2529          apply (simp add: comp_is_class)
  2515 
  2530 
  2516   (* sttp_of .. = (T # ST, LT) *)
  2531         (* sttp_of .. = (T # ST, LT) *)
  2517 apply (simp (no_asm_simp) add: compTpInitLvars_LT_ST compTpExpr_LT_ST compTpStmt_LT_ST is_inited_LT_def)
  2532         apply (simp (no_asm_simp) add: compTpInitLvars_LT_ST compTpExpr_LT_ST compTpStmt_LT_ST is_inited_LT_def)
  2518 apply (subgoal_tac "(snd (compTpInitLvars (pns, lvars, blk, res) lvars
  2533        apply (subgoal_tac "(snd (compTpInitLvars (pns, lvars, blk, res) lvars
  2519                               (start_ST, start_LT C pTs (length lvars))))
  2534                             (start_ST, start_LT C pTs (length lvars))))
  2520                 = (start_ST, inited_LT C pTs lvars)") 
  2535                            = (start_ST, inited_LT C pTs lvars)")
  2521    prefer 2 apply (rule compTpInitLvars_LT_ST) apply (rule HOL.refl) apply assumption
  2536         prefer 2
  2522 apply (subgoal_tac "(snd (compTpStmt (pns, lvars, blk, res) G blk
  2537         apply (rule compTpInitLvars_LT_ST)
  2523                        (start_ST, inited_LT C pTs lvars))) 
  2538          apply (rule HOL.refl)
  2524                 = (start_ST, inited_LT C pTs lvars)") 
  2539         apply assumption
  2525    prefer 2 apply (erule conjE)+
  2540        apply (subgoal_tac "(snd (compTpStmt (pns, lvars, blk, res) G blk
  2526    apply (rule compTpStmt_LT_ST) apply (rule HOL.refl) apply assumption+
  2541                             (start_ST, inited_LT C pTs lvars)))
  2527    apply (simp only:)+ apply (simp (no_asm_simp) add: is_inited_LT_def)
  2542                             = (start_ST, inited_LT C pTs lvars)")
  2528    apply (simp (no_asm_simp) add: is_inited_LT_def)
  2543         prefer 2 apply (erule conjE)+
  2529 
  2544         apply (rule compTpStmt_LT_ST)
  2530 
  2545              apply (rule HOL.refl)
  2531    (* Return *)
  2546             apply assumption+
  2532 apply (intro strip)
  2547          apply (simp only:)+
  2533 apply (rule_tac T=T and ST=start_ST and LT="inited_LT C pTs lvars" in wt_instr_Return)
  2548         apply (simp (no_asm_simp) add: is_inited_LT_def)
  2534 apply (simp (no_asm_simp) add: nth_append 
  2549        apply (simp (no_asm_simp) add: is_inited_LT_def)
  2535   length_compTpInitLvars length_compTpStmt length_compTpExpr)
  2550 
  2536 apply (simp only: compTpInitLvars_LT_ST compTpStmt_LT_ST compTpExpr_LT_ST 
  2551 
  2537   nochangeST_def)
  2552        (* Return *)
  2538 apply (simp only: is_inited_LT_def compTpStmt_LT_ST compTpExpr_LT_ST)
  2553        apply (intro strip)
  2539 apply (simp (no_asm_simp))+
  2554        apply (rule_tac T=T and ST=start_ST and LT="inited_LT C pTs lvars" in wt_instr_Return)
  2540 apply simp
  2555           apply (simp (no_asm_simp) add: nth_append length_compTpInitLvars length_compTpStmt length_compTpExpr)
  2541 
  2556           apply (simp only: compTpInitLvars_LT_ST compTpStmt_LT_ST compTpExpr_LT_ST nochangeST_def)
  2542   (* subgoal \<exists> E. \<dots> *)
  2557           apply (simp only: is_inited_LT_def compTpStmt_LT_ST compTpExpr_LT_ST)
  2543 apply (simp add: wf_java_mdecl_def local_env_def)
  2558           apply (simp (no_asm_simp))+
  2544 
  2559       apply simp
  2545   (* subgoal jmb = (\<dots>) *)
  2560 
  2546 apply (simp only: split_paired_All, simp)
  2561       (* subgoal \<exists> E. \<dots> *)
  2547 
  2562       apply (simp add: wf_java_mdecl_def local_env_def)
  2548   (* subgoal is_class / wf_mhead / wf_java_mdecl *)
  2563 
  2549 apply (blast intro: methd [THEN conjunct2])
  2564      (* subgoal jmb = (\<dots>) *)
  2550 apply (frule wf_prog_wf_mdecl, assumption+) apply (simp only:) apply (simp add: wf_mdecl_def)
  2565      apply (simp only: split_paired_All, simp)
  2551 apply (rule wf_java_prog_wf_java_mdecl, assumption+)
  2566 
  2552 done
  2567     (* subgoal is_class / wf_mhead / wf_java_mdecl *)
       
  2568     apply (blast intro: methd [THEN conjunct2])
       
  2569    apply (frule wf_prog_wf_mdecl, assumption+)
       
  2570     apply (simp only:)
       
  2571    apply (simp add: wf_mdecl_def)
       
  2572   apply (rule wf_java_prog_wf_java_mdecl, assumption+)
       
  2573   done
  2553 
  2574 
  2554 
  2575 
  2555 lemma comp_set_ms: "(C, D, fs, cms)\<in>set (comp G) 
  2576 lemma comp_set_ms: "(C, D, fs, cms)\<in>set (comp G) 
  2556   \<Longrightarrow> \<exists> ms. (C, D, fs, ms) \<in>set G   \<and> cms = map (compMethod G C) ms"
  2577   \<Longrightarrow> \<exists> ms. (C, D, fs, ms) \<in>set G   \<and> cms = map (compMethod G C) ms"
  2557 by (auto simp: comp_def compClass_def)
  2578   by (auto simp: comp_def compClass_def)
  2558 
  2579 
  2559 
  2580 
  2560   (* ---------------------------------------------------------------------- *)
  2581   (* ---------------------------------------------------------------------- *)
  2561 
  2582 
  2562 subsection "Main Theorem"
  2583 subsection "Main Theorem"
  2563   (* MAIN THEOREM: 
  2584   (* MAIN THEOREM: 
  2564   Methodtype computed by comp is correct for bytecode generated by compTp *)
  2585   Methodtype computed by comp is correct for bytecode generated by compTp *)
  2565 theorem wt_prog_comp: "wf_java_prog G  \<Longrightarrow> wt_jvm_prog (comp G) (compTp G)"
  2586 theorem wt_prog_comp: "wf_java_prog G  \<Longrightarrow> wt_jvm_prog (comp G) (compTp G)"
  2566 apply (simp add: wf_prog_def)
  2587   apply (simp add: wf_prog_def)
  2567 
  2588 
  2568 apply (subgoal_tac "wf_java_prog G") prefer 2 apply (simp add: wf_prog_def)
  2589   apply (subgoal_tac "wf_java_prog G")
  2569 apply (simp (no_asm_simp) add: wf_prog_def wt_jvm_prog_def)
  2590    prefer 2
  2570 apply (simp add: comp_ws_prog)
  2591    apply (simp add: wf_prog_def)
  2571 
  2592   apply (simp (no_asm_simp) add: wf_prog_def wt_jvm_prog_def)
  2572 apply (intro strip)
  2593   apply (simp add: comp_ws_prog)
  2573 apply (subgoal_tac "\<exists> C D fs cms. c = (C, D, fs, cms)")
  2594 
  2574 apply clarify
  2595   apply (intro strip)
  2575 apply (frule comp_set_ms)
  2596   apply (subgoal_tac "\<exists>C D fs cms. c = (C, D, fs, cms)")
  2576 apply clarify
  2597    apply clarify
  2577 apply (drule bspec, assumption)
  2598    apply (frule comp_set_ms)
  2578 apply (rule conjI)
  2599    apply clarify
  2579 
  2600    apply (drule bspec, assumption)
  2580   (* wf_mrT *)
  2601    apply (rule conjI)
  2581 apply (case_tac "C = Object")
  2602 
  2582 apply (simp add: wf_mrT_def)
  2603     (* wf_mrT *)
  2583 apply (subgoal_tac "is_class G D")
  2604     apply (case_tac "C = Object")
  2584 apply (simp add: comp_wf_mrT)
  2605      apply (simp add: wf_mrT_def)
  2585 apply (simp add: wf_prog_def ws_prog_def ws_cdecl_def)
  2606     apply (subgoal_tac "is_class G D")
  2586 apply blast
  2607      apply (simp add: comp_wf_mrT)
  2587 
  2608     apply (simp add: wf_prog_def ws_prog_def ws_cdecl_def)
  2588   (* wf_cdecl_mdecl *)
  2609     apply blast
  2589 apply (simp add: wf_cdecl_mdecl_def)
  2610 
  2590 apply (simp add: split_beta)
  2611    (* wf_cdecl_mdecl *)
  2591 apply (intro strip)
  2612    apply (simp add: wf_cdecl_mdecl_def)
  2592 
  2613    apply (simp add: split_beta)
  2593   (* show wt_method \<dots> *)
  2614    apply (intro strip)
  2594 apply (subgoal_tac "\<exists> sig rT mb. x = (sig, rT, mb)") 
  2615 
  2595 apply (erule exE)+
  2616    (* show wt_method \<dots> *)
  2596 apply (simp (no_asm_simp) add: compMethod_def split_beta)
  2617    apply (subgoal_tac "\<exists>sig rT mb. x = (sig, rT, mb)")
  2597 apply (erule conjE)+
  2618     apply (erule exE)+
  2598 apply (drule_tac x="(sig, rT, mb)" in bspec) apply simp
  2619     apply (simp (no_asm_simp) add: compMethod_def split_beta)
  2599 apply (rule_tac mn="fst sig" and pTs="snd sig" in wt_method_comp)
  2620     apply (erule conjE)+
  2600   apply assumption+
  2621     apply (drule_tac x="(sig, rT, mb)" in bspec)
  2601   apply simp
  2622      apply simp
  2602 apply (simp (no_asm_simp) add: compTp_def)
  2623     apply (rule_tac mn="fst sig" and pTs="snd sig" in wt_method_comp)
  2603 apply (simp (no_asm_simp) add: compMethod_def split_beta)
  2624          apply assumption+
  2604 apply (frule WellForm.methd) apply assumption+
  2625       apply simp
  2605 apply simp
  2626      apply (simp (no_asm_simp) add: compTp_def)
  2606 apply simp
  2627      apply (simp (no_asm_simp) add: compMethod_def split_beta)
  2607 apply (simp add: compMethod_def split_beta)
  2628      apply (frule WellForm.methd) apply assumption+
  2608 apply auto
  2629       apply simp
  2609 done
  2630      apply simp
       
  2631     apply (simp add: compMethod_def split_beta)
       
  2632    apply auto
       
  2633   done
  2610 
  2634 
  2611 
  2635 
  2612 
  2636 
  2613   (**********************************************************************************)
  2637   (**********************************************************************************)
  2614 
  2638