src/HOL/MicroJava/Comp/CorrCompTp.thy
changeset 14045 a34d89ce6097
parent 14025 d9b155757dc8
child 14174 f3cafd2929d5
equal deleted inserted replaced
14044:bbd2f7b00736 14045:a34d89ce6097
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Martin Strecker
     3     Author:     Martin Strecker
     4     Copyright   GPL 2002
     4     Copyright   GPL 2002
     5 *)
     5 *)
     6 
     6 
     7 theory CorrCompTp =  LemmasComp + JVM + TypeInf + NatCanonify + Altern:
     7 theory CorrCompTp =  LemmasComp + JVM + TypeInf + Altern:
     8 
       
     9 
     8 
    10 declare split_paired_All [simp del]
     9 declare split_paired_All [simp del]
    11 declare split_paired_Ex [simp del]
    10 declare split_paired_Ex [simp del]
    12 
    11 
    13 
    12 
    25 
    24 
    26 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"
    27 by (simp add: local_env_def split_beta)
    26 by (simp add: local_env_def split_beta)
    28 
    27 
    29 
    28 
    30 lemma wt_class_expr_is_class: "\<lbrakk> wf_prog wf_mb G; E \<turnstile> expr :: Class cname;
    29 lemma wt_class_expr_is_class: "\<lbrakk> ws_prog G; E \<turnstile> expr :: Class cname;
    31   E = local_env G C (mn, pTs) pns lvars\<rbrakk>
    30   E = local_env G C (mn, pTs) pns lvars\<rbrakk>
    32   \<Longrightarrow> is_class G cname "
    31   \<Longrightarrow> is_class G cname "
    33 apply (subgoal_tac "((fst E), (snd E)) \<turnstile> expr :: Class cname")
    32 apply (subgoal_tac "((fst E), (snd E)) \<turnstile> expr :: Class cname")
    34 apply (frule ty_expr_is_type) apply simp
    33 apply (frule ty_expr_is_type) apply simp
    35 apply simp apply (simp (no_asm_use))
    34 apply simp apply (simp (no_asm_use))
   306   apply simp
   305   apply simp
   307 
   306 
   308   (* show is_class G cname \<and> field (G, cname) vname = Some (cname, T) *)
   307   (* show is_class G cname \<and> field (G, cname) vname = Some (cname, T) *)
   309   apply (rule field_in_fd) apply assumption+
   308   apply (rule field_in_fd) apply assumption+
   310   (* show is_class G Ca *)
   309   (* show is_class G Ca *)
   311   apply (rule wt_class_expr_is_class, assumption+, rule HOL.refl)
   310   apply (fast intro: wt_class_expr_is_class)
   312 
   311 
   313 (* FAss *)
   312 (* FAss *)
   314 apply (intro strip)
   313 apply (intro strip)
   315 apply (drule FAss_invers, clarify)
   314 apply (drule FAss_invers, clarify)
   316 apply (drule FAcc_invers, clarify)
   315 apply (drule FAcc_invers, clarify)
   483 
   482 
   484 
   483 
   485 lemma states_mono: "\<lbrakk> mxs \<le> mxs' \<rbrakk>
   484 lemma states_mono: "\<lbrakk> mxs \<le> mxs' \<rbrakk>
   486   \<Longrightarrow> states G mxs mxr \<subseteq> states G mxs' mxr"
   485   \<Longrightarrow> states G mxs mxr \<subseteq> states G mxs' mxr"
   487 apply (simp add: states_def JVMType.sl_def)
   486 apply (simp add: states_def JVMType.sl_def)
   488 apply (simp add: Product.esl_def stk_esl_def reg_sl_def upto_esl_def Listn.sl_def Err.sl_def
   487 apply (simp add: Product.esl_def stk_esl_def reg_sl_def 
   489   JType.esl_def)
   488   upto_esl_def Listn.sl_def Err.sl_def  JType.esl_def)
   490 apply (simp add: Err.esl_def Err.le_def Listn.le_def)
   489 apply (simp add: Err.esl_def Err.le_def Listn.le_def)
   491 apply (simp add: Product.le_def Product.sup_def Err.sup_def)
   490 apply (simp add: Product.le_def Product.sup_def Err.sup_def)
   492 apply (simp add: Opt.esl_def Listn.sup_def)
   491 apply (simp add: Opt.esl_def Listn.sup_def)
   493 apply (rule err_mono)
   492 apply (rule err_mono)
   494 apply (rule opt_mono)
   493 apply (rule opt_mono)
   526 lemma pc_succs_shift: "pc'\<in>set (succs i (pc'' + n))
   525 lemma pc_succs_shift: "pc'\<in>set (succs i (pc'' + n))
   527  \<Longrightarrow> ((pc' - n) \<in>set (succs i pc''))"
   526  \<Longrightarrow> ((pc' - n) \<in>set (succs i pc''))"
   528 apply (induct i)
   527 apply (induct i)
   529 apply simp+
   528 apply simp+
   530   (* case Goto *)
   529   (* case Goto *)
   531 apply (simp only: nat_canonify)
   530 apply arith
   532 apply simp
       
   533   (* case Ifcmpeq *)
   531   (* case Ifcmpeq *)
   534 apply simp
   532 apply simp
   535 apply (erule disjE)
   533 apply (erule disjE)
   536 apply simp
   534 apply arith
   537 apply (simp only: nat_canonify)
   535 apply arith
   538 apply simp
       
   539   (* case Throw *)
   536   (* case Throw *)
   540 apply simp
   537 apply simp
   541 done
   538 done
   542 
   539 
   543 
   540 
   545   \<forall> b. ((i = (Goto b) \<or> i=(Ifcmpeq b)) \<longrightarrow> 0 \<le> (int pc'' + b)) \<rbrakk> 
   542   \<forall> b. ((i = (Goto b) \<or> i=(Ifcmpeq b)) \<longrightarrow> 0 \<le> (int pc'' + b)) \<rbrakk> 
   546   \<Longrightarrow> n \<le> pc'"
   543   \<Longrightarrow> n \<le> pc'"
   547 apply (induct i)
   544 apply (induct i)
   548 apply simp+
   545 apply simp+
   549   (* case Goto *)
   546   (* case Goto *)
   550 apply (simp only: nat_canonify)
   547 apply arith
   551 apply simp
       
   552   (* case Ifcmpeq *)
   548   (* case Ifcmpeq *)
   553 apply simp
   549 apply simp
   554 apply (erule disjE)
   550 apply (erule disjE)
   555 apply simp
   551 apply simp
   556 apply (simp only: nat_canonify)
   552 apply arith
   557 apply simp
       
   558   (* case Throw *)
   553   (* case Throw *)
   559 apply simp
   554 apply simp
   560 done
   555 done
   561 
   556 
   562 
   557 
  1253 lemma bc_mt_corresp_Getfield: "\<lbrakk> wf_prog wf_mb G; 
  1248 lemma bc_mt_corresp_Getfield: "\<lbrakk> wf_prog wf_mb G; 
  1254   field (G, C) vname = Some (cname, T);  is_class G C \<rbrakk>
  1249   field (G, C) vname = Some (cname, T);  is_class G C \<rbrakk>
  1255   \<Longrightarrow> bc_mt_corresp [Getfield vname cname] 
  1250   \<Longrightarrow> bc_mt_corresp [Getfield vname cname] 
  1256         (replST (Suc 0) (snd (the (field (G, cname) vname))))
  1251         (replST (Suc 0) (snd (the (field (G, cname) vname))))
  1257         (Class C # ST, LT) (comp G) rT mxr (Suc 0)"
  1252         (Class C # ST, LT) (comp G) rT mxr (Suc 0)"
  1258   apply (frule wf_subcls1)
  1253   apply (frule wf_prog_ws_prog [THEN wf_subcls1])
  1259   apply (frule field_in_fd, assumption+)
  1254   apply (frule field_in_fd, assumption+)
  1260   apply (frule widen_field, assumption+)
  1255   apply (frule widen_field, assumption+)
  1261   apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def)
  1256   apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def)
  1262   apply (simp add: comp_field [THEN sym] comp_subcls1 [THEN sym] comp_widen [THEN sym] comp_is_class [THEN sym])
  1257   apply (simp add: comp_field comp_subcls1 comp_widen comp_is_class)
  1263   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1258   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def)
  1264   apply (intro strip)
  1259   apply (intro strip)
  1265 apply (simp add: check_type_simps)
  1260 apply (simp add: check_type_simps)
  1266 apply clarify
  1261 apply clarify
  1267 apply (rule_tac x="Suc (length ST)" in exI)
  1262 apply (rule_tac x="Suc (length ST)" in exI)
  1268 apply simp+
  1263 apply simp+
  1269 apply (simp only: comp_is_type [THEN sym])
  1264 apply (simp only: comp_is_type)
  1270 apply (rule_tac C=cname in fields_is_type)
  1265 apply (rule_tac C=cname in fields_is_type)
  1271 apply (simp add: field_def)
  1266 apply (simp add: field_def)
  1272 apply (drule JBasis.table_of_remap_SomeD)+
  1267 apply (drule JBasis.table_of_remap_SomeD)+
  1273 apply assumption+
  1268 apply assumption+
       
  1269 apply (erule wf_prog_ws_prog)
       
  1270 apply assumption
  1274 done
  1271 done
  1275 
  1272 
  1276 lemma bc_mt_corresp_Putfield: "\<lbrakk> wf_prog wf_mb G; 
  1273 lemma bc_mt_corresp_Putfield: "\<lbrakk> wf_prog wf_mb G; 
  1277   field (G, C) vname = Some (cname, Ta); G \<turnstile> T \<preceq> Ta; is_class G C \<rbrakk>
  1274   field (G, C) vname = Some (cname, Ta); G \<turnstile> T \<preceq> Ta; is_class G C \<rbrakk>
  1278   \<Longrightarrow> bc_mt_corresp [Putfield vname cname] (popST 2) (T # Class C # T # ST, LT)
  1275   \<Longrightarrow> bc_mt_corresp [Putfield vname cname] (popST 2) (T # Class C # T # ST, LT)
  1279            (comp G) rT mxr (Suc 0)"
  1276            (comp G) rT mxr (Suc 0)"
  1280   apply (frule wf_subcls1)
  1277   apply (frule wf_prog_ws_prog [THEN wf_subcls1])
  1281   apply (frule field_in_fd, assumption+)
  1278   apply (frule field_in_fd, assumption+)
  1282   apply (frule widen_field, assumption+)
  1279   apply (frule widen_field, assumption+)
  1283   apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def)
  1280   apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def)
  1284   apply (simp add: comp_field [THEN sym] comp_subcls1 [THEN sym] comp_widen [THEN sym] comp_is_class [THEN sym])
  1281   apply (simp add: comp_field comp_subcls1 comp_widen comp_is_class)
  1285   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def max_def)
  1282   apply (simp add: max_ssize_def max_of_list_def ssize_sto_def max_def)
  1286 
  1283 
  1287   apply (intro strip)
  1284   apply (intro strip)
  1288 apply (simp add: check_type_simps)
  1285 apply (simp add: check_type_simps)
  1289 apply clarify
  1286 apply clarify
  1300   apply (subgoal_tac "(\<exists>mD' rT' comp_b. 
  1297   apply (subgoal_tac "(\<exists>mD' rT' comp_b. 
  1301     method (comp G, cname) (mname, pTs') = Some (mD', rT', comp_b))")
  1298     method (comp G, cname) (mname, pTs') = Some (mD', rT', comp_b))")
  1302   apply (simp add: comp_is_class)
  1299   apply (simp add: comp_is_class)
  1303   apply (rule_tac x=pTsa in exI)
  1300   apply (rule_tac x=pTsa in exI)
  1304   apply (rule_tac x="Class cname" in exI)
  1301   apply (rule_tac x="Class cname" in exI)
  1305   apply (simp add: max_spec_preserves_length comp_is_class [THEN sym])
  1302   apply (simp add: max_spec_preserves_length comp_is_class)
  1306   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1303   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1307   apply (simp add: comp_widen list_all2_def)
  1304   apply (simp add: split_paired_all comp_widen list_all2_def)
  1308   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1305   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1309   apply (rule exI)+
  1306   apply (rule exI)+
  1310   apply (rule comp_method)
  1307   apply (simp add: wf_prog_ws_prog [THEN comp_method])
  1311   apply assumption+
  1308   apply auto
  1312   done
  1309   done
  1313 
  1310 
  1314 
  1311 
  1315 lemma bc_mt_corresp_Invoke: "\<lbrakk> wf_prog wf_mb G; 
  1312 lemma bc_mt_corresp_Invoke: "\<lbrakk> wf_prog wf_mb G; 
  1316   max_spec G cname (mname, pTsa) = {((md, T), fpTs)};
  1313   max_spec G cname (mname, pTsa) = {((md, T), fpTs)};
  1327     apply (rule HOL.refl) apply assumption
  1324     apply (rule HOL.refl) apply assumption
  1328     apply (simp add: max_ssize_def max_of_list_elem ssize_sto_def)
  1325     apply (simp add: max_ssize_def max_of_list_elem ssize_sto_def)
  1329 
  1326 
  1330   -- {* @{text "<=s"} *}
  1327   -- {* @{text "<=s"} *}
  1331   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1328   apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+)
  1332   apply (frule comp_method, assumption+)
  1329   apply (simp add: wf_prog_ws_prog [THEN comp_method])
  1333   apply (simp add: max_spec_preserves_length [THEN sym])
  1330   apply (simp add: max_spec_preserves_length [THEN sym])
  1334 
  1331 
  1335   -- "@{text check_type}"
  1332   -- "@{text check_type}"
  1336 apply (simp add: max_ssize_def ssize_sto_def max_def)
  1333 apply (simp add: max_ssize_def ssize_sto_def max_def)
  1337 apply (simp add: max_of_list_def)
  1334 apply (simp add: max_of_list_def)
  1339 apply simp
  1336 apply simp
  1340 apply (simp add: check_type_simps)
  1337 apply (simp add: check_type_simps)
  1341 apply clarify
  1338 apply clarify
  1342 apply (rule_tac x="Suc (length ST)" in exI)
  1339 apply (rule_tac x="Suc (length ST)" in exI)
  1343 apply simp+
  1340 apply simp+
  1344 apply (simp only: comp_is_type [THEN sym])
  1341 apply (simp only: comp_is_type)
  1345 apply (frule method_wf_mdecl) apply assumption apply assumption
  1342 apply (frule method_wf_mdecl) apply assumption apply assumption
  1346 apply (simp add: wf_mdecl_def wf_mhead_def)
  1343 apply (simp add: wf_mdecl_def wf_mhead_def)
  1347 apply (simp add: max_def)
  1344 apply (simp add: max_def)
  1348   done
  1345   done
  1349 
  1346 
  1712 apply (simp (no_asm_use))
  1709 apply (simp (no_asm_use))
  1713 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast)
  1710 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast)
  1714 apply (simp (no_asm_simp), rule bc_mt_corresp_Checkcast)
  1711 apply (simp (no_asm_simp), rule bc_mt_corresp_Checkcast)
  1715 apply (simp add: comp_is_class)
  1712 apply (simp add: comp_is_class)
  1716 apply (simp only: compTpExpr_LT_ST)
  1713 apply (simp only: compTpExpr_LT_ST)
       
  1714 apply (drule cast_RefT)
  1717 apply blast
  1715 apply blast
  1718 apply (simp add: start_sttp_resp_def)
  1716 apply (simp add: start_sttp_resp_def)
  1719 
  1717 
  1720 (* Lit *)
  1718 (* Lit *)
  1721 apply (intro allI impI)
  1719 apply (intro allI impI)
  1883 apply clarify
  1881 apply clarify
  1884 apply (simp (no_asm_use))
  1882 apply (simp (no_asm_use))
  1885 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast) 
  1883 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast) 
  1886   apply (simp (no_asm_simp))
  1884   apply (simp (no_asm_simp))
  1887   apply (rule bc_mt_corresp_Getfield) apply assumption+
  1885   apply (rule bc_mt_corresp_Getfield) apply assumption+
  1888      apply (rule wt_class_expr_is_class, assumption+) apply (rule HOL.refl)
  1886      apply (fast intro: wt_class_expr_is_class)
  1889 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1887 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1890 
  1888 
  1891 
  1889 
  1892   (* FAss *)
  1890   (* FAss *)
  1893 apply (intro allI impI)
  1891 apply (intro allI impI)
  1903 apply (rule_tac "bc1.0"="[Dup_x1]" and "bc2.0"="[Putfield vname cname]" in bc_mt_corresp_comb) 
  1901 apply (rule_tac "bc1.0"="[Dup_x1]" and "bc2.0"="[Putfield vname cname]" in bc_mt_corresp_comb) 
  1904   apply (simp (no_asm_simp))+
  1902   apply (simp (no_asm_simp))+
  1905 apply (rule bc_mt_corresp_Dup_x1)
  1903 apply (rule bc_mt_corresp_Dup_x1)
  1906   apply (simp (no_asm_simp) add: dup_x1ST_def)
  1904   apply (simp (no_asm_simp) add: dup_x1ST_def)
  1907 apply (rule bc_mt_corresp_Putfield) apply assumption+
  1905 apply (rule bc_mt_corresp_Putfield) apply assumption+
  1908      apply (rule wt_class_expr_is_class, assumption+) apply (rule HOL.refl)
  1906      apply (fast intro: wt_class_expr_is_class)
  1909 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1907 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1910 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1908 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1911 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1909 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1912 
  1910 
  1913 (* Call *)
  1911 (* Call *)
  1920   apply (simp only: compTpExpr_LT_ST)
  1918   apply (simp only: compTpExpr_LT_ST)
  1921 apply (rule bc_mt_corresp_comb, (rule HOL.refl)+) apply blast
  1919 apply (rule bc_mt_corresp_comb, (rule HOL.refl)+) apply blast
  1922   apply (simp only: compTpExprs_LT_ST)
  1920   apply (simp only: compTpExprs_LT_ST)
  1923   apply (simp (no_asm_simp))
  1921   apply (simp (no_asm_simp))
  1924 apply (rule bc_mt_corresp_Invoke) apply assumption+
  1922 apply (rule bc_mt_corresp_Invoke) apply assumption+
  1925   apply (rule wt_class_expr_is_class, assumption+) apply (rule HOL.refl)
  1923      apply (fast intro: wt_class_expr_is_class)
  1926 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1924 apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1927 apply (rule start_sttp_resp_comb) 
  1925 apply (rule start_sttp_resp_comb) 
  1928   apply (simp (no_asm_simp))
  1926   apply (simp (no_asm_simp))
  1929   apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1927   apply (simp (no_asm_simp) add: start_sttp_resp_def)
  1930 
  1928 
  2245   and "f3.0"="comb_nil"
  2243   and "f3.0"="comb_nil"
  2246   in bc_mt_corresp_comb_wt_instr)
  2244   in bc_mt_corresp_comb_wt_instr)
  2247   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ 
  2245   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ 
  2248   apply (intro strip)
  2246   apply (intro strip)
  2249   apply (rule wt_instr_Goto)
  2247   apply (rule wt_instr_Goto)
  2250   apply (simp (no_asm_simp) add: nat_canonify)
  2248   apply arith
  2251   apply (simp (no_asm_simp) add: nat_canonify)
  2249   apply arith
  2252     (* \<dots> ! nat (int pc + i) = \<dots> ! pc *)
  2250     (* \<dots> ! nat (int pc + i) = \<dots> ! pc *)
  2253   apply (simp (no_asm_simp) add: nat_canonify)
  2251   apply (simp (no_asm_simp))
  2254   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2252   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2255   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
  2253   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
  2256   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2254   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2257   apply (simp (no_asm_simp) only: int_outside_right nat_int)
       
  2258   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2255   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2259   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2256   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2260   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
  2257   apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def)
  2261   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2258   apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)
  2262   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2259   apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST)
  2590 
  2587 
  2591   (* subgoal jmb = (\<dots>) *)
  2588   (* subgoal jmb = (\<dots>) *)
  2592 apply (simp only: split_paired_All, simp)
  2589 apply (simp only: split_paired_All, simp)
  2593 
  2590 
  2594   (* subgoal is_class / wf_mhead / wf_java_mdecl *)
  2591   (* subgoal is_class / wf_mhead / wf_java_mdecl *)
  2595 apply (rule methd [THEN conjunct2]) apply assumption+ apply (simp only:)
  2592 apply (blast intro: methd [THEN conjunct2])
  2596 apply (rule wf_prog_wf_mhead, assumption+) apply (simp only:)
  2593 apply (frule wf_prog_wf_mdecl, assumption+) apply (simp only:) apply (simp add: wf_mdecl_def)
  2597 apply (rule wf_java_prog_wf_java_mdecl, assumption+)
  2594 apply (rule wf_java_prog_wf_java_mdecl, assumption+)
  2598 
  2595 done
  2599 done
       
  2600 
       
  2601 
       
  2602   (**********************************************************************************)
       
  2603 
       
  2604 
  2596 
  2605 
  2597 
  2606 lemma comp_set_ms: "(C, D, fs, cms)\<in>set (comp G) 
  2598 lemma comp_set_ms: "(C, D, fs, cms)\<in>set (comp G) 
  2607   \<Longrightarrow> \<exists> ms. (C, D, fs, ms) \<in>set G   \<and> cms = map (compMethod G C) ms"
  2599   \<Longrightarrow> \<exists> ms. (C, D, fs, ms) \<in>set G   \<and> cms = map (compMethod G C) ms"
  2608 by (auto simp: comp_def compClass_def)
  2600 by (auto simp: comp_def compClass_def)
  2609 
  2601 
  2610 lemma method_body_source: "\<lbrakk> wf_prog wf_mb G; is_class G C;  method (comp G, C) sig = Some (D, rT, cmb) \<rbrakk>  
  2602 
  2611   \<Longrightarrow>  (\<exists> mb. method (G, C) sig = Some (D, rT, mb))"
  2603   (* ---------------------------------------------------------------------- *)
  2612 apply (simp add: comp_method_eq comp_method_result_def)
       
  2613 apply (case_tac "method (G, C) sig")
       
  2614 apply auto
       
  2615 done
       
  2616 
  2604 
  2617 section "Main Theorem"
  2605 section "Main Theorem"
  2618   (* MAIN THEOREM: 
  2606   (* MAIN THEOREM: 
  2619   Methodtype computed by comp is correct for bytecode generated by compTp *)
  2607   Methodtype computed by comp is correct for bytecode generated by compTp *)
  2620 theorem wt_prog_comp: "wf_java_prog G  \<Longrightarrow> wt_jvm_prog (comp G) (compTp G)"
  2608 theorem wt_prog_comp: "wf_java_prog G  \<Longrightarrow> wt_jvm_prog (comp G) (compTp G)"
  2621 apply (simp add: wf_prog_def)
  2609 apply (simp add: wf_prog_def)
       
  2610 
  2622 apply (subgoal_tac "wf_java_prog G") prefer 2 apply (simp add: wf_prog_def)
  2611 apply (subgoal_tac "wf_java_prog G") prefer 2 apply (simp add: wf_prog_def)
  2623 apply (simp (no_asm_simp) add: wf_prog_def wt_jvm_prog_def)
  2612 apply (simp (no_asm_simp) add: wf_prog_def wt_jvm_prog_def)
  2624 apply (simp add:  comp_unique comp_wf_syscls wf_cdecl_def)
  2613 apply (simp add: comp_ws_prog)
       
  2614 
       
  2615 apply (intro strip)
       
  2616 apply (subgoal_tac "\<exists> C D fs cms. c = (C, D, fs, cms)")
  2625 apply clarify
  2617 apply clarify
  2626 apply (frule comp_set_ms)
  2618 apply (frule comp_set_ms)
  2627 apply clarify
  2619 apply clarify
  2628 apply (drule bspec, assumption)
  2620 apply (drule bspec, assumption)
  2629 apply (simp add: comp_wf_fdecl)
       
  2630 apply (simp add: wf_mdecl_def)
       
  2631 
       
  2632 apply (rule conjI)
  2621 apply (rule conjI)
  2633 apply (rule ballI)
  2622 
  2634 apply (subgoal_tac "\<exists> sig rT mb. x = (sig, rT, mb)") prefer 2 apply (case_tac x, simp)
  2623   (* wf_mrT *)
       
  2624 apply (case_tac "C = Object")
       
  2625 apply (simp add: wf_mrT_def)
       
  2626 apply (subgoal_tac "is_class G D")
       
  2627 apply (simp add: comp_wf_mrT)
       
  2628 apply (simp add: wf_prog_def ws_prog_def ws_cdecl_def)
       
  2629 apply blast
       
  2630 
       
  2631   (* wf_cdecl_mdecl *)
       
  2632 apply (simp add: wf_cdecl_mdecl_def)
       
  2633 apply (simp add: split_beta)
       
  2634 apply (intro strip)
       
  2635 
       
  2636   (* show wt_method \<dots> *)
       
  2637 apply (subgoal_tac "\<exists> sig rT mb. x = (sig, rT, mb)") 
  2635 apply (erule exE)+
  2638 apply (erule exE)+
  2636 apply (simp (no_asm_simp) add: compMethod_def split_beta)
  2639 apply (simp (no_asm_simp) add: compMethod_def split_beta)
  2637 apply (erule conjE)+
  2640 apply (erule conjE)+
  2638 apply (drule_tac x="(sig, rT, mb)" in bspec) apply simp
  2641 apply (drule_tac x="(sig, rT, mb)" in bspec) apply simp
  2639 apply (rule conjI)
       
  2640 apply (simp add: comp_wf_mhead)
       
  2641 apply (rule_tac mn="fst sig" and pTs="snd sig" in wt_method_comp)
  2642 apply (rule_tac mn="fst sig" and pTs="snd sig" in wt_method_comp)
  2642   apply assumption+
  2643   apply assumption+
  2643   apply simp
  2644   apply simp
  2644 apply (simp (no_asm_simp) add: compTp_def)
  2645 apply (simp (no_asm_simp) add: compTp_def)
  2645 apply (simp (no_asm_simp) add: compMethod_def split_beta)
  2646 apply (simp (no_asm_simp) add: compMethod_def split_beta)
  2646 apply (frule WellForm.methd) apply assumption+
  2647 apply (frule WellForm.methd) apply assumption+
  2647 apply simp
  2648 apply simp
  2648 apply simp
  2649 apply simp
  2649 apply (simp add: compMethod_def split_beta)
  2650 apply (simp add: compMethod_def split_beta)
  2650 
  2651 apply auto
  2651 apply (rule conjI)
  2652 done
  2652 apply (rule unique_map_fst [THEN iffD1]) 
       
  2653   apply (simp (no_asm_simp) add: compMethod_def split_beta) apply simp
       
  2654 
       
  2655 apply clarify
       
  2656 apply (rule conjI) apply (simp add: comp_is_class)
       
  2657 apply (rule conjI) apply (simp add: comp_subcls)
       
  2658 apply (simp add: compMethod_def split_beta)
       
  2659 apply (intro strip) 
       
  2660   apply (drule_tac x=x in bspec, assumption, drule_tac x="D'" in spec, drule_tac x="rT'" in spec)
       
  2661   apply (erule exE)
       
  2662 
       
  2663 apply (frule method_body_source) apply assumption+
       
  2664 apply (drule mp, assumption)
       
  2665 apply (simp add: comp_widen)
       
  2666 done
       
  2667 
       
  2668 
  2653 
  2669 
  2654 
  2670 
  2655 
  2671   (**********************************************************************************)
  2656   (**********************************************************************************)
  2672 
  2657