theory VCGExec = ProofCalculus + VCOpt + TermCodegen: section {* Control Flow Graph *} lemma [code]: "addr_of_sys_xcpt s = (if s = NullPointer then 0 else if s = ClassCast then 1 else if s = OutOfMemory then 2 else (arbitrary::nat))" (*<*) by (simp add: addr_of_sys_xcpt_def) (*>*) lemma [code]: "extractTy (Ty ex' tp, ex) = (if ex'=ex then [tp] else [])" (*<*) by simp (*>*) section {* Weakest Precondition Operator *} section {* Wellformedness *} consts prefix :: "('a list \ 'a list) \ bool" recdef prefix "measure (\ (xs,ys). length xs)" "prefix ([],ys) = True" "prefix (x#xs,[]) = False" "prefix (x#xs,y#ys) = ((x = y) \ prefix (xs,ys))" lemma prefix_append: "\ ys. prefix (xs,ys) = (\ zs. ys = xs @ zs)" (*<*) apply (induct xs) apply simp apply simp apply (rule iffI) apply (case_tac ys) apply simp apply simp apply atomize apply (case_tac ys) apply simp apply simp done (*>*) consts checkPosS :: "jbc_prog \ (pos list) \ StrBool" constdefs toString::"pos \ string" "toString \ (\ (C,M,pc::nat). ''(''@C@'',''@M@'',''@BCVExec.toString pc@'')'')" primrec "checkPosS \ [] = TRUE" "checkPosS \ (p#ps) = (if (let scsn = map fst (succsNormal \ p); scse = map fst (succsExcept \ p) in list_all (\p'. ((idx (domC \) p' \ idx (domC \) p) \ anF \ p' \ None) \ p' mem (domC \) \ (p' mem scsn \ handlesEx (fst \) p' = None)) (scsn @ scse) \ (set scse \ set (domC \)) ) \ throwChk (\,cmd \ p,anF \ p,p) \ invokeChk (\,cmd \ p,anF \ p,p) then (checkPosS \ ps) else FALSE (''Error at position::''@(toString p)))" constdefs wfS::"jbc_prog \ StrBool" "wfS \ == (let cp = (checkPosS \ (domC \)) in (if (cp \ TRUE) then cp else (if (\ (checkExTables \)) then FALSE ''Exception tables malformed'' else (if (\ (distinct (classnames (fst \)))) then FALSE ''Classnames not distinct'' else (if (\ (distinct (methodnames (fst \)))) then FALSE ''Methodnames not distinct'' else (if (\ (prefix (SystemClasses,fst \))) then FALSE ''Systemclasses are expected in front.'' else (if (\ (ipc \ mem (domC \))) then FALSE ''initial position missing'' else (let wfTy_P = (wf_jvm_prog_phi (pTy (fst \)) (fst \)) in (if \ wfTy_P then FALSE ''program not welltyped'' else (if (\ (fst (snd (method (fst \) (fst (ipc \)) (fst (snd (ipc \))))) = [])) then FALSE ''main method malformed'' else TRUE))))))))))" lemma wf_eq [code]: "wf Pi = (checkPos Pi (domC Pi) \ checkExTables Pi \ distinct (classnames (fst Pi)) \ distinct (methodnames (fst Pi)) \ prefix (SystemClasses,fst Pi) \ (ipc Pi mem (domC Pi)) \ wf_jvm_prog_phi (pTy (fst Pi)) (fst Pi) \ fst (snd (method (fst Pi) (fst (ipc Pi)) (fst (snd (ipc Pi))))) = [] )" (*<*) apply (rule iffI) apply (simp only: JBC_VCG.wf_def) apply (erule conjE)+ apply (subgoal_tac "\ P An. Pi = (P,An)") prefer 2 apply fastsimp apply (erule exE)+ apply (simp add: prefix_append set_mem_eq BCVExec.methodnames_def methodnames_def JBC_VCG.wf_def) apply (simp only: JBC_VCG.wf_def) apply (erule conjE)+ apply (subgoal_tac "\ P An. Pi = (P,An)") prefer 2 apply fastsimp apply (erule exE)+ apply (simp add: prefix_append set_mem_eq methodnames_def) done (*>*) section {* Setting up the verification environment *} lemma safeP_frs_length: "\ s \ safeP \; fst (snd (fst s)) \ fst (snd (ipc \)) \ \ Suc 0 < length (snd (snd (fst (snd s))))" (*<*) apply (drule JBC_SafetyLogic.safeP_state) apply (erule exE)+ apply (case_tac "frs") apply (simp add: ipc_def main_def) apply simp done (*>*) lemma evalE_Call_Cn: "Suc 0 < length (snd (snd (fst (snd s)))) \ evalE \ s (Call (Cn v)) = v" (*<*) by (simp add: evalE_evalEs.simps split_def) (*>*) lemma evalE_Call_Neg: "Suc 0 < length (snd (snd (fst (snd s)))) \ evalE \ s (Call (Neg ex)) = Bool (\ the_Bool (evalE \ s (Call ex)))" (*<*) by (simp add: evalE_evalEs.simps split_def) (*>*) lemma evalE_Call_Imp: "Suc 0 < length (snd (snd (fst (snd s)))) \ evalE \ s (Call (Imp ex ex')) = Bool (the_Bool (evalE \ s (Call ex)) \ the_Bool (evalE \ s (Call ex')))" (*<*) by (simp add: evalE_evalEs.simps split_def) (*>*) lemma evalE_Call_And: "Suc 0 < length (snd (snd (fst (snd s)))) \ evalE \ s (Call (And es)) = Bool (list_all (\ ex. the_Bool (evalE \ s (Call ex))) es)" (*<*) apply (simp add: evalE_evalEs.simps split_def) apply (induct "es" rule: list.induct) apply simp apply (rule iffI) apply simp apply ( simp add: the_Bool_True) done (*>*) lemma evalE_Call_Num: "Suc 0 < length (snd (snd (fst (snd s)))) \ evalE \ s (Call (Num ex no ex')) = liftI (numop no) (evalE \ s (Call ex)) (evalE \ s (Call ex'))" (*<*) by (simp add: evalE_evalEs.simps split_def) (*>*) lemma evalE_Call_Rel: "Suc 0 < length (snd (snd (fst (snd s)))) \ evalE \ s (Call (Rel ex ro ex')) = liftR (relop ro) (evalE \ s (Call ex)) (evalE \ s (Call ex'))" (*<*) by (simp add: evalE_evalEs.simps split_def) (*>*) lemma evalE_Call_Eq: "Suc 0 < length (snd (snd (fst (snd s)))) \ evalE \ s (Call (Eq ex ex')) = Bool (evalE \ s (Call ex) = (evalE \ s (Call ex')))" (*<*) by (simp add: evalE_evalEs.simps split_def) (*>*) lemma triple_simp: "(fst x, fst (snd x), snd (snd x)) = x" (*<*) by fastsimp (*>*) lemma evalE_Call_Forall: "Suc 0 < length (snd (snd (fst (snd s)))) \ evalE \ s (Call (Forall v ex)) = (let (p, \, e) = s in Bool (\v'. the_Bool (evalE \ (p, \, e\lv := (lv e)(v := v')\) (Call ex))))" (*<*) apply (simp add: evalE_evalEs.simps split_def) apply (rule doubleAllI, rule allI) apply (simp only: callstate_lv triple_simp Let_def split_def fst_conv snd_conv) apply (subgoal_tac "\ p \ e. s = (p,\,e)") prefer 2 apply (rule_tac x="fst s" in exI) apply (rule_tac x="fst (snd s)" in exI) apply (rule_tac x="snd (snd s)" in exI) apply (simp only: triple_simp) apply (subgoal_tac "\ p' \' e'. callstate s = (p',\',e')") prefer 2 apply (rule_tac x="fst (callstate s)" in exI) apply (rule_tac x="fst (snd (callstate s))" in exI) apply (rule_tac x="snd (snd (callstate s))" in exI) apply (simp only: triple_simp) apply (erule exE)+ apply (simp add: callstate_lv_inv) done (*>*) lemma evalE_Ty_Integer: "evalE \ s (Ty ex Integer) = Bool (\x. evalE \ s ex = Intg x)" (*<*) apply (simp add: evalE_evalEs.simps split_def) apply (case_tac "evalE \ s ex") apply simp+ apply (simp add: split_def) done (*>*) lemma evalE_FrNr': "evalE \ s FrNr = Intg (int (length (snd (snd (fst (snd s))))))" (*<*) by (simp add: split_def) (*>*) lemma evalE_And': "evalE \ s (And es) = Bool (list_all (\ ex. the_Bool (evalE \ s ex)) es)" (*<*) apply (simp add: evalE_And list_all_conv) apply (rule iffI) apply (rule ballI) apply (erule_tac x="evalE \ s x" in ballE) apply simp apply (induct es rule: list.induct) apply simp apply simp apply (case_tac "x = a") apply simp apply simp apply (rule ballI) apply (induct es rule: list.induct) apply simp apply simp apply (case_tac "x = evalE \ s a") apply simp apply (rule the_Bool_True) apply simp apply simp done (*>*) lemma evalE_Pos': "the_Bool (evalE \ s (Pos p)) \ fst s = p" (*<*) by (simp add: evalE_Pos) (*>*) lemmas evalE_simps = evalEs_empty evalEs_cons evalE_Cn evalE_Num evalE_Imp evalE_Neg evalE_Rel evalE_Eq evalE_Forall evalE_Neg evalE_And' evalE_Ty_Integer evalE_Ite evalE_FrNr' evalE_Call_Cn evalE_Call_And evalE_Call_Neg evalE_Call_Imp evalE_Call_Num evalE_Call_Rel evalE_Call_Eq evalE_Call_Forall lemmas sem_simps = valid_def evalE_simps liftR_def relop_def liftI_def numop_def the_Intg.simps the_Bool.simps val.simps end