instance proof (standard, goal_cases) case 1 show ?caseby(rule less_prod_def) next case 2 show ?caseby(simp add: less_eq_prod_def) next case 3 thus ?caseunfolding less_eq_prod_def by(metis order_trans) next case 4 thus ?caseby(simp add: less_eq_prod_def)(metis eq_iff surjective_pairing) qed
end
subsubsection "Extended Framework"
subclass (in bounded_lattice) semilattice_sup_top ..
locale Abs_Int_inv = Val_inv where\<gamma> = \<gamma> for\<gamma> :: "'av::bounded_lattice \<Rightarrow> val set" begin
lemma in_gamma_sup_UpI: "s \ \\<^sub>o S1 \ s \ \\<^sub>o S2 \ s \ \\<^sub>o(S1 \ S2)" by (metis (opaque_lifting, no_types) sup_ge1 sup_ge2 mono_gamma_o subsetD)
fun aval'' :: "aexp \ 'av st option \ 'av" where "aval'' e None = \" | "aval'' e (Some S) = aval' e S"
lemma aval''_correct: "s \ \\<^sub>o S \ aval a s \ \(aval'' a S)" by(cases S)(auto simp add: aval'_correct split: option.splits)
subsubsection "Backward analysis"
fun inv_aval' :: "aexp \ 'av \ 'av st option \ 'av st option" where "inv_aval' (N n) a S = (if test_num' n a then S else None)" | "inv_aval' (V x) a S = (case S of None \ None | Some S \ let a' = fun S x \ a in if a' = \ then None else Some(update S x a'))" | "inv_aval' (Plus e1 e2) a S =
(let (a1,a2) = inv_plus' a (aval'' e1 S) (aval'' e2 S) in inv_aval' e1 a1 (inv_aval' e2 a2 S))"
text\<open>The test for \<^const>\<open>bot\<close> in the \<^const>\<open>V\<close>-case is important: \<^const>\<open>bot\<close> indicates that a variable has no possible values, i.e.\ that the current
program point is unreachable. But then the abstract state should collapse to \<^const>\<open>None\<close>. Put differently, we maintain the invariant that in an abstract
state of the form \<^term>\<open>Some s\<close>, all variables are mapped to non-\<^const>\<open>bot\<close> values. Otherwise the (pointwise) sup of two abstract states, one of
which contains\<^const>\<open>bot\<close> values, may produce too large a result, thus
making the analysis less precise.\<close>
fun inv_bval' :: "bexp \ bool \ 'av st option \ 'av st option" where "inv_bval' (Bc v) res S = (if v=res then S else None)" | "inv_bval' (Not b) res S = inv_bval' b (\ res) S" | "inv_bval' (And b1 b2) res S =
(if res then inv_bval' b1 True (inv_bval' b2 True S)
else inv_bval' b1 False S \ inv_bval' b2 False S)" | "inv_bval' (Less e1 e2) res S =
(let (a1,a2) = inv_less' res (aval'' e1 S) (aval'' e2 S) in inv_aval' e1 a1 (inv_aval' e2 a2 S))"
lemma inv_aval'_correct: "s \ \\<^sub>o S \ aval e s \ \ a \ s \ \\<^sub>o (inv_aval' e a S)" proof(induction e arbitrary: a S) case N thus ?caseby simp (metis test_num') next case (V x) obtain S' where "S = Some S'" and "s \<in> \<gamma>\<^sub>s S'" using \<open>s \<in> \<gamma>\<^sub>o S\<close> by(auto simp: in_gamma_option_iff) moreoverhence"s x \ \ (fun S' x)" by(simp add: \<gamma>_st_def) moreoverhave"s x \ \ a" using V(2) by simp ultimatelyshow ?case by(simp add: Let_def \<gamma>_st_def)
(metis mono_gamma emptyE in_gamma_inf gamma_bot subset_empty) next case (Plus e1 e2) thus ?case using inv_plus'[OF _ aval''_correct aval''_correct] by (auto split: prod.split) qed
lemma inv_bval'_correct: "s \ \\<^sub>o S \ bv = bval b s \ s \ \\<^sub>o(inv_bval' b bv S)" proof(induction b arbitrary: S bv) case Bc thus ?caseby simp next case (Not b) thus ?caseby simp next case (And b1 b2) thus ?case by simp (metis And(1) And(2) in_gamma_sup_UpI) next case (Less e1 e2) thus ?case apply hypsubst_thin apply (auto split: prod.split) apply (metis (lifting) inv_aval'_correct aval''_correct inv_less') done qed
definition"step' = Step
(\<lambda>x e S. case S of None \<Rightarrow> None | Some S \<Rightarrow> Some(update S x (aval' e S)))
(\<lambda>b S. inv_bval' b True S)"
definition AI :: "com \ 'av st option acom option" where "AI c = pfp (step' \) (bot c)"
lemma strip_step'[simp]: "strip(step' S c) = strip c" by(simp add: step'_def)
lemma top_on_inv_aval': "\ top_on_opt S X; vars e \ -X \ \ top_on_opt (inv_aval' e a S) X" by(induction e arbitrary: a S) (auto simp: Let_def split: option.splits prod.split)
lemma top_on_inv_bval': "\top_on_opt S X; vars b \ -X\ \ top_on_opt (inv_bval' b r S) X" by(induction b arbitrary: r S) (auto simp: top_on_inv_aval' top_on_sup split: prod.split)
lemma top_on_step': "top_on_acom C (- vars C) \ top_on_acom (step' \ C) (- vars C)" unfolding step'_def by(rule top_on_Step)
(auto simp add: top_on_top top_on_inv_bval' split: option.split)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.