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) |
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> |
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 |
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? *) |
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) |
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; |