src/HOL/MicroJava/Comp/CorrComp.thy
changeset 14045 a34d89ce6097
parent 14025 d9b155757dc8
child 14143 7544966fa07d
equal deleted inserted replaced
14044:bbd2f7b00736 14045:a34d89ce6097
     6 
     6 
     7 (* Compiler correctness statement and proof *)
     7 (* Compiler correctness statement and proof *)
     8 
     8 
     9 theory CorrComp =  JTypeSafe + LemmasComp:
     9 theory CorrComp =  JTypeSafe + LemmasComp:
    10 
    10 
    11 
    11 declare wf_prog_ws_prog [simp add]
    12 
    12 
    13 (* If no exception is present after evaluation/execution, 
    13 (* If no exception is present after evaluation/execution, 
    14   none can have been present before *)
    14   none can have been present before *)
    15 lemma eval_evals_exec_xcpt:
    15 lemma eval_evals_exec_xcpt:
    16  "((xs,ex,val,xs') \<in> Eval.eval G \<longrightarrow> gx xs' = None \<longrightarrow> gx xs = None) \<and>
    16  "((xs,ex,val,xs') \<in> Eval.eval G \<longrightarrow> gx xs' = None \<longrightarrow> gx xs = None) \<and>
   276 
   276 
   277 
   277 
   278 (**********************************************************************)
   278 (**********************************************************************)
   279 
   279 
   280 
   280 
   281 (* ### to be moved to one of the J/* files *)
       
   282 
       
   283 lemma method_preserves [rule_format (no_asm)]:
   281 lemma method_preserves [rule_format (no_asm)]:
   284   "\<lbrakk> wf_prog wf_mb G; is_class G C; 
   282   "\<lbrakk> wf_prog wf_mb G; is_class G C; 
   285   \<forall> S rT mb. \<forall> cn \<in> fst ` set G. wf_mdecl wf_mb G cn (S,rT,mb)  \<longrightarrow> (P cn S (rT,mb))\<rbrakk>
   283   \<forall> S rT mb. \<forall> cn \<in> fst ` set G. wf_mdecl wf_mb G cn (S,rT,mb)  \<longrightarrow> (P cn S (rT,mb))\<rbrakk>
   286  \<Longrightarrow> \<forall> D. 
   284  \<Longrightarrow> \<forall> D. 
   287   method (G, C) S = Some (D, rT, mb) \<longrightarrow> (P D S (rT,mb))"
   285   method (G, C) S = Some (D, rT, mb) \<longrightarrow> (P D S (rT,mb))"
   288 
   286 
   289 apply (frule WellForm.wf_subcls1)
   287 apply (frule wf_prog_ws_prog [THEN wf_subcls1])
   290 apply (rule subcls1_induct, assumption, assumption)
   288 apply (rule subcls1_induct, assumption, assumption)
   291 
   289 
   292 apply (intro strip)
   290 apply (intro strip)
   293 apply ((drule spec)+, drule_tac x="Object" in bspec)
   291 apply ((drule spec)+, drule_tac x="Object" in bspec)
   294 apply (simp add: wf_prog_def wf_syscls_def)
   292 apply (simp add: wf_prog_def ws_prog_def wf_syscls_def)
   295 apply (subgoal_tac "D=Object") apply simp
   293 apply (subgoal_tac "D=Object") apply simp
   296 apply (drule mp)
   294 apply (drule mp)
   297 apply (frule_tac C=Object in method_wf_mdecl)
   295 apply (frule_tac C=Object in method_wf_mdecl)
   298  apply simp apply assumption apply simp apply assumption apply simp
   296  apply simp
       
   297  apply assumption apply simp apply assumption apply simp
   299 
   298 
   300 apply (subst method_rec) apply simp
   299 apply (subst method_rec) apply simp
   301 apply force
   300 apply force
   302 apply assumption
   301 apply simp
   303 apply (simp only: map_add_def)
   302 apply (simp only: map_add_def)
   304 apply (split option.split)
   303 apply (split option.split)
   305 apply (rule conjI)
   304 apply (rule conjI)
   306 apply force
   305 apply force
   307 apply (intro strip)
   306 apply (intro strip)
   329   in method_preserves)
   328   in method_preserves)
   330 apply (auto simp: wf_mdecl_def wf_java_mdecl_def)
   329 apply (auto simp: wf_mdecl_def wf_java_mdecl_def)
   331 done
   330 done
   332 
   331 
   333 (**********************************************************************)
   332 (**********************************************************************)
   334 
       
   335 (* required for lemma wtpd_expr_call *)
       
   336 lemma ty_exprs_length [simp]: "(E\<turnstile>es[::]Ts \<longrightarrow> length es = length Ts)"
       
   337 apply (subgoal_tac "(E\<turnstile>e::T \<longrightarrow> True) \<and> (E\<turnstile>es[::]Ts \<longrightarrow> length es = length Ts) \<and> (E\<turnstile>s\<surd> \<longrightarrow> True)")
       
   338 apply blast
       
   339 apply (rule ty_expr_ty_exprs_wt_stmt.induct)
       
   340 apply auto
       
   341 done
       
   342 
   333 
   343 constdefs wtpd_expr :: "java_mb env \<Rightarrow> expr \<Rightarrow> bool"
   334 constdefs wtpd_expr :: "java_mb env \<Rightarrow> expr \<Rightarrow> bool"
   344   "wtpd_expr E e == (\<exists> T. E\<turnstile>e :: T)"
   335   "wtpd_expr E e == (\<exists> T. E\<turnstile>e :: T)"
   345   wtpd_exprs :: "java_mb env \<Rightarrow> (expr list) \<Rightarrow> bool"
   336   wtpd_exprs :: "java_mb env \<Rightarrow> (expr list) \<Rightarrow> bool"
   346   "wtpd_exprs E e == (\<exists> T. E\<turnstile>e [::] T)"
   337   "wtpd_exprs E e == (\<exists> T. E\<turnstile>e [::] T)"
   571 done
   562 done
   572 
   563 
   573 
   564 
   574 
   565 
   575 
   566 
   576 
       
   577 
       
   578 
       
   579 
       
   580 
       
   581 (**********************************************************************)
   567 (**********************************************************************)
   582 
   568 
   583 constdefs
   569 lemma state_ok_eval: "\<lbrakk>xs::\<preceq>E; wf_java_prog (prg E); wtpd_expr E e;
   584   state_ok :: "java_mb env \<Rightarrow> xstate \<Rightarrow> bool"
   570   (prg E)\<turnstile>xs -e\<succ>v -> xs'\<rbrakk> \<Longrightarrow>  xs'::\<preceq>E"
   585   "state_ok E xs == xs::\<preceq>E"
   571 apply (simp only: wtpd_expr_def)
   586 
       
   587 
       
   588 lemma state_ok_eval: "\<lbrakk>state_ok E xs; wf_java_prog (prg E); wtpd_expr E e;
       
   589   (prg E)\<turnstile>xs -e\<succ>v -> xs'\<rbrakk> \<Longrightarrow>  state_ok E xs'"
       
   590 apply (simp only: state_ok_def wtpd_expr_def)
       
   591 apply (erule exE)
   572 apply (erule exE)
   592 apply (case_tac xs', case_tac xs, simp only:)
   573 apply (case_tac xs', case_tac xs)
   593 apply (rule eval_type_sound [THEN conjunct1])
   574 apply (auto intro: eval_type_sound [THEN conjunct1])
   594 apply (rule HOL.refl)
   575 done
   595 apply assumption
   576 
   596 apply (subgoal_tac "fst E \<turnstile> (gx xs, gs xs) -e\<succ>v-> (gx xs', gs xs')")
   577 lemma state_ok_evals: "\<lbrakk>xs::\<preceq>E; wf_java_prog (prg E); wtpd_exprs E es;
   597 apply assumption
   578   (xs,es,vs,xs') \<in> Eval.evals (prg E)\<rbrakk> \<Longrightarrow> xs'::\<preceq>E"
   598 apply (auto simp: gx_def gs_def)
   579 apply (simp only: wtpd_exprs_def)
   599 done
       
   600 
       
   601 (* to be moved into JTypeSafe.thy *)
       
   602 lemma evals_type_sound: "!!E s s'.  
       
   603   [| G\<turnstile>(x,s) -es[\<succ>]vs -> (x',s'); G=prg E; wf_java_prog G; (x,s)::\<preceq>E; E\<turnstile>es[::]Ts |]  
       
   604   ==> (x',s')::\<preceq>E \<and> (x'=None --> list_all2 (conf G (heap s')) vs Ts)"
       
   605 apply( simp (no_asm_simp) only: split_tupled_all)
       
   606 apply (drule eval_evals_exec_type_sound 
       
   607              [THEN conjunct2, THEN conjunct1, THEN mp, THEN spec, THEN mp])
       
   608 apply auto
       
   609 done
       
   610 
       
   611 lemma state_ok_evals: "\<lbrakk>state_ok E xs; wf_java_prog (prg E); wtpd_exprs E es;
       
   612   (xs,es,vs,xs') \<in> Eval.evals (prg E)\<rbrakk> \<Longrightarrow>  state_ok E xs'"
       
   613 apply (simp only: state_ok_def wtpd_exprs_def)
       
   614 apply (erule exE)
   580 apply (erule exE)
   615 apply (case_tac xs) apply (case_tac xs') apply (simp only:)
   581 apply (case_tac xs) apply (case_tac xs')
   616 apply (rule evals_type_sound [THEN conjunct1])
   582 apply (auto intro: evals_type_sound [THEN conjunct1])
   617 apply (auto simp: gx_def gs_def)
   583 done
   618 done
   584 
   619 
   585 lemma state_ok_exec: "\<lbrakk>xs::\<preceq>E; wf_java_prog (prg E); wtpd_stmt E st;
   620 lemma state_ok_exec: "\<lbrakk>state_ok E xs; wf_java_prog (prg E); wtpd_stmt E st;
   586   (xs,st,xs') \<in> Eval.exec (prg E)\<rbrakk> \<Longrightarrow>  xs'::\<preceq>E"
   621   (xs,st,xs') \<in> Eval.exec (prg E)\<rbrakk> \<Longrightarrow>  state_ok E xs'"
   587 apply (simp only: wtpd_stmt_def)
   622 apply (simp only: state_ok_def wtpd_stmt_def)
   588 apply (case_tac xs', case_tac xs)
   623 apply (case_tac xs', case_tac xs, simp only:)
   589 apply (auto intro: exec_type_sound)
   624 apply (rule exec_type_sound)
       
   625 apply (rule HOL.refl)
       
   626 apply assumption
       
   627 apply (subgoal_tac "((gx xs, gs xs), st, (gx xs', gs xs')) \<in> Eval.exec (fst E)")
       
   628 apply assumption
       
   629 apply (auto simp: gx_def gs_def)
       
   630 done
   590 done
   631 
   591 
   632 
   592 
   633 lemma state_ok_init: 
   593 lemma state_ok_init: 
   634   "\<lbrakk> wf_java_prog G; state_ok (env_of_jmb G C S) (x, h, l); 
   594   "\<lbrakk> wf_java_prog G; (x, h, l)::\<preceq>(env_of_jmb G C S); 
   635   is_class G dynT;
   595   is_class G dynT;
   636   method (G, dynT) (mn, pTs) = Some (md, rT, pns, lvars, blk, res);
   596   method (G, dynT) (mn, pTs) = Some (md, rT, pns, lvars, blk, res);
   637   list_all2 (conf G h) pvs pTs; G,h \<turnstile> a' ::\<preceq> Class md\<rbrakk>
   597   list_all2 (conf G h) pvs pTs; G,h \<turnstile> a' ::\<preceq> Class md\<rbrakk>
   638 \<Longrightarrow>
   598 \<Longrightarrow>
   639 state_ok (env_of_jmb G md (mn, pTs)) (np a' x, h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a'))"
   599 (np a' x, h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a'))::\<preceq>(env_of_jmb G md (mn, pTs))"
       
   600 apply (frule wf_prog_ws_prog)
   640 apply (frule method_in_md [THEN conjunct2], assumption+)
   601 apply (frule method_in_md [THEN conjunct2], assumption+)
   641 apply (frule method_yields_wf_java_mdecl, assumption, assumption)
   602 apply (frule method_yields_wf_java_mdecl, assumption, assumption)
   642 apply (simp add: state_ok_def env_of_jmb_def gs_def conforms_def split_beta)
   603 apply (simp add: env_of_jmb_def gs_def conforms_def split_beta)
   643 apply (simp add: wf_java_mdecl_def)
   604 apply (simp add: wf_java_mdecl_def)
   644 apply (rule conjI)
   605 apply (rule conjI)
   645 apply (rule lconf_ext)
   606 apply (rule lconf_ext)
   646 apply (rule lconf_ext_list)
   607 apply (rule lconf_ext_list)
   647 apply (rule lconf_init_vars)
   608 apply (rule lconf_init_vars)
   673 apply (case_tac v)
   634 apply (case_tac v)
   674 apply (auto elim: widen.cases)
   635 apply (auto elim: widen.cases)
   675 done
   636 done
   676 
   637 
   677 
   638 
   678 lemma class_expr_is_class: "\<lbrakk>E \<turnstile> e :: Class C; wf_prog wf_mb (prg E)\<rbrakk> 
   639 lemma class_expr_is_class: "\<lbrakk>E \<turnstile> e :: Class C; ws_prog (prg E)\<rbrakk> 
   679   \<Longrightarrow> is_class (prg E) C"
   640   \<Longrightarrow> is_class (prg E) C"
   680 by (case_tac E, auto dest: ty_expr_is_type)
   641 by (case_tac E, auto dest: ty_expr_is_type)
   681 
   642 
   682 
   643 
   683 lemma max_spec_widen: "max_spec G C (mn, pTs) = {((md,rT),pTs')} \<Longrightarrow> 
   644 lemma max_spec_widen: "max_spec G C (mn, pTs) = {((md,rT),pTs')} \<Longrightarrow> 
   684   list_all2 (\<lambda> T T'. G \<turnstile> T \<preceq> T') pTs pTs'"
   645   list_all2 (\<lambda> T T'. G \<turnstile> T \<preceq> T') pTs pTs'"
   685 by (blast dest: singleton_in_set max_spec2appl_meths appl_methsD)
   646 by (blast dest: singleton_in_set max_spec2appl_meths appl_methsD)
   686 
   647 
   687 
   648 
   688 lemma eval_conf: "\<lbrakk>G \<turnstile> s -e\<succ>v-> s'; wf_java_prog G; state_ok E s;
   649 lemma eval_conf: "\<lbrakk>G \<turnstile> s -e\<succ>v-> s'; wf_java_prog G; s::\<preceq>E;
   689   E\<turnstile>e::T; gx s' = None; prg E = G \<rbrakk> 
   650   E\<turnstile>e::T; gx s' = None; prg E = G \<rbrakk> 
   690   \<Longrightarrow> G,gh s'\<turnstile>v::\<preceq>T"
   651   \<Longrightarrow> G,gh s'\<turnstile>v::\<preceq>T"
   691 apply (simp add: gh_def)
   652 apply (simp add: gh_def)
   692 apply (rule_tac x2="fst s" and "s2"="snd s"and "x'2"="fst s'"  
   653 apply (rule_tac x2="fst s" and "s2"="snd s"and "x'2"="fst s'"  
   693   in eval_type_sound [THEN conjunct2 [THEN mp], simplified])
   654   in eval_type_sound [THEN conjunct2 [THEN mp], simplified])
   694 apply (rule sym) apply assumption
   655 apply (rule sym) apply assumption
   695 apply assumption
   656 apply assumption
   696 apply (simp (no_asm_use) add: surjective_pairing [THEN sym])
   657 apply (simp (no_asm_use) add: surjective_pairing [THEN sym])
   697 apply (simp only: state_ok_def gs_def)
   658 apply (simp only: surjective_pairing [THEN sym])
   698 apply (case_tac s, simp)
   659 apply (auto simp add: gs_def gx_def)
   699 apply assumption
       
   700 apply (simp add: gx_def)
       
   701 done
   660 done
   702 
   661 
   703 lemma evals_preserves_conf:
   662 lemma evals_preserves_conf:
   704   "\<lbrakk> G\<turnstile> s -es[\<succ>]vs-> s'; G,gh s \<turnstile> t ::\<preceq> T; E \<turnstile>es[::]Ts;
   663   "\<lbrakk> G\<turnstile> s -es[\<succ>]vs-> s'; G,gh s \<turnstile> t ::\<preceq> T; E \<turnstile>es[::]Ts;
   705   wf_java_prog G; state_ok E s; 
   664   wf_java_prog G; s::\<preceq>E; 
   706   prg E = G \<rbrakk> \<Longrightarrow> G,gh s' \<turnstile> t ::\<preceq> T"
   665   prg E = G \<rbrakk> \<Longrightarrow> G,gh s' \<turnstile> t ::\<preceq> T"
   707 apply (subgoal_tac "gh s\<le>| gh s'")
   666 apply (subgoal_tac "gh s\<le>| gh s'")
   708 apply (frule conf_hext, assumption, assumption)
   667 apply (frule conf_hext, assumption, assumption)
   709 apply (frule eval_evals_exec_type_sound [THEN conjunct2 [THEN conjunct1 [THEN mp]]]) 
   668 apply (frule eval_evals_exec_type_sound [THEN conjunct2 [THEN conjunct1 [THEN mp]]]) 
   710 apply (subgoal_tac "G \<turnstile> (gx s, (gh s, gl s)) -es[\<succ>]vs-> (gx s', (gh s', gl s'))")
   669 apply (subgoal_tac "G \<turnstile> (gx s, (gh s, gl s)) -es[\<succ>]vs-> (gx s', (gh s', gl s'))")
   711 apply assumption
   670 apply assumption
   712 apply (simp add: gx_def gh_def gl_def surjective_pairing [THEN sym])
   671 apply (simp add: gx_def gh_def gl_def surjective_pairing [THEN sym])
   713 apply (case_tac E)
   672 apply (case_tac E)
   714 apply (simp add: gx_def gs_def gh_def gl_def state_ok_def
   673 apply (simp add: gx_def gs_def gh_def gl_def surjective_pairing [THEN sym])
   715   surjective_pairing [THEN sym])
       
   716 done
   674 done
   717 
   675 
   718 lemma eval_of_class: "\<lbrakk> G \<turnstile> s -e\<succ>a'-> s'; E \<turnstile> e :: Class C; 
   676 lemma eval_of_class: "\<lbrakk> G \<turnstile> s -e\<succ>a'-> s'; E \<turnstile> e :: Class C; 
   719   wf_java_prog G; state_ok E s; gx s'=None; a' \<noteq> Null; G=prg E\<rbrakk>
   677   wf_java_prog G; s::\<preceq>E; gx s'=None; a' \<noteq> Null; G=prg E\<rbrakk>
   720   \<Longrightarrow> (\<exists> lc. a' = Addr lc)"
   678   \<Longrightarrow> (\<exists> lc. a' = Addr lc)"
   721 apply (case_tac s, case_tac s', simp)
   679 apply (case_tac s, case_tac s', simp)
   722 apply (frule eval_type_sound, (simp add: state_ok_def gs_def)+)
   680 apply (frule eval_type_sound, (simp add: gs_def)+)
   723 apply (case_tac a')
   681 apply (case_tac a')
   724 apply (auto simp: conf_def)
   682 apply (auto simp: conf_def)
   725 done
   683 done
   726 
   684 
   727 
   685 
   728 lemma dynT_subcls: 
   686 lemma dynT_subcls: 
   729   "\<lbrakk> a' \<noteq> Null; G,h\<turnstile>a'::\<preceq> Class C; dynT = fst (the (h (the_Addr a')));
   687   "\<lbrakk> a' \<noteq> Null; G,h\<turnstile>a'::\<preceq> Class C; dynT = fst (the (h (the_Addr a')));
   730   is_class G dynT; wf_prog wf_mb G \<rbrakk> \<Longrightarrow> G\<turnstile>dynT \<preceq>C C"
   688   is_class G dynT; ws_prog G \<rbrakk> \<Longrightarrow> G\<turnstile>dynT \<preceq>C C"
   731 apply (case_tac "C = Object")
   689 apply (case_tac "C = Object")
   732 apply (simp, rule subcls_C_Object, assumption+)
   690 apply (simp, rule subcls_C_Object, assumption+)
       
   691 apply simp
   733 apply (frule non_np_objD, auto)
   692 apply (frule non_np_objD, auto)
   734 done
   693 done
   735 
   694 
   736 
   695 
   737 lemma method_defined: "\<lbrakk> 
   696 lemma method_defined: "\<lbrakk> 
   744 apply (drule singleton_in_set, drule max_spec2appl_meths)
   703 apply (drule singleton_in_set, drule max_spec2appl_meths)
   745 apply (simp add: appl_methds_def)
   704 apply (simp add: appl_methds_def)
   746 apply ((erule exE)+, (erule conjE)+, (erule exE)+)
   705 apply ((erule exE)+, (erule conjE)+, (erule exE)+)
   747 apply (drule widen_methd)
   706 apply (drule widen_methd)
   748 apply assumption
   707 apply assumption
   749 apply (rule dynT_subcls, assumption+, simp, assumption+)
   708 apply (rule dynT_subcls) apply assumption+ apply simp apply simp
   750 apply (erule exE)+ apply simp
   709 apply (erule exE)+ apply simp
   751 done
   710 done
   752 
   711 
   753 
   712 
   754 
   713 
   762   ((xs,ex,val,xs') \<in> Eval.eval G \<longrightarrow>
   721   ((xs,ex,val,xs') \<in> Eval.eval G \<longrightarrow>
   763   gx xs = None \<longrightarrow> gx xs' = None \<longrightarrow>
   722   gx xs = None \<longrightarrow> gx xs' = None \<longrightarrow>
   764   (\<forall> os CL S.
   723   (\<forall> os CL S.
   765   (class_sig_defined G CL S) \<longrightarrow> 
   724   (class_sig_defined G CL S) \<longrightarrow> 
   766   (wtpd_expr (env_of_jmb G CL S) ex) \<longrightarrow>
   725   (wtpd_expr (env_of_jmb G CL S) ex) \<longrightarrow>
   767   (state_ok (env_of_jmb G CL S) xs) \<longrightarrow>
   726   (xs ::\<preceq> (env_of_jmb G CL S)) \<longrightarrow>
   768   ( {TranslComp.comp G, CL, S} \<turnstile>
   727   ( {TranslComp.comp G, CL, S} \<turnstile>
   769     {gh xs, os, (locvars_xstate G CL S xs)}
   728     {gh xs, os, (locvars_xstate G CL S xs)}
   770     >- (compExpr (gmb G CL S) ex) \<rightarrow>
   729     >- (compExpr (gmb G CL S) ex) \<rightarrow>
   771     {gh xs', val#os, locvars_xstate G CL S xs'}))) \<and> 
   730     {gh xs', val#os, locvars_xstate G CL S xs'}))) \<and> 
   772 
   731 
   773  ((xs,exs,vals,xs') \<in> Eval.evals G \<longrightarrow>
   732  ((xs,exs,vals,xs') \<in> Eval.evals G \<longrightarrow>
   774   gx xs = None \<longrightarrow> gx xs' = None \<longrightarrow>
   733   gx xs = None \<longrightarrow> gx xs' = None \<longrightarrow>
   775   (\<forall> os CL S.
   734   (\<forall> os CL S.
   776   (class_sig_defined G CL S) \<longrightarrow> 
   735   (class_sig_defined G CL S) \<longrightarrow> 
   777   (wtpd_exprs (env_of_jmb G CL S) exs) \<longrightarrow>
   736   (wtpd_exprs (env_of_jmb G CL S) exs) \<longrightarrow>
   778   (state_ok (env_of_jmb G CL S) xs) \<longrightarrow>
   737   (xs::\<preceq>(env_of_jmb G CL S)) \<longrightarrow>
   779   ( {TranslComp.comp G, CL, S} \<turnstile>
   738   ( {TranslComp.comp G, CL, S} \<turnstile>
   780     {gh xs, os, (locvars_xstate G CL S xs)}
   739     {gh xs, os, (locvars_xstate G CL S xs)}
   781     >- (compExprs (gmb G CL S) exs) \<rightarrow>
   740     >- (compExprs (gmb G CL S) exs) \<rightarrow>
   782     {gh xs', (rev vals)@os, (locvars_xstate G CL S xs')}))) \<and> 
   741     {gh xs', (rev vals)@os, (locvars_xstate G CL S xs')}))) \<and> 
   783 
   742 
   784   ((xs,st,xs') \<in> Eval.exec G \<longrightarrow>
   743   ((xs,st,xs') \<in> Eval.exec G \<longrightarrow>
   785    gx xs = None \<longrightarrow> gx xs' = None \<longrightarrow>
   744    gx xs = None \<longrightarrow> gx xs' = None \<longrightarrow>
   786   (\<forall> os CL S.
   745   (\<forall> os CL S.
   787   (class_sig_defined G CL S) \<longrightarrow> 
   746   (class_sig_defined G CL S) \<longrightarrow> 
   788   (wtpd_stmt (env_of_jmb G CL S) st) \<longrightarrow>
   747   (wtpd_stmt (env_of_jmb G CL S) st) \<longrightarrow>
   789   (state_ok (env_of_jmb G CL S) xs) \<longrightarrow>
   748   (xs::\<preceq>(env_of_jmb G CL S)) \<longrightarrow>
   790   ( {TranslComp.comp G, CL, S} \<turnstile>
   749   ( {TranslComp.comp G, CL, S} \<turnstile>
   791     {gh xs, os, (locvars_xstate G CL S xs)}
   750     {gh xs, os, (locvars_xstate G CL S xs)}
   792     >- (compStmt (gmb G CL S) st) \<rightarrow>
   751     >- (compStmt (gmb G CL S) st) \<rightarrow>
   793     {gh xs', os, (locvars_xstate G CL S xs')})))"
   752     {gh xs', os, (locvars_xstate G CL S xs')})))"
   794 apply (rule Eval.eval_evals_exec.induct)
   753 apply (rule Eval.eval_evals_exec.induct)
   795 
   754 
   796 (* case XcptE *)
   755 (* case XcptE *)
   797 apply simp
   756 apply simp
   798 
   757 
   799 (* case NewC *) 
   758 (* case NewC *) 
   800 apply clarify
   759 apply clarify 
   801 apply (frule wf_subcls1) (* establish  wf ((subcls1 G)^-1) *)
   760 apply (frule wf_prog_ws_prog [THEN wf_subcls1]) (* establish  wf ((subcls1 G)^-1) *)
   802 apply (simp add: c_hupd_hp_invariant)
   761 apply (simp add: c_hupd_hp_invariant)
   803 apply (rule progression_one_step)
   762 apply (rule progression_one_step)
   804 apply (rotate_tac 1, drule sym) (* reverse equation (a, None) = new_Addr (fst s) *)
   763 apply (rotate_tac 1, drule sym) (* reverse equation (a, None) = new_Addr (fst s) *)
   805 apply (simp add: locvars_xstate_def locvars_locals_def comp_fields)
   764 apply (simp add: locvars_xstate_def locvars_locals_def comp_fields)
   806 
   765 
   826 
   785 
   827 (* case BinOp *)
   786 (* case BinOp *)
   828 apply (intro allI impI)
   787 apply (intro allI impI)
   829 apply (frule_tac xs=s1 in eval_xcpt, assumption) (* establish (gx s1 = None) *)
   788 apply (frule_tac xs=s1 in eval_xcpt, assumption) (* establish (gx s1 = None) *)
   830 apply (frule wtpd_expr_binop)
   789 apply (frule wtpd_expr_binop)
   831 (* establish (state_ok \<dots> s1) *)
   790 (* establish (s1::\<preceq> \<dots>) *)
   832 apply (frule_tac e=e1 in state_ok_eval) apply (simp (no_asm_simp)) apply simp apply (simp (no_asm_use) only: env_of_jmb_fst) 
   791 apply (frule_tac e=e1 in state_ok_eval) apply (simp (no_asm_simp)) apply simp apply (simp (no_asm_use) only: env_of_jmb_fst) 
   833 
   792 
   834 
   793 
   835 apply (simp (no_asm_use) only: compExpr_compExprs.simps)
   794 apply (simp (no_asm_use) only: compExpr_compExprs.simps)
   836 apply (rule_tac "instrs0.0" = "compExpr (gmb G CL S) e1" in progression_transitive, simp) apply blast
   795 apply (rule_tac "instrs0.0" = "compExpr (gmb G CL S) e1" in progression_transitive, simp) apply blast
   894    (* establish x1 = None  and  a' \<noteq> Null  *)
   853    (* establish x1 = None  and  a' \<noteq> Null  *)
   895 apply (frule_tac xs="(np a' x1, s1)" in eval_xcpt)
   854 apply (frule_tac xs="(np a' x1, s1)" in eval_xcpt)
   896 apply (simp only: gx_conv, simp only: gx_conv, frule np_NoneD, erule conjE)
   855 apply (simp only: gx_conv, simp only: gx_conv, frule np_NoneD, erule conjE)
   897 
   856 
   898 
   857 
   899   (* establish (state_ok \<dots> (Norm s1)) *)
   858   (* establish ((Norm s1)::\<preceq> \<dots>) *)
   900 apply (frule_tac e=e1 in state_ok_eval) apply (simp (no_asm_simp) only: env_of_jmb_fst) apply assumption apply (simp (no_asm_use) only: env_of_jmb_fst) 
   859 apply (frule_tac e=e1 in state_ok_eval) apply (simp (no_asm_simp) only: env_of_jmb_fst) 
       
   860    apply assumption apply (simp (no_asm_use) only: env_of_jmb_fst) 
   901 
   861 
   902 apply (simp only: compExpr_compExprs.simps)
   862 apply (simp only: compExpr_compExprs.simps)
   903 
   863 
   904 apply (rule_tac "instrs0.0" = "(compExpr (gmb G CL S) e1)" in progression_transitive, rule HOL.refl)
   864 apply (rule_tac "instrs0.0" = "(compExpr (gmb G CL S) e1)" in progression_transitive, rule HOL.refl)
   905 apply fast (* blast does not seem to work - why? *)
   865 apply fast (* blast does not seem to work - why? *)
   934 
   894 
   935 (* case Cons *)
   895 (* case Cons *)
   936 apply (intro allI impI)
   896 apply (intro allI impI)
   937 apply (frule_tac xs=s1 in evals_xcpt, simp only: gx_conv) (* establish gx s1 = None *)
   897 apply (frule_tac xs=s1 in evals_xcpt, simp only: gx_conv) (* establish gx s1 = None *)
   938 apply (frule wtpd_exprs_cons)
   898 apply (frule wtpd_exprs_cons)
   939    (* establish (state_ok \<dots> (Norm s0)) *)
   899    (* establish ((Norm s0)::\<preceq> \<dots>) *)
   940 apply (frule_tac e=e in state_ok_eval) apply (simp (no_asm_simp) only: env_of_jmb_fst) apply simp apply (simp (no_asm_use) only: env_of_jmb_fst)
   900 apply (frule_tac e=e in state_ok_eval) apply (simp (no_asm_simp) only: env_of_jmb_fst) apply simp apply (simp (no_asm_use) only: env_of_jmb_fst)
   941 
   901 
   942 apply simp
   902 apply simp
   943 apply (rule_tac "instrs0.0" = "(compExpr (gmb G CL S) e)" in progression_transitive, rule HOL.refl)
   903 apply (rule_tac "instrs0.0" = "(compExpr (gmb G CL S) e)" in progression_transitive, rule HOL.refl)
   944 apply fast
   904 apply fast
   965 (* case Comp *)
   925 (* case Comp *)
   966 apply (intro allI impI)
   926 apply (intro allI impI)
   967 apply (frule_tac xs=s1 in exec_xcpt, assumption) (* establish (gx s1 = None) *)
   927 apply (frule_tac xs=s1 in exec_xcpt, assumption) (* establish (gx s1 = None) *)
   968 apply (frule wtpd_stmt_comp)
   928 apply (frule wtpd_stmt_comp)
   969 
   929 
   970   (* establish (state_ok \<dots>  s1) *)
   930   (* establish (s1::\<preceq> \<dots>) *)
   971 apply (frule_tac st=c1 in state_ok_exec) apply (simp (no_asm_simp) only: env_of_jmb_fst) apply simp apply (simp (no_asm_use) only: env_of_jmb_fst)
   931 apply (frule_tac st=c1 in state_ok_exec) apply (simp (no_asm_simp) only: env_of_jmb_fst) apply simp apply (simp (no_asm_use) only: env_of_jmb_fst)
   972 
   932 
   973 apply simp
   933 apply simp
   974 apply (rule_tac "instrs0.0" = "(compStmt (gmb G CL S) c1)" in progression_transitive, rule HOL.refl)
   934 apply (rule_tac "instrs0.0" = "(compStmt (gmb G CL S) c1)" in progression_transitive, rule HOL.refl)
   975 apply fast
   935 apply fast
   978 
   938 
   979 (* case Cond *)
   939 (* case Cond *)
   980 apply (intro allI impI)
   940 apply (intro allI impI)
   981 apply (frule_tac xs=s1 in exec_xcpt, assumption) (* establish (gx s1 = None) *)
   941 apply (frule_tac xs=s1 in exec_xcpt, assumption) (* establish (gx s1 = None) *)
   982 apply (frule wtpd_stmt_cond, (erule conjE)+)
   942 apply (frule wtpd_stmt_cond, (erule conjE)+)
   983 (* establish (state_ok \<dots> s1) *)
   943 (* establish (s1::\<preceq> \<dots>) *)
   984 apply (frule_tac e=e in state_ok_eval) 
   944 apply (frule_tac e=e in state_ok_eval) 
   985 apply (simp (no_asm_simp) only: env_of_jmb_fst)
   945 apply (simp (no_asm_simp) only: env_of_jmb_fst)
   986 apply assumption 
   946 apply assumption 
   987 apply (simp (no_asm_use) only: env_of_jmb_fst) 
   947 apply (simp (no_asm_use) only: env_of_jmb_fst) 
   988 (* establish G,gh s1\<turnstile>v::\<preceq>PrimT Boolean *)
   948 (* establish G,gh s1\<turnstile>v::\<preceq>PrimT Boolean *)
  1051 apply (intro allI impI)
  1011 apply (intro allI impI)
  1052 apply (frule_tac xs=s2 in exec_xcpt, assumption) (* establish (gx s2 = None) *)
  1012 apply (frule_tac xs=s2 in exec_xcpt, assumption) (* establish (gx s2 = None) *)
  1053 apply (frule_tac xs=s1 in exec_xcpt, assumption) (* establish (gx s1 = None) *)
  1013 apply (frule_tac xs=s1 in exec_xcpt, assumption) (* establish (gx s1 = None) *)
  1054 apply (frule wtpd_stmt_loop, (erule conjE)+)
  1014 apply (frule wtpd_stmt_loop, (erule conjE)+)
  1055 
  1015 
  1056 (* establish (state_ok \<dots> s1) *)
  1016 (* establish (s1::\<preceq> \<dots>) *)
  1057 apply (frule_tac e=e in state_ok_eval) apply (simp (no_asm_simp) only: env_of_jmb_fst) apply simp apply (simp (no_asm_use) only: env_of_jmb_fst)
  1017 apply (frule_tac e=e in state_ok_eval) apply (simp (no_asm_simp) only: env_of_jmb_fst) apply simp apply (simp (no_asm_use) only: env_of_jmb_fst)
  1058 (* establish (state_ok \<dots> s2) *)
  1018 (* establish (s2::\<preceq> \<dots>) *)
  1059 apply (frule_tac xs=s1 and st=c in state_ok_exec)
  1019 apply (frule_tac xs=s1 and st=c in state_ok_exec)
  1060 apply (simp (no_asm_simp) only: env_of_jmb_fst) apply assumption apply (simp (no_asm_use) only: env_of_jmb_fst)
  1020 apply (simp (no_asm_simp) only: env_of_jmb_fst) apply assumption apply (simp (no_asm_use) only: env_of_jmb_fst)
  1061 
  1021 
  1062 (* establish G,gh s1\<turnstile>v::\<preceq>PrimT Boolean *)
  1022 (* establish G,gh s1\<turnstile>v::\<preceq>PrimT Boolean *)
  1063 apply (frule eval_conf, assumption+, rule env_of_jmb_fst)
  1023 apply (frule eval_conf, assumption+, rule env_of_jmb_fst)
  1092 apply (rule jump_bwd_one_step)
  1052 apply (rule jump_bwd_one_step)
  1093 apply simp
  1053 apply simp
  1094 apply blast
  1054 apply blast
  1095 
  1055 
  1096 (*****)
  1056 (*****)
  1097 (* case method call *) defer (* !!! NEWC *)
  1057 (* case method call *)
  1098 
  1058 
  1099 apply (intro allI impI)
  1059 apply (intro allI impI)
  1100 
  1060 
  1101 apply (frule_tac xs=s3 in eval_xcpt, simp only: gx_conv) (* establish gx s3 = None *)
  1061 apply (frule_tac xs=s3 in eval_xcpt, simp only: gx_conv) (* establish gx s3 = None *)
  1102 apply (frule exec_xcpt, assumption, simp (no_asm_use) only: gx_conv, frule np_NoneD) (* establish x = None \<and> a' \<noteq> Null *)
  1062 apply (frule exec_xcpt, assumption, simp (no_asm_use) only: gx_conv, frule np_NoneD) (* establish x = None \<and> a' \<noteq> Null *)
  1105 apply (frule wtpd_expr_call, (erule conjE)+)
  1065 apply (frule wtpd_expr_call, (erule conjE)+)
  1106 
  1066 
  1107 
  1067 
  1108 (* assumptions about state_ok and is_class *)
  1068 (* assumptions about state_ok and is_class *)
  1109 
  1069 
  1110 (* establish state_ok (env_of_jmb G CL S) s1 *)
  1070 (* establish s1::\<preceq> (env_of_jmb G CL S) *)
  1111 apply (frule_tac xs="Norm s0" and e=e in state_ok_eval)
  1071 apply (frule_tac xs="Norm s0" and e=e in state_ok_eval)
  1112 apply (simp (no_asm_simp) only: env_of_jmb_fst, assumption, simp (no_asm_use) only: env_of_jmb_fst)
  1072 apply (simp (no_asm_simp) only: env_of_jmb_fst, assumption, simp (no_asm_use) only: env_of_jmb_fst)
  1113 
  1073 
  1114 (* establish state_ok (env_of_jmb G CL S) (x, h, l) *)
  1074 (* establish (x, h, l)::\<preceq>(env_of_jmb G CL S) *)
  1115 apply (frule_tac xs=s1 and xs'="(x, h, l)" in state_ok_evals)
  1075 apply (frule_tac xs=s1 and xs'="(x, h, l)" in state_ok_evals)
  1116 apply (simp (no_asm_simp) only: env_of_jmb_fst, assumption, simp only: env_of_jmb_fst)
  1076 apply (simp (no_asm_simp) only: env_of_jmb_fst, assumption, simp only: env_of_jmb_fst)
  1117 
  1077 
  1118 (* establish \<exists> lc. a' = Addr lc *)
  1078 (* establish \<exists> lc. a' = Addr lc *)
  1119 apply (frule (5) eval_of_class, rule env_of_jmb_fst [THEN sym])
  1079 apply (frule (5) eval_of_class, rule env_of_jmb_fst [THEN sym])
  1128 apply (subgoal_tac "is_class G md")
  1088 apply (subgoal_tac "is_class G md")
  1129 apply (subgoal_tac "G\<turnstile>Class dynT \<preceq> Class md")
  1089 apply (subgoal_tac "G\<turnstile>Class dynT \<preceq> Class md")
  1130 apply (subgoal_tac " method (G, md) (mn, pTs) = Some (md, rT, pns, lvars, blk, res)")
  1090 apply (subgoal_tac " method (G, md) (mn, pTs) = Some (md, rT, pns, lvars, blk, res)")
  1131 apply (subgoal_tac "list_all2 (conf G h) pvs pTs")
  1091 apply (subgoal_tac "list_all2 (conf G h) pvs pTs")
  1132 
  1092 
  1133 (* establish state_ok (env_of_jmb G md (mn, pTs)) (np a' x, h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a')) *)
  1093 (* establish (np a' x, h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a'))::\<preceq>(env_of_jmb G md (mn, pTs)) *)
  1134 apply (subgoal_tac "G,h \<turnstile> a' ::\<preceq> Class dynT")
  1094 apply (subgoal_tac "G,h \<turnstile> a' ::\<preceq> Class dynT")
  1135 apply (frule (2) conf_widen)
  1095 apply (frule (2) conf_widen)
  1136 apply (frule state_ok_init, assumption+)
  1096 apply (frule state_ok_init, assumption+)
  1137 
  1097 
  1138 apply (subgoal_tac "class_sig_defined G md (mn, pTs)")
  1098 apply (subgoal_tac "class_sig_defined G md (mn, pTs)")
  1139 apply (frule wtpd_blk, assumption, assumption)
  1099 apply (frule wtpd_blk, assumption, assumption)
  1140 apply (frule wtpd_res, assumption, assumption)
  1100 apply (frule wtpd_res, assumption, assumption)
  1141 apply (subgoal_tac "state_ok (env_of_jmb G md (mn, pTs)) s3")
  1101 apply (subgoal_tac "s3::\<preceq>(env_of_jmb G md (mn, pTs))")
  1142 
  1102 
  1143 (* establish method (TranslComp.comp G, md) (mn, pTs) =
  1103 apply (subgoal_tac "method (TranslComp.comp G, md) (mn, pTs) =
  1144           Some (md, rT, compMethod (pns, lvars, blk, res)) *)
  1104           Some (md, rT, snd (snd (compMethod G md ((mn, pTs), rT, pns, lvars, blk, res))))")
  1145 apply (frule_tac C=md and D=md in comp_method, assumption, assumption)
  1105 prefer 2 apply (simp add: wf_prog_ws_prog [THEN comp_method])
  1146 
  1106 apply (subgoal_tac "method (TranslComp.comp G, dynT) (mn, pTs) =
  1147 (* establish
  1107           Some (md, rT, snd (snd (compMethod G md ((mn, pTs), rT, pns, lvars, blk, res))))")
  1148    method (TranslComp.comp G, dynT) (mn, pTs) =
  1108 prefer 2 apply (simp add: wf_prog_ws_prog [THEN comp_method])
  1149           Some (md, rT, compMethod (pns, lvars, blk, res)) *)
       
  1150  apply (frule_tac C=dynT and D=md in comp_method, assumption, assumption)
       
  1151  apply (simp only: fst_conv snd_conv)
  1109  apply (simp only: fst_conv snd_conv)
  1152 
  1110 
  1153 (* establish length pns = length pTs *)
  1111 (* establish length pns = length pTs *)
  1154 apply (frule method_preserves_length, assumption, assumption) 
  1112 apply (frule method_preserves_length, assumption, assumption) 
  1155 (* establish length pvs = length ps *)
  1113 (* establish length pvs = length ps *)
  1207 apply (subgoal_tac "rev pvs @ a' # os = (rev (a' # pvs)) @ os")
  1165 apply (subgoal_tac "rev pvs @ a' # os = (rev (a' # pvs)) @ os")
  1208 apply (simp only: drop_append)
  1166 apply (simp only: drop_append)
  1209 apply (simp (no_asm_simp))
  1167 apply (simp (no_asm_simp))
  1210 apply (simp (no_asm_simp))
  1168 apply (simp (no_asm_simp))
  1211 
  1169 
  1212 (* show state_ok \<dots> s3 *)
  1170 (* show s3::\<preceq>\<dots> *)
  1213 apply (rule_tac xs = "(np a' x, h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a'))" and st=blk in state_ok_exec)
  1171 apply (rule_tac xs = "(np a' x, h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a'))" and st=blk in state_ok_exec)
  1214 apply assumption apply (simp (no_asm_simp) only: env_of_jmb_fst) 
  1172 apply assumption apply (simp (no_asm_simp) only: env_of_jmb_fst) 
  1215 apply assumption apply (simp (no_asm_use) only: env_of_jmb_fst)
  1173 apply assumption apply (simp (no_asm_use) only: env_of_jmb_fst)
  1216 
  1174 
  1217 (* show class_sig_defined G md (mn, pTs) *)
  1175 (* show class_sig_defined G md (mn, pTs) *)
  1229 apply (erule exE)+ apply (erule conjE)+
  1187 apply (erule exE)+ apply (erule conjE)+
  1230 apply (rule_tac Ts="pTsa" in conf_list_gext_widen) apply assumption
  1188 apply (rule_tac Ts="pTsa" in conf_list_gext_widen) apply assumption
  1231 apply (subgoal_tac "((gx s1, gs s1), ps, pvs, x, h, l) \<in> evals G")
  1189 apply (subgoal_tac "((gx s1, gs s1), ps, pvs, x, h, l) \<in> evals G")
  1232 apply (frule_tac E="env_of_jmb G CL S" in evals_type_sound)
  1190 apply (frule_tac E="env_of_jmb G CL S" in evals_type_sound)
  1233 apply (simp only: env_of_jmb_fst) 
  1191 apply (simp only: env_of_jmb_fst) 
  1234 apply assumption apply (simp only: state_ok_def)
  1192 apply assumption
  1235 apply (simp add: conforms_def xconf_def gs_def)
  1193 apply (simp add: conforms_def xconf_def gs_def)
  1236 apply simp
  1194 apply simp
  1237 apply (simp (no_asm_use) only: gx_def gs_def surjective_pairing [THEN sym])
  1195 apply (simp (no_asm_use) only: gx_def gs_def surjective_pairing [THEN sym])
  1238 apply (simp (no_asm_use) only: ty_exprs_list_all2) apply simp
  1196 apply (simp (no_asm_use) only: ty_exprs_list_all2) apply simp
  1239 apply (simp (no_asm_use) only: gx_def gs_def surjective_pairing [THEN sym])
  1197 apply (simp (no_asm_use) only: gx_def gs_def surjective_pairing [THEN sym])
  1240     (* list_all2 (\<lambda>T T'. G \<turnstile> T \<preceq> T') pTsa pTs *)
  1198     (* list_all2 (\<lambda>T T'. G \<turnstile> T \<preceq> T') pTsa pTs *)
  1241     apply (rule max_spec_widen, simp only: env_of_jmb_fst)
  1199     apply (rule max_spec_widen, simp only: env_of_jmb_fst)
  1242 
  1200 
  1243 
  1201 
  1244 (* show method (G, md) (mn, pTs) = Some (md, rT, pns, lvars, blk, res) *)
  1202 (* show method (G, md) (mn, pTs) = Some (md, rT, pns, lvars, blk, res) *)
  1245 apply (frule method_in_md [THEN conjunct2], assumption+)
  1203 apply (frule wf_prog_ws_prog [THEN method_in_md [THEN conjunct2]], assumption+)
  1246 
  1204 
  1247   (* show G\<turnstile>Class dynT \<preceq> Class md *)
  1205   (* show G\<turnstile>Class dynT \<preceq> Class md *)
  1248 apply (simp (no_asm_use) only: widen_Class_Class)
  1206 apply (simp (no_asm_use) only: widen_Class_Class)
  1249 apply (rule method_wf_mdecl [THEN conjunct1], assumption+)
  1207 apply (rule method_wf_mdecl [THEN conjunct1], assumption+)
  1250 
  1208 
  1251   (* is_class G md *)
  1209   (* is_class G md *)
  1252 apply (rule method_in_md [THEN conjunct1], assumption+)
  1210 apply (rule wf_prog_ws_prog [THEN method_in_md [THEN conjunct1]], assumption+)
  1253 
  1211 
  1254   (* show is_class G dynT *)
  1212   (* show is_class G dynT *)
  1255 apply (frule non_npD) apply assumption
  1213 apply (frule non_npD) apply assumption
  1256 apply (erule exE)+ apply (erule conjE)+
  1214 apply (erule exE)+ apply (erule conjE)+
  1257 apply simp
  1215 apply simp
  1258 apply (rule subcls_is_class2) apply assumption
  1216 apply (rule subcls_is_class2) apply assumption
  1259 apply (frule class_expr_is_class) apply (simp only: env_of_jmb_fst)
  1217 apply (frule class_expr_is_class) apply (simp only: env_of_jmb_fst)
       
  1218 apply (rule wf_prog_ws_prog, assumption)
  1260 apply (simp only: env_of_jmb_fst)
  1219 apply (simp only: env_of_jmb_fst)
  1261 
  1220 
  1262  (* show G,h \<turnstile> a' ::\<preceq> Class C *)
  1221  (* show G,h \<turnstile> a' ::\<preceq> Class C *)
  1263 apply (simp only: wtpd_exprs_def, erule exE)
  1222 apply (simp only: wtpd_exprs_def, erule exE)
  1264 apply (frule evals_preserves_conf)
  1223 apply (frule evals_preserves_conf)
  1278   {(TranslComp.comp G), C, S} \<turnstile> 
  1237   {(TranslComp.comp G), C, S} \<turnstile> 
  1279     {hp, os, (locvars_locals G C S loc)}
  1238     {hp, os, (locvars_locals G C S loc)}
  1280       >- (compExpr (gmb G C S) ex) \<rightarrow> 
  1239       >- (compExpr (gmb G C S) ex) \<rightarrow> 
  1281     {hp', val#os, (locvars_locals G C S loc')}"
  1240     {hp', val#os, (locvars_locals G C S loc')}"
  1282 apply (frule compiler_correctness [THEN conjunct1])
  1241 apply (frule compiler_correctness [THEN conjunct1])
  1283 apply (auto simp: gh_def gx_def gs_def gl_def locvars_xstate_def state_ok_def)
  1242 apply (auto simp: gh_def gx_def gs_def gl_def locvars_xstate_def)
  1284 done
  1243 done
  1285 
  1244 
  1286 theorem compiler_correctness_exec: "
  1245 theorem compiler_correctness_exec: "
  1287   \<lbrakk> ((None,hp,loc), st, (None,hp',loc')) \<in> Eval.exec G;
  1246   \<lbrakk> ((None,hp,loc), st, (None,hp',loc')) \<in> Eval.exec G;
  1288   wf_java_prog G;
  1247   wf_java_prog G;
  1292   {(TranslComp.comp G), C, S} \<turnstile> 
  1251   {(TranslComp.comp G), C, S} \<turnstile> 
  1293     {hp, os, (locvars_locals G C S loc)}
  1252     {hp, os, (locvars_locals G C S loc)}
  1294       >- (compStmt (gmb G C S) st) \<rightarrow>
  1253       >- (compStmt (gmb G C S) st) \<rightarrow>
  1295     {hp', os, (locvars_locals G C S loc')}"
  1254     {hp', os, (locvars_locals G C S loc')}"
  1296 apply (frule compiler_correctness [THEN conjunct2 [THEN conjunct2]])
  1255 apply (frule compiler_correctness [THEN conjunct2 [THEN conjunct2]])
  1297 apply (auto simp: gh_def gx_def gs_def gl_def locvars_xstate_def state_ok_def)
  1256 apply (auto simp: gh_def gx_def gs_def gl_def locvars_xstate_def)
  1298 done
  1257 done
  1299 
  1258 
  1300 (**********************************************************************)
  1259 (**********************************************************************)
  1301 
  1260 
  1302 
  1261 
  1304 declare split_paired_All [simp] split_paired_Ex [simp]
  1263 declare split_paired_All [simp] split_paired_Ex [simp]
  1305 ML_setup {*
  1264 ML_setup {*
  1306 simpset_ref() := simpset() addloop ("split_all_tac", split_all_tac)
  1265 simpset_ref() := simpset() addloop ("split_all_tac", split_all_tac)
  1307 *}
  1266 *}
  1308 
  1267 
       
  1268 declare wf_prog_ws_prog [simp del]
       
  1269 
  1309 end
  1270 end