264 (characterized by class and signature) *) |
264 (characterized by class and signature) *) |
265 definition env_of_jmb :: "java_mb prog \<Rightarrow> cname \<Rightarrow> sig \<Rightarrow> java_mb env" where |
265 definition env_of_jmb :: "java_mb prog \<Rightarrow> cname \<Rightarrow> sig \<Rightarrow> java_mb env" where |
266 "env_of_jmb G C S == |
266 "env_of_jmb G C S == |
267 (let (mn,pTs) = S; |
267 (let (mn,pTs) = S; |
268 (D,rT,(pns,lvars,blk,res)) = the(method (G, C) S) in |
268 (D,rT,(pns,lvars,blk,res)) = the(method (G, C) S) in |
269 (G,map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C)))" |
269 (G,(map_of lvars)(pns[\<mapsto>]pTs, This\<mapsto>Class C)))" |
270 |
270 |
271 lemma env_of_jmb_fst [simp]: "fst (env_of_jmb G C S) = G" |
271 lemma env_of_jmb_fst [simp]: "fst (env_of_jmb G C S) = G" |
272 by (simp add: env_of_jmb_def split_beta) |
272 by (simp add: env_of_jmb_def split_beta) |
273 |
273 |
274 |
274 |
404 lemma wtpd_blk: |
404 lemma wtpd_blk: |
405 "\<lbrakk> method (G, D) (md, pTs) = Some (D, rT, (pns, lvars, blk, res)); |
405 "\<lbrakk> method (G, D) (md, pTs) = Some (D, rT, (pns, lvars, blk, res)); |
406 wf_prog wf_java_mdecl G; is_class G D \<rbrakk> |
406 wf_prog wf_java_mdecl G; is_class G D \<rbrakk> |
407 \<Longrightarrow> wtpd_stmt (env_of_jmb G D (md, pTs)) blk" |
407 \<Longrightarrow> wtpd_stmt (env_of_jmb G D (md, pTs)) blk" |
408 apply (simp add: wtpd_stmt_def env_of_jmb_def) |
408 apply (simp add: wtpd_stmt_def env_of_jmb_def) |
409 apply (frule_tac P="%D (md, pTs) (rT, (pns, lvars, blk, res)). (G, map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class D)) \<turnstile> blk \<surd> " in method_preserves) |
409 apply (frule_tac P="%D (md, pTs) (rT, (pns, lvars, blk, res)). (G, (map_of lvars)(pns[\<mapsto>]pTs, This\<mapsto>Class D)) \<turnstile> blk \<surd> " in method_preserves) |
410 apply (auto simp: wf_mdecl_def wf_java_mdecl_def) |
410 apply (auto simp: wf_mdecl_def wf_java_mdecl_def) |
411 done |
411 done |
412 |
412 |
413 lemma wtpd_res: |
413 lemma wtpd_res: |
414 "\<lbrakk> method (G, D) (md, pTs) = Some (D, rT, (pns, lvars, blk, res)); |
414 "\<lbrakk> method (G, D) (md, pTs) = Some (D, rT, (pns, lvars, blk, res)); |
415 wf_prog wf_java_mdecl G; is_class G D \<rbrakk> |
415 wf_prog wf_java_mdecl G; is_class G D \<rbrakk> |
416 \<Longrightarrow> wtpd_expr (env_of_jmb G D (md, pTs)) res" |
416 \<Longrightarrow> wtpd_expr (env_of_jmb G D (md, pTs)) res" |
417 apply (simp add: wtpd_expr_def env_of_jmb_def) |
417 apply (simp add: wtpd_expr_def env_of_jmb_def) |
418 apply (frule_tac P="%D (md, pTs) (rT, (pns, lvars, blk, res)). \<exists>T. (G, map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class D)) \<turnstile> res :: T " in method_preserves) |
418 apply (frule_tac P="%D (md, pTs) (rT, (pns, lvars, blk, res)). \<exists>T. (G, (map_of lvars)(pns[\<mapsto>]pTs, This\<mapsto>Class D)) \<turnstile> res :: T " in method_preserves) |
419 apply (auto simp: wf_mdecl_def wf_java_mdecl_def) |
419 apply (auto simp: wf_mdecl_def wf_java_mdecl_def) |
420 done |
420 done |
421 |
421 |
422 |
422 |
423 (**********************************************************************) |
423 (**********************************************************************) |
537 (\<forall> lvals. |
537 (\<forall> lvals. |
538 length lvars = length lvals \<longrightarrow> |
538 length lvars = length lvals \<longrightarrow> |
539 {cG, D, S} \<turnstile> |
539 {cG, D, S} \<turnstile> |
540 {h, os, (a' # pvs @ lvals)} |
540 {h, os, (a' # pvs @ lvals)} |
541 >- (compInitLvars (pns, lvars, blk, res) lvars) \<rightarrow> |
541 >- (compInitLvars (pns, lvars, blk, res) lvars) \<rightarrow> |
542 {h, os, (locvars_xstate G C S (Norm (h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a'))))})" |
542 {h, os, (locvars_xstate G C S (Norm (h, (init_vars lvars)(pns[\<mapsto>]pvs, This\<mapsto>a'))))})" |
543 apply (simp only: compInitLvars_def) |
543 apply (simp only: compInitLvars_def) |
544 apply (frule method_yields_wf_java_mdecl, assumption, assumption) |
544 apply (frule method_yields_wf_java_mdecl, assumption, assumption) |
545 |
545 |
546 apply (simp only: wf_java_mdecl_def) |
546 apply (simp only: wf_java_mdecl_def) |
547 apply (subgoal_tac "(\<forall>y\<in>set pns. y \<notin> set (map fst lvars))") |
547 apply (subgoal_tac "(\<forall>y\<in>set pns. y \<notin> set (map fst lvars))") |
585 "\<lbrakk> wf_java_prog G; (x, h, l)::\<preceq>(env_of_jmb G C S); |
585 "\<lbrakk> wf_java_prog G; (x, h, l)::\<preceq>(env_of_jmb G C S); |
586 is_class G dynT; |
586 is_class G dynT; |
587 method (G, dynT) (mn, pTs) = Some (md, rT, pns, lvars, blk, res); |
587 method (G, dynT) (mn, pTs) = Some (md, rT, pns, lvars, blk, res); |
588 list_all2 (conf G h) pvs pTs; G,h \<turnstile> a' ::\<preceq> Class md\<rbrakk> |
588 list_all2 (conf G h) pvs pTs; G,h \<turnstile> a' ::\<preceq> Class md\<rbrakk> |
589 \<Longrightarrow> |
589 \<Longrightarrow> |
590 (np a' x, h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a'))::\<preceq>(env_of_jmb G md (mn, pTs))" |
590 (np a' x, h, (init_vars lvars)(pns[\<mapsto>]pvs, This\<mapsto>a'))::\<preceq>(env_of_jmb G md (mn, pTs))" |
591 apply (frule wf_prog_ws_prog) |
591 apply (frule wf_prog_ws_prog) |
592 apply (frule method_in_md [THEN conjunct2], assumption+) |
592 apply (frule method_in_md [THEN conjunct2], assumption+) |
593 apply (frule method_yields_wf_java_mdecl, assumption, assumption) |
593 apply (frule method_yields_wf_java_mdecl, assumption, assumption) |
594 apply (simp add: env_of_jmb_def gs_def conforms_def split_beta) |
594 apply (simp add: env_of_jmb_def gs_def conforms_def split_beta) |
595 apply (simp add: wf_java_mdecl_def) |
595 apply (simp add: wf_java_mdecl_def) |
1171 apply (simp only: drop_append) |
1171 apply (simp only: drop_append) |
1172 apply (simp (no_asm_simp)) |
1172 apply (simp (no_asm_simp)) |
1173 apply (simp (no_asm_simp)) |
1173 apply (simp (no_asm_simp)) |
1174 |
1174 |
1175 (* show s3::\<preceq>\<dots> *) |
1175 (* show s3::\<preceq>\<dots> *) |
1176 apply (rule_tac xs = "(np a' x, h, init_vars lvars(pns[\<mapsto>]pvs)(This\<mapsto>a'))" and st=blk in state_ok_exec) |
1176 apply (rule_tac xs = "(np a' x, h, (init_vars lvars)(pns[\<mapsto>]pvs, This\<mapsto>a'))" and st=blk in state_ok_exec) |
1177 apply assumption |
1177 apply assumption |
1178 apply (simp (no_asm_simp) only: env_of_jmb_fst) |
1178 apply (simp (no_asm_simp) only: env_of_jmb_fst) |
1179 apply assumption |
1179 apply assumption |
1180 apply (simp (no_asm_use) only: env_of_jmb_fst) |
1180 apply (simp (no_asm_use) only: env_of_jmb_fst) |
1181 |
1181 |