header {* \isaheader{VCG Correctness} *} theory VCG_Correctness = VCG: locale correctVCG = VCG + fixes ReachablesAn::"'prog \ ('pos \ 'mem) set" defines "ReachablesAn \ \ \. ReachableFromInv (effS \) (initS \) ({s. \,s \ aF \ (fst s)})" assumes correctInitF: "\ wf \; s \ initS \ \ \ valid \ s (initF \)" assumes correctWpF: "\ wf \; s \ (ReachablesAn \); (s,s')\(effS \); \,s \ (wpF \ (fst s) (fst s') Q) \ \ \,s' \ Q" assumes succsF_complete: "\ wf \; s \ (ReachablesAn \); (s,s') \ (effS \) \ \ (\ B. (fst s',B) \ set (succsF \ (fst s)) \ valid \ s B)" assumes correctSafetyLogic: "\ wf \; \ \ f; s \ (ReachablesAn \) \ \ \,s \ f" (*<*) lemma (in correctVCG) ReachablesAn_init: "\ s \ (initS \) \ \ s \ (ReachablesAn \)" apply (simp add: ReachablesAn_def) apply (rule ReachableFromInv.init) apply assumption+ done (*>*) (*<*) lemma (in correctVCG) ReachablesAn_step: "\ s \ (ReachablesAn \); \,s \ aF \ (fst s); \,s' \ aF \ (fst s'); (s,s') \ (effS \) \ \ s' \ (ReachablesAn \)" apply (simp add: ReachablesAn_def) apply (rule ReachableFromInv.step) apply simp+ done (*>*) (*<*) lemma (in correctVCG) ReachablesAn_initF_aF: "s \ (ReachablesAn \) \ s \ (initS \) \ \,s \ aF \ (fst s)" apply (simp only: ReachablesAn_def) apply (erule ReachableFromInv.elims) apply simp+ done (*>*) (*<*) lemma (in correctVCG) vc_init: "\ wf \; \ \ vcg \; s \ initS \ \ \ \,s \ isafeF \ (fst s)" apply (subgoal_tac "s \ (ReachablesAn \)") prefer 2 apply (rule ReachablesAn_init) apply assumption apply (frule_tac s="s" and f="vcg \" in correctSafetyLogic) apply assumption+ apply (simp add: vcgdef) apply (subgoal_tac "\,s \ Impl (initF \) (isafeF \ (ipc \))") prefer 2 apply (simp add: semConj) apply (drule semImpE) apply (frule_tac s="s" in correctInitF) apply assumption apply (subgoal_tac "fst s = ipc \") prefer 2 apply (rule initF_ipc) apply assumption apply simp apply simp done (*>*) lemma (in correctVCG) isafeF_saF: "\,s \ isafeF \ (fst s) \ \, s \ saF \ (fst s)" (*<*) apply (simp add: isafeF_def isafe'_def) apply (case_tac "(fst s) mem domC \") prefer 2 apply (simp add: semFalse) --{* fst s mem domC \ *} apply (simp add: saF_def del: isafe.simps) apply (case_tac "anF \ (fst s)") apply (simp add: semConj semTrue aF_def) apply (simp add: aF_def) done (*>*) lemma (in correctVCG) vc_isafeF_ReachablesAn: assumes wf_Pi: "wf \" assumes vc_provable: "\ \ vcg \" assumes s_Reach: "s \ (Reachables \)" shows "(\, s \ isafeF \ (fst s) \ s \ ReachablesAn \)" using s_Reach proof (induct rule: Reachables_induct) --{* induction base *} case (init s) show "\,s \ isafeF \ (fst s) \ s \ ReachablesAn \" proof (rule conjI) from wf_Pi vc_provable init show "\,s \ isafeF \ (fst s)" by (rule vc_init) next show "s \ ReachablesAn \" by (rule ReachablesAn_init) qed next case (step s s') have s_Reach: "s \ Reachables \" . have s_isafeF: "\,s \ isafeF \ (fst s)" and s_ReachAn: "s \ ReachablesAn \" using step by auto have s_s'_effS: "(s,s') \ effS \" . from s_isafeF have s_saF: "\,s \ saF \ (fst s)" by (rule isafeF_saF) from s_saF have s_aF: "\,s \ aF \ (fst s)" by (simp add: saF_def semConj) from wf_Pi s_ReachAn s_s'_effS obtain B where B_succsF: "(fst s',B) \ set (succsF \ (fst s))" and s_B: "\,s \ B" apply - apply (drule_tac s="s" and s'="s'" in succsF_complete) apply assumption apply assumption apply fastsimp done from B_succsF obtain su su' where su_B_su'_succsF: "succsF \ (fst s) = su@(fst s',B)#su'" by (fastsimp simp add: in_set_conv_decomp) from wf_Pi s_isafeF have s_domC: "fst s \ (set (domC \))" apply - apply (drule_tac pc="fst s" in isafeFdef) apply (rule classical) apply (simp add: isafeFdef semFalse) done from s_domC obtain dC dC' where domC_dC_dC': "domC \ = dC@(fst s)#dC'" by (fastsimp simp add: in_set_conv_decomp) have s'_isafeF: "\,s' \ isafeF \ (fst s')" proof (cases "anF \ (fst s)") case None from None wf_Pi s_domC s_isafeF su_B_su'_succsF have B_imp_wpF: "\,s \ B \ wpF \ (fst s) (fst s') (isafeF \ (fst s'))" apply - apply (drule_tac pc="fst s" in isafeFdef) apply (simp add: semConj) done from s_B B_imp_wpF have wpF_isafeF: "\,s \ wpF \ (fst s) (fst s') (isafeF \ (fst s'))" apply - apply (drule semImpE) apply simp done from wf_Pi s_ReachAn B_succsF s_s'_effS wpF_isafeF show "\,s' \ isafeF \ (fst s')" by (rule_tac Q="isafeF \ (fst s')" and s="s" in correctWpF) next case (Some A) from Some domC_dC_dC' obtain dA dA' where domA_dA_dA': "domA \ = dA@(fst s)#dA'" by (simp add: domA_def in_set_conv_decomp) from wf_Pi vc_provable s_ReachAn have s_vc: "\,s \ (vcg \)" by (rule correctSafetyLogic) from wf_Pi Some s_isafeF s_domC have isafeF_safeF_A: "isafeF \ (fst s) = \ [safeF \ (fst s), A]" by (drule_tac pc="fst s" in isafeFdef, simp) from wf_Pi domA_dA_dA' s_vc su_B_su'_succsF have isafeF_B_imp_wpF: "\,s \ \ [isafeF \ (fst s),B] \ wpF \ (fst s) (fst s') (isafeF \ (fst s'))" apply - by (drule vcgdef, simp add: semConj) from isafeF_B_imp_wpF s_isafeF s_B have s_wpF_isafeF: "\,s \ wpF \ (fst s) (fst s') (isafeF \ (fst s'))" apply - apply (drule semImpE) apply (simp add: semConj) done from wf_Pi s_ReachAn B_succsF s_s'_effS s_wpF_isafeF show "\,s' \ isafeF \ (fst s')" by (rule_tac Q="isafeF \ (fst s')" and s="s" in correctWpF) qed from s'_isafeF have s'_aF: "\,s' \ aF \ (fst s')" apply - apply (drule isafeF_saF) apply (simp add: saF_def semConj) done show "\,s' \ isafeF \ (fst s') \ s' \ ReachablesAn \" proof (rule conjI) show "\,s' \ isafeF \ (fst s')" by (rule s'_isafeF) next from s_ReachAn s_aF s'_aF s_s'_effS show "s' \ ReachablesAn \" by (rule ReachablesAn_step) qed qed text {* The Soundness proof of our VCG *} theorem (in correctVCG) vcg_soundness: assumes wf_Pi: "wf \" assumes vc_provable: "\ \ vcg \" shows "isSafe \" proof - have isSafePi: "\ s \ Reachables \. \,s \ safeF \ (fst s)" proof (rule ballI) fix s assume s_Reach: "s \ Reachables \" show "\,s \ safeF \ (fst s)" proof - from wf_Pi vc_provable s_Reach have s_isafeF_ReachAn: "\,s \ isafeF \ (fst s) \ s \ ReachablesAn \" by (rule vc_isafeF_ReachablesAn) from s_isafeF_ReachAn have s_isafeF: "\,s \ isafeF \ (fst s)" by simp from s_isafeF show "\,s \ safeF \ (fst s)" apply - apply (drule isafeF_saF) apply (simp add: saF_def semConj) done qed qed from isSafePi show "isSafe \" by (simp add: isSafe_def) qed text {* Verification Conditions also guarantee correct annotations. *} lemma (in correctVCG) vcg_correctAn: assumes wf_Pi: "wf \" assumes vc_provable: "\ \ vcg \" shows "correctAn \" proof - have correctAnPi: "\ s \ Reachables \. \,s \ aF \ (fst s)" proof (rule ballI) fix s assume s_Reach: "s \ Reachables \" show "\,s \ aF \ (fst s)" proof - from wf_Pi vc_provable s_Reach have s_isafeF_ReachAn: "\,s \ isafeF \ (fst s) \ s \ ReachablesAn \" by (rule vc_isafeF_ReachablesAn) from s_isafeF_ReachAn have s_isafeF: "\,s \ isafeF \ (fst s)" by simp from s_isafeF show "\,s \ aF \ (fst s)" apply - apply (drule isafeF_saF) apply (simp add: saF_def semConj) done qed qed from correctAnPi show "correctAn \" by (simp add: correctAn_def) qed end