(* Title: HOL/MicroJava/JVM/JVMExec.thy ID: $Id: JVMExec.html 1910 2004-05-19 04:46:04Z kleing $ Author: Cornelia Pusch, Gerwin Klein Copyright 1999 Technische Universitaet Muenchen *) header {* \isaheader{Program Execution in the JVM} *} theory JVMExec = JVMExecInstr + JVMExceptions: syntax instrs_of :: "jvm_prog => cname => mname => instr list" translations "instrs_of P C M" == "fst(snd(snd(snd(snd(snd(method P C M))))))" -- "single step execution:" consts exec :: "jvm_prog × jvm_state => jvm_state option" recdef exec "{}" "exec (P, xp, h, []) = None" "exec (P, None, h, (stk,loc,C,M,pc)#frs) = (let i = instrs_of P C M ! pc; (xcpt', h', frs') = exec_instr i P h stk loc C M pc frs in Some(case xcpt' of None => (None,h',frs') | Some a => find_handler P a h ((stk,loc,C,M,pc)#frs)))" "exec (P, Some xa, h, frs) = None" (* Needed because recdef splits clauses further up *) lemma [simp]: "exec (P, x, h, []) = None" by(cases x) simp+ -- "relational view" consts exec_1 :: "jvm_prog => (jvm_state × jvm_state) set" syntax "@exec_1" :: "jvm_prog => jvm_state => jvm_state => bool" ("_ |-/ _ -jvm->1/ _" [61,61,61] 60) syntax (xsymbols) "@exec_1" :: "jvm_prog => jvm_state => jvm_state => bool" ("_ \<turnstile>/ _ -jvm->1/ _" [61,61,61] 60) translations "P \<turnstile> σ -jvm->1 σ'" == "(σ,σ') ∈ exec_1 P" inductive "exec_1 P" intros exec_1I: "exec (P,σ) = Some σ' ==> P \<turnstile> σ -jvm->1 σ'" -- "reflexive transitive closure:" consts exec_all :: "jvm_prog => jvm_state => jvm_state => bool" ("_ |-/ _ -jvm->/ _" [61,61,61]60) (* FIXME exec_all -> exec_star, also in Def.JVM *) syntax (xsymbols) exec_all :: "jvm_prog => jvm_state => jvm_state => bool" ("(_ \<turnstile>/ _ -jvm->/ _)" [61,61,61]60) defs exec_all_def1: "P \<turnstile> σ -jvm-> σ' ≡ (σ,σ') ∈ (exec_1 P)*" lemma exec_1_def: "exec_1 P = {(σ,σ'). exec (P,σ) = Some σ'}" (*<*)by (auto intro: exec_1I elim: exec_1.elims)(*>*) lemma exec_1_iff: "P \<turnstile> σ -jvm->1 σ' = (exec (P,σ) = Some σ')" (*<*)by (simp add: exec_1_def)(*>*) lemma exec_all_def: "P \<turnstile> σ -jvm-> σ' = ((σ,σ') ∈ {(σ,σ'). exec (P,σ) = Some σ'}*)" (*<*)by (simp add: exec_all_def1 exec_1_def)(*>*) lemma jvm_refl[iff]: "P \<turnstile> σ -jvm-> σ" (*<*)by(simp add: exec_all_def)(*>*) lemma jvm_trans[trans]: "[| P \<turnstile> σ -jvm-> σ'; P \<turnstile> σ' -jvm-> σ'' |] ==> P \<turnstile> σ -jvm-> σ''" (*<*)by(simp add: exec_all_def)(rules intro: rtrancl_trans)(*>*) lemma jvm_one_step1[trans]: "[| P \<turnstile> σ -jvm->1 σ'; P \<turnstile> σ' -jvm-> σ'' |] ==> P \<turnstile> σ -jvm-> σ''" (*<*) by (simp add: exec_all_def1) (rule converse_rtrancl_into_rtrancl)(*>*) lemma jvm_one_step2[trans]: "[| P \<turnstile> σ -jvm-> σ'; P \<turnstile> σ' -jvm->1 σ'' |] ==> P \<turnstile> σ -jvm-> σ''" (*<*) by (simp add: exec_all_def1) (rule rtrancl_into_rtrancl)(*>*) lemma exec_all_conf: "[| P \<turnstile> σ -jvm-> σ'; P \<turnstile> σ -jvm-> σ'' |] ==> P \<turnstile> σ' -jvm-> σ'' ∨ P \<turnstile> σ'' -jvm-> σ'" (*<*)by(simp add: exec_all_def single_valued_def single_valued_confluent)(*>*) lemma exec_all_finalD: "P \<turnstile> (x, h, []) -jvm-> σ ==> σ = (x, h, [])" (*<*) apply(simp only: exec_all_def) apply(erule converse_rtranclE) apply simp apply simp done (*>*) lemma exec_all_deterministic: "[| P \<turnstile> σ -jvm-> (x,h,[]); P \<turnstile> σ -jvm-> σ' |] ==> P \<turnstile> σ' -jvm-> (x,h,[])" (*<*) apply(drule (1) exec_all_conf) apply(blast dest!: exec_all_finalD) done (*>*) text {* The start configuration of the JVM: in the start heap, we call a method @{text m} of class @{text C} in program @{text P}. The @{text this} pointer of the frame is set to @{text Null} to simulate a static method invokation. *} constdefs start_state :: "jvm_prog => cname => mname => jvm_state" "start_state P C M ≡ let (D,Ts,T,mxs,mxl0,b) = method P C M in (None, start_heap P, [([], Null # replicate mxl0 arbitrary, C, M, 0)])" end
lemma
exec (P, x, h, []) = None
lemma exec_1_def:
exec_1 P = {(σ, σ'). exec (P, σ) = ⌊σ'⌋}
lemma exec_1_iff:
P |- σ -jvm->1 σ' = (exec (P, σ) = ⌊σ'⌋)
lemma exec_all_def:
P |- σ -jvm-> σ' = ((σ, σ') : {(σ, σ'). exec (P, σ) = ⌊σ'⌋}^*)
lemma jvm_refl:
P |- σ -jvm-> σ
lemma jvm_trans:
[| P |- σ -jvm-> σ'; P |- σ' -jvm-> σ'' |] ==> P |- σ -jvm-> σ''
lemma jvm_one_step1:
[| P |- σ -jvm->1 σ'; P |- σ' -jvm-> σ'' |] ==> P |- σ -jvm-> σ''
lemma jvm_one_step2:
[| P |- σ -jvm-> σ'; P |- σ' -jvm->1 σ'' |] ==> P |- σ -jvm-> σ''
lemma exec_all_conf:
[| P |- σ -jvm-> σ'; P |- σ -jvm-> σ'' |] ==> P |- σ' -jvm-> σ'' | P |- σ'' -jvm-> σ'
lemma exec_all_finalD:
P |- (x, h, []) -jvm-> σ ==> σ = (x, h, [])
lemma exec_all_deterministic:
[| P |- σ -jvm-> (x, h, []); P |- σ -jvm-> σ' |] ==> P |- σ' -jvm-> (x, h, [])