equal
deleted
inserted
replaced
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) |