src/HOL/IMP/Abs_Int1.thy
changeset 46355 42a01315d998
parent 46346 10c18630612a
equal deleted inserted replaced
46354:25f081f77915 46355:42a01315d998
    75 
    75 
    76 end
    76 end
    77 
    77 
    78 
    78 
    79 locale Val_abs1 =
    79 locale Val_abs1 =
    80  Val_abs1_gamma where \<gamma> = \<gamma>
    80   Val_abs1_gamma where \<gamma> = \<gamma>
    81  for \<gamma> :: "'av::L_top_bot \<Rightarrow> val set" +
    81    for \<gamma> :: "'av::L_top_bot \<Rightarrow> val set" +
    82 fixes filter_plus' :: "'av \<Rightarrow> 'av \<Rightarrow> 'av \<Rightarrow> 'av * 'av"
    82 fixes test_num' :: "val \<Rightarrow> 'av \<Rightarrow> bool"
       
    83 and filter_plus' :: "'av \<Rightarrow> 'av \<Rightarrow> 'av \<Rightarrow> 'av * 'av"
    83 and filter_less' :: "bool \<Rightarrow> 'av \<Rightarrow> 'av \<Rightarrow> 'av * 'av"
    84 and filter_less' :: "bool \<Rightarrow> 'av \<Rightarrow> 'av \<Rightarrow> 'av * 'av"
    84 assumes filter_plus': "filter_plus' a a1 a2 = (a1',a2') \<Longrightarrow>
    85 assumes test_num': "test_num' n a = (n : \<gamma> a)"
    85   n1 : \<gamma> a1 \<Longrightarrow> n2 : \<gamma> a2 \<Longrightarrow> n1+n2 : \<gamma> a \<Longrightarrow> n1 : \<gamma> a1' \<and> n2 : \<gamma> a2'"
    86 and filter_plus': "filter_plus' a a1 a2 = (b1,b2) \<Longrightarrow>
    86 and filter_less': "filter_less' (n1<n2) a1 a2 = (a1',a2') \<Longrightarrow>
    87   n1 : \<gamma> a1 \<Longrightarrow> n2 : \<gamma> a2 \<Longrightarrow> n1+n2 : \<gamma> a \<Longrightarrow> n1 : \<gamma> b1 \<and> n2 : \<gamma> b2"
    87   n1 : \<gamma> a1 \<Longrightarrow> n2 : \<gamma> a2 \<Longrightarrow> n1 : \<gamma> a1' \<and> n2 : \<gamma> a2'"
    88 and filter_less': "filter_less' (n1<n2) a1 a2 = (b1,b2) \<Longrightarrow>
       
    89   n1 : \<gamma> a1 \<Longrightarrow> n2 : \<gamma> a2 \<Longrightarrow> n1 : \<gamma> b1 \<and> n2 : \<gamma> b2"
    88 
    90 
    89 
    91 
    90 locale Abs_Int1 =
    92 locale Abs_Int1 =
    91   Val_abs1 where \<gamma> = \<gamma> for \<gamma> :: "'av::L_top_bot \<Rightarrow> val set"
    93   Val_abs1 where \<gamma> = \<gamma> for \<gamma> :: "'av::L_top_bot \<Rightarrow> val set"
    92 begin
    94 begin
   102 by(cases S)(simp add: aval'_sound)+
   104 by(cases S)(simp add: aval'_sound)+
   103 
   105 
   104 subsubsection "Backward analysis"
   106 subsubsection "Backward analysis"
   105 
   107 
   106 fun afilter :: "aexp \<Rightarrow> 'av \<Rightarrow> 'av st option \<Rightarrow> 'av st option" where
   108 fun afilter :: "aexp \<Rightarrow> 'av \<Rightarrow> 'av st option \<Rightarrow> 'av st option" where
   107 "afilter (N n) a S = (if n : \<gamma> a then S else None)" |
   109 "afilter (N n) a S = (if test_num' n a then S else None)" |
   108 "afilter (V x) a S = (case S of None \<Rightarrow> None | Some S \<Rightarrow>
   110 "afilter (V x) a S = (case S of None \<Rightarrow> None | Some S \<Rightarrow>
   109   let a' = lookup S x \<sqinter> a in
   111   let a' = lookup S x \<sqinter> a in
   110   if a' \<sqsubseteq> \<bottom> then None else Some(update S x a'))" |
   112   if a' \<sqsubseteq> \<bottom> then None else Some(update S x a'))" |
   111 "afilter (Plus e1 e2) a S =
   113 "afilter (Plus e1 e2) a S =
   112  (let (a1,a2) = filter_plus' a (aval'' e1 S) (aval'' e2 S)
   114  (let (a1,a2) = filter_plus' a (aval'' e1 S) (aval'' e2 S)
   132   (let (res1,res2) = filter_less' res (aval'' e1 S) (aval'' e2 S)
   134   (let (res1,res2) = filter_less' res (aval'' e1 S) (aval'' e2 S)
   133    in afilter e1 res1 (afilter e2 res2 S))"
   135    in afilter e1 res1 (afilter e2 res2 S))"
   134 
   136 
   135 lemma afilter_sound: "s : \<gamma>\<^isub>o S \<Longrightarrow> aval e s : \<gamma> a \<Longrightarrow> s : \<gamma>\<^isub>o (afilter e a S)"
   137 lemma afilter_sound: "s : \<gamma>\<^isub>o S \<Longrightarrow> aval e s : \<gamma> a \<Longrightarrow> s : \<gamma>\<^isub>o (afilter e a S)"
   136 proof(induction e arbitrary: a S)
   138 proof(induction e arbitrary: a S)
   137   case N thus ?case by simp
   139   case N thus ?case by simp (metis test_num')
   138 next
   140 next
   139   case (V x)
   141   case (V x)
   140   obtain S' where "S = Some S'" and "s : \<gamma>\<^isub>f S'" using `s : \<gamma>\<^isub>o S`
   142   obtain S' where "S = Some S'" and "s : \<gamma>\<^isub>f S'" using `s : \<gamma>\<^isub>o S`
   141     by(auto simp: in_gamma_option_iff)
   143     by(auto simp: in_gamma_option_iff)
   142   moreover hence "s x : \<gamma> (lookup S' x)" by(simp add: \<gamma>_st_def)
   144   moreover hence "s x : \<gamma> (lookup S' x)" by(simp add: \<gamma>_st_def)
   326  apply simp
   328  apply simp
   327 by (simp add: mono_aval')
   329 by (simp add: mono_aval')
   328 
   330 
   329 lemma mono_afilter: "r \<sqsubseteq> r' \<Longrightarrow> S \<sqsubseteq> S' \<Longrightarrow> afilter e r S \<sqsubseteq> afilter e r' S'"
   331 lemma mono_afilter: "r \<sqsubseteq> r' \<Longrightarrow> S \<sqsubseteq> S' \<Longrightarrow> afilter e r S \<sqsubseteq> afilter e r' S'"
   330 apply(induction e arbitrary: r r' S S')
   332 apply(induction e arbitrary: r r' S S')
   331 apply(auto simp: Let_def split: option.splits prod.splits)
   333 apply(auto simp: test_num' Let_def split: option.splits prod.splits)
   332 apply (metis mono_gamma subsetD)
   334 apply (metis mono_gamma subsetD)
   333 apply(drule_tac x = "list" in mono_lookup)
   335 apply(drule_tac x = "list" in mono_lookup)
   334 apply (metis mono_meet le_trans)
   336 apply (metis mono_meet le_trans)
   335 apply (metis mono_meet mono_lookup mono_update)
   337 apply (metis mono_meet mono_lookup mono_update)
   336 apply(metis mono_aval'' mono_filter_plus'[simplified le_prod_def] fst_conv snd_conv)
   338 apply(metis mono_aval'' mono_filter_plus'[simplified le_prod_def] fst_conv snd_conv)