Up to index of Isabelle/HOL/SafeImp
theory dem_DECREGION(* Title: Lemmas for the translation SVM to JVM. DECREGION Author:Javier de Dios and Ricardo Pe~na Copyright: January 2009, Universidad Complutense de Madrid *) theory dem_DECREGION imports "../JVMSAFE/JVMExec" SVM2JVM SVMSemantics CertifSVM2JVM dem_translation begin no_translations "Norm s" == "(None,s)" no_translations "ex_table_of m" == "snd (snd (snd m))" declare trInstr.simps [simp del] declare equivS.simps [simp del] declare extractBytecode_def [simp del] declare initConsTable_def [simp del] axioms decregion_method: "[| s = (None, shp, hp, ihp,([],vs,safeP, sigSafeMain,pc,z)#[]); shp (heapC,kf) = Some (Intg k); shp (heapC,k0f) = Some (Intg k0); shp (heapC,regionsf) = Some (Addr l); hp l = Some (Arr ty m regS); Invoke_static heapC decregion [] = fst(snd(snd(snd(snd(the(method' (P',safeP) sigSafeMain)))))) ! pc |] ==> P' |- s -jvm-> (None, shp ((heapC,kf)\<mapsto> Intg k0), hp(l \<mapsto> Arr ty ma regS'), ihp, ([],loc,safeP,sigSafeMain,pc+1,z)#[]) ∧ (∀ j ≤ nat k0 . region regS' hp j = region regS hp j)" axioms kf_Some_i: "sha (heapC, kf) = Some (Intg jj)" axioms k0f_Some_i: "sha (heapC, k0f) = Some (Intg ii)" axioms activeCells_3: "[| l' ∉ activeCells regS h k; l ≠ l'; l ≠ l'' |] ==> l' ∉ activeCells regS (h(l \<mapsto> A, l''\<mapsto> B)) k" axioms activeCells_3_1: "[| l' ∉ activeCells regS h k |] ==> l' ∉ activeCells regS (h(l' \<mapsto> A, l''\<mapsto> B)) k" axioms activeCells_5: "la ∉ activeCells regS h k ==> la ∉ activeCells regS' h' k'" axioms equivS_DECREGION: "equivS S S' n ctm d g ==> equivS S S' n ctm d (g |` {l ∈ dom hm. fst (the (hm l)) ≤ nat (the_Intg (the (sha (heapC, k0f))))})" axioms inj_on_DECREGION: "[| ((hm, k), k0, (l, i), S) = ((H, ka), k0a, PC, Sa); inj_on g (dom H) |] ==> inj_on (g |` {l ∈ dom hm. fst (the (hm l)) ≤ nat (the_Intg (the (sha (heapC, k0f))))}) (dom (hm |` {p ∈ dom hm. fst (the (hm p)) ≤ k0}))" axioms equivH_DECREGION: "[| ((hm, k), k0, (l, i), S) = ((H, ka), k0a, PC, Sa); equivH (H, ka) h k' com regS d g |] ==> equivH (hm |` {p ∈ dom hm. fst (the (hm p)) ≤ k0}, k0) (dh(l' \<mapsto> Arr ty ma regS')) (nat (the_Intg (the ((sh((heapC, kf) \<mapsto> the (sh (heapC, k0f)))) (heapC, kf))))) com regS' d (g |` {l ∈ dom hm. fst (the (hm l)) ≤ nat (the_Intg (the (sha (heapC, k0f))))})" lemma execSVMInstr_DECREGION : "[| (P', cdm, ctm, com) = trSVM2JVM ((svms, ctmap), ini, ct, ah, ai, bc); cdm , ctm, com \<turnstile> ((hm, k), k0, (l, i), S) \<triangleq> S1'; (fst (the (map_of svms l)) ! i) = DECREGION; execSVMInst DECREGION (map_of ct) (hm, k) k0 (l, i) S = Either.Right S2; drop (the (cdm (l, i))) (extractBytecode P') = trInstr (the (cdm (l, i))) cdm' ctm' com pcc DECREGION @ bytecode' |] ==> ∃ v' sh' dh' ih' fms' . P' \<turnstile> S1' -jvm-> (v',sh',dh',ih', fms') ∧ cdm , ctm, com \<turnstile> S2 \<triangleq> (v',sh',dh',ih', fms')" (* First, we make the tuples explicit *) apply (case_tac S1') apply (rename_tac v tup) apply (case_tac tup) apply (rename_tac sh tup) apply (case_tac tup) apply (rename_tac dh tup) apply (case_tac tup) apply (rename_tac ih fms) apply (simp) apply (unfold equivState_def) apply (elim exE,elim conjE) (* we go on with the main goal. We instantiate the arrival JVM state*) apply (rule_tac x="None" in exI) apply (rule_tac x="sh((heapC,kf)\<mapsto> the (sh (heapC, k0f)))" in exI) apply (rule_tac x="dh(l' \<mapsto> Arr ty ma regS')" in exI) apply (rule_tac x="ih" in exI) apply (rule_tac x="[([], vs, safeP, sigSafeMain, pc+1, ref)]" in exI) apply (rule conjI) apply (subgoal_tac "sha (heapC, k0f) = Some (Intg ii)") apply (subgoal_tac "sha (heapC, kf) = Some (Intg jj)") (* Now, we prove that the JVM sequence leads to the arrival state *) apply (subgoal_tac "P' |- (v, sh, dh, ih,fms) -jvm-> (None, sh ((heapC,kf)\<mapsto> Intg (the_Intg (the (sha (heapC, k0f))))), dh (l' \<mapsto> Arr ty ma regS'), ih, ([],vs,safeP,sigSafeMain,pc+1,ref)#[]) ∧ (∀ j ≤ nat (the_Intg (the (sha (heapC, k0f)))) . region regS' dh j = region regS dh j)") apply (elim conjE) apply(simp) apply (rule decregion_method) apply (simp,simp,simp,simp,simp) (* We prove that the executed instruction corresponds with the translation *) apply (unfold extractBytecode_def) apply (unfold trInstr.simps) apply clarify apply (rule sym) apply (rule_tac ys="[]" in nth_via_drop_append) apply simp apply (rule kf_Some_i) apply (rule k0f_Some_i) (* Now we prove the equivalence relation *) apply (frule nonJumping_Suc_pc) apply (erule_tac sym [where t="DECREGION"]) apply (simp add: nonJumping.simps) apply (simp add: trInstr.simps) apply (rule_tac x="hm |` {p ∈ dom hm. fst (the (hm p)) ≤ k0}" in exI) apply (rule_tac x="k0" in exI) apply (rule_tac x="k0" in exI) apply (rule_tac x="(l,Suc i)" in exI) apply (rule_tac x="S" in exI) apply (rule_tac x="sh((heapC, kf) \<mapsto> the (sh (heapC, k0f)))" in exI) apply (rule_tac x="dh(l' \<mapsto> Arr ty ma regS')" in exI) apply (rule_tac x="ih" in exI) apply (rule_tac x="vs" in exI) apply (rule_tac x="pc + 1" in exI) apply (rule_tac x="ref" in exI) apply (rule_tac x="nat (the_Intg (the ((sh((heapC, kf) \<mapsto> the (sh (heapC, k0f)))) (heapC, kf))))" in exI) apply (rule_tac x="nat (the_Intg (the ((sh((heapC, kf) \<mapsto> the (sh (heapC, k0f)))) (heapC, k0f))))" in exI) apply (rule_tac x="la" in exI) apply (rule_tac x="ty" in exI) apply (rule_tac x="m" in exI) apply (rule_tac x="S'" in exI) apply (rule_tac x="n" in exI) apply (rule_tac x="l'" in exI) apply (rule_tac x="regS'" in exI) apply (rule_tac x="l''" in exI) apply (rule_tac x="ma" in exI) apply (rule_tac x="m''" in exI) apply (rule_tac x="d" in exI) apply (rule_tac x="g |` {l ∈ dom hm. fst (the (hm l)) ≤ nat (the_Intg (the (sha (heapC, k0f))))}" in exI) apply (rule conjI, clarsimp) apply (rule conjI, rule refl) apply (rule conjI, rule refl) apply (rule conjI, rule refl) apply (rule conjI) apply (simp add: stackC_def add: heapC_def) apply (rule conjI, assumption) apply (rule conjI) apply clarsimp apply (rule conjI) apply (rule activeCells_5,assumption) apply (rule conjI) apply (rule activeCells_5,assumption) apply (rule activeCells_5,assumption) apply (rule conjI) apply clarsimp apply (rule conjI) apply (simp add: stackC_def add: heapC_def) apply (rule conjI) apply (simp add: regionsf_def add: kf_def) apply (rule conjI) apply clarsimp apply (rule conjI) apply (simp add: dirCellC_def add: heapC_def) apply (rule conjI) apply clarsimp apply (rule conjI) apply clarsimp apply (rule conjI) apply (simp add: inj_on_def) apply (rule conjI) apply (rule equivH_DECREGION, assumption+) apply (rule conjI) apply simp apply (rule conjI) apply (clarsimp, rule equivS_DECREGION,assumption) apply (rule conjI) apply clarsimp by simp end
lemma execSVMInstr_DECREGION:
[| (P', cdm, ctm, com) = trSVM2JVM ((svms, ctmap), ini, ct, ah, ai, bc);
cdm , ctm, com \<turnstile> ((hm, k), k0.0, (l, i), S) \<triangleq> S1';
fst (the (map_of svms l)) ! i = DECREGION;
execSVMInst DECREGION (map_of ct) (hm, k) k0.0 (l, i) S = Either.Right S2.0;
drop (the (cdm (l, i))) (extractBytecode P') =
trInstr (the (cdm (l, i))) cdm' ctm' com pcc DECREGION @ bytecode' |]
==> ∃v' sh' dh' ih' fms'.
P' |- S1' -jvm-> (v', sh', dh', ih', fms') ∧
cdm , ctm, com \<turnstile> S2.0 \<triangleq> (v', sh', dh', ih', fms')