21 definition local_env :: "[java_mb prog, cname, sig, vname list,(vname \<times> ty) list] \<Rightarrow> java_mb env" where |
21 definition local_env :: "[java_mb prog, cname, sig, vname list,(vname \<times> ty) list] \<Rightarrow> java_mb env" where |
22 "local_env G C S pns lvars == |
22 "local_env G C S pns lvars == |
23 let (mn, pTs) = S in (G,map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C))" |
23 let (mn, pTs) = S in (G,map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C))" |
24 |
24 |
25 lemma local_env_fst [simp]: "fst (local_env G C S pns lvars) = G" |
25 lemma local_env_fst [simp]: "fst (local_env G C S pns lvars) = G" |
26 by (simp add: local_env_def split_beta) |
26 by (simp add: local_env_def split_beta) |
27 |
27 |
28 |
28 |
29 lemma wt_class_expr_is_class: "\<lbrakk> ws_prog G; E \<turnstile> expr :: Class cname; |
29 lemma wt_class_expr_is_class: |
30 E = local_env G C (mn, pTs) pns lvars\<rbrakk> |
30 "\<lbrakk> ws_prog G; E \<turnstile> expr :: Class cname; E = local_env G C (mn, pTs) pns lvars\<rbrakk> |
31 \<Longrightarrow> is_class G cname " |
31 \<Longrightarrow> is_class G cname " |
32 apply (subgoal_tac "((fst E), (snd E)) \<turnstile> expr :: Class cname") |
32 apply (subgoal_tac "((fst E), (snd E)) \<turnstile> expr :: Class cname") |
33 apply (frule ty_expr_is_type) apply simp |
33 apply (frule ty_expr_is_type) |
34 apply simp apply (simp (no_asm_use)) |
34 apply simp |
35 done |
35 apply simp |
|
36 apply (simp (no_asm_use)) |
|
37 done |
36 |
38 |
37 |
39 |
38 |
40 |
39 (********************************************************************************) |
41 (********************************************************************************) |
40 subsection "index" |
42 subsection "index" |
41 |
43 |
42 lemma local_env_snd: " |
44 lemma local_env_snd: |
43 snd (local_env G C (mn, pTs) pns lvars) = map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C)" |
45 "snd (local_env G C (mn, pTs) pns lvars) = map_of lvars(pns[\<mapsto>]pTs)(This\<mapsto>Class C)" |
44 by (simp add: local_env_def) |
46 by (simp add: local_env_def) |
45 |
47 |
46 |
48 |
47 |
49 |
48 lemma index_in_bounds: " length pns = length pTs \<Longrightarrow> |
50 lemma index_in_bounds: |
|
51 "length pns = length pTs \<Longrightarrow> |
49 snd (local_env G C (mn, pTs) pns lvars) vname = Some T |
52 snd (local_env G C (mn, pTs) pns lvars) vname = Some T |
50 \<Longrightarrow> index (pns, lvars, blk, res) vname < length (inited_LT C pTs lvars)" |
53 \<Longrightarrow> index (pns, lvars, blk, res) vname < length (inited_LT C pTs lvars)" |
51 apply (simp add: local_env_snd index_def split_beta) |
54 apply (simp add: local_env_snd index_def split_beta) |
52 apply (case_tac "vname = This") |
55 apply (case_tac "vname = This") |
53 apply (simp add: inited_LT_def) |
56 apply (simp add: inited_LT_def) |
54 apply simp |
57 apply simp |
55 apply (drule map_of_upds_SomeD) |
58 apply (drule map_of_upds_SomeD) |
56 apply (drule length_takeWhile) |
59 apply (drule length_takeWhile) |
57 apply (simp add: inited_LT_def) |
60 apply (simp add: inited_LT_def) |
58 done |
61 done |
59 |
62 |
60 |
63 |
61 lemma map_upds_append [rule_format (no_asm)]: |
64 lemma map_upds_append: |
62 "\<forall> x1s m. (length k1s = length x1s |
65 "length k1s = length x1s \<Longrightarrow> m(k1s[\<mapsto>]x1s)(k2s[\<mapsto>]x2s) = m ((k1s@k2s)[\<mapsto>](x1s@x2s))" |
63 \<longrightarrow> m(k1s[\<mapsto>]x1s)(k2s[\<mapsto>]x2s) = m ((k1s@k2s)[\<mapsto>](x1s@x2s)))" |
66 apply (induct k1s arbitrary: x1s m) |
64 apply (induct k1s) |
67 apply simp |
65 apply simp |
68 apply (subgoal_tac "\<exists>x xr. x1s = x # xr") |
66 apply (intro strip) |
69 apply clarsimp |
67 apply (subgoal_tac "\<exists> x xr. x1s = x # xr") |
|
68 apply clarify |
|
69 apply simp |
|
70 (* subgoal *) |
70 (* subgoal *) |
71 apply (case_tac x1s) |
71 apply (case_tac x1s) |
72 apply auto |
72 apply auto |
73 done |
73 done |
74 |
74 |
75 |
75 |
76 lemma map_of_append [rule_format]: |
76 lemma map_of_append: |
77 "\<forall> ys. (map_of ((rev xs) @ ys) = (map_of ys) ((map fst xs) [\<mapsto>] (map snd xs)))" |
77 "map_of ((rev xs) @ ys) = (map_of ys) ((map fst xs) [\<mapsto>] (map snd xs))" |
78 apply (induct xs) |
78 apply (induct xs arbitrary: ys) |
79 apply simp |
79 apply simp |
80 apply (rule allI) |
80 apply (rename_tac a xs ys) |
81 apply (drule_tac x="a # ys" in spec) |
81 apply (drule_tac x="a # ys" in meta_spec) |
82 apply (simp only: rev.simps append_assoc append_Cons append_Nil |
82 apply (simp only: rev.simps append_assoc append_Cons append_Nil |
83 list.map map_of.simps map_upds_Cons list.sel) |
83 list.map map_of.simps map_upds_Cons list.sel) |
84 done |
84 done |
85 |
85 |
86 lemma map_of_as_map_upds: "map_of (rev xs) = empty ((map fst xs) [\<mapsto>] (map snd xs))" |
86 lemma map_of_as_map_upds: "map_of (rev xs) = empty ((map fst xs) [\<mapsto>] (map snd xs))" |
87 by (rule map_of_append [of _ "[]", simplified]) |
87 by (rule map_of_append [of _ "[]", simplified]) |
88 |
88 |
89 lemma map_of_rev: "unique xs \<Longrightarrow> map_of (rev xs) = map_of xs" |
89 lemma map_of_rev: "unique xs \<Longrightarrow> map_of (rev xs) = map_of xs" |
90 apply (induct xs) |
90 apply (induct xs) |
91 apply simp |
91 apply simp |
92 apply (simp add: unique_def map_of_append map_of_as_map_upds [symmetric] |
92 apply (simp add: unique_def map_of_append map_of_as_map_upds [symmetric] |
93 Map.map_of_append[symmetric] del:Map.map_of_append) |
93 Map.map_of_append[symmetric] del:Map.map_of_append) |
94 done |
94 done |
95 |
95 |
96 lemma map_upds_rev [rule_format]: "\<forall> xs. (distinct ks \<longrightarrow> length ks = length xs |
96 lemma map_upds_rev: |
97 \<longrightarrow> m (rev ks [\<mapsto>] rev xs) = m (ks [\<mapsto>] xs))" |
97 "\<lbrakk> distinct ks; length ks = length xs \<rbrakk> \<Longrightarrow> m (rev ks [\<mapsto>] rev xs) = m (ks [\<mapsto>] xs)" |
98 apply (induct ks) |
98 apply (induct ks arbitrary: xs) |
99 apply simp |
99 apply simp |
100 apply (intro strip) |
100 apply (subgoal_tac "\<exists>x xr. xs = x # xr") |
101 apply (subgoal_tac "\<exists> x xr. xs = x # xr") |
101 apply clarify |
102 apply clarify |
102 apply (drule_tac x=xr in meta_spec) |
103 apply (drule_tac x=xr in spec) |
103 apply (simp add: map_upds_append [symmetric]) |
104 apply (simp add: map_upds_append [symmetric]) |
104 apply (case_tac xs, auto) |
105 (* subgoal *) |
105 done |
106 apply (case_tac xs) |
|
107 apply auto |
|
108 done |
|
109 |
106 |
110 lemma map_upds_takeWhile [rule_format]: |
107 lemma map_upds_takeWhile [rule_format]: |
111 "\<forall> ks. (empty(rev ks[\<mapsto>]rev xs)) k = Some x \<longrightarrow> length ks = length xs \<longrightarrow> |
108 "\<forall>ks. (empty(rev ks[\<mapsto>]rev xs)) k = Some x \<longrightarrow> length ks = length xs \<longrightarrow> |
112 xs ! length (takeWhile (\<lambda>z. z \<noteq> k) ks) = x" |
109 xs ! length (takeWhile (\<lambda>z. z \<noteq> k) ks) = x" |
113 apply (induct xs) |
110 apply (induct xs) |
114 apply simp |
111 apply simp |
115 apply (intro strip) |
112 apply (intro strip) |
116 apply (subgoal_tac "\<exists> k' kr. ks = k' # kr") |
113 apply (subgoal_tac "\<exists>k' kr. ks = k' # kr") |
117 apply (clarify) |
114 apply (clarify) |
118 apply (drule_tac x=kr in spec) |
115 apply (drule_tac x=kr in spec) |
119 apply (simp only: rev.simps) |
116 apply (simp only: rev.simps) |
120 apply (subgoal_tac "(empty(rev kr @ [k'][\<mapsto>]rev xs @ [a])) = empty (rev kr[\<mapsto>]rev xs)([k'][\<mapsto>][a])") |
117 apply (subgoal_tac "(empty(rev kr @ [k'][\<mapsto>]rev xs @ [a])) = empty (rev kr[\<mapsto>]rev xs)([k'][\<mapsto>][a])") |
121 apply (simp split:split_if_asm) |
118 apply (simp split:split_if_asm) |
122 apply (simp add: map_upds_append [symmetric]) |
119 apply (simp add: map_upds_append [symmetric]) |
123 apply (case_tac ks) |
120 apply (case_tac ks) |
124 apply auto |
121 apply auto |
125 done |
122 done |
126 |
123 |
127 |
124 |
128 lemma local_env_inited_LT: "\<lbrakk> snd (local_env G C (mn, pTs) pns lvars) vname = Some T; |
125 lemma local_env_inited_LT: |
|
126 "\<lbrakk> snd (local_env G C (mn, pTs) pns lvars) vname = Some T; |
129 length pns = length pTs; distinct pns; unique lvars \<rbrakk> |
127 length pns = length pTs; distinct pns; unique lvars \<rbrakk> |
130 \<Longrightarrow> (inited_LT C pTs lvars ! index (pns, lvars, blk, res) vname) = OK T" |
128 \<Longrightarrow> (inited_LT C pTs lvars ! index (pns, lvars, blk, res) vname) = OK T" |
131 apply (simp add: local_env_snd index_def) |
129 apply (simp add: local_env_snd index_def) |
132 apply (case_tac "vname = This") |
130 apply (case_tac "vname = This") |
133 apply (simp add: inited_LT_def) |
131 apply (simp add: inited_LT_def) |
134 apply (simp add: inited_LT_def) |
132 apply (simp add: inited_LT_def) |
135 apply (simp (no_asm_simp) only: map_map [symmetric] map_append [symmetric] list.map [symmetric]) |
133 apply (simp (no_asm_simp) only: map_map [symmetric] map_append [symmetric] list.map [symmetric]) |
136 apply (subgoal_tac "length (takeWhile (\<lambda>z. z \<noteq> vname) (pns @ map fst lvars)) < length (pTs @ map snd lvars)") |
134 apply (subgoal_tac "length (takeWhile (\<lambda>z. z \<noteq> vname) (pns @ map fst lvars)) < length (pTs @ map snd lvars)") |
137 apply (simp (no_asm_simp) only: List.nth_map ok_val.simps) |
135 apply (simp (no_asm_simp) only: List.nth_map ok_val.simps) |
138 apply (subgoal_tac "map_of lvars = map_of (map (\<lambda> p. (fst p, snd p)) lvars)") |
136 apply (subgoal_tac "map_of lvars = map_of (map (\<lambda> p. (fst p, snd p)) lvars)") |
139 apply (simp only:) |
137 apply (simp only:) |
140 apply (subgoal_tac "distinct (map fst lvars)") |
138 apply (subgoal_tac "distinct (map fst lvars)") |
141 apply (frule_tac g=snd in AuxLemmas.map_of_map_as_map_upd) |
139 apply (frule_tac g=snd in AuxLemmas.map_of_map_as_map_upd) |
142 apply (simp only:) |
140 apply (simp only:) |
143 apply (simp add: map_upds_append) |
141 apply (simp add: map_upds_append) |
144 apply (frule map_upds_SomeD) |
142 apply (frule map_upds_SomeD) |
145 apply (rule map_upds_takeWhile) |
143 apply (rule map_upds_takeWhile) |
146 apply (simp (no_asm_simp)) |
144 apply (simp (no_asm_simp)) |
147 apply (simp add: map_upds_append [symmetric]) |
145 apply (simp add: map_upds_append [symmetric]) |
148 apply (simp add: map_upds_rev) |
146 apply (simp add: map_upds_rev) |
149 |
147 |
150 (* show length (pns @ map fst lvars) = length (pTs @ map snd lvars) *) |
148 (* show length (pns @ map fst lvars) = length (pTs @ map snd lvars) *) |
151 apply simp |
149 apply simp |
152 |
150 |
153 (* show distinct (map fst lvars) *) |
151 (* show distinct (map fst lvars) *) |
154 apply (simp only: unique_def Fun.comp_def) |
152 apply (simp only: unique_def Fun.comp_def) |
155 |
153 |
156 (* show map_of lvars = map_of (map (\<lambda>p. (fst p, snd p)) lvars) *) |
154 (* show map_of lvars = map_of (map (\<lambda>p. (fst p, snd p)) lvars) *) |
157 apply simp |
155 apply simp |
158 |
156 |
159 (* show length (takeWhile (\<lambda>z. z \<noteq> vname) (pns @ map fst lvars)) < length (pTs @ map snd lvars) *) |
157 (* show length (takeWhile (\<lambda>z. z \<noteq> vname) (pns @ map fst lvars)) < length (pTs @ map snd lvars) *) |
160 apply (drule map_of_upds_SomeD) |
158 apply (drule map_of_upds_SomeD) |
161 apply (drule length_takeWhile) |
159 apply (drule length_takeWhile) |
162 apply simp |
160 apply simp |
163 done |
161 done |
164 |
162 |
165 |
163 |
166 lemma inited_LT_at_index_no_err: " i < length (inited_LT C pTs lvars) |
164 lemma inited_LT_at_index_no_err: |
167 \<Longrightarrow> inited_LT C pTs lvars ! i \<noteq> Err" |
165 "i < length (inited_LT C pTs lvars) \<Longrightarrow> inited_LT C pTs lvars ! i \<noteq> Err" |
168 apply (simp only: inited_LT_def) |
166 apply (simp only: inited_LT_def) |
169 apply (simp only: map_map [symmetric] map_append [symmetric] list.map [symmetric] length_map) |
167 apply (simp only: map_map [symmetric] map_append [symmetric] list.map [symmetric] length_map) |
170 apply (simp only: nth_map) |
168 apply (simp only: nth_map) |
171 apply simp |
169 apply simp |
172 done |
170 done |
173 |
171 |
174 |
172 |
175 lemma sup_loc_update_index: " |
173 lemma sup_loc_update_index: " |
176 \<lbrakk> G \<turnstile> T \<preceq> T'; is_type G T'; length pns = length pTs; distinct pns; unique lvars; |
174 \<lbrakk> G \<turnstile> T \<preceq> T'; is_type G T'; length pns = length pTs; distinct pns; unique lvars; |
177 snd (local_env G C (mn, pTs) pns lvars) vname = Some T' \<rbrakk> |
175 snd (local_env G C (mn, pTs) pns lvars) vname = Some T' \<rbrakk> |
178 \<Longrightarrow> |
176 \<Longrightarrow> |
179 comp G \<turnstile> |
177 comp G \<turnstile> inited_LT C pTs lvars [index (pns, lvars, blk, res) vname := OK T] <=l |
180 inited_LT C pTs lvars [index (pns, lvars, blk, res) vname := OK T] <=l |
178 inited_LT C pTs lvars" |
181 inited_LT C pTs lvars" |
179 apply (subgoal_tac " index (pns, lvars, blk, res) vname < length (inited_LT C pTs lvars)") |
182 apply (subgoal_tac " index (pns, lvars, blk, res) vname < length (inited_LT C pTs lvars)") |
180 apply (frule_tac blk=blk and res=res in local_env_inited_LT, assumption+) |
183 apply (frule_tac blk=blk and res=res in local_env_inited_LT, assumption+) |
181 apply (rule sup_loc_trans) |
184 apply (rule sup_loc_trans) |
182 apply (rule_tac b="OK T'" in sup_loc_update) |
185 apply (rule_tac b="OK T'" in sup_loc_update) |
183 apply (simp add: comp_widen) |
186 apply (simp add: comp_widen) |
184 apply assumption |
187 apply assumption |
185 apply (rule sup_loc_refl) |
188 apply (rule sup_loc_refl) |
186 apply (simp add: list_update_same_conv [THEN iffD2]) |
189 apply (simp add: list_update_same_conv [THEN iffD2]) |
|
190 (* subgoal *) |
187 (* subgoal *) |
191 apply (rule index_in_bounds) |
188 apply (rule index_in_bounds) |
192 apply simp+ |
189 apply simp+ |
193 done |
190 done |
194 |
191 |
195 |
192 |
196 (********************************************************************************) |
193 (********************************************************************************) |
197 |
194 |
198 subsection "Preservation of ST and LT by compTpExpr / compTpStmt" |
195 subsection "Preservation of ST and LT by compTpExpr / compTpStmt" |
199 |
196 |
200 lemma sttp_of_comb_nil [simp]: "sttp_of (comb_nil sttp) = sttp" |
197 lemma sttp_of_comb_nil [simp]: "sttp_of (comb_nil sttp) = sttp" |
201 by (simp add: comb_nil_def) |
198 by (simp add: comb_nil_def) |
202 |
199 |
203 lemma mt_of_comb_nil [simp]: "mt_of (comb_nil sttp) = []" |
200 lemma mt_of_comb_nil [simp]: "mt_of (comb_nil sttp) = []" |
204 by (simp add: comb_nil_def) |
201 by (simp add: comb_nil_def) |
205 |
202 |
206 |
203 |
207 lemma sttp_of_comb [simp]: "sttp_of ((f1 \<box> f2) sttp) = sttp_of (f2 (sttp_of (f1 sttp)))" |
204 lemma sttp_of_comb [simp]: "sttp_of ((f1 \<box> f2) sttp) = sttp_of (f2 (sttp_of (f1 sttp)))" |
208 apply (case_tac "f1 sttp") |
205 apply (case_tac "f1 sttp") |
209 apply (case_tac "(f2 (sttp_of (f1 sttp)))") |
206 apply (case_tac "(f2 (sttp_of (f1 sttp)))") |
210 apply (simp add: comb_def) |
207 apply (simp add: comb_def) |
211 done |
208 done |
212 |
209 |
213 lemma mt_of_comb: "(mt_of ((f1 \<box> f2) sttp)) = |
210 lemma mt_of_comb: "(mt_of ((f1 \<box> f2) sttp)) = |
214 (mt_of (f1 sttp)) @ (mt_of (f2 (sttp_of (f1 sttp))))" |
211 (mt_of (f1 sttp)) @ (mt_of (f2 (sttp_of (f1 sttp))))" |
215 by (simp add: comb_def split_beta) |
212 by (simp add: comb_def split_beta) |
216 |
213 |
217 |
214 |
218 lemma mt_of_comb_length [simp]: "\<lbrakk> n1 = length (mt_of (f1 sttp)); n1 \<le> n \<rbrakk> |
215 lemma mt_of_comb_length [simp]: "\<lbrakk> n1 = length (mt_of (f1 sttp)); n1 \<le> n \<rbrakk> |
219 \<Longrightarrow> (mt_of ((f1 \<box> f2) sttp) ! n) = (mt_of (f2 (sttp_of (f1 sttp))) ! (n - n1))" |
216 \<Longrightarrow> (mt_of ((f1 \<box> f2) sttp) ! n) = (mt_of (f2 (sttp_of (f1 sttp))) ! (n - n1))" |
220 by (simp add: comb_def nth_append split_beta) |
217 by (simp add: comb_def nth_append split_beta) |
221 |
218 |
222 |
219 |
223 lemma compTpExpr_Exprs_LT_ST: " |
220 lemma compTpExpr_Exprs_LT_ST: " |
224 \<lbrakk>jmb = (pns, lvars, blk, res); |
221 \<lbrakk>jmb = (pns, lvars, blk, res); |
225 wf_prog wf_java_mdecl G; |
222 wf_prog wf_java_mdecl G; |
226 wf_java_mdecl G C ((mn, pTs), rT, jmb); |
223 wf_java_mdecl G C ((mn, pTs), rT, jmb); |
227 E = local_env G C (mn, pTs) pns lvars \<rbrakk> |
224 E = local_env G C (mn, pTs) pns lvars \<rbrakk> |
228 \<Longrightarrow> |
225 \<Longrightarrow> |
229 (\<forall> ST LT T. |
226 (\<forall> ST LT T. |
230 E \<turnstile> ex :: T \<longrightarrow> |
227 E \<turnstile> ex :: T \<longrightarrow> |
231 is_inited_LT C pTs lvars LT \<longrightarrow> |
228 is_inited_LT C pTs lvars LT \<longrightarrow> |
232 sttp_of (compTpExpr jmb G ex (ST, LT)) = (T # ST, LT)) |
229 sttp_of (compTpExpr jmb G ex (ST, LT)) = (T # ST, LT)) |
233 \<and> |
230 \<and> |
234 (\<forall> ST LT Ts. |
231 (\<forall> ST LT Ts. |
235 E \<turnstile> exs [::] Ts \<longrightarrow> |
232 E \<turnstile> exs [::] Ts \<longrightarrow> |
236 is_inited_LT C pTs lvars LT \<longrightarrow> |
233 is_inited_LT C pTs lvars LT \<longrightarrow> |
237 sttp_of (compTpExprs jmb G exs (ST, LT)) = ((rev Ts) @ ST, LT))" |
234 sttp_of (compTpExprs jmb G exs (ST, LT)) = ((rev Ts) @ ST, LT))" |
238 |
235 |
239 apply (rule compat_expr_expr_list.induct) |
236 apply (rule compat_expr_expr_list.induct) |
240 |
237 |
241 (* expresssions *) |
238 (* expresssions *) |
242 |
239 |
243 (* NewC *) |
240 (* NewC *) |
244 apply (intro strip) |
241 apply (intro strip) |
245 apply (drule NewC_invers) |
242 apply (drule NewC_invers) |
246 apply (simp add: pushST_def) |
243 apply (simp add: pushST_def) |
247 |
244 |
248 (* Cast *) |
245 (* Cast *) |
249 apply (intro strip) |
246 apply (intro strip) |
250 apply (drule Cast_invers, clarify) |
247 apply (drule Cast_invers, clarify) |
251 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+) |
248 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+) |
252 apply (simp add: replST_def split_beta) |
249 apply (simp add: replST_def split_beta) |
253 |
250 |
254 (* Lit *) |
251 (* Lit *) |
255 apply (intro strip) |
252 apply (intro strip) |
256 apply (drule Lit_invers) |
253 apply (drule Lit_invers) |
257 apply (simp add: pushST_def) |
254 apply (simp add: pushST_def) |
258 |
255 |
259 (* BinOp *) |
256 (* BinOp *) |
260 apply (intro strip) |
257 apply (intro strip) |
261 apply (drule BinOp_invers, clarify) |
258 apply (drule BinOp_invers, clarify) |
262 apply (drule_tac x=ST in spec) |
259 apply (drule_tac x=ST in spec) |
263 apply (drule_tac x="Ta # ST" in spec) |
260 apply (drule_tac x="Ta # ST" in spec) |
264 apply ((drule spec)+, (drule mp, assumption)+) |
261 apply ((drule spec)+, (drule mp, assumption)+) |
265 apply (rename_tac binop x2 x3 ST LT T Ta, case_tac binop) |
262 apply (rename_tac binop x2 x3 ST LT T Ta, case_tac binop) |
266 apply (simp (no_asm_simp)) |
263 apply (simp (no_asm_simp)) |
267 apply (simp (no_asm_simp) add: popST_def pushST_def) |
264 apply (simp (no_asm_simp) add: popST_def pushST_def) |
268 apply (simp) |
265 apply (simp) |
269 apply (simp (no_asm_simp) add: replST_def) |
266 apply (simp (no_asm_simp) add: replST_def) |
270 |
267 |
271 |
268 |
272 (* LAcc *) |
269 (* LAcc *) |
273 apply (intro strip) |
270 apply (intro strip) |
274 apply (drule LAcc_invers) |
271 apply (drule LAcc_invers) |
275 apply (simp add: pushST_def is_inited_LT_def) |
272 apply (simp add: pushST_def is_inited_LT_def) |
276 apply (simp add: wf_prog_def) |
273 apply (simp add: wf_prog_def) |
277 apply (frule wf_java_mdecl_disjoint_varnames) |
274 apply (frule wf_java_mdecl_disjoint_varnames) |
278 apply (simp add: disjoint_varnames_def) |
275 apply (simp add: disjoint_varnames_def) |
279 apply (frule wf_java_mdecl_length_pTs_pns) |
276 apply (frule wf_java_mdecl_length_pTs_pns) |
280 apply (erule conjE)+ |
277 apply (erule conjE)+ |
281 apply (simp (no_asm_simp) add: local_env_inited_LT) |
278 apply (simp (no_asm_simp) add: local_env_inited_LT) |
282 |
279 |
283 (* LAss *) |
280 (* LAss *) |
284 apply (intro strip) |
281 apply (intro strip) |
285 apply (drule LAss_invers, clarify) |
282 apply (drule LAss_invers, clarify) |
286 apply (drule LAcc_invers) |
283 apply (drule LAcc_invers) |
287 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+) |
284 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+) |
288 apply (simp add: popST_def dupST_def) |
285 apply (simp add: popST_def dupST_def) |
289 |
286 |
290 (* FAcc *) |
287 (* FAcc *) |
291 apply (intro strip) |
288 apply (intro strip) |
292 apply (drule FAcc_invers, clarify) |
289 apply (drule FAcc_invers, clarify) |
293 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+) |
290 apply ((drule_tac x=ST in spec), (drule spec)+, (drule mp, assumption)+) |
294 apply (simp add: replST_def) |
291 apply (simp add: replST_def) |
295 |
292 |
296 (* show snd (the (field (G, cname) vname)) = T *) |
293 (* show snd (the (field (G, cname) vname)) = T *) |
297 apply (subgoal_tac "is_class G Ca") |
294 apply (subgoal_tac "is_class G Ca") |
298 apply (rename_tac cname x2 vname ST LT T Ca, subgoal_tac "is_class G cname \<and> field (G, cname) vname = Some (cname, T)") |
295 apply (rename_tac cname x2 vname ST LT T Ca, subgoal_tac "is_class G cname \<and> field (G, cname) vname = Some (cname, T)") |
|
296 apply simp |
|
297 |
|
298 (* show is_class G cname \<and> field (G, cname) vname = Some (cname, T) *) |
|
299 apply (rule field_in_fd) apply assumption+ |
|
300 (* show is_class G Ca *) |
|
301 apply (fast intro: wt_class_expr_is_class) |
|
302 |
|
303 (* FAss *) |
|
304 apply (intro strip) |
|
305 apply (drule FAss_invers, clarify) |
|
306 apply (drule FAcc_invers, clarify) |
|
307 apply (drule_tac x=ST in spec) |
|
308 apply (drule_tac x="Class Ca # ST" in spec) |
|
309 apply ((drule spec)+, (drule mp, assumption)+) |
|
310 apply (simp add: popST_def dup_x1ST_def) |
|
311 |
|
312 |
|
313 (* Call *) |
|
314 apply (intro strip) |
|
315 apply (drule Call_invers, clarify) |
|
316 apply (drule_tac x=ST in spec) |
|
317 apply (rename_tac cname x2 x3 x4 x5 ST LT T pTsa md, drule_tac x="Class cname # ST" in spec) |
|
318 apply ((drule spec)+, (drule mp, assumption)+) |
|
319 apply (simp add: replST_def) |
|
320 |
|
321 |
|
322 (* expression lists *) |
|
323 (* nil *) |
|
324 |
|
325 apply (intro strip) |
|
326 apply (drule Nil_invers) |
|
327 apply (simp add: comb_nil_def) |
|
328 |
|
329 (* cons *) |
|
330 |
|
331 apply (intro strip) |
|
332 apply (drule Cons_invers, clarify) |
|
333 apply (drule_tac x=ST in spec) |
|
334 apply (drule_tac x="T # ST" in spec) |
|
335 apply ((drule spec)+, (drule mp, assumption)+) |
299 apply simp |
336 apply simp |
300 |
337 |
301 (* show is_class G cname \<and> field (G, cname) vname = Some (cname, T) *) |
338 done |
302 apply (rule field_in_fd) apply assumption+ |
|
303 (* show is_class G Ca *) |
|
304 apply (fast intro: wt_class_expr_is_class) |
|
305 |
|
306 (* FAss *) |
|
307 apply (intro strip) |
|
308 apply (drule FAss_invers, clarify) |
|
309 apply (drule FAcc_invers, clarify) |
|
310 apply (drule_tac x=ST in spec) |
|
311 apply (drule_tac x="Class Ca # ST" in spec) |
|
312 apply ((drule spec)+, (drule mp, assumption)+) |
|
313 apply (simp add: popST_def dup_x1ST_def) |
|
314 |
|
315 |
|
316 (* Call *) |
|
317 apply (intro strip) |
|
318 apply (drule Call_invers, clarify) |
|
319 apply (drule_tac x=ST in spec) |
|
320 apply (rename_tac cname x2 x3 x4 x5 ST LT T pTsa md, drule_tac x="Class cname # ST" in spec) |
|
321 apply ((drule spec)+, (drule mp, assumption)+) |
|
322 apply (simp add: replST_def) |
|
323 |
|
324 |
|
325 (* expression lists *) |
|
326 (* nil *) |
|
327 |
|
328 apply (intro strip) |
|
329 apply (drule Nil_invers) |
|
330 apply (simp add: comb_nil_def) |
|
331 |
|
332 (* cons *) |
|
333 |
|
334 apply (intro strip) |
|
335 apply (drule Cons_invers, clarify) |
|
336 apply (drule_tac x=ST in spec) |
|
337 apply (drule_tac x="T # ST" in spec) |
|
338 apply ((drule spec)+, (drule mp, assumption)+) |
|
339 apply simp |
|
340 |
|
341 done |
|
342 |
339 |
343 |
340 |
344 |
341 |
345 lemmas compTpExpr_LT_ST [rule_format (no_asm)] = |
342 lemmas compTpExpr_LT_ST [rule_format (no_asm)] = |
346 compTpExpr_Exprs_LT_ST [THEN conjunct1] |
343 compTpExpr_Exprs_LT_ST [THEN conjunct1] |
411 (length pns) + (length lvars_pre) + 1 = length pre \<and> |
408 (length pns) + (length lvars_pre) + 1 = length pre \<and> |
412 disjoint_varnames pns (lvars_pre @ lvars) |
409 disjoint_varnames pns (lvars_pre @ lvars) |
413 \<longrightarrow> |
410 \<longrightarrow> |
414 sttp_of (compTpInitLvars jmb lvars (ST, pre @ replicate (length lvars) Err)) |
411 sttp_of (compTpInitLvars jmb lvars (ST, pre @ replicate (length lvars) Err)) |
415 = (ST, pre @ map (Fun.comp OK snd) lvars)" |
412 = (ST, pre @ map (Fun.comp OK snd) lvars)" |
416 apply (induct lvars) |
413 apply (induct lvars) |
417 apply simp |
414 apply simp |
418 |
415 |
419 apply (intro strip) |
416 apply (intro strip) |
420 apply (subgoal_tac "\<exists> vn ty. a = (vn, ty)") |
417 apply (subgoal_tac "\<exists>vn ty. a = (vn, ty)") |
421 prefer 2 apply (simp (no_asm_simp)) |
418 prefer 2 |
|
419 apply (simp (no_asm_simp)) |
422 apply ((erule exE)+, simp (no_asm_simp)) |
420 apply ((erule exE)+, simp (no_asm_simp)) |
423 |
421 |
424 apply (drule_tac x="pre @ [OK ty]" in spec) |
422 apply (drule_tac x="pre @ [OK ty]" in spec) |
425 apply (drule_tac x="lvars_pre @ [a]" in spec) |
423 apply (drule_tac x="lvars_pre @ [a]" in spec) |
426 apply (drule_tac x="lvars0" in spec) |
424 apply (drule_tac x="lvars0" in spec) |
427 apply (simp add: compTpInit_LT_ST index_of_var2) |
425 apply (simp add: compTpInit_LT_ST index_of_var2) |
428 done |
426 done |
429 |
427 |
430 lemma compTpInitLvars_LT_ST: |
428 lemma compTpInitLvars_LT_ST: |
431 "\<lbrakk> jmb = (pns, lvars, blk, res); wf_java_mdecl G C ((mn, pTs), rT, jmb) \<rbrakk> |
429 "\<lbrakk> jmb = (pns, lvars, blk, res); wf_java_mdecl G C ((mn, pTs), rT, jmb) \<rbrakk> |
432 \<Longrightarrow>(sttp_of (compTpInitLvars jmb lvars (ST, start_LT C pTs (length lvars)))) |
430 \<Longrightarrow> sttp_of (compTpInitLvars jmb lvars (ST, start_LT C pTs (length lvars))) |
433 = (ST, inited_LT C pTs lvars)" |
431 = (ST, inited_LT C pTs lvars)" |
434 apply (simp add: start_LT_def inited_LT_def) |
432 apply (simp add: start_LT_def inited_LT_def) |
435 apply (simp only: append_Cons [symmetric]) |
433 apply (simp only: append_Cons [symmetric]) |
436 apply (rule compTpInitLvars_LT_ST_aux) |
434 apply (rule compTpInitLvars_LT_ST_aux) |
437 apply (auto dest: wf_java_mdecl_length_pTs_pns wf_java_mdecl_disjoint_varnames) |
435 apply (auto dest: wf_java_mdecl_length_pTs_pns wf_java_mdecl_disjoint_varnames) |
438 done |
436 done |
439 |
437 |
440 |
438 |
441 |
439 |
442 (********************************************************************************) |
440 (********************************************************************************) |
443 |
441 |
444 lemma max_of_list_elem: "x \<in> set xs \<Longrightarrow> x \<le> (max_of_list xs)" |
442 lemma max_of_list_elem: "x \<in> set xs \<Longrightarrow> x \<le> (max_of_list xs)" |
445 by (induct xs, auto intro: max.cobounded1 simp: le_max_iff_disj max_of_list_def) |
443 by (induct xs, auto intro: max.cobounded1 simp: le_max_iff_disj max_of_list_def) |
446 |
444 |
447 lemma max_of_list_sublist: "set xs \<subseteq> set ys |
445 lemma max_of_list_sublist: "set xs \<subseteq> set ys |
448 \<Longrightarrow> (max_of_list xs) \<le> (max_of_list ys)" |
446 \<Longrightarrow> (max_of_list xs) \<le> (max_of_list ys)" |
449 by (induct xs, auto dest: max_of_list_elem simp: max_of_list_def) |
447 by (induct xs, auto dest: max_of_list_elem simp: max_of_list_def) |
450 |
448 |
451 lemma max_of_list_append [simp]: |
449 lemma max_of_list_append [simp]: |
452 "max_of_list (xs @ ys) = max (max_of_list xs) (max_of_list ys)" |
450 "max_of_list (xs @ ys) = max (max_of_list xs) (max_of_list ys)" |
453 apply (simp add: max_of_list_def) |
451 apply (simp add: max_of_list_def) |
454 apply (induct xs) |
452 apply (induct xs) |
455 apply simp |
453 apply simp |
456 using [[linarith_split_limit = 0]] |
454 using [[linarith_split_limit = 0]] |
457 apply simp |
455 apply simp |
458 apply arith |
456 apply arith |
459 done |
457 done |
460 |
458 |
461 |
459 |
462 lemma app_mono_mxs: "\<lbrakk> app i G mxs rT pc et s; mxs \<le> mxs' \<rbrakk> |
460 lemma app_mono_mxs: "\<lbrakk> app i G mxs rT pc et s; mxs \<le> mxs' \<rbrakk> |
463 \<Longrightarrow> app i G mxs' rT pc et s" |
461 \<Longrightarrow> app i G mxs' rT pc et s" |
464 apply (case_tac s) |
462 apply (case_tac s) |
465 apply (simp add: app_def) |
463 apply (simp add: app_def) |
466 apply (case_tac i) |
464 apply (case_tac i, auto intro: less_trans) |
467 apply (auto intro: less_trans) |
465 done |
468 done |
|
469 |
466 |
470 |
467 |
471 |
468 |
472 lemma err_mono [simp]: "A \<subseteq> B \<Longrightarrow> err A \<subseteq> err B" |
469 lemma err_mono [simp]: "A \<subseteq> B \<Longrightarrow> err A \<subseteq> err B" |
473 by (auto simp: err_def) |
470 by (auto simp: err_def) |
474 |
471 |
475 lemma opt_mono [simp]: "A \<subseteq> B \<Longrightarrow> opt A \<subseteq> opt B" |
472 lemma opt_mono [simp]: "A \<subseteq> B \<Longrightarrow> opt A \<subseteq> opt B" |
476 by (auto simp: opt_def) |
473 by (auto simp: opt_def) |
477 |
474 |
478 |
475 |
479 lemma states_mono: "\<lbrakk> mxs \<le> mxs' \<rbrakk> |
476 lemma states_mono: "\<lbrakk> mxs \<le> mxs' \<rbrakk> |
480 \<Longrightarrow> states G mxs mxr \<subseteq> states G mxs' mxr" |
477 \<Longrightarrow> states G mxs mxr \<subseteq> states G mxs' mxr" |
481 apply (simp add: states_def JVMType.sl_def) |
478 apply (simp add: states_def JVMType.sl_def) |
482 apply (simp add: Product.esl_def stk_esl_def reg_sl_def |
479 apply (simp add: Product.esl_def stk_esl_def reg_sl_def |
483 upto_esl_def Listn.sl_def Err.sl_def JType.esl_def) |
480 upto_esl_def Listn.sl_def Err.sl_def JType.esl_def) |
484 apply (simp add: Err.esl_def Err.le_def Listn.le_def) |
481 apply (simp add: Err.esl_def Err.le_def Listn.le_def) |
485 apply (simp add: Product.le_def Product.sup_def Err.sup_def) |
482 apply (simp add: Product.le_def Product.sup_def Err.sup_def) |
486 apply (simp add: Opt.esl_def Listn.sup_def) |
483 apply (simp add: Opt.esl_def Listn.sup_def) |
487 apply (rule err_mono) |
484 apply (rule err_mono) |
488 apply (rule opt_mono) |
485 apply (rule opt_mono) |
489 apply (rule Sigma_mono) |
486 apply (rule Sigma_mono) |
490 apply (rule Union_mono) |
487 apply (rule Union_mono) |
491 apply auto |
488 apply auto |
492 done |
489 done |
493 |
490 |
494 |
491 |
495 lemma check_type_mono: "\<lbrakk> check_type G mxs mxr s; mxs \<le> mxs' \<rbrakk> |
492 lemma check_type_mono: |
496 \<Longrightarrow> check_type G mxs' mxr s" |
493 "\<lbrakk> check_type G mxs mxr s; mxs \<le> mxs' \<rbrakk> \<Longrightarrow> check_type G mxs' mxr s" |
497 apply (simp add: check_type_def) |
494 apply (simp add: check_type_def) |
498 apply (frule_tac G=G and mxr=mxr in states_mono) |
495 apply (frule_tac G=G and mxr=mxr in states_mono) |
499 apply auto |
496 apply auto |
500 done |
497 done |
501 |
498 |
502 |
499 |
503 (* wt is preserved when adding instructions/state-types at the end *) |
500 (* wt is preserved when adding instructions/state-types at the end *) |
504 lemma wt_instr_prefix: " |
501 lemma wt_instr_prefix: " |
505 \<lbrakk> wt_instr_altern (bc ! pc) cG rT mt mxs mxr max_pc et pc; |
502 \<lbrakk> wt_instr_altern (bc ! pc) cG rT mt mxs mxr max_pc et pc; |
506 bc' = bc @ bc_post; mt' = mt @ mt_post; |
503 bc' = bc @ bc_post; mt' = mt @ mt_post; |
507 mxs \<le> mxs'; max_pc \<le> max_pc'; |
504 mxs \<le> mxs'; max_pc \<le> max_pc'; |
508 pc < length bc; pc < length mt; |
505 pc < length bc; pc < length mt; |
509 max_pc = (length mt)\<rbrakk> |
506 max_pc = (length mt)\<rbrakk> |
510 \<Longrightarrow> wt_instr_altern (bc' ! pc) cG rT mt' mxs' mxr max_pc' et pc" |
507 \<Longrightarrow> wt_instr_altern (bc' ! pc) cG rT mt' mxs' mxr max_pc' et pc" |
511 apply (simp add: wt_instr_altern_def nth_append) |
508 apply (simp add: wt_instr_altern_def nth_append) |
512 apply (auto intro: app_mono_mxs check_type_mono) |
509 apply (auto intro: app_mono_mxs check_type_mono) |
513 done |
510 done |
514 |
511 |
515 |
512 |
516 (************************************************************************) |
513 (************************************************************************) |
517 |
514 |
518 |
515 |
519 |
516 |
520 lemma pc_succs_shift: "pc'\<in>set (succs i (pc'' + n)) |
517 lemma pc_succs_shift: |
521 \<Longrightarrow> ((pc' - n) \<in>set (succs i pc''))" |
518 "pc'\<in>set (succs i (pc'' + n)) \<Longrightarrow> ((pc' - n) \<in>set (succs i pc''))" |
522 apply (induct i) |
519 apply (induct i, simp_all) |
523 apply simp_all |
520 apply arith |
524 apply arith |
521 done |
525 done |
522 |
526 |
523 |
527 |
524 lemma pc_succs_le: |
528 lemma pc_succs_le: "\<lbrakk> pc' \<in> set (succs i (pc'' + n)); |
525 "\<lbrakk> pc' \<in> set (succs i (pc'' + n)); |
529 \<forall> b. ((i = (Goto b) \<or> i=(Ifcmpeq b)) \<longrightarrow> 0 \<le> (int pc'' + b)) \<rbrakk> |
526 \<forall>b. ((i = (Goto b) \<or> i=(Ifcmpeq b)) \<longrightarrow> 0 \<le> (int pc'' + b)) \<rbrakk> |
530 \<Longrightarrow> n \<le> pc'" |
527 \<Longrightarrow> n \<le> pc'" |
531 apply (induct i) |
528 apply (induct i, simp_all) |
532 apply simp_all |
529 apply arith |
533 apply arith |
530 done |
534 done |
|
535 |
531 |
536 |
532 |
537 (**********************************************************************) |
533 (**********************************************************************) |
538 |
534 |
539 definition offset_xcentry :: "[nat, exception_entry] \<Rightarrow> exception_entry" where |
535 definition offset_xcentry :: "[nat, exception_entry] \<Rightarrow> exception_entry" where |
686 |
682 |
687 definition start_sttp_resp :: "[state_type \<Rightarrow> method_type \<times> state_type] \<Rightarrow> bool" where |
683 definition start_sttp_resp :: "[state_type \<Rightarrow> method_type \<times> state_type] \<Rightarrow> bool" where |
688 "start_sttp_resp f == (f = comb_nil) \<or> (start_sttp_resp_cons f)" |
684 "start_sttp_resp f == (f = comb_nil) \<or> (start_sttp_resp_cons f)" |
689 |
685 |
690 lemma start_sttp_resp_comb_nil [simp]: "start_sttp_resp comb_nil" |
686 lemma start_sttp_resp_comb_nil [simp]: "start_sttp_resp comb_nil" |
691 by (simp add: start_sttp_resp_def) |
687 by (simp add: start_sttp_resp_def) |
692 |
688 |
693 lemma start_sttp_resp_cons_comb_cons [simp]: "start_sttp_resp_cons f |
689 lemma start_sttp_resp_cons_comb_cons [simp]: "start_sttp_resp_cons f |
694 \<Longrightarrow> start_sttp_resp_cons (f \<box> f')" |
690 \<Longrightarrow> start_sttp_resp_cons (f \<box> f')" |
695 apply (simp add: start_sttp_resp_cons_def comb_def split_beta) |
691 apply (simp add: start_sttp_resp_cons_def comb_def split_beta) |
696 apply (rule allI) |
692 apply (rule allI) |
697 apply (drule_tac x=sttp in spec) |
693 apply (drule_tac x=sttp in spec) |
698 apply auto |
694 apply auto |
699 done |
695 done |
700 |
696 |
701 lemma start_sttp_resp_cons_comb_cons_r: "\<lbrakk> start_sttp_resp f; start_sttp_resp_cons f'\<rbrakk> |
697 lemma start_sttp_resp_cons_comb_cons_r: "\<lbrakk> start_sttp_resp f; start_sttp_resp_cons f'\<rbrakk> |
702 \<Longrightarrow> start_sttp_resp_cons (f \<box> f')" |
698 \<Longrightarrow> start_sttp_resp_cons (f \<box> f')" |
703 apply (simp add: start_sttp_resp_def) |
699 by (auto simp: start_sttp_resp_def) |
704 apply (erule disjE) |
|
705 apply simp+ |
|
706 done |
|
707 |
700 |
708 lemma start_sttp_resp_cons_comb [simp]: "start_sttp_resp_cons f |
701 lemma start_sttp_resp_cons_comb [simp]: "start_sttp_resp_cons f |
709 \<Longrightarrow> start_sttp_resp (f \<box> f')" |
702 \<Longrightarrow> start_sttp_resp (f \<box> f')" |
710 by (simp add: start_sttp_resp_def) |
703 by (simp add: start_sttp_resp_def) |
711 |
704 |
712 lemma start_sttp_resp_comb: "\<lbrakk> start_sttp_resp f; start_sttp_resp f' \<rbrakk> |
705 lemma start_sttp_resp_comb: "\<lbrakk> start_sttp_resp f; start_sttp_resp f' \<rbrakk> |
713 \<Longrightarrow> start_sttp_resp (f \<box> f')" |
706 \<Longrightarrow> start_sttp_resp (f \<box> f')" |
714 apply (simp add: start_sttp_resp_def) |
707 by (auto simp: start_sttp_resp_def) |
715 apply (erule disjE) |
|
716 apply simp |
|
717 apply (erule disjE) |
|
718 apply simp+ |
|
719 done |
|
720 |
708 |
721 lemma start_sttp_resp_cons_nochangeST [simp]: "start_sttp_resp_cons nochangeST" |
709 lemma start_sttp_resp_cons_nochangeST [simp]: "start_sttp_resp_cons nochangeST" |
722 by (simp add: start_sttp_resp_cons_def nochangeST_def) |
710 by (simp add: start_sttp_resp_cons_def nochangeST_def) |
723 |
711 |
724 lemma start_sttp_resp_cons_pushST [simp]: "start_sttp_resp_cons (pushST Ts)" |
712 lemma start_sttp_resp_cons_pushST [simp]: "start_sttp_resp_cons (pushST Ts)" |
725 by (simp add: start_sttp_resp_cons_def pushST_def split_beta) |
713 by (simp add: start_sttp_resp_cons_def pushST_def split_beta) |
726 |
714 |
727 lemma start_sttp_resp_cons_dupST [simp]: "start_sttp_resp_cons dupST" |
715 lemma start_sttp_resp_cons_dupST [simp]: "start_sttp_resp_cons dupST" |
728 by (simp add: start_sttp_resp_cons_def dupST_def split_beta) |
716 by (simp add: start_sttp_resp_cons_def dupST_def split_beta) |
729 |
717 |
730 lemma start_sttp_resp_cons_dup_x1ST [simp]: "start_sttp_resp_cons dup_x1ST" |
718 lemma start_sttp_resp_cons_dup_x1ST [simp]: "start_sttp_resp_cons dup_x1ST" |
731 by (simp add: start_sttp_resp_cons_def dup_x1ST_def split_beta) |
719 by (simp add: start_sttp_resp_cons_def dup_x1ST_def split_beta) |
732 |
720 |
733 lemma start_sttp_resp_cons_popST [simp]: "start_sttp_resp_cons (popST n)" |
721 lemma start_sttp_resp_cons_popST [simp]: "start_sttp_resp_cons (popST n)" |
734 by (simp add: start_sttp_resp_cons_def popST_def split_beta) |
722 by (simp add: start_sttp_resp_cons_def popST_def split_beta) |
735 |
723 |
736 lemma start_sttp_resp_cons_replST [simp]: "start_sttp_resp_cons (replST n tp)" |
724 lemma start_sttp_resp_cons_replST [simp]: "start_sttp_resp_cons (replST n tp)" |
737 by (simp add: start_sttp_resp_cons_def replST_def split_beta) |
725 by (simp add: start_sttp_resp_cons_def replST_def split_beta) |
738 |
726 |
739 lemma start_sttp_resp_cons_storeST [simp]: "start_sttp_resp_cons (storeST i tp)" |
727 lemma start_sttp_resp_cons_storeST [simp]: "start_sttp_resp_cons (storeST i tp)" |
740 by (simp add: start_sttp_resp_cons_def storeST_def split_beta) |
728 by (simp add: start_sttp_resp_cons_def storeST_def split_beta) |
741 |
729 |
742 lemma start_sttp_resp_cons_compTpExpr [simp]: "start_sttp_resp_cons (compTpExpr jmb G ex)" |
730 lemma start_sttp_resp_cons_compTpExpr [simp]: "start_sttp_resp_cons (compTpExpr jmb G ex)" |
743 apply (induct ex) |
731 apply (induct ex) |
744 apply simp+ |
732 apply simp+ |
745 apply (simp add: start_sttp_resp_cons_def comb_def pushST_def split_beta) (* LAcc *) |
733 apply (simp add: start_sttp_resp_cons_def comb_def pushST_def split_beta) (* LAcc *) |
746 apply simp+ |
734 apply simp+ |
747 done |
735 done |
748 |
736 |
749 lemma start_sttp_resp_cons_compTpInit [simp]: "start_sttp_resp_cons (compTpInit jmb lv)" |
737 lemma start_sttp_resp_cons_compTpInit [simp]: "start_sttp_resp_cons (compTpInit jmb lv)" |
750 by (simp add: compTpInit_def split_beta) |
738 by (simp add: compTpInit_def split_beta) |
751 |
739 |
752 |
740 |
753 lemma start_sttp_resp_nochangeST [simp]: "start_sttp_resp nochangeST" |
741 lemma start_sttp_resp_nochangeST [simp]: "start_sttp_resp nochangeST" |
754 by (simp add: start_sttp_resp_def) |
742 by (simp add: start_sttp_resp_def) |
755 |
743 |
756 lemma start_sttp_resp_pushST [simp]: "start_sttp_resp (pushST Ts)" |
744 lemma start_sttp_resp_pushST [simp]: "start_sttp_resp (pushST Ts)" |
757 by (simp add: start_sttp_resp_def) |
745 by (simp add: start_sttp_resp_def) |
758 |
746 |
759 lemma start_sttp_resp_dupST [simp]: "start_sttp_resp dupST" |
747 lemma start_sttp_resp_dupST [simp]: "start_sttp_resp dupST" |
760 by (simp add: start_sttp_resp_def) |
748 by (simp add: start_sttp_resp_def) |
761 |
749 |
762 lemma start_sttp_resp_dup_x1ST [simp]: "start_sttp_resp dup_x1ST" |
750 lemma start_sttp_resp_dup_x1ST [simp]: "start_sttp_resp dup_x1ST" |
763 by (simp add: start_sttp_resp_def) |
751 by (simp add: start_sttp_resp_def) |
764 |
752 |
765 lemma start_sttp_resp_popST [simp]: "start_sttp_resp (popST n)" |
753 lemma start_sttp_resp_popST [simp]: "start_sttp_resp (popST n)" |
766 by (simp add: start_sttp_resp_def) |
754 by (simp add: start_sttp_resp_def) |
767 |
755 |
768 lemma start_sttp_resp_replST [simp]: "start_sttp_resp (replST n tp)" |
756 lemma start_sttp_resp_replST [simp]: "start_sttp_resp (replST n tp)" |
769 by (simp add: start_sttp_resp_def) |
757 by (simp add: start_sttp_resp_def) |
770 |
758 |
771 lemma start_sttp_resp_storeST [simp]: "start_sttp_resp (storeST i tp)" |
759 lemma start_sttp_resp_storeST [simp]: "start_sttp_resp (storeST i tp)" |
772 by (simp add: start_sttp_resp_def) |
760 by (simp add: start_sttp_resp_def) |
773 |
761 |
774 lemma start_sttp_resp_compTpExpr [simp]: "start_sttp_resp (compTpExpr jmb G ex)" |
762 lemma start_sttp_resp_compTpExpr [simp]: "start_sttp_resp (compTpExpr jmb G ex)" |
775 by (simp add: start_sttp_resp_def) |
763 by (simp add: start_sttp_resp_def) |
776 |
764 |
777 lemma start_sttp_resp_compTpExprs [simp]: "start_sttp_resp (compTpExprs jmb G exs)" |
765 lemma start_sttp_resp_compTpExprs [simp]: "start_sttp_resp (compTpExprs jmb G exs)" |
778 by (induct exs, (simp add: start_sttp_resp_comb)+) |
766 by (induct exs, (simp add: start_sttp_resp_comb)+) |
779 |
767 |
780 lemma start_sttp_resp_compTpStmt [simp]: "start_sttp_resp (compTpStmt jmb G s)" |
768 lemma start_sttp_resp_compTpStmt [simp]: "start_sttp_resp (compTpStmt jmb G s)" |
781 by (induct s, (simp add: start_sttp_resp_comb)+) |
769 by (induct s, (simp add: start_sttp_resp_comb)+) |
782 |
770 |
783 lemma start_sttp_resp_compTpInitLvars [simp]: "start_sttp_resp (compTpInitLvars jmb lvars)" |
771 lemma start_sttp_resp_compTpInitLvars [simp]: "start_sttp_resp (compTpInitLvars jmb lvars)" |
784 by (induct lvars, simp+) |
772 by (induct lvars, simp+) |
785 |
773 |
786 |
774 |
787 |
775 |
788 |
776 |
789 (* ********************************************************************** *) |
777 (* ********************************************************************** *) |
790 subsection "length of compExpr/ compTpExprs" |
778 subsection "length of compExpr/ compTpExprs" |
791 (* ********************************************************************** *) |
779 (* ********************************************************************** *) |
792 |
780 |
793 lemma length_comb [simp]: "length (mt_of ((f1 \<box> f2) sttp)) = |
781 lemma length_comb [simp]: "length (mt_of ((f1 \<box> f2) sttp)) = |
794 length (mt_of (f1 sttp)) + length (mt_of (f2 (sttp_of (f1 sttp))))" |
782 length (mt_of (f1 sttp)) + length (mt_of (f2 (sttp_of (f1 sttp))))" |
795 by (simp add: comb_def split_beta) |
783 by (simp add: comb_def split_beta) |
796 |
784 |
797 |
785 |
798 lemma length_comb_nil [simp]: "length (mt_of (comb_nil sttp)) = 0" |
786 lemma length_comb_nil [simp]: "length (mt_of (comb_nil sttp)) = 0" |
799 by (simp add: comb_nil_def) |
787 by (simp add: comb_nil_def) |
800 |
788 |
801 lemma length_nochangeST [simp]: "length (mt_of (nochangeST sttp)) = 1" |
789 lemma length_nochangeST [simp]: "length (mt_of (nochangeST sttp)) = 1" |
802 by (simp add: nochangeST_def) |
790 by (simp add: nochangeST_def) |
803 |
791 |
804 lemma length_pushST [simp]: "length (mt_of (pushST Ts sttp)) = 1" |
792 lemma length_pushST [simp]: "length (mt_of (pushST Ts sttp)) = 1" |
805 by (simp add: pushST_def split_beta) |
793 by (simp add: pushST_def split_beta) |
806 |
794 |
807 lemma length_dupST [simp]: "length (mt_of (dupST sttp)) = 1" |
795 lemma length_dupST [simp]: "length (mt_of (dupST sttp)) = 1" |
808 by (simp add: dupST_def split_beta) |
796 by (simp add: dupST_def split_beta) |
809 |
797 |
810 lemma length_dup_x1ST [simp]: "length (mt_of (dup_x1ST sttp)) = 1" |
798 lemma length_dup_x1ST [simp]: "length (mt_of (dup_x1ST sttp)) = 1" |
811 by (simp add: dup_x1ST_def split_beta) |
799 by (simp add: dup_x1ST_def split_beta) |
812 |
800 |
813 lemma length_popST [simp]: "length (mt_of (popST n sttp)) = 1" |
801 lemma length_popST [simp]: "length (mt_of (popST n sttp)) = 1" |
814 by (simp add: popST_def split_beta) |
802 by (simp add: popST_def split_beta) |
815 |
803 |
816 lemma length_replST [simp]: "length (mt_of (replST n tp sttp)) = 1" |
804 lemma length_replST [simp]: "length (mt_of (replST n tp sttp)) = 1" |
817 by (simp add: replST_def split_beta) |
805 by (simp add: replST_def split_beta) |
818 |
806 |
819 lemma length_storeST [simp]: "length (mt_of (storeST i tp sttp)) = 1" |
807 lemma length_storeST [simp]: "length (mt_of (storeST i tp sttp)) = 1" |
820 by (simp add: storeST_def split_beta) |
808 by (simp add: storeST_def split_beta) |
821 |
809 |
822 |
810 |
823 lemma length_compTpExpr_Exprs [rule_format]: " |
811 lemma length_compTpExpr_Exprs [rule_format]: " |
824 (\<forall> sttp. (length (mt_of (compTpExpr jmb G ex sttp)) = length (compExpr jmb ex))) |
812 (\<forall>sttp. (length (mt_of (compTpExpr jmb G ex sttp)) = length (compExpr jmb ex))) |
825 \<and> (\<forall> sttp. (length (mt_of (compTpExprs jmb G exs sttp)) = length (compExprs jmb exs)))" |
813 \<and> (\<forall>sttp. (length (mt_of (compTpExprs jmb G exs sttp)) = length (compExprs jmb exs)))" |
826 apply (rule compat_expr_expr_list.induct) |
814 apply (rule compat_expr_expr_list.induct) |
827 apply simp+ |
815 apply (simp_all)[3] |
828 apply (rename_tac binop a b, case_tac binop) |
816 apply (rename_tac binop a b, case_tac binop) |
829 apply simp+ |
817 apply (auto simp add: pushST_def split_beta) |
830 apply (simp add: pushST_def split_beta) |
818 done |
831 apply simp+ |
|
832 done |
|
833 |
819 |
834 lemma length_compTpExpr: "length (mt_of (compTpExpr jmb G ex sttp)) = length (compExpr jmb ex)" |
820 lemma length_compTpExpr: "length (mt_of (compTpExpr jmb G ex sttp)) = length (compExpr jmb ex)" |
835 by (rule length_compTpExpr_Exprs [THEN conjunct1 [THEN spec]]) |
821 by (rule length_compTpExpr_Exprs [THEN conjunct1 [THEN spec]]) |
836 |
822 |
837 lemma length_compTpExprs: "length (mt_of (compTpExprs jmb G exs sttp)) = length (compExprs jmb exs)" |
823 lemma length_compTpExprs: "length (mt_of (compTpExprs jmb G exs sttp)) = length (compExprs jmb exs)" |
838 by (rule length_compTpExpr_Exprs [THEN conjunct2 [THEN spec]]) |
824 by (rule length_compTpExpr_Exprs [THEN conjunct2 [THEN spec]]) |
839 |
825 |
840 lemma length_compTpStmt [rule_format]: " |
826 lemma length_compTpStmt [rule_format]: " |
841 (\<forall> sttp. (length (mt_of (compTpStmt jmb G s sttp)) = length (compStmt jmb s)))" |
827 (\<forall> sttp. (length (mt_of (compTpStmt jmb G s sttp)) = length (compStmt jmb s)))" |
842 apply (rule stmt.induct) |
828 by (rule stmt.induct) (auto simp: length_compTpExpr) |
843 apply (simp add: length_compTpExpr)+ |
|
844 done |
|
845 |
|
846 |
829 |
847 lemma length_compTpInit: "length (mt_of (compTpInit jmb lv sttp)) = length (compInit jmb lv)" |
830 lemma length_compTpInit: "length (mt_of (compTpInit jmb lv sttp)) = length (compInit jmb lv)" |
848 by (simp add: compTpInit_def compInit_def split_beta) |
831 by (simp add: compTpInit_def compInit_def split_beta) |
849 |
832 |
850 lemma length_compTpInitLvars [rule_format]: |
833 lemma length_compTpInitLvars [rule_format]: |
851 "\<forall> sttp. length (mt_of (compTpInitLvars jmb lvars sttp)) = length (compInitLvars jmb lvars)" |
834 "\<forall> sttp. length (mt_of (compTpInitLvars jmb lvars sttp)) = length (compInitLvars jmb lvars)" |
852 by (induct lvars, (simp add: compInitLvars_def length_compTpInit split_beta)+) |
835 by (induct lvars, (simp add: compInitLvars_def length_compTpInit split_beta)+) |
853 |
836 |
854 |
837 |
855 (* ********************************************************************** *) |
838 (* ********************************************************************** *) |
856 subsection "Correspondence bytecode - method types" |
839 subsection "Correspondence bytecode - method types" |
857 (* ********************************************************************** *) |
840 (* ********************************************************************** *) |
904 \<lbrakk> bc' = (bc1@bc2); l' = (length bc'); |
887 \<lbrakk> bc' = (bc1@bc2); l' = (length bc'); |
905 bc_mt_corresp bc1 f1 sttp0 cG rT mxr (length bc1); |
888 bc_mt_corresp bc1 f1 sttp0 cG rT mxr (length bc1); |
906 bc_mt_corresp bc2 f2 (sttp_of (f1 sttp0)) cG rT mxr (length bc2); |
889 bc_mt_corresp bc2 f2 (sttp_of (f1 sttp0)) cG rT mxr (length bc2); |
907 start_sttp_resp f2\<rbrakk> |
890 start_sttp_resp f2\<rbrakk> |
908 \<Longrightarrow> bc_mt_corresp bc' (f1 \<box> f2) sttp0 cG rT mxr l'" |
891 \<Longrightarrow> bc_mt_corresp bc' (f1 \<box> f2) sttp0 cG rT mxr l'" |
909 apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+) |
892 apply (subgoal_tac "\<exists>mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+) |
910 apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+) |
893 apply (subgoal_tac "\<exists>mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+) |
911 |
894 |
912 (* unfold start_sttp_resp and make case distinction *) |
895 (* unfold start_sttp_resp and make case distinction *) |
913 apply (simp only: start_sttp_resp_def) |
896 apply (simp only: start_sttp_resp_def) |
914 apply (erule disjE) |
897 apply (erule disjE) |
915 (* case f2 = comb_nil *) |
898 (* case f2 = comb_nil *) |
916 apply (simp add: bc_mt_corresp_def comb_nil_def start_sttp_resp_cons_def) |
899 apply (simp add: bc_mt_corresp_def comb_nil_def start_sttp_resp_cons_def) |
917 apply (erule conjE)+ |
900 apply (erule conjE)+ |
918 apply (intro strip) |
901 apply (intro strip) |
919 apply simp |
902 apply simp |
920 |
903 |
921 (* case start_sttp_resp_cons f2 *) |
904 (* case start_sttp_resp_cons f2 *) |
922 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def del: all_simps) |
905 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def del: all_simps) |
923 apply (intro strip) |
906 apply (intro strip) |
924 apply (erule conjE)+ |
907 apply (erule conjE)+ |
925 apply (drule mp, assumption) |
908 apply (drule mp, assumption) |
926 apply (subgoal_tac "check_type cG (length (fst sttp1)) mxr (OK (Some sttp1))") |
909 apply (subgoal_tac "check_type cG (length (fst sttp1)) mxr (OK (Some sttp1))") |
927 apply (erule conjE)+ |
910 apply (erule conjE)+ |
928 apply (drule mp, assumption) |
911 apply (drule mp, assumption) |
929 apply (erule conjE)+ |
912 apply (erule conjE)+ |
930 |
913 |
931 apply (rule conjI) |
914 apply (rule conjI) |
932 (* show wt_instr \<dots> *) |
915 (* show wt_instr \<dots> *) |
933 |
916 |
934 apply (drule_tac x=sttp1 in spec, simp) |
917 apply (drule_tac x=sttp1 in spec, simp) |
935 apply (erule exE) |
918 apply (erule exE) |
936 apply (intro strip) |
919 apply (intro strip) |
937 apply (case_tac "pc < length mt1") |
920 apply (case_tac "pc < length mt1") |
938 |
921 |
939 (* case pc < length mt1 *) |
922 (* case pc < length mt1 *) |
940 apply (drule spec, drule mp, simp) |
923 apply (drule spec, drule mp, simp) |
941 apply simp |
924 apply simp |
942 apply (rule_tac mt="mt1 @ [Some sttp1]" in wt_instr_prefix) |
925 apply (rule_tac mt="mt1 @ [Some sttp1]" in wt_instr_prefix) |
943 apply assumption+ apply (rule HOL.refl) |
926 apply assumption+ apply (rule HOL.refl) |
944 apply (simp (no_asm_simp)) |
927 apply (simp (no_asm_simp)) |
945 apply (simp (no_asm_simp) add: max_ssize_def) |
928 apply (simp (no_asm_simp) add: max_ssize_def) |
946 apply (simp add: max_of_list_def ac_simps) |
929 apply (simp add: max_of_list_def ac_simps) |
947 apply arith |
930 apply arith |
948 apply (simp (no_asm_simp))+ |
931 apply (simp (no_asm_simp))+ |
949 |
932 |
950 (* case pc \<ge> length mt1 *) |
933 (* case pc \<ge> length mt1 *) |
951 apply (rule_tac bc=bc2 and mt=mt2 and bc_post="[]" and mt_post="[Some sttp2]" |
934 apply (rule_tac bc=bc2 and mt=mt2 and bc_post="[]" and mt_post="[Some sttp2]" |
952 and mxr=mxr |
935 and mxr=mxr |
953 in wt_instr_offset) |
936 in wt_instr_offset) |
954 apply simp |
937 apply simp |
955 apply (simp (no_asm_simp))+ |
938 apply (simp (no_asm_simp))+ |
956 apply simp |
939 apply simp |
957 apply (simp add: max_ssize_def) apply (simp (no_asm_simp)) |
940 apply (simp add: max_ssize_def) apply (simp (no_asm_simp)) |
958 |
941 |
959 (* show check_type \<dots> *) |
942 (* show check_type \<dots> *) |
960 apply (subgoal_tac "((mt2 @ [Some sttp2]) ! length bc2) = Some sttp2") |
943 apply (subgoal_tac "((mt2 @ [Some sttp2]) ! length bc2) = Some sttp2") |
961 apply (simp only:) |
944 apply (simp only:) |
962 apply (rule check_type_mono) apply assumption |
945 apply (rule check_type_mono) apply assumption |
963 apply (simp (no_asm_simp) add: max_ssize_def ac_simps) |
946 apply (simp (no_asm_simp) add: max_ssize_def ac_simps) |
964 apply (simp add: nth_append) |
947 apply (simp add: nth_append) |
965 |
948 |
966 apply (erule conjE)+ |
949 apply (erule conjE)+ |
967 apply (case_tac sttp1) |
950 apply (case_tac sttp1) |
968 apply (simp add: check_type_def) |
951 apply (simp add: check_type_def) |
969 apply (rule states_lower, assumption) |
952 apply (rule states_lower, assumption) |
970 apply (simp (no_asm_simp) add: max_ssize_def) |
953 apply (simp (no_asm_simp) add: max_ssize_def) |
971 apply (simp (no_asm_simp) add: max_of_list_def ssize_sto_def) |
954 apply (simp (no_asm_simp) add: max_of_list_def ssize_sto_def) |
972 apply (simp (no_asm_simp))+ |
955 apply (simp (no_asm_simp))+ |
973 done |
956 done |
974 |
957 |
975 |
958 |
976 lemma bc_mt_corresp_zero [simp]: "\<lbrakk> length (mt_of (f sttp)) = length bc; start_sttp_resp f\<rbrakk> |
959 lemma bc_mt_corresp_zero [simp]: |
|
960 "\<lbrakk> length (mt_of (f sttp)) = length bc; start_sttp_resp f\<rbrakk> |
977 \<Longrightarrow> bc_mt_corresp bc f sttp cG rT mxr 0" |
961 \<Longrightarrow> bc_mt_corresp bc f sttp cG rT mxr 0" |
978 apply (simp add: bc_mt_corresp_def start_sttp_resp_def split_beta) |
962 apply (simp add: bc_mt_corresp_def start_sttp_resp_def split_beta) |
979 apply (erule disjE) |
963 apply (erule disjE) |
980 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def split: prod.split) |
964 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def split: prod.split) |
981 apply (intro strip) |
965 apply (intro strip) |
982 apply (simp add: start_sttp_resp_cons_def split_beta) |
966 apply (simp add: start_sttp_resp_cons_def split_beta) |
983 apply (drule_tac x=sttp in spec, erule exE) |
967 apply (drule_tac x=sttp in spec, erule exE) |
984 apply simp |
968 apply simp |
985 apply (rule check_type_mono, assumption) |
969 apply (rule check_type_mono, assumption) |
986 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def split: prod.split) |
970 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def split: prod.split) |
987 done |
971 done |
988 |
972 |
989 (* ********************************************************************** *) |
973 (* ********************************************************************** *) |
990 |
974 |
991 |
975 |
992 definition mt_sttp_flatten :: "method_type \<times> state_type \<Rightarrow> method_type" where |
976 definition mt_sttp_flatten :: "method_type \<times> state_type \<Rightarrow> method_type" where |
993 "mt_sttp_flatten mt_sttp == (mt_of mt_sttp) @ [Some (sttp_of mt_sttp)]" |
977 "mt_sttp_flatten mt_sttp == (mt_of mt_sttp) @ [Some (sttp_of mt_sttp)]" |
994 |
978 |
995 |
979 |
996 lemma mt_sttp_flatten_length [simp]: "n = (length (mt_of (f sttp))) |
980 lemma mt_sttp_flatten_length [simp]: "n = (length (mt_of (f sttp))) |
997 \<Longrightarrow> (mt_sttp_flatten (f sttp)) ! n = Some (sttp_of (f sttp))" |
981 \<Longrightarrow> (mt_sttp_flatten (f sttp)) ! n = Some (sttp_of (f sttp))" |
998 by (simp add: mt_sttp_flatten_def) |
982 by (simp add: mt_sttp_flatten_def) |
999 |
983 |
1000 lemma mt_sttp_flatten_comb: "(mt_sttp_flatten ((f1 \<box> f2) sttp)) = |
984 lemma mt_sttp_flatten_comb: "(mt_sttp_flatten ((f1 \<box> f2) sttp)) = |
1001 (mt_of (f1 sttp)) @ (mt_sttp_flatten (f2 (sttp_of (f1 sttp))))" |
985 (mt_of (f1 sttp)) @ (mt_sttp_flatten (f2 (sttp_of (f1 sttp))))" |
1002 by (simp add: mt_sttp_flatten_def comb_def split_beta) |
986 by (simp add: mt_sttp_flatten_def comb_def split_beta) |
1003 |
987 |
1004 lemma mt_sttp_flatten_comb_length [simp]: "\<lbrakk> n1 = length (mt_of (f1 sttp)); n1 \<le> n \<rbrakk> |
988 lemma mt_sttp_flatten_comb_length [simp]: "\<lbrakk> n1 = length (mt_of (f1 sttp)); n1 \<le> n \<rbrakk> |
1005 \<Longrightarrow> (mt_sttp_flatten ((f1 \<box> f2) sttp) ! n) = (mt_sttp_flatten (f2 (sttp_of (f1 sttp))) ! (n - n1))" |
989 \<Longrightarrow> (mt_sttp_flatten ((f1 \<box> f2) sttp) ! n) = (mt_sttp_flatten (f2 (sttp_of (f1 sttp))) ! (n - n1))" |
1006 by (simp add: mt_sttp_flatten_comb nth_append) |
990 by (simp add: mt_sttp_flatten_comb nth_append) |
1007 |
991 |
1008 lemma mt_sttp_flatten_comb_zero [simp]: "start_sttp_resp f |
992 lemma mt_sttp_flatten_comb_zero [simp]: |
1009 \<Longrightarrow> (mt_sttp_flatten (f sttp)) ! 0 = Some sttp" |
993 "start_sttp_resp f \<Longrightarrow> (mt_sttp_flatten (f sttp)) ! 0 = Some sttp" |
1010 apply (simp only: start_sttp_resp_def) |
994 apply (simp only: start_sttp_resp_def) |
1011 apply (erule disjE) |
995 apply (erule disjE) |
1012 apply (simp add: comb_nil_def mt_sttp_flatten_def) |
996 apply (simp add: comb_nil_def mt_sttp_flatten_def) |
1013 apply (simp add: start_sttp_resp_cons_def mt_sttp_flatten_def split_beta) |
997 apply (simp add: start_sttp_resp_cons_def mt_sttp_flatten_def split_beta) |
1014 apply (drule_tac x=sttp in spec) |
998 apply (drule_tac x=sttp in spec) |
1015 apply (erule exE) |
999 apply (erule exE) |
1016 apply simp |
1000 apply simp |
1017 done |
1001 done |
1018 |
1002 |
1019 |
1003 |
1020 (* move into prelude -- compare with nat_int_length *) |
1004 (* move into prelude -- compare with nat_int_length *) |
1021 lemma int_outside_right: "0 \<le> (m::int) \<Longrightarrow> m + (int n) = int ((nat m) + n)" |
1005 lemma int_outside_right: "0 \<le> (m::int) \<Longrightarrow> m + (int n) = int ((nat m) + n)" |
1022 by simp |
1006 by simp |
1023 |
1007 |
1024 lemma int_outside_left: "0 \<le> (m::int) \<Longrightarrow> (int n) + m = int (n + (nat m))" |
1008 lemma int_outside_left: "0 \<le> (m::int) \<Longrightarrow> (int n) + m = int (n + (nat m))" |
1025 by simp |
1009 by simp |
1026 |
1010 |
1027 |
1011 |
1028 |
1012 |
1029 |
1013 |
1030 (* ********************************************************************** *) |
1014 (* ********************************************************************** *) |
1076 apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def) |
1060 apply (simp add: bc_mt_corresp_def replST_def wt_instr_altern_def eff_def norm_eff_def) |
1077 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def) |
1061 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def) |
1078 apply (simp add: check_type_simps) |
1062 apply (simp add: check_type_simps) |
1079 apply clarify |
1063 apply clarify |
1080 apply (rule_tac x="Suc (length STo)" in exI) |
1064 apply (rule_tac x="Suc (length STo)" in exI) |
1081 apply simp+ |
1065 apply simp |
1082 done |
1066 done |
1083 |
1067 |
1084 |
1068 |
1085 lemma bc_mt_corresp_LitPush: "\<lbrakk> typeof (\<lambda>v. None) val = Some T \<rbrakk> |
1069 lemma bc_mt_corresp_LitPush: "\<lbrakk> typeof (\<lambda>v. None) val = Some T \<rbrakk> |
1086 \<Longrightarrow> bc_mt_corresp [LitPush val] (pushST [T]) sttp cG rT mxr (Suc 0)" |
1070 \<Longrightarrow> bc_mt_corresp [LitPush val] (pushST [T]) sttp cG rT mxr (Suc 0)" |
1087 apply (subgoal_tac "\<exists> ST LT. sttp= (ST, LT)", (erule exE)+) |
1071 apply (subgoal_tac "\<exists>ST LT. sttp= (ST, LT)", (erule exE)+) |
1088 apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def |
1072 apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def |
1089 max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1073 max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1090 apply (intro strip) |
1074 apply (intro strip) |
1091 apply (rule conjI) |
1075 apply (rule conjI) |
1092 apply (rule check_type_mono, assumption, simp) |
1076 apply (rule check_type_mono, assumption, simp) |
1093 apply (simp add: check_type_simps) |
1077 apply (simp add: check_type_simps) |
1094 apply clarify |
1078 apply clarify |
1095 apply (rule_tac x="Suc (length ST)" in exI) |
1079 apply (rule_tac x="Suc (length ST)" in exI) |
1096 apply simp |
1080 apply simp |
1097 apply (drule sym) |
1081 apply (drule sym) |
1098 apply (case_tac val) |
1082 apply (case_tac val) |
1099 apply simp+ |
1083 apply simp+ |
1100 done |
1084 done |
1101 |
1085 |
1102 |
1086 |
1103 lemma bc_mt_corresp_LitPush_CT: "\<lbrakk> typeof (\<lambda>v. None) val = Some T \<and> cG \<turnstile> T \<preceq> T'; |
1087 lemma bc_mt_corresp_LitPush_CT: |
1104 is_type cG T' \<rbrakk> |
1088 "\<lbrakk> typeof (\<lambda>v. None) val = Some T \<and> cG \<turnstile> T \<preceq> T'; is_type cG T' \<rbrakk> |
1105 \<Longrightarrow> bc_mt_corresp [LitPush val] (pushST [T']) sttp cG rT mxr (Suc 0)" |
1089 \<Longrightarrow> bc_mt_corresp [LitPush val] (pushST [T']) sttp cG rT mxr (Suc 0)" |
1106 apply (subgoal_tac "\<exists> ST LT. sttp= (ST, LT)", (erule exE)+) |
1090 apply (subgoal_tac "\<exists>ST LT. sttp= (ST, LT)", (erule exE)+) |
1107 apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def |
1091 apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def max_ssize_def |
1108 max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1092 max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1109 apply (intro strip) |
1093 apply (intro strip) |
1110 apply (rule conjI) |
1094 apply (rule conjI) |
1111 apply (rule check_type_mono, assumption, simp) |
1095 apply (rule check_type_mono, assumption, simp) |
1112 apply (simp add: check_type_simps) |
1096 apply (simp add: check_type_simps) |
1113 apply (simp add: sup_state_Cons) |
1097 apply (simp add: sup_state_Cons) |
1114 apply clarify |
1098 apply clarify |
1115 apply (rule_tac x="Suc (length ST)" in exI) |
1099 apply (rule_tac x="Suc (length ST)" in exI) |
1116 apply simp |
1100 apply simp |
1117 apply simp+ |
1101 apply simp |
1118 done |
1102 done |
1119 |
1103 |
1120 declare not_Err_eq [iff del] |
1104 declare not_Err_eq [iff del] |
1121 |
1105 |
1122 lemma bc_mt_corresp_Load: "\<lbrakk> i < length LT; LT ! i \<noteq> Err; mxr = length LT \<rbrakk> |
1106 lemma bc_mt_corresp_Load: "\<lbrakk> i < length LT; LT ! i \<noteq> Err; mxr = length LT \<rbrakk> |
1123 \<Longrightarrow> bc_mt_corresp [Load i] |
1107 \<Longrightarrow> bc_mt_corresp [Load i] |
1124 (\<lambda>(ST, LT). pushST [ok_val (LT ! i)] (ST, LT)) (ST, LT) cG rT mxr (Suc 0)" |
1108 (\<lambda>(ST, LT). pushST [ok_val (LT ! i)] (ST, LT)) (ST, LT) cG rT mxr (Suc 0)" |
1125 apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def |
1109 apply (simp add: bc_mt_corresp_def pushST_def wt_instr_altern_def max_ssize_def max_of_list_def |
1126 max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1110 ssize_sto_def eff_def norm_eff_def max.absorb2) |
1127 apply (intro strip) |
1111 apply (intro strip) |
1128 apply (rule conjI) |
1112 apply (rule conjI) |
1129 apply (rule check_type_mono, assumption, simp) |
1113 apply (rule check_type_mono, assumption, simp) |
1130 apply (simp add: check_type_simps) |
1114 apply (simp add: check_type_simps) |
1131 apply clarify |
1115 apply clarify |
1132 apply (rule_tac x="Suc (length ST)" in exI) |
1116 apply (rule_tac x="Suc (length ST)" in exI) |
1133 apply (simp (no_asm_simp)) |
1117 apply (simp (no_asm_simp)) |
1134 apply (simp only: err_def) |
1118 apply (simp only: err_def) |
1135 apply (frule listE_nth_in) apply assumption |
1119 apply (frule listE_nth_in) |
1136 apply (subgoal_tac "LT ! i \<in> {x. \<exists>y\<in>types cG. x = OK y}") |
1120 apply assumption |
1137 apply (drule CollectD) apply (erule bexE) |
1121 apply (subgoal_tac "LT ! i \<in> {x. \<exists>y\<in>types cG. x = OK y}") |
1138 apply (simp (no_asm_simp)) |
1122 apply (drule CollectD) |
1139 apply blast |
1123 apply (erule bexE) |
1140 apply blast |
1124 apply (simp (no_asm_simp)) |
1141 done |
1125 apply blast |
1142 |
1126 apply blast |
1143 |
1127 done |
1144 lemma bc_mt_corresp_Store_init: "\<lbrakk> i < length LT \<rbrakk> |
1128 |
1145 \<Longrightarrow> bc_mt_corresp [Store i] (storeST i T) (T # ST, LT) cG rT mxr (Suc 0)" |
1129 |
1146 apply (simp add: bc_mt_corresp_def storeST_def wt_instr_altern_def eff_def norm_eff_def) |
1130 lemma bc_mt_corresp_Store_init: |
|
1131 "i < length LT \<Longrightarrow> bc_mt_corresp [Store i] (storeST i T) (T # ST, LT) cG rT mxr (Suc 0)" |
|
1132 apply (simp add: bc_mt_corresp_def storeST_def wt_instr_altern_def eff_def norm_eff_def) |
1147 apply (simp add: max_ssize_def max_of_list_def) |
1133 apply (simp add: max_ssize_def max_of_list_def) |
1148 apply (simp add: ssize_sto_def) |
1134 apply (simp add: ssize_sto_def) |
1149 apply (intro strip) |
1135 apply (intro strip) |
1150 apply (simp add: check_type_simps max.absorb1) |
1136 apply (simp add: check_type_simps max.absorb1) |
1151 apply clarify |
1137 apply clarify |
1152 apply (rule conjI) |
1138 apply (rule conjI) |
1153 apply (rule_tac x="(length ST)" in exI) |
1139 apply (rule_tac x="(length ST)" in exI) |
1154 apply simp+ |
1140 apply simp+ |
1155 done |
1141 done |
1156 |
1142 |
1157 |
1143 |
1158 lemma bc_mt_corresp_Store: "\<lbrakk> i < length LT; cG \<turnstile> LT[i := OK T] <=l LT \<rbrakk> |
1144 lemma bc_mt_corresp_Store: |
|
1145 "\<lbrakk> i < length LT; cG \<turnstile> LT[i := OK T] <=l LT \<rbrakk> |
1159 \<Longrightarrow> bc_mt_corresp [Store i] (popST (Suc 0)) (T # ST, LT) cG rT mxr (Suc 0)" |
1146 \<Longrightarrow> bc_mt_corresp [Store i] (popST (Suc 0)) (T # ST, LT) cG rT mxr (Suc 0)" |
1160 apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def) |
1147 apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def) |
1161 apply (simp add: sup_state_conv) |
1148 apply (simp add: sup_state_conv) |
1162 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def) |
1149 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def) |
1163 apply (intro strip) |
1150 apply (intro strip) |
1164 apply (simp add: check_type_simps max.absorb1) |
1151 apply (simp add: check_type_simps max.absorb1) |
1165 apply clarify |
1152 apply clarify |
1166 apply (rule_tac x="(length ST)" in exI) |
1153 apply (rule_tac x="(length ST)" in exI) |
1167 apply simp+ |
1154 apply simp |
1168 done |
1155 done |
1169 |
1156 |
1170 |
1157 |
1171 lemma bc_mt_corresp_Dup: " |
1158 lemma bc_mt_corresp_Dup: " |
1172 bc_mt_corresp [Dup] dupST (T # ST, LT) cG rT mxr (Suc 0)" |
1159 bc_mt_corresp [Dup] dupST (T # ST, LT) cG rT mxr (Suc 0)" |
1173 apply (simp add: bc_mt_corresp_def dupST_def wt_instr_altern_def |
1160 apply (simp add: bc_mt_corresp_def dupST_def wt_instr_altern_def |
1174 max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1161 max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1175 apply (intro strip) |
1162 apply (intro strip) |
1176 apply (rule conjI) |
1163 apply (rule conjI) |
1177 apply (rule check_type_mono, assumption, simp) |
1164 apply (rule check_type_mono, assumption, simp) |
1178 apply (simp add: check_type_simps) |
1165 apply (simp add: check_type_simps) |
1179 apply clarify |
1166 apply clarify |
1180 apply (rule_tac x="Suc (Suc (length ST))" in exI) |
1167 apply (rule_tac x="Suc (Suc (length ST))" in exI) |
1181 apply simp+ |
1168 apply simp |
1182 done |
1169 done |
1183 |
1170 |
1184 lemma bc_mt_corresp_Dup_x1: " |
1171 lemma bc_mt_corresp_Dup_x1: " |
1185 bc_mt_corresp [Dup_x1] dup_x1ST (T1 # T2 # ST, LT) cG rT mxr (Suc 0)" |
1172 bc_mt_corresp [Dup_x1] dup_x1ST (T1 # T2 # ST, LT) cG rT mxr (Suc 0)" |
1186 apply (simp add: bc_mt_corresp_def dup_x1ST_def wt_instr_altern_def |
1173 apply (simp add: bc_mt_corresp_def dup_x1ST_def wt_instr_altern_def |
1187 max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1174 max_ssize_def max_of_list_def ssize_sto_def eff_def norm_eff_def max.absorb2) |
1188 apply (intro strip) |
1175 apply (intro strip) |
1189 apply (rule conjI) |
1176 apply (rule conjI) |
1190 apply (rule check_type_mono, assumption, simp) |
1177 apply (rule check_type_mono, assumption, simp) |
1191 apply (simp add: check_type_simps) |
1178 apply (simp add: check_type_simps) |
1192 apply clarify |
1179 apply clarify |
1193 apply (rule_tac x="Suc (Suc (Suc (length ST)))" in exI) |
1180 apply (rule_tac x="Suc (Suc (Suc (length ST)))" in exI) |
1194 apply simp+ |
1181 apply simp+ |
1195 done |
1182 done |
1196 |
1183 |
1197 |
1184 |
1198 |
1185 |
1199 lemma bc_mt_corresp_IAdd: " |
1186 lemma bc_mt_corresp_IAdd: " |
1200 bc_mt_corresp [IAdd] (replST 2 (PrimT Integer)) |
1187 bc_mt_corresp [IAdd] (replST 2 (PrimT Integer)) |
1242 apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def) |
1229 apply (simp add: bc_mt_corresp_def popST_def wt_instr_altern_def eff_def norm_eff_def) |
1243 apply (simp add: comp_field comp_subcls1 comp_widen comp_is_class) |
1230 apply (simp add: comp_field comp_subcls1 comp_widen comp_is_class) |
1244 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def) |
1231 apply (simp add: max_ssize_def max_of_list_def ssize_sto_def) |
1245 |
1232 |
1246 apply (intro strip) |
1233 apply (intro strip) |
1247 apply (simp add: check_type_simps max.absorb1) |
1234 apply (simp add: check_type_simps max.absorb1) |
1248 apply clarify |
1235 apply clarify |
1249 apply (rule_tac x="Suc (length ST)" in exI) |
1236 apply (rule_tac x="Suc (length ST)" in exI) |
1250 apply simp+ |
1237 apply simp+ |
1251 done |
1238 done |
1252 |
1239 |
1253 |
1240 |
1254 |
1241 |
1255 lemma Call_app: "\<lbrakk> wf_prog wf_mb G; is_class G cname; |
1242 lemma Call_app: |
1256 STs = rev pTsa @ Class cname # ST; |
1243 "\<lbrakk> wf_prog wf_mb G; is_class G cname; |
1257 max_spec G cname (mname, pTsa) = {((md, T), pTs')} \<rbrakk> |
1244 STs = rev pTsa @ Class cname # ST; |
|
1245 max_spec G cname (mname, pTsa) = {((md, T), pTs')} \<rbrakk> |
1258 \<Longrightarrow> app (Invoke cname mname pTs') (comp G) (length (T # ST)) rT 0 empty_et (Some (STs, LTs))" |
1246 \<Longrightarrow> app (Invoke cname mname pTs') (comp G) (length (T # ST)) rT 0 empty_et (Some (STs, LTs))" |
1259 apply (subgoal_tac "(\<exists>mD' rT' comp_b. |
1247 apply (subgoal_tac "(\<exists>mD' rT' comp_b. |
1260 method (comp G, cname) (mname, pTs') = Some (mD', rT', comp_b))") |
1248 method (comp G, cname) (mname, pTs') = Some (mD', rT', comp_b))") |
1261 apply (simp add: comp_is_class) |
1249 apply (simp add: comp_is_class) |
1262 apply (rule_tac x=pTsa in exI) |
1250 apply (rule_tac x=pTsa in exI) |
1263 apply (rule_tac x="Class cname" in exI) |
1251 apply (rule_tac x="Class cname" in exI) |
1264 apply (simp add: max_spec_preserves_length comp_is_class) |
1252 apply (simp add: max_spec_preserves_length comp_is_class) |
1265 apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+) |
1253 apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+) |
1266 apply (simp add: split_paired_all comp_widen list_all2_iff) |
1254 apply (simp add: split_paired_all comp_widen list_all2_iff) |
1267 apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+) |
1255 apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+) |
1268 apply (rule exI)+ |
1256 apply (rule exI)+ |
1269 apply (simp add: wf_prog_ws_prog [THEN comp_method]) |
1257 apply (simp add: wf_prog_ws_prog [THEN comp_method]) |
1270 done |
1258 done |
1271 |
1259 |
1272 |
1260 |
1273 lemma bc_mt_corresp_Invoke: "\<lbrakk> wf_prog wf_mb G; |
1261 lemma bc_mt_corresp_Invoke: |
|
1262 "\<lbrakk> wf_prog wf_mb G; |
1274 max_spec G cname (mname, pTsa) = {((md, T), fpTs)}; |
1263 max_spec G cname (mname, pTsa) = {((md, T), fpTs)}; |
1275 is_class G cname \<rbrakk> |
1264 is_class G cname \<rbrakk> |
1276 \<Longrightarrow> bc_mt_corresp [Invoke cname mname fpTs] (replST (Suc (length pTsa)) T) |
1265 \<Longrightarrow> bc_mt_corresp [Invoke cname mname fpTs] (replST (Suc (length pTsa)) T) |
1277 (rev pTsa @ Class cname # ST, LT) (comp G) rT mxr (Suc 0)" |
1266 (rev pTsa @ Class cname # ST, LT) (comp G) rT mxr (Suc 0)" |
1278 apply (simp add: bc_mt_corresp_def wt_instr_altern_def eff_def norm_eff_def) |
1267 apply (simp add: bc_mt_corresp_def wt_instr_altern_def eff_def norm_eff_def) |
1279 apply (simp add: replST_def del: appInvoke) |
1268 apply (simp add: replST_def del: appInvoke) |
1280 apply (intro strip) |
1269 apply (intro strip) |
1281 apply (rule conjI) |
1270 apply (rule conjI) |
1282 |
1271 |
1283 -- "app" |
1272 -- "app" |
1284 apply (rule Call_app [THEN app_mono_mxs]) apply assumption+ |
1273 apply (rule Call_app [THEN app_mono_mxs]) |
1285 apply (rule HOL.refl) apply assumption |
1274 apply assumption+ |
1286 apply (simp add: max_ssize_def max_of_list_elem ssize_sto_def) |
1275 apply (rule HOL.refl) |
|
1276 apply assumption |
|
1277 apply (simp add: max_ssize_def max_of_list_elem ssize_sto_def) |
1287 |
1278 |
1288 -- {* @{text "<=s"} *} |
1279 -- {* @{text "<=s"} *} |
1289 apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+) |
1280 apply (frule max_spec2mheads, (erule exE)+, (erule conjE)+) |
1290 apply (simp add: wf_prog_ws_prog [THEN comp_method]) |
1281 apply (simp add: wf_prog_ws_prog [THEN comp_method]) |
1291 apply (simp add: max_spec_preserves_length [symmetric]) |
1282 apply (simp add: max_spec_preserves_length [symmetric]) |
1292 |
1283 |
1293 -- "@{text check_type}" |
1284 -- "@{text check_type}" |
1294 apply (simp add: max_ssize_def ssize_sto_def) |
1285 apply (simp add: max_ssize_def ssize_sto_def) |
1295 apply (simp add: max_of_list_def) |
1286 apply (simp add: max_of_list_def) |
1296 apply (subgoal_tac "(max (length pTsa + length ST) (length ST)) = (length pTsa + length ST)") |
1287 apply (subgoal_tac "(max (length pTsa + length ST) (length ST)) = (length pTsa + length ST)") |
1297 apply simp |
1288 apply simp |
1298 apply (simp add: check_type_simps) |
1289 apply (simp add: check_type_simps) |
1299 apply clarify |
1290 apply clarify |
1300 apply (rule_tac x="Suc (length ST)" in exI) |
1291 apply (rule_tac x="Suc (length ST)" in exI) |
1301 apply simp+ |
1292 apply simp+ |
1302 apply (simp only: comp_is_type) |
1293 apply (simp only: comp_is_type) |
1303 apply (frule method_wf_mdecl) apply assumption apply assumption |
1294 apply (frule method_wf_mdecl) apply assumption apply assumption |
1304 apply (simp add: wf_mdecl_def wf_mhead_def) |
1295 apply (simp add: wf_mdecl_def wf_mhead_def) |
1305 apply (simp) |
1296 apply (simp) |
1306 done |
1297 done |
1307 |
1298 |
1308 |
1299 |
1309 lemma wt_instr_Ifcmpeq: "\<lbrakk>Suc pc < max_pc; |
1300 lemma wt_instr_Ifcmpeq: "\<lbrakk>Suc pc < max_pc; |
1310 0 \<le> (int pc + i); nat (int pc + i) < max_pc; |
1301 0 \<le> (int pc + i); nat (int pc + i) < max_pc; |
1339 l1 = (length bc1); l12 = (length (bc1@bc2)); |
1330 l1 = (length bc1); l12 = (length (bc1@bc2)); |
1340 bc_mt_corresp bc2 f2 (sttp_of (f1 sttp0)) cG rT mxr (length bc2); |
1331 bc_mt_corresp bc2 f2 (sttp_of (f1 sttp0)) cG rT mxr (length bc2); |
1341 length bc1 = length (mt_of (f1 sttp0)); |
1332 length bc1 = length (mt_of (f1 sttp0)); |
1342 start_sttp_resp f2; start_sttp_resp f3\<rbrakk> |
1333 start_sttp_resp f2; start_sttp_resp f3\<rbrakk> |
1343 \<Longrightarrow> bc_mt_corresp bc' f' sttp0 cG rT mxr l12" |
1334 \<Longrightarrow> bc_mt_corresp bc' f' sttp0 cG rT mxr l12" |
1344 apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+) |
1335 apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+) |
1345 apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+) |
1336 apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+) |
1346 apply (subgoal_tac "\<exists> mt3 sttp3. (f3 sttp2) = (mt3, sttp3)", (erule exE)+) |
1337 apply (subgoal_tac "\<exists> mt3 sttp3. (f3 sttp2) = (mt3, sttp3)", (erule exE)+) |
1347 |
1338 |
1348 (* unfold start_sttp_resp and make case distinction *) |
1339 (* unfold start_sttp_resp and make case distinction *) |
1349 apply (simp only: start_sttp_resp_def) |
1340 apply (simp only: start_sttp_resp_def) |
1350 apply (erule_tac Q="start_sttp_resp_cons f2" in disjE) |
1341 apply (erule_tac Q="start_sttp_resp_cons f2" in disjE) |
1351 (* case f2 = comb_nil *) |
1342 (* case f2 = comb_nil *) |
1352 apply (simp add: bc_mt_corresp_def comb_nil_def start_sttp_resp_cons_def) |
1343 apply (simp add: bc_mt_corresp_def comb_nil_def start_sttp_resp_cons_def) |
1353 |
1344 |
1354 (* case start_sttp_resp_cons f2 *) |
1345 (* case start_sttp_resp_cons f2 *) |
1355 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def) |
1346 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def) |
1356 apply (drule_tac x=sttp1 in spec, simp, erule exE) |
1347 apply (drule_tac x=sttp1 in spec, simp, erule exE) |
1357 apply (intro strip, (erule conjE)+) |
1348 apply (intro strip, (erule conjE)+) |
1358 |
1349 |
1359 |
1350 |
1360 (* get rid of all check_type info *) |
1351 (* get rid of all check_type info *) |
1361 apply (subgoal_tac "check_type cG (length (fst sttp1)) mxr (OK (Some sttp1))") |
1352 apply (subgoal_tac "check_type cG (length (fst sttp1)) mxr (OK (Some sttp1))") |
1362 apply (subgoal_tac "check_type cG (max_ssize (mt2 @ [Some sttp2])) mxr (OK (Some sttp2))") |
1353 apply (subgoal_tac "check_type cG (max_ssize (mt2 @ [Some sttp2])) mxr (OK (Some sttp2))") |
1363 apply (subgoal_tac "check_type cG (max_ssize (mt1 @ mt2 @ mt3 @ [Some sttp3])) mxr |
1354 apply (subgoal_tac "check_type cG (max_ssize (mt1 @ mt2 @ mt3 @ [Some sttp3])) mxr |
1364 (OK ((mt2 @ mt3 @ [Some sttp3]) ! length mt2))") |
1355 (OK ((mt2 @ mt3 @ [Some sttp3]) ! length mt2))") |
1365 apply simp |
1356 apply simp |
1366 |
1357 |
1367 |
1358 |
1368 |
1359 |
1369 apply (intro strip, (erule conjE)+) |
1360 apply (intro strip, (erule conjE)+) |
1370 apply (case_tac "pc < length mt1") |
1361 apply (case_tac "pc < length mt1") |
1371 |
1362 |
1372 (* case pc < length mt1 *) |
1363 (* case pc < length mt1 *) |
1373 apply (drule spec, drule mp, assumption) |
1364 apply (drule spec, drule mp, assumption) |
1374 apply assumption |
1365 apply assumption |
1375 |
1366 |
1376 (* case pc \<ge> length mt1 *) |
1367 (* case pc \<ge> length mt1 *) |
1377 (* case distinction on start_sttp_resp f3 *) |
1368 (* case distinction on start_sttp_resp f3 *) |
1378 apply (erule_tac P="f3 = comb_nil" in disjE) |
1369 apply (erule_tac P="f3 = comb_nil" in disjE) |
1379 |
1370 |
1380 (* case f3 = comb_nil *) |
1371 (* case f3 = comb_nil *) |
1381 apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3") apply (erule conjE)+ |
1372 apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3") apply (erule conjE)+ |
1382 apply (subgoal_tac "bc3=[]") |
1373 apply (subgoal_tac "bc3=[]") |
1383 |
1374 |
1384 apply (rule_tac bc_pre=bc1 and bc=bc2 and bc_post=bc3 |
1375 apply (rule_tac bc_pre=bc1 and bc=bc2 and bc_post=bc3 |
1385 and mt_pre=mt1 and mt=mt2 and mt_post="mt3@ [Some sttp3]" |
1376 and mt_pre=mt1 and mt=mt2 and mt_post="mt3@ [Some sttp3]" |
1386 and mxs="(max_ssize (mt2 @ [(Some sttp2)]))" |
1377 and mxs="(max_ssize (mt2 @ [(Some sttp2)]))" |
1387 and max_pc="(Suc (length mt2))" |
1378 and max_pc="(Suc (length mt2))" |
1388 in wt_instr_offset) |
1379 in wt_instr_offset) |
1389 apply simp |
1380 apply simp |
1390 apply (rule HOL.refl)+ |
1381 apply (rule HOL.refl)+ |
1391 apply (simp (no_asm_simp))+ |
1382 apply (simp (no_asm_simp))+ |
1392 |
1383 |
1393 apply (simp (no_asm_simp) add: max_ssize_def del: max_of_list_append) |
1384 apply (simp (no_asm_simp) add: max_ssize_def del: max_of_list_append) |
1394 apply (rule max_of_list_sublist) |
1385 apply (rule max_of_list_sublist) |
1395 apply (simp (no_asm_simp) only: set_append list.set list.map) apply blast |
1386 apply (simp (no_asm_simp) only: set_append list.set list.map) apply blast |
1396 apply (simp (no_asm_simp)) |
1387 apply (simp (no_asm_simp)) |
1397 apply simp (* subgoal bc3 = [] *) |
1388 apply simp (* subgoal bc3 = [] *) |
1398 apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *) |
1389 apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *) |
1399 |
1390 |
1400 (* case start_sttp_resp_cons f3 *) |
1391 (* case start_sttp_resp_cons f3 *) |
1401 apply (subgoal_tac "\<exists>mt3_rest. (mt3 = Some sttp2 # mt3_rest)", erule exE) |
1392 apply (subgoal_tac "\<exists>mt3_rest. (mt3 = Some sttp2 # mt3_rest)", erule exE) |
1402 apply (rule_tac bc_pre=bc1 and bc=bc2 and bc_post=bc3 |
1393 apply (rule_tac bc_pre=bc1 and bc=bc2 and bc_post=bc3 |
1403 and mt_pre=mt1 and mt=mt2 and mt_post="mt3@ [Some sttp3]" |
1394 and mt_pre=mt1 and mt=mt2 and mt_post="mt3@ [Some sttp3]" |
1404 and mxs="(max_ssize (mt2 @ [Some sttp2]))" |
1395 and mxs="(max_ssize (mt2 @ [Some sttp2]))" |
1405 and max_pc="(Suc (length mt2))" |
1396 and max_pc="(Suc (length mt2))" |
1406 in wt_instr_offset) |
1397 in wt_instr_offset) |
1407 apply (intro strip) |
1398 apply (intro strip) |
1408 apply (rule_tac bc=bc2 and mt="(mt2 @ [Some sttp2])" |
1399 apply (rule_tac bc=bc2 and mt="(mt2 @ [Some sttp2])" |
1409 and mxs="(max_ssize (mt2 @ [Some sttp2]))" |
1400 and mxs="(max_ssize (mt2 @ [Some sttp2]))" |
1410 and max_pc="(Suc (length mt2))" |
1401 and max_pc="(Suc (length mt2))" |
1411 in wt_instr_prefix) |
1402 in wt_instr_prefix) |
1412 |
1403 |
1413 |
1404 (* preconditions of wt_instr_prefix *) |
1414 (* preconditions of wt_instr_prefix *) |
1405 apply simp |
1415 apply simp |
1406 apply (rule HOL.refl) |
1416 apply (rule HOL.refl) |
1407 apply (simp (no_asm_simp))+ |
1417 apply (simp (no_asm_simp))+ |
1408 apply simp+ |
1418 apply simp+ |
1409 (* (some) preconditions of wt_instr_offset *) |
1419 (* (some) preconditions of wt_instr_offset *) |
1410 apply (simp (no_asm_simp) add: max_ssize_def del: max_of_list_append) |
1420 apply (simp (no_asm_simp) add: max_ssize_def del: max_of_list_append) |
1411 apply (rule max_of_list_sublist) |
1421 apply (rule max_of_list_sublist) |
1412 apply (simp (no_asm_simp) only: set_append list.set list.map) |
1422 apply (simp (no_asm_simp) only: set_append list.set list.map) apply blast |
1413 apply blast |
1423 apply (simp (no_asm_simp)) |
1414 apply (simp (no_asm_simp)) |
1424 |
1415 |
1425 apply (drule_tac x=sttp2 in spec, simp) (* subgoal \<exists>mt3_rest. \<dots> *) |
1416 apply (drule_tac x=sttp2 in spec, simp) (* subgoal \<exists>mt3_rest. \<dots> *) |
1426 |
1417 |
1427 (* subgoals check_type*) |
1418 (* subgoals check_type*) |
1428 (* \<dots> ! length mt2 *) |
1419 (* \<dots> ! length mt2 *) |
1429 apply simp |
1420 apply simp |
1430 |
1421 |
1431 apply (erule_tac P="f3 = comb_nil" in disjE) |
1422 apply (erule_tac P="f3 = comb_nil" in disjE) |
1432 |
1423 |
1433 (* -- case f3 = comb_nil *) |
1424 (* -- case f3 = comb_nil *) |
1434 apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3") apply (erule conjE)+ |
1425 apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3") apply (erule conjE)+ |
1435 apply simp |
1426 apply simp |
1436 apply (rule check_type_mono, assumption) |
1427 apply (rule check_type_mono, assumption) |
1437 apply (simp only: max_ssize_def) apply (rule max_of_list_sublist) apply (simp (no_asm_simp)) |
1428 apply (simp only: max_ssize_def) |
1438 apply blast |
1429 apply (rule max_of_list_sublist) |
1439 apply simp (* subgoal bc3 = [] *) |
1430 apply (simp (no_asm_simp)) |
1440 apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *) |
1431 apply blast |
1441 |
1432 apply simp (* subgoal bc3 = [] *) |
1442 |
1433 apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *) |
1443 (* -- case start_sttp_resp_cons f3 *) |
1434 |
1444 apply (subgoal_tac "\<exists>mt3_rest. (mt3 = Some sttp2 # mt3_rest)", erule exE) |
1435 |
1445 apply (simp (no_asm_simp) add: nth_append) |
1436 (* -- case start_sttp_resp_cons f3 *) |
1446 apply (erule conjE)+ |
1437 apply (subgoal_tac "\<exists>mt3_rest. (mt3 = Some sttp2 # mt3_rest)", erule exE) |
1447 apply (rule check_type_mono, assumption) |
1438 apply (simp (no_asm_simp) add: nth_append) |
1448 apply (simp only: max_ssize_def) apply (rule max_of_list_sublist) apply (simp (no_asm_simp)) |
1439 apply (erule conjE)+ |
1449 apply blast |
1440 apply (rule check_type_mono, assumption) |
1450 apply (drule_tac x=sttp2 in spec, simp) (* subgoal \<exists>mt3_rest. \<dots> *) |
1441 apply (simp only: max_ssize_def) |
1451 |
1442 apply (rule max_of_list_sublist) |
1452 |
1443 apply (simp (no_asm_simp)) |
1453 (* subgoal check_type \<dots> Some sttp2 *) |
1444 apply blast |
1454 apply (simp add: nth_append) |
1445 apply (drule_tac x=sttp2 in spec, simp) (* subgoal \<exists>mt3_rest. \<dots> *) |
1455 |
1446 |
1456 (* subgoal check_type \<dots> Some sttp1 *) |
1447 |
1457 apply (simp add: nth_append) |
1448 (* subgoal check_type \<dots> Some sttp2 *) |
1458 apply (erule conjE)+ |
1449 apply (simp add: nth_append) |
1459 apply (case_tac "sttp1", simp) |
1450 |
1460 apply (rule check_type_lower) apply assumption |
1451 (* subgoal check_type \<dots> Some sttp1 *) |
1461 apply (simp (no_asm_simp) add: max_ssize_def ssize_sto_def) |
1452 apply (simp add: nth_append) |
1462 apply (simp (no_asm_simp) add: max_of_list_def) |
1453 apply (erule conjE)+ |
1463 |
1454 apply (case_tac "sttp1", simp) |
1464 (* subgoals \<exists> ... *) |
1455 apply (rule check_type_lower, assumption) |
1465 apply (rule surj_pair)+ |
1456 apply (simp (no_asm_simp) add: max_ssize_def ssize_sto_def) |
1466 done |
1457 apply (simp (no_asm_simp) add: max_of_list_def) |
|
1458 |
|
1459 (* subgoals \<exists> ... *) |
|
1460 apply (rule surj_pair)+ |
|
1461 done |
1467 |
1462 |
1468 |
1463 |
1469 (* ******************** *) |
1464 (* ******************** *) |
1470 definition contracting :: "(state_type \<Rightarrow> method_type \<times> state_type) \<Rightarrow> bool" where |
1465 definition contracting :: "(state_type \<Rightarrow> method_type \<times> state_type) \<Rightarrow> bool" where |
1471 "contracting f == (\<forall> ST LT. |
1466 "contracting f == (\<forall> ST LT. |
1554 empty_et |
1548 empty_et |
1555 (length bc1); |
1549 (length bc1); |
1556 contracting f2 |
1550 contracting f2 |
1557 \<rbrakk> |
1551 \<rbrakk> |
1558 \<Longrightarrow> bc_mt_corresp bc' f' sttp0 cG rT mxr (length (bc1@[inst]))" |
1552 \<Longrightarrow> bc_mt_corresp bc' f' sttp0 cG rT mxr (length (bc1@[inst]))" |
1559 apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+) |
1553 apply (subgoal_tac "\<exists> mt1 sttp1. (f1 sttp0) = (mt1, sttp1)", (erule exE)+) |
1560 apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+) |
1554 apply (subgoal_tac "\<exists> mt2 sttp2. (f2 sttp1) = (mt2, sttp2)", (erule exE)+) |
1561 apply (subgoal_tac "\<exists> mt3 sttp3. (f3 sttp2) = (mt3, sttp3)", (erule exE)+) |
1555 apply (subgoal_tac "\<exists> mt3 sttp3. (f3 sttp2) = (mt3, sttp3)", (erule exE)+) |
1562 |
1556 |
1563 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def |
1557 apply (simp add: bc_mt_corresp_def comb_def start_sttp_resp_cons_def |
1564 mt_sttp_flatten_def) |
1558 mt_sttp_flatten_def) |
1565 |
1559 |
1566 apply (intro strip, (erule conjE)+) |
1560 apply (intro strip, (erule conjE)+) |
1567 apply (drule mp, assumption)+ apply (erule conjE)+ |
1561 apply (drule mp, assumption)+ |
1568 apply (drule mp, assumption) |
1562 apply (erule conjE)+ |
1569 apply (rule conjI) |
1563 apply (drule mp, assumption) |
1570 |
1564 apply (rule conjI) |
1571 (* wt_instr \<dots> *) |
1565 |
1572 apply (intro strip) |
1566 (* wt_instr \<dots> *) |
1573 apply (case_tac "pc < length mt1") |
1567 apply (intro strip) |
1574 |
1568 apply (case_tac "pc < length mt1") |
1575 (* case pc < length mt1 *) |
1569 |
1576 apply (drule spec, drule mp, assumption) |
1570 (* case pc < length mt1 *) |
1577 apply assumption |
1571 apply (drule spec, drule mp, assumption) |
1578 |
1572 apply assumption |
1579 (* case pc \<ge> length mt1 *) |
1573 |
1580 apply (subgoal_tac "pc = length mt1") prefer 2 apply arith |
1574 (* case pc \<ge> length mt1 *) |
1581 apply (simp only:) |
1575 apply (subgoal_tac "pc = length mt1") prefer 2 apply arith |
1582 apply (simp add: nth_append mt_sttp_flatten_def) |
1576 apply (simp only:) |
1583 |
1577 apply (simp add: nth_append mt_sttp_flatten_def) |
1584 |
1578 |
1585 (* check_type \<dots> *) |
1579 |
1586 apply (simp add: start_sttp_resp_def) |
1580 (* check_type \<dots> *) |
1587 apply (drule_tac x="sttp0" in spec, simp, erule exE) |
1581 apply (simp add: start_sttp_resp_def) |
1588 apply (drule_tac x="sttp1" in spec, simp, erule exE) |
1582 apply (drule_tac x="sttp0" in spec, simp, erule exE) |
1589 |
1583 apply (drule_tac x="sttp1" in spec, simp, erule exE) |
1590 apply (subgoal_tac "check_type cG (max_ssize (mt1 @ mt2 @ mt3 @ [Some sttp3])) mxr |
1584 |
1591 (OK (Some (sttp_of (f2 sttp1))))") |
1585 apply (subgoal_tac "check_type cG (max_ssize (mt1 @ mt2 @ mt3 @ [Some sttp3])) mxr |
1592 |
1586 (OK (Some (sttp_of (f2 sttp1))))") |
1593 apply (simp only:) |
1587 |
1594 |
1588 apply (simp only:) |
1595 apply (erule disjE) |
1589 |
1596 (* case f3 = comb_nil *) |
1590 apply (erule disjE) |
1597 apply (subgoal_tac "((mt1 @ mt2 @ mt3 @ [Some sttp3]) ! Suc (length mt1)) = (Some (snd (f2 sttp1)))")apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3") apply (erule conjE)+ |
1591 (* case f3 = comb_nil *) |
1598 apply (simp add: nth_append) |
1592 apply (subgoal_tac "((mt1 @ mt2 @ mt3 @ [Some sttp3]) ! Suc (length mt1)) = (Some (snd (f2 sttp1)))") |
1599 apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *) |
1593 apply (subgoal_tac "mt3 = [] \<and> sttp2 = sttp3") |
1600 apply (simp add: nth_append comb_nil_def) (* subgoal \<dots> ! Suc (length mt1) *) |
1594 apply (erule conjE)+ |
1601 |
1595 apply (simp add: nth_append) |
1602 (* case start_sttp_resp_cons f3 *) |
1596 apply (simp add: comb_nil_def) (* subgoal mt3 = [] \<and> sttp2 = sttp3 *) |
1603 apply (simp add: start_sttp_resp_cons_def) |
1597 apply (simp add: nth_append comb_nil_def) (* subgoal \<dots> ! Suc (length mt1) *) |
1604 apply (drule_tac x="sttp2" in spec, simp, erule exE) |
1598 |
1605 apply (simp add: nth_append) |
1599 (* case start_sttp_resp_cons f3 *) |
1606 |
1600 apply (simp add: start_sttp_resp_cons_def) |
1607 (* subgoal check_type *) |
1601 apply (drule_tac x="sttp2" in spec, simp, erule exE) |
1608 apply (rule check_type_contracting) |
1602 apply (simp add: nth_append) |
1609 apply (subgoal_tac "((mt1 @ mt2 @ mt3 @ [Some sttp3]) ! length mt1) = (Some sttp1)") |
1603 |
1610 apply (simp add: nth_append) |
1604 (* subgoal check_type *) |
1611 apply (simp add: nth_append) |
1605 apply (rule check_type_contracting) |
1612 |
1606 apply (subgoal_tac "((mt1 @ mt2 @ mt3 @ [Some sttp3]) ! length mt1) = (Some sttp1)") |
1613 apply assumption |
1607 apply (simp add: nth_append) |
1614 |
1608 apply (simp add: nth_append) |
1615 (* subgoals *) |
1609 |
1616 apply (rule surj_pair)+ |
1610 apply assumption |
1617 done |
1611 |
1618 |
1612 (* subgoals *) |
1619 |
1613 apply (rule surj_pair)+ |
1620 lemma compTpExpr_LT_ST_rewr [simp]: "\<lbrakk> |
1614 done |
1621 wf_java_prog G; |
1615 |
1622 wf_java_mdecl G C ((mn, pTs), rT, (pns, lvars, blk, res)); |
1616 |
1623 local_env G C (mn, pTs) pns lvars \<turnstile> ex :: T; |
1617 lemma compTpExpr_LT_ST_rewr [simp]: |
1624 is_inited_LT C pTs lvars LT\<rbrakk> |
1618 "\<lbrakk> wf_java_prog G; wf_java_mdecl G C ((mn, pTs), rT, (pns, lvars, blk, res)); |
1625 \<Longrightarrow> sttp_of (compTpExpr (pns, lvars, blk, res) G ex (ST, LT)) = (T # ST, LT)" |
1619 local_env G C (mn, pTs) pns lvars \<turnstile> ex :: T; |
1626 apply (rule compTpExpr_LT_ST) |
1620 is_inited_LT C pTs lvars LT\<rbrakk> |
1627 apply auto |
1621 \<Longrightarrow> sttp_of (compTpExpr (pns, lvars, blk, res) G ex (ST, LT)) = (T # ST, LT)" |
1628 done |
1622 by (rule compTpExpr_LT_ST) auto |
1629 |
|
1630 |
|
1631 |
1623 |
1632 |
1624 |
1633 lemma wt_method_compTpExpr_Exprs_corresp: " |
1625 lemma wt_method_compTpExpr_Exprs_corresp: " |
1634 \<lbrakk> jmb = (pns,lvars,blk,res); |
1626 \<lbrakk> jmb = (pns,lvars,blk,res); |
1635 wf_prog wf_java_mdecl G; |
1627 wf_prog wf_java_mdecl G; |
1645 \<and> |
1637 \<and> |
1646 (\<forall> ST LT Ts. |
1638 (\<forall> ST LT Ts. |
1647 E \<turnstile> exs [::] Ts \<longrightarrow> |
1639 E \<turnstile> exs [::] Ts \<longrightarrow> |
1648 (is_inited_LT C pTs lvars LT) |
1640 (is_inited_LT C pTs lvars LT) |
1649 \<longrightarrow> bc_mt_corresp (compExprs jmb exs) (compTpExprs jmb G exs) (ST, LT) (comp G) rT (length LT) (length (compExprs jmb exs)))" |
1641 \<longrightarrow> bc_mt_corresp (compExprs jmb exs) (compTpExprs jmb G exs) (ST, LT) (comp G) rT (length LT) (length (compExprs jmb exs)))" |
1650 |
1642 apply (rule compat_expr_expr_list.induct) |
1651 apply (rule compat_expr_expr_list.induct) |
1643 |
1652 |
1644 (* expresssions *) |
1653 |
1645 |
1654 (* expresssions *) |
1646 (* NewC *) |
1655 |
1647 apply (intro allI impI) |
1656 (* NewC *) |
1648 apply (simp only:) |
1657 apply (intro allI impI) |
1649 apply (drule NewC_invers) |
1658 apply (simp only:) |
1650 apply (simp (no_asm_use)) |
1659 apply (drule NewC_invers) |
1651 apply (rule bc_mt_corresp_New) |
1660 apply (simp (no_asm_use)) |
1652 apply (simp add: comp_is_class) |
1661 apply (rule bc_mt_corresp_New) |
1653 |
1662 apply (simp add: comp_is_class) |
1654 (* Cast *) |
1663 |
1655 apply (intro allI impI) |
1664 (* Cast *) |
1656 apply (simp only:) |
1665 apply (intro allI impI) |
1657 apply (drule Cast_invers) |
1666 apply (simp only:) |
1658 apply clarify |
1667 apply (drule Cast_invers) |
1659 apply (simp (no_asm_use)) |
1668 apply clarify |
1660 apply (rule bc_mt_corresp_comb) |
1669 apply (simp (no_asm_use)) |
1661 apply (rule HOL.refl, simp (no_asm_simp), blast) |
1670 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast) |
1662 apply (simp (no_asm_simp), rule bc_mt_corresp_Checkcast) |
1671 apply (simp (no_asm_simp), rule bc_mt_corresp_Checkcast) |
1663 apply (simp add: comp_is_class) |
1672 apply (simp add: comp_is_class) |
1664 apply (simp only: compTpExpr_LT_ST) |
1673 apply (simp only: compTpExpr_LT_ST) |
1665 apply (drule cast_RefT) |
1674 apply (drule cast_RefT) |
1666 apply blast |
1675 apply blast |
1667 apply (simp add: start_sttp_resp_def) |
1676 apply (simp add: start_sttp_resp_def) |
1668 |
1677 |
1669 (* Lit *) |
1678 (* Lit *) |
1670 apply (intro allI impI) |
1679 apply (intro allI impI) |
1671 apply (simp only:) |
1680 apply (simp only:) |
1672 apply (drule Lit_invers) |
1681 apply (drule Lit_invers) |
1673 apply simp |
1682 (* apply (simp (no_asm_use)) *) |
1674 apply (rule bc_mt_corresp_LitPush) |
1683 apply simp |
1675 apply assumption |
1684 apply (rule bc_mt_corresp_LitPush) |
1676 |
1685 apply assumption |
1677 |
1686 |
1678 (* BinOp *) |
1687 |
1679 |
1688 (* BinOp *) |
1680 apply (intro allI impI) |
1689 |
1681 apply (simp (no_asm_simp) only:) |
1690 apply (intro allI impI) |
1682 apply (drule BinOp_invers, erule exE, (erule conjE)+) |
1691 apply (simp (no_asm_simp) only:) |
1683 apply (rename_tac binop expr1 expr2 ST LT T bc' f' Ta, case_tac binop) |
1692 apply (drule BinOp_invers, erule exE, (erule conjE)+) |
1684 apply (simp (no_asm_simp)) |
1693 apply (rename_tac binop expr1 expr2 ST LT T bc' f' Ta, case_tac binop) |
1685 |
1694 apply (simp (no_asm_simp)) |
1686 (* case Eq *) |
1695 |
1687 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0") |
1696 (* case Eq *) |
1688 prefer 2 |
1697 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0") |
1689 apply (rule bc_mt_corresp_zero) |
1698 prefer 2 |
1690 apply (simp add: length_compTpExpr) |
1699 apply (rule bc_mt_corresp_zero) apply (simp add: length_compTpExpr) |
1691 apply (simp (no_asm_simp)) |
1700 apply (simp (no_asm_simp)) |
1692 |
1701 |
1693 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "compExpr jmb expr1" |
1702 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "compExpr jmb expr1" |
1694 and ?f1.0=comb_nil and ?f2.0 = "compTpExpr jmb G expr1" |
1703 and ?f1.0=comb_nil and ?f2.0 = "compTpExpr jmb G expr1" |
1695 in bc_mt_corresp_comb_inside) |
1704 in bc_mt_corresp_comb_inside) |
1696 apply (simp (no_asm_simp))+ |
1705 apply (simp (no_asm_simp))+ |
1697 apply blast |
1706 apply blast |
1698 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
1707 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
1699 |
1708 |
1700 apply (drule_tac ?bc2.0 = "compExpr jmb expr2" and ?f2.0 = "compTpExpr jmb G expr2" |
1709 apply (drule_tac ?bc2.0 = "compExpr jmb expr2" and ?f2.0 = "compTpExpr jmb G expr2" |
1701 in bc_mt_corresp_comb_inside) |
1710 in bc_mt_corresp_comb_inside) |
1702 apply (simp (no_asm_simp))+ |
1711 apply (simp (no_asm_simp))+ |
1703 apply (simp only: compTpExpr_LT_ST) |
1712 apply (simp only: compTpExpr_LT_ST) |
1704 apply (simp (no_asm_simp) add: length_compTpExpr) |
1713 apply (simp (no_asm_simp) add: length_compTpExpr) |
1705 apply (simp (no_asm_simp)) |
1714 apply (simp (no_asm_simp)) |
1706 apply (simp (no_asm_simp)) |
1715 apply (simp (no_asm_simp)) |
1707 |
1716 |
1708 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2" |
1717 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2" |
1709 and inst = "Ifcmpeq 3" and ?bc3.0 = "[LitPush (Bool False),Goto 2, LitPush (Bool True)]" |
1718 and inst = "Ifcmpeq 3" and ?bc3.0 = "[LitPush (Bool False),Goto 2, LitPush (Bool True)]" |
1710 and ?f1.0="compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2" |
1719 and ?f1.0="compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2" |
1711 and ?f2.0="popST 2" and ?f3.0="pushST [PrimT Boolean] \<box> popST 1 \<box> pushST [PrimT Boolean]" |
1720 and ?f2.0="popST 2" and ?f3.0="pushST [PrimT Boolean] \<box> popST 1 \<box> pushST [PrimT Boolean]" |
1712 in bc_mt_corresp_comb_wt_instr) |
1721 in bc_mt_corresp_comb_wt_instr) |
1713 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
1722 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
1714 |
1723 |
1715 (* wt_instr *) |
1724 (* wt_instr *) |
1716 apply (intro strip) |
1725 apply (intro strip) |
1717 apply (simp (no_asm_simp) add: wt_instr_altern_def length_compTpExpr eff_def) |
1726 apply (simp (no_asm_simp) add: wt_instr_altern_def length_compTpExpr eff_def) |
1718 apply (simp (no_asm_simp) add: norm_eff_def) |
1727 apply (simp (no_asm_simp) add: norm_eff_def) |
1719 apply (simp (no_asm_simp) only: int_outside_left nat_int) |
1728 apply (simp (no_asm_simp) only: int_outside_left nat_int) |
1720 apply (simp (no_asm_simp) add: length_compTpExpr) |
1729 apply (simp (no_asm_simp) add: length_compTpExpr) |
1721 apply (simp only: compTpExpr_LT_ST)+ |
1730 apply (simp only: compTpExpr_LT_ST)+ |
1722 apply (simp add: eff_def norm_eff_def popST_def pushST_def mt_sttp_flatten_def) |
1731 apply (simp add: eff_def norm_eff_def popST_def pushST_def mt_sttp_flatten_def) |
1723 apply (case_tac Ta) |
1732 apply (case_tac Ta) apply (simp (no_asm_simp)) apply (simp (no_asm_simp)) |
1724 apply (simp (no_asm_simp)) |
1733 apply (rule contracting_popST) (* contracting (popST 2) *) |
1725 apply (simp (no_asm_simp)) |
1734 |
1726 apply (rule contracting_popST) (* contracting (popST 2) *) |
1735 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3]" |
1727 |
1736 and ?bc2.0 = "[LitPush (Bool False)]" |
1728 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3]" |
1737 and ?bc3.0 = "[Goto 2, LitPush (Bool True)]" |
1729 and ?bc2.0 = "[LitPush (Bool False)]" |
1738 and ?f1.0 = "compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2" |
1730 and ?bc3.0 = "[Goto 2, LitPush (Bool True)]" |
1739 and ?f2.0 = "pushST [PrimT Boolean]" |
1731 and ?f1.0 = "compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2" |
1740 and ?f3.0 = "popST (Suc 0) \<box> pushST [PrimT Boolean]" |
1732 and ?f2.0 = "pushST [PrimT Boolean]" |
1741 in bc_mt_corresp_comb_inside) |
1733 and ?f3.0 = "popST (Suc 0) \<box> pushST [PrimT Boolean]" |
1742 apply (simp (no_asm_simp))+ |
1734 in bc_mt_corresp_comb_inside) |
|
1735 apply (simp (no_asm_simp))+ |
|
1736 apply simp |
|
1737 apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) apply (simp (no_asm_simp)) |
|
1738 apply (simp (no_asm_simp) add: length_compTpExpr) |
|
1739 apply (simp (no_asm_simp)) |
|
1740 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1741 |
|
1742 |
|
1743 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3, LitPush (Bool False)]" |
|
1744 and inst = "Goto 2" and ?bc3.0 = "[LitPush (Bool True)]" |
|
1745 and ?f1.0="compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2 \<box> pushST [PrimT Boolean]" |
|
1746 and ?f2.0="popST 1" and ?f3.0="pushST [PrimT Boolean]" |
|
1747 in bc_mt_corresp_comb_wt_instr) |
|
1748 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
|
1749 |
|
1750 (* wt_instr *) |
|
1751 apply (simp (no_asm_simp) add: wt_instr_altern_def length_compTpExpr) |
|
1752 apply (simp (no_asm_simp) add: eff_def norm_eff_def) |
|
1753 apply (simp (no_asm_simp) only: int_outside_right nat_int) |
|
1754 apply (simp (no_asm_simp) add: length_compTpExpr) |
|
1755 apply (simp only: compTpExpr_LT_ST)+ |
|
1756 apply (simp add: eff_def norm_eff_def popST_def pushST_def) |
|
1757 apply (rule contracting_popST) (* contracting (popST 1) *) |
|
1758 |
|
1759 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3, LitPush (Bool False), Goto 2]" |
|
1760 and ?bc2.0 = "[LitPush (Bool True)]" |
|
1761 and ?bc3.0 = "[]" |
|
1762 and ?f1.0 = "compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2 \<box> |
|
1763 pushST [PrimT Boolean] \<box> popST (Suc 0)" |
|
1764 and ?f2.0 = "pushST [PrimT Boolean]" |
|
1765 and ?f3.0 = "comb_nil" |
|
1766 in bc_mt_corresp_comb_inside) |
|
1767 apply (simp (no_asm_simp))+ |
|
1768 apply simp |
|
1769 apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) |
|
1770 apply (simp (no_asm_simp)) |
|
1771 apply (simp (no_asm_simp) add: length_compTpExpr) |
|
1772 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1773 apply (simp (no_asm_simp)) |
|
1774 |
|
1775 apply simp |
|
1776 |
|
1777 (* case Add *) |
|
1778 apply simp |
|
1779 apply (rule bc_mt_corresp_comb) |
|
1780 apply (rule HOL.refl) |
|
1781 apply simp |
|
1782 apply blast |
|
1783 apply (rule bc_mt_corresp_comb, rule HOL.refl) |
|
1784 apply (simp only: compTpExpr_LT_ST) |
|
1785 apply (simp only: compTpExpr_LT_ST) |
|
1786 apply blast |
|
1787 |
|
1788 apply (simp only: compTpExpr_LT_ST) |
|
1789 apply simp |
|
1790 apply (rule bc_mt_corresp_IAdd) |
|
1791 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1792 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1793 |
|
1794 |
|
1795 (* LAcc *) |
|
1796 apply (intro allI impI) |
|
1797 apply (simp only:) |
|
1798 apply (drule LAcc_invers) |
|
1799 apply (frule wf_java_mdecl_length_pTs_pns) |
|
1800 apply clarify |
|
1801 apply (simp add: is_inited_LT_def) |
|
1802 apply (rule bc_mt_corresp_Load) |
|
1803 apply (rule index_in_bounds) |
|
1804 apply simp |
|
1805 apply assumption |
|
1806 apply (rule inited_LT_at_index_no_err) |
|
1807 apply (rule index_in_bounds) |
|
1808 apply simp |
|
1809 apply assumption |
|
1810 apply (rule HOL.refl) |
|
1811 |
|
1812 |
|
1813 (* LAss *) |
|
1814 apply (intro allI impI) |
|
1815 apply (simp only:) |
|
1816 apply (drule LAss_invers, erule exE, (erule conjE)+) |
|
1817 apply (drule LAcc_invers) |
|
1818 apply (frule wf_java_mdecl_disjoint_varnames, simp add: disjoint_varnames_def) |
|
1819 apply (frule wf_java_mdecl_length_pTs_pns) |
|
1820 apply clarify |
|
1821 apply (simp (no_asm_use)) |
|
1822 apply (rule bc_mt_corresp_comb) |
|
1823 apply (rule HOL.refl, simp (no_asm_simp), blast) |
|
1824 apply (rename_tac vname x2 ST LT T Ta) |
|
1825 apply (rule_tac ?bc1.0="[Dup]" and ?bc2.0="[Store (index (pns, lvars, blk, res) vname)]" |
|
1826 and ?f1.0="dupST" and ?f2.0="popST (Suc 0)" |
|
1827 in bc_mt_corresp_comb) |
|
1828 apply (simp (no_asm_simp))+ |
|
1829 apply (rule bc_mt_corresp_Dup) |
|
1830 apply (simp only: compTpExpr_LT_ST) |
|
1831 apply (simp add: dupST_def is_inited_LT_def) |
|
1832 apply (rule bc_mt_corresp_Store) |
|
1833 apply (rule index_in_bounds) |
|
1834 apply simp |
|
1835 apply assumption |
|
1836 apply (rule sup_loc_update_index, assumption+) |
|
1837 apply simp |
|
1838 apply assumption+ |
|
1839 apply (simp add: start_sttp_resp_def) |
|
1840 apply (simp add: start_sttp_resp_def) |
|
1841 |
|
1842 (* FAcc *) |
|
1843 apply (intro allI impI) |
|
1844 apply (simp only:) |
|
1845 apply (drule FAcc_invers) |
|
1846 apply clarify |
|
1847 apply (simp (no_asm_use)) |
|
1848 apply (rule bc_mt_corresp_comb) |
|
1849 apply (rule HOL.refl, simp (no_asm_simp), blast) |
|
1850 apply (simp (no_asm_simp)) |
|
1851 apply (rule bc_mt_corresp_Getfield) |
|
1852 apply assumption+ |
|
1853 apply (fast intro: wt_class_expr_is_class) |
|
1854 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1855 |
|
1856 |
|
1857 (* FAss *) |
|
1858 apply (intro allI impI) |
|
1859 apply (simp only:) |
|
1860 apply (drule FAss_invers, erule exE, (erule conjE)+) |
|
1861 apply (drule FAcc_invers) |
|
1862 apply clarify |
|
1863 apply (simp (no_asm_use)) |
|
1864 apply (rule bc_mt_corresp_comb) |
|
1865 apply (rule HOL.refl) |
|
1866 apply simp |
|
1867 apply blast |
|
1868 apply (simp only: compTpExpr_LT_ST) |
|
1869 apply (rule bc_mt_corresp_comb, (rule HOL.refl)+) |
|
1870 apply blast |
|
1871 apply (simp only: compTpExpr_LT_ST) |
|
1872 apply (rename_tac cname x2 vname x4 ST LT T Ta Ca) |
|
1873 apply (rule_tac ?bc1.0="[Dup_x1]" and ?bc2.0="[Putfield vname cname]" in bc_mt_corresp_comb) |
|
1874 apply (simp (no_asm_simp))+ |
|
1875 apply (rule bc_mt_corresp_Dup_x1) |
|
1876 apply (simp (no_asm_simp) add: dup_x1ST_def) |
|
1877 apply (rule bc_mt_corresp_Putfield, assumption+) |
|
1878 apply (fast intro: wt_class_expr_is_class) |
|
1879 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1880 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1881 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1882 |
|
1883 (* Call *) |
|
1884 apply (intro allI impI) |
|
1885 apply (simp only:) |
|
1886 apply (drule Call_invers) |
|
1887 apply clarify |
|
1888 apply (simp (no_asm_use)) |
|
1889 apply (rule bc_mt_corresp_comb) |
|
1890 apply (rule HOL.refl) |
|
1891 apply simp |
|
1892 apply blast |
|
1893 apply (simp only: compTpExpr_LT_ST) |
|
1894 apply (rule bc_mt_corresp_comb, (rule HOL.refl)+) |
|
1895 apply blast |
|
1896 apply (simp only: compTpExprs_LT_ST) |
|
1897 apply (simp (no_asm_simp)) |
|
1898 apply (rule bc_mt_corresp_Invoke) |
|
1899 apply assumption+ |
|
1900 apply (fast intro: wt_class_expr_is_class) |
|
1901 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1902 apply (rule start_sttp_resp_comb) |
|
1903 apply (simp (no_asm_simp)) |
|
1904 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1905 |
|
1906 |
|
1907 (* expression lists *) |
|
1908 (* nil *) |
|
1909 |
|
1910 apply (intro allI impI) |
|
1911 apply (drule Nil_invers) |
|
1912 apply simp |
|
1913 |
|
1914 (* cons *) |
|
1915 |
|
1916 apply (intro allI impI) |
|
1917 apply (drule Cons_invers, (erule exE)+, (erule conjE)+) |
|
1918 apply clarify |
|
1919 apply (simp (no_asm_use)) |
|
1920 apply (rule bc_mt_corresp_comb) |
|
1921 apply (rule HOL.refl) |
|
1922 apply simp |
|
1923 apply blast |
|
1924 apply (simp only: compTpExpr_LT_ST) |
|
1925 apply blast |
1743 apply simp |
1926 apply simp |
1744 apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) apply (simp (no_asm_simp)) |
|
1745 apply (simp (no_asm_simp) add: length_compTpExpr) |
|
1746 apply (simp (no_asm_simp)) |
|
1747 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1748 |
|
1749 |
|
1750 apply (drule_tac ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3, LitPush (Bool False)]" |
|
1751 and inst = "Goto 2" and ?bc3.0 = "[LitPush (Bool True)]" |
|
1752 and ?f1.0="compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2 \<box> pushST [PrimT Boolean]" |
|
1753 and ?f2.0="popST 1" and ?f3.0="pushST [PrimT Boolean]" |
|
1754 in bc_mt_corresp_comb_wt_instr) |
|
1755 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
|
1756 |
|
1757 (* wt_instr *) |
|
1758 apply (simp (no_asm_simp) add: wt_instr_altern_def length_compTpExpr) |
|
1759 apply (simp (no_asm_simp) add: eff_def norm_eff_def) |
|
1760 apply (simp (no_asm_simp) only: int_outside_right nat_int) |
|
1761 apply (simp (no_asm_simp) add: length_compTpExpr) |
|
1762 apply (simp only: compTpExpr_LT_ST)+ |
|
1763 apply (simp add: eff_def norm_eff_def popST_def pushST_def) |
|
1764 apply (rule contracting_popST) (* contracting (popST 1) *) |
|
1765 |
|
1766 apply (drule_tac |
|
1767 ?bc1.0 = "compExpr jmb expr1 @ compExpr jmb expr2 @ [Ifcmpeq 3, LitPush (Bool False), Goto 2]" |
|
1768 and ?bc2.0 = "[LitPush (Bool True)]" |
|
1769 and ?bc3.0 = "[]" |
|
1770 and ?f1.0 = "compTpExpr jmb G expr1 \<box> compTpExpr jmb G expr2 \<box> popST 2 \<box> |
|
1771 pushST [PrimT Boolean] \<box> popST (Suc 0)" |
|
1772 and ?f2.0 = "pushST [PrimT Boolean]" |
|
1773 and ?f3.0 = "comb_nil" |
|
1774 in bc_mt_corresp_comb_inside) |
|
1775 apply (simp (no_asm_simp))+ |
|
1776 apply simp |
|
1777 apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) apply (simp (no_asm_simp)) |
|
1778 apply (simp (no_asm_simp) add: length_compTpExpr) |
|
1779 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1780 apply (simp (no_asm_simp)) |
|
1781 |
|
1782 apply simp |
|
1783 |
|
1784 (* case Add *) |
|
1785 apply simp |
|
1786 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) apply simp apply blast |
|
1787 apply (rule bc_mt_corresp_comb, rule HOL.refl) |
|
1788 apply (simp only: compTpExpr_LT_ST) |
|
1789 apply (simp only: compTpExpr_LT_ST) apply blast |
|
1790 |
|
1791 apply (simp only: compTpExpr_LT_ST) |
|
1792 apply simp |
|
1793 apply (rule bc_mt_corresp_IAdd) |
|
1794 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1795 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1796 |
|
1797 |
|
1798 (* LAcc *) |
|
1799 apply (intro allI impI) |
|
1800 apply (simp only:) |
|
1801 apply (drule LAcc_invers) |
|
1802 apply (frule wf_java_mdecl_length_pTs_pns) |
|
1803 apply clarify |
|
1804 apply (simp add: is_inited_LT_def) |
|
1805 apply (rule bc_mt_corresp_Load) |
|
1806 apply (rule index_in_bounds) apply simp apply assumption |
|
1807 apply (rule inited_LT_at_index_no_err) |
|
1808 apply (rule index_in_bounds) apply simp apply assumption |
|
1809 apply (rule HOL.refl) |
|
1810 |
|
1811 |
|
1812 (* LAss *) |
|
1813 apply (intro allI impI) |
|
1814 apply (simp only:) |
|
1815 apply (drule LAss_invers, erule exE, (erule conjE)+) |
|
1816 apply (drule LAcc_invers) |
|
1817 apply (frule wf_java_mdecl_disjoint_varnames, simp add: disjoint_varnames_def) |
|
1818 apply (frule wf_java_mdecl_length_pTs_pns) |
|
1819 apply clarify |
|
1820 apply (simp (no_asm_use)) |
|
1821 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast) |
|
1822 apply (rename_tac vname x2 ST LT T Ta) |
|
1823 apply (rule_tac ?bc1.0="[Dup]" and ?bc2.0="[Store (index (pns, lvars, blk, res) vname)]" |
|
1824 and ?f1.0="dupST" and ?f2.0="popST (Suc 0)" |
|
1825 in bc_mt_corresp_comb) |
|
1826 apply (simp (no_asm_simp))+ |
|
1827 apply (rule bc_mt_corresp_Dup) |
|
1828 apply (simp only: compTpExpr_LT_ST) |
|
1829 apply (simp add: dupST_def is_inited_LT_def) |
|
1830 apply (rule bc_mt_corresp_Store) |
|
1831 apply (rule index_in_bounds) |
|
1832 apply simp apply assumption |
|
1833 apply (rule sup_loc_update_index, assumption+) |
|
1834 apply simp apply assumption+ |
|
1835 apply (simp add: start_sttp_resp_def) |
|
1836 apply (simp add: start_sttp_resp_def) |
|
1837 |
|
1838 (* FAcc *) |
|
1839 apply (intro allI impI) |
|
1840 apply (simp only:) |
|
1841 apply (drule FAcc_invers) |
|
1842 apply clarify |
|
1843 apply (simp (no_asm_use)) |
|
1844 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp), blast) |
|
1845 apply (simp (no_asm_simp)) |
|
1846 apply (rule bc_mt_corresp_Getfield) apply assumption+ |
|
1847 apply (fast intro: wt_class_expr_is_class) |
|
1848 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1849 |
|
1850 |
|
1851 (* FAss *) |
|
1852 apply (intro allI impI) |
|
1853 apply (simp only:) |
|
1854 apply (drule FAss_invers, erule exE, (erule conjE)+) |
|
1855 apply (drule FAcc_invers) |
|
1856 apply clarify |
|
1857 apply (simp (no_asm_use)) |
|
1858 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) apply simp apply blast |
|
1859 apply (simp only: compTpExpr_LT_ST) |
|
1860 apply (rule bc_mt_corresp_comb, (rule HOL.refl)+) apply blast |
|
1861 apply (simp only: compTpExpr_LT_ST) |
|
1862 apply (rename_tac cname x2 vname x4 ST LT T Ta Ca) |
|
1863 apply (rule_tac ?bc1.0="[Dup_x1]" and ?bc2.0="[Putfield vname cname]" in bc_mt_corresp_comb) |
|
1864 apply (simp (no_asm_simp))+ |
|
1865 apply (rule bc_mt_corresp_Dup_x1) |
|
1866 apply (simp (no_asm_simp) add: dup_x1ST_def) |
|
1867 apply (rule bc_mt_corresp_Putfield) apply assumption+ |
|
1868 apply (fast intro: wt_class_expr_is_class) |
|
1869 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1870 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1871 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1872 |
|
1873 (* Call *) |
|
1874 apply (intro allI impI) |
|
1875 apply (simp only:) |
|
1876 apply (drule Call_invers) |
|
1877 apply clarify |
|
1878 apply (simp (no_asm_use)) |
|
1879 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) apply simp apply blast |
|
1880 apply (simp only: compTpExpr_LT_ST) |
|
1881 apply (rule bc_mt_corresp_comb, (rule HOL.refl)+) apply blast |
|
1882 apply (simp only: compTpExprs_LT_ST) |
|
1883 apply (simp (no_asm_simp)) |
|
1884 apply (rule bc_mt_corresp_Invoke) apply assumption+ |
|
1885 apply (fast intro: wt_class_expr_is_class) |
|
1886 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1887 apply (rule start_sttp_resp_comb) |
|
1888 apply (simp (no_asm_simp)) |
|
1889 apply (simp (no_asm_simp) add: start_sttp_resp_def) |
|
1890 |
|
1891 |
|
1892 (* expression lists *) |
|
1893 (* nil *) |
|
1894 |
|
1895 apply (intro allI impI) |
|
1896 apply (drule Nil_invers) |
|
1897 apply simp |
|
1898 |
|
1899 (* cons *) |
|
1900 |
|
1901 apply (intro allI impI) |
|
1902 apply (drule Cons_invers, (erule exE)+, (erule conjE)+) |
|
1903 apply clarify |
|
1904 apply (simp (no_asm_use)) |
|
1905 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) apply simp apply blast |
|
1906 apply (simp only: compTpExpr_LT_ST) |
|
1907 apply blast |
|
1908 apply simp |
|
1909 |
1927 |
1910 done |
1928 done |
1911 |
1929 |
1912 |
1930 |
1913 lemmas wt_method_compTpExpr_corresp [rule_format (no_asm)] = |
1931 lemmas wt_method_compTpExpr_corresp [rule_format (no_asm)] = |
1930 (is_inited_LT C pTs lvars LT) \<longrightarrow> |
1948 (is_inited_LT C pTs lvars LT) \<longrightarrow> |
1931 bc' = (compStmt jmb s) \<longrightarrow> |
1949 bc' = (compStmt jmb s) \<longrightarrow> |
1932 f' = (compTpStmt jmb G s) |
1950 f' = (compTpStmt jmb G s) |
1933 \<longrightarrow> bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) (length bc'))" |
1951 \<longrightarrow> bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) (length bc'))" |
1934 |
1952 |
1935 apply (rule stmt.induct) |
1953 apply (rule stmt.induct) |
1936 |
1954 |
1937 (* Skip *) |
1955 (* Skip *) |
1938 apply (intro allI impI) |
1956 apply (intro allI impI) |
1939 apply simp |
1957 apply simp |
1940 |
1958 |
1941 |
1959 |
1942 (* Expr *) |
1960 (* Expr *) |
1943 apply (intro allI impI) |
1961 apply (intro allI impI) |
1944 apply (drule Expr_invers, erule exE) |
1962 apply (drule Expr_invers, erule exE) |
1945 apply (simp (no_asm_simp)) |
1963 apply (simp (no_asm_simp)) |
1946 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp)) |
1964 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl, simp (no_asm_simp)) |
1947 apply (rule wt_method_compTpExpr_corresp) apply assumption+ |
1965 apply (rule wt_method_compTpExpr_corresp) apply assumption+ |
1948 apply (simp add: compTpExpr_LT_ST [of _ pns lvars blk res])+ |
1966 apply (simp add: compTpExpr_LT_ST [of _ pns lvars blk res])+ |
1949 apply (rule bc_mt_corresp_Pop) |
1967 apply (rule bc_mt_corresp_Pop) |
1950 apply (simp add: start_sttp_resp_def) |
1968 apply (simp add: start_sttp_resp_def) |
1951 |
1969 |
1952 |
1970 |
1953 (* Comp *) |
1971 (* Comp *) |
1954 apply (intro allI impI) |
1972 apply (intro allI impI) |
1955 apply (drule Comp_invers) |
1973 apply (drule Comp_invers) |
1956 apply clarify |
1974 apply clarify |
1957 apply (simp (no_asm_use)) |
1975 apply (simp (no_asm_use)) |
1958 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) |
1976 apply (rule bc_mt_corresp_comb) apply (rule HOL.refl) |
1959 apply (simp (no_asm_simp)) apply blast |
1977 apply (simp (no_asm_simp)) apply blast |
1960 apply (simp only: compTpStmt_LT_ST) |
1978 apply (simp only: compTpStmt_LT_ST) |
1961 apply (simp (no_asm_simp)) |
1979 apply (simp (no_asm_simp)) |
1962 |
1980 |
1963 (* Cond *) |
1981 (* Cond *) |
1964 apply (intro allI impI) |
1982 apply (intro allI impI) |
1965 apply (simp (no_asm_simp) only:) |
1983 apply (simp (no_asm_simp) only:) |
1966 apply (drule Cond_invers, (erule conjE)+) |
1984 apply (drule Cond_invers, (erule conjE)+) |
1967 apply (simp (no_asm_simp)) |
1985 apply (simp (no_asm_simp)) |
1968 |
1986 |
1969 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0") |
1987 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0") |
1970 prefer 2 |
1988 prefer 2 |
1971 apply (rule bc_mt_corresp_zero) |
1989 apply (rule bc_mt_corresp_zero) |
1972 apply (simp (no_asm_simp) add: length_compTpStmt length_compTpExpr) |
1990 apply (simp (no_asm_simp) add: length_compTpStmt length_compTpExpr) |
|
1991 apply (simp (no_asm_simp)) |
|
1992 |
|
1993 apply (rename_tac expr stmt1 stmt2 ST LT bc' f') |
|
1994 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "[LitPush (Bool False)]" |
|
1995 and ?bc3.0="compExpr jmb expr @ Ifcmpeq (2 + int (length (compStmt jmb stmt1))) # |
|
1996 compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) # |
|
1997 compStmt jmb stmt2" |
|
1998 and ?f1.0=comb_nil and ?f2.0 = "pushST [PrimT Boolean]" |
|
1999 and ?f3.0="compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt1 \<box> |
|
2000 nochangeST \<box> compTpStmt jmb G stmt2" |
|
2001 in bc_mt_corresp_comb_inside) |
|
2002 apply (simp (no_asm_simp))+ |
|
2003 apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) |
|
2004 apply (simp (no_asm_simp) add: start_sttp_resp_def)+ |
|
2005 |
|
2006 apply (drule_tac ?bc1.0="[LitPush (Bool False)]" and ?bc2.0 = "compExpr jmb expr" |
|
2007 and ?bc3.0="Ifcmpeq (2 + int (length (compStmt jmb stmt1))) # |
|
2008 compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) # |
|
2009 compStmt jmb stmt2" |
|
2010 and ?f1.0="pushST [PrimT Boolean]" and ?f2.0 = "compTpExpr jmb G expr" |
|
2011 and ?f3.0="popST 2 \<box> compTpStmt jmb G stmt1 \<box> nochangeST \<box> compTpStmt jmb G stmt2" |
|
2012 in bc_mt_corresp_comb_inside) |
|
2013 apply (simp (no_asm_simp))+ |
|
2014 apply (simp (no_asm_simp) add: pushST_def) |
|
2015 apply (rule wt_method_compTpExpr_corresp, assumption+) |
|
2016 apply (simp (no_asm_simp))+ |
|
2017 |
|
2018 |
|
2019 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr" |
|
2020 and inst = "Ifcmpeq (2 + int (length (compStmt jmb stmt1)))" |
|
2021 and ?bc3.0 = "compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) # |
|
2022 compStmt jmb stmt2" |
|
2023 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr" and ?f2.0 = "popST 2" |
|
2024 and ?f3.0="compTpStmt jmb G stmt1 \<box> nochangeST \<box> compTpStmt jmb G stmt2" |
|
2025 in bc_mt_corresp_comb_wt_instr) |
|
2026 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
|
2027 apply (simp (no_asm_simp) add: start_sttp_resp_comb) |
|
2028 |
|
2029 (* wt_instr *) |
|
2030 apply (intro strip) |
|
2031 apply (rule_tac ts="PrimT Boolean" and ts'="PrimT Boolean" and ST=ST and LT=LT |
|
2032 in wt_instr_Ifcmpeq) |
|
2033 apply (simp (no_asm_simp)) |
|
2034 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
|
2035 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
|
2036 (* current pc *) |
|
2037 apply (simp add: length_compTpExpr pushST_def) |
|
2038 apply (simp only: compTpExpr_LT_ST) |
|
2039 (* Suc pc *) |
|
2040 apply (simp add: length_compTpExpr pushST_def) |
|
2041 apply (simp add: popST_def start_sttp_resp_comb) |
|
2042 (* jump goal *) |
|
2043 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
|
2044 apply (simp add: length_compTpExpr pushST_def) |
|
2045 apply (simp add: popST_def start_sttp_resp_comb length_compTpStmt) |
|
2046 apply (simp only: compTpStmt_LT_ST) |
|
2047 apply (simp add: nochangeST_def) |
|
2048 (* check_type *) |
|
2049 apply (subgoal_tac " |
|
2050 (mt_sttp_flatten (f' (ST, LT)) ! length ([LitPush (Bool False)] @ compExpr jmb expr)) = |
|
2051 (Some (PrimT Boolean # PrimT Boolean # ST, LT))") |
|
2052 apply (simp only:) |
|
2053 apply (simp (no_asm_simp)) apply (rule trans, rule mt_sttp_flatten_comb_length) |
|
2054 apply (rule HOL.refl) apply (simp (no_asm_simp) add: length_compTpExpr) |
|
2055 apply (simp (no_asm_simp) add: length_compTpExpr pushST_def) |
|
2056 apply (simp only: compTpExpr_LT_ST_rewr) |
|
2057 (* contracting\<dots> *) |
|
2058 apply (rule contracting_popST) |
|
2059 |
|
2060 apply (drule_tac ?bc1.0="[LitPush (Bool False)] @ compExpr jmb expr @ |
|
2061 [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] " |
|
2062 and ?bc2.0 = "compStmt jmb stmt1" |
|
2063 and ?bc3.0="Goto (1 + int (length (compStmt jmb stmt2))) # compStmt jmb stmt2" |
|
2064 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2" |
|
2065 and ?f2.0 = "compTpStmt jmb G stmt1" |
|
2066 and ?f3.0="nochangeST \<box> compTpStmt jmb G stmt2" |
|
2067 in bc_mt_corresp_comb_inside) |
|
2068 apply (simp (no_asm_simp))+ |
|
2069 apply (simp (no_asm_simp) add: pushST_def popST_def compTpExpr_LT_ST) |
|
2070 apply (simp only: compTpExpr_LT_ST) |
|
2071 apply (simp (no_asm_simp)) |
|
2072 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
|
2073 |
|
2074 |
|
2075 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr @ [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] @ compStmt jmb stmt1" |
|
2076 and inst = "Goto (1 + int (length (compStmt jmb stmt2)))" |
|
2077 and ?bc3.0 = "compStmt jmb stmt2" |
|
2078 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt1" |
|
2079 and ?f2.0 = "nochangeST" |
|
2080 and ?f3.0="compTpStmt jmb G stmt2" |
|
2081 in bc_mt_corresp_comb_wt_instr) |
|
2082 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ |
|
2083 apply (intro strip) |
|
2084 apply (rule wt_instr_Goto) |
|
2085 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
|
2086 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
|
2087 (* \<dots> ! nat (int pc + i) = \<dots> ! pc *) |
|
2088 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt) |
|
2089 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def) |
|
2090 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
|
2091 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def) |
|
2092 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
|
2093 apply (simp only:) |
|
2094 apply (simp add: length_compTpExpr length_compTpStmt) |
|
2095 apply (rule contracting_nochangeST) |
|
2096 |
|
2097 |
|
2098 apply (drule_tac |
|
2099 ?bc1.0= "[LitPush (Bool False)] @ compExpr jmb expr @ |
|
2100 [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] @ |
|
2101 compStmt jmb stmt1 @ [Goto (1 + int (length (compStmt jmb stmt2)))]" |
|
2102 and ?bc2.0 = "compStmt jmb stmt2" |
|
2103 and ?bc3.0="[]" |
|
2104 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt1 \<box> nochangeST" |
|
2105 and ?f2.0 = "compTpStmt jmb G stmt2" |
|
2106 and ?f3.0="comb_nil" |
|
2107 in bc_mt_corresp_comb_inside) |
|
2108 apply (simp (no_asm_simp))+ |
|
2109 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def compTpExpr_LT_ST) |
|
2110 apply (simp only: compTpExpr_LT_ST) |
|
2111 apply (simp (no_asm_simp)) |
|
2112 apply (simp only: compTpStmt_LT_ST) |
|
2113 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ |
|
2114 |
|
2115 apply simp |
|
2116 |
|
2117 |
|
2118 (* Loop *) |
|
2119 apply (intro allI impI) |
|
2120 apply (simp (no_asm_simp) only:) |
|
2121 apply (drule Loop_invers, (erule conjE)+) |
1973 apply (simp (no_asm_simp)) |
2122 apply (simp (no_asm_simp)) |
1974 |
2123 |
1975 apply (rename_tac expr stmt1 stmt2 ST LT bc' f') |
2124 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0") |
1976 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "[LitPush (Bool False)]" |
2125 prefer 2 |
1977 and ?bc3.0="compExpr jmb expr @ Ifcmpeq (2 + int (length (compStmt jmb stmt1))) # |
2126 apply (rule bc_mt_corresp_zero) |
1978 compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) # |
2127 apply (simp (no_asm_simp) add: length_compTpStmt length_compTpExpr) |
1979 compStmt jmb stmt2" |
2128 apply (simp (no_asm_simp)) |
1980 and ?f1.0=comb_nil and ?f2.0 = "pushST [PrimT Boolean]" |
2129 |
1981 and ?f3.0="compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt1 \<box> |
2130 apply (rename_tac expr stmt ST LT bc' f') |
1982 nochangeST \<box> compTpStmt jmb G stmt2" |
2131 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "[LitPush (Bool False)]" |
1983 in bc_mt_corresp_comb_inside) |
2132 and ?bc3.0="compExpr jmb expr @ Ifcmpeq (2 + int (length (compStmt jmb stmt))) # |
1984 apply (simp (no_asm_simp))+ |
2133 compStmt jmb stmt @ |
1985 apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) |
2134 [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" |
1986 apply (simp (no_asm_simp) add: start_sttp_resp_def)+ |
2135 and ?f1.0=comb_nil and ?f2.0 = "pushST [PrimT Boolean]" |
1987 |
2136 and ?f3.0="compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt \<box> nochangeST" |
1988 apply (drule_tac ?bc1.0="[LitPush (Bool False)]" and ?bc2.0 = "compExpr jmb expr" |
2137 in bc_mt_corresp_comb_inside) |
1989 and ?bc3.0="Ifcmpeq (2 + int (length (compStmt jmb stmt1))) # |
2138 apply (simp (no_asm_simp))+ |
1990 compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) # |
2139 apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) |
1991 compStmt jmb stmt2" |
2140 apply (simp (no_asm_simp) add: start_sttp_resp_def)+ |
1992 and ?f1.0="pushST [PrimT Boolean]" and ?f2.0 = "compTpExpr jmb G expr" |
2141 |
1993 and ?f3.0="popST 2 \<box> compTpStmt jmb G stmt1 \<box> |
2142 apply (drule_tac ?bc1.0="[LitPush (Bool False)]" and ?bc2.0 = "compExpr jmb expr" |
1994 nochangeST \<box> compTpStmt jmb G stmt2" |
2143 and ?bc3.0="Ifcmpeq (2 + int (length (compStmt jmb stmt))) # |
1995 in bc_mt_corresp_comb_inside) |
2144 compStmt jmb stmt @ |
1996 apply (simp (no_asm_simp))+ |
2145 [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" |
1997 apply (simp (no_asm_simp) add: pushST_def) |
2146 and ?f1.0="pushST [PrimT Boolean]" and ?f2.0 = "compTpExpr jmb G expr" |
1998 apply (rule wt_method_compTpExpr_corresp) apply assumption+ |
2147 and ?f3.0="popST 2 \<box> compTpStmt jmb G stmt \<box> nochangeST" |
1999 apply (simp (no_asm_simp))+ |
2148 in bc_mt_corresp_comb_inside) |
2000 |
2149 apply (simp (no_asm_simp))+ |
2001 |
2150 apply (simp (no_asm_simp) add: pushST_def) |
2002 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr" |
2151 apply (rule wt_method_compTpExpr_corresp, assumption+) |
2003 and inst = "Ifcmpeq (2 + int (length (compStmt jmb stmt1)))" |
2152 apply (simp (no_asm_simp))+ |
2004 and ?bc3.0 = "compStmt jmb stmt1 @ Goto (1 + int (length (compStmt jmb stmt2))) # |
2153 |
2005 compStmt jmb stmt2" |
2154 |
2006 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr" and ?f2.0 = "popST 2" |
2155 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr" |
2007 and ?f3.0="compTpStmt jmb G stmt1 \<box> nochangeST \<box> compTpStmt jmb G stmt2" |
2156 and inst = "Ifcmpeq (2 + int (length (compStmt jmb stmt)))" |
2008 in bc_mt_corresp_comb_wt_instr) |
2157 and ?bc3.0 = "compStmt jmb stmt @ |
2009 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
2158 [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" |
2010 apply (simp (no_asm_simp) add: start_sttp_resp_comb) |
2159 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr" and ?f2.0 = "popST 2" |
|
2160 and ?f3.0="compTpStmt jmb G stmt \<box> nochangeST" |
|
2161 in bc_mt_corresp_comb_wt_instr) |
|
2162 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
|
2163 apply (simp (no_asm_simp) add: start_sttp_resp_comb) |
2011 |
2164 |
2012 (* wt_instr *) |
2165 (* wt_instr *) |
2013 apply (intro strip) |
2166 apply (intro strip) |
2014 apply (rule_tac ts="PrimT Boolean" and ts'="PrimT Boolean" |
2167 apply (rule_tac ts="PrimT Boolean" and ts'="PrimT Boolean" |
2015 and ST=ST and LT=LT |
2168 and ST=ST and LT=LT |
2016 in wt_instr_Ifcmpeq) |
2169 in wt_instr_Ifcmpeq) |
2017 apply (simp (no_asm_simp)) |
2170 apply (simp (no_asm_simp)) |
2018 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
2171 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
2019 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
2172 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
2020 (* current pc *) |
2173 (* current pc *) |
2021 apply (simp add: length_compTpExpr pushST_def) |
2174 apply (simp add: length_compTpExpr pushST_def) |
2022 apply (simp only: compTpExpr_LT_ST) |
2175 apply (simp only: compTpExpr_LT_ST) |
2023 (* Suc pc *) |
2176 (* Suc pc *) |
2024 apply (simp add: length_compTpExpr pushST_def) |
2177 apply (simp add: length_compTpExpr pushST_def) |
2025 apply (simp add: popST_def start_sttp_resp_comb) |
2178 apply (simp add: popST_def start_sttp_resp_comb) |
2026 (* jump goal *) |
2179 (* jump goal *) |
2027 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
2180 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
2028 apply (simp add: length_compTpExpr pushST_def) |
2181 apply (simp add: length_compTpExpr pushST_def) |
2029 apply (simp add: popST_def start_sttp_resp_comb length_compTpStmt) |
2182 apply (simp add: popST_def start_sttp_resp_comb length_compTpStmt) |
2030 apply (simp only: compTpStmt_LT_ST) |
2183 apply (simp only: compTpStmt_LT_ST) |
2031 apply (simp add: nochangeST_def) |
2184 apply (simp add: nochangeST_def) |
2032 (* check_type *) |
2185 (* check_type *) |
2033 apply (subgoal_tac " |
2186 apply (subgoal_tac " |
2034 (mt_sttp_flatten (f' (ST, LT)) ! length ([LitPush (Bool False)] @ compExpr jmb expr)) = |
2187 (mt_sttp_flatten (f' (ST, LT)) ! length ([LitPush (Bool False)] @ compExpr jmb expr)) = |
2035 (Some (PrimT Boolean # PrimT Boolean # ST, LT))") |
2188 (Some (PrimT Boolean # PrimT Boolean # ST, LT))") |
2036 apply (simp only:) |
2189 apply (simp only:) |
2037 apply (simp (no_asm_simp)) apply (rule trans, rule mt_sttp_flatten_comb_length) |
2190 apply (simp (no_asm_simp)) apply (rule trans, rule mt_sttp_flatten_comb_length) |
2038 apply (rule HOL.refl) apply (simp (no_asm_simp) add: length_compTpExpr) |
2191 apply (rule HOL.refl) apply (simp (no_asm_simp) add: length_compTpExpr) |
2039 apply (simp (no_asm_simp) add: length_compTpExpr pushST_def) |
2192 apply (simp (no_asm_simp) add: length_compTpExpr pushST_def) |
2040 apply (simp only: compTpExpr_LT_ST_rewr) |
2193 apply (simp only: compTpExpr_LT_ST_rewr) |
2041 (* contracting\<dots> *) |
2194 (* contracting\<dots> *) |
2042 apply (rule contracting_popST) |
2195 apply (rule contracting_popST) |
2043 |
2196 |
2044 apply (drule_tac |
2197 apply (drule_tac |
2045 ?bc1.0="[LitPush (Bool False)] @ compExpr jmb expr @ |
2198 ?bc1.0="[LitPush (Bool False)] @ compExpr jmb expr @ |
2046 [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] " |
2199 [Ifcmpeq (2 + int (length (compStmt jmb stmt)))] " |
2047 and ?bc2.0 = "compStmt jmb stmt1" |
2200 and ?bc2.0 = "compStmt jmb stmt" |
2048 and ?bc3.0="Goto (1 + int (length (compStmt jmb stmt2))) # compStmt jmb stmt2" |
2201 and ?bc3.0="[Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" |
2049 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2" |
2202 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2" |
2050 and ?f2.0 = "compTpStmt jmb G stmt1" |
2203 and ?f2.0 = "compTpStmt jmb G stmt" |
2051 and ?f3.0="nochangeST \<box> compTpStmt jmb G stmt2" |
2204 and ?f3.0="nochangeST" |
2052 in bc_mt_corresp_comb_inside) |
2205 in bc_mt_corresp_comb_inside) |
2053 apply (simp (no_asm_simp))+ |
2206 apply (simp (no_asm_simp))+ |
2054 apply (simp (no_asm_simp) add: pushST_def popST_def compTpExpr_LT_ST) |
2207 apply (simp (no_asm_simp) add: pushST_def popST_def compTpExpr_LT_ST) |
2055 apply (simp only: compTpExpr_LT_ST) |
2208 apply (simp only: compTpExpr_LT_ST) |
2056 apply (simp (no_asm_simp)) |
2209 apply (simp (no_asm_simp)) |
2057 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
2210 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
2058 |
2211 |
2059 |
2212 |
2060 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr @ [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] @ compStmt jmb stmt1" |
2213 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr @ [Ifcmpeq (2 + int (length (compStmt jmb stmt)))] @ compStmt jmb stmt" |
2061 and inst = "Goto (1 + int (length (compStmt jmb stmt2)))" |
2214 and inst = "Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))" |
2062 and ?bc3.0 = "compStmt jmb stmt2" |
2215 and ?bc3.0 = "[]" |
2063 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> |
2216 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt" |
2064 compTpStmt jmb G stmt1" |
2217 and ?f2.0 = "nochangeST" |
2065 and ?f2.0 = "nochangeST" |
2218 and ?f3.0="comb_nil" |
2066 and ?f3.0="compTpStmt jmb G stmt2" |
2219 in bc_mt_corresp_comb_wt_instr) |
2067 in bc_mt_corresp_comb_wt_instr) |
2220 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ |
2068 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ |
2221 apply (intro strip) |
2069 apply (intro strip) |
2222 apply (rule wt_instr_Goto) |
2070 apply (rule wt_instr_Goto) |
2223 apply arith |
2071 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
2224 apply arith |
2072 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
2225 (* \<dots> ! nat (int pc + i) = \<dots> ! pc *) |
2073 (* \<dots> ! nat (int pc + i) = \<dots> ! pc *) |
2226 apply (simp (no_asm_simp)) |
2074 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt) |
2227 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt) |
2075 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def) |
2228 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def) |
2076 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
2229 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
2077 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def) |
2230 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt) |
2078 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
2231 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
2079 apply (simp only:) |
2232 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def) |
2080 apply (simp add: length_compTpExpr length_compTpStmt) |
2233 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt) |
2081 apply (rule contracting_nochangeST) |
2234 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
2082 |
2235 |
2083 |
2236 apply (simp add: length_compTpExpr length_compTpStmt) (* check_type *) |
2084 apply (drule_tac |
|
2085 ?bc1.0= "[LitPush (Bool False)] @ compExpr jmb expr @ |
|
2086 [Ifcmpeq (2 + int (length (compStmt jmb stmt1)))] @ |
|
2087 compStmt jmb stmt1 @ [Goto (1 + int (length (compStmt jmb stmt2)))]" |
|
2088 and ?bc2.0 = "compStmt jmb stmt2" |
|
2089 and ?bc3.0="[]" |
|
2090 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> |
|
2091 compTpStmt jmb G stmt1 \<box> nochangeST" |
|
2092 and ?f2.0 = "compTpStmt jmb G stmt2" |
|
2093 and ?f3.0="comb_nil" |
|
2094 in bc_mt_corresp_comb_inside) |
|
2095 apply (simp (no_asm_simp))+ |
|
2096 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def compTpExpr_LT_ST) |
|
2097 apply (simp only: compTpExpr_LT_ST) |
|
2098 apply (simp (no_asm_simp)) |
|
2099 apply (simp only: compTpStmt_LT_ST) |
|
2100 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ |
|
2101 |
|
2102 apply simp |
|
2103 |
|
2104 |
|
2105 (* Loop *) |
|
2106 apply (intro allI impI) |
|
2107 apply (simp (no_asm_simp) only:) |
|
2108 apply (drule Loop_invers, (erule conjE)+) |
|
2109 apply (simp (no_asm_simp)) |
|
2110 |
|
2111 apply (subgoal_tac "bc_mt_corresp bc' f' (ST, LT) (comp G) rT (length LT) 0") |
|
2112 prefer 2 |
|
2113 apply (rule bc_mt_corresp_zero) |
|
2114 apply (simp (no_asm_simp) add: length_compTpStmt length_compTpExpr) |
|
2115 apply (simp (no_asm_simp)) |
|
2116 |
|
2117 apply (rename_tac expr stmt ST LT bc' f') |
|
2118 apply (drule_tac ?bc1.0="[]" and ?bc2.0 = "[LitPush (Bool False)]" |
|
2119 and ?bc3.0="compExpr jmb expr @ Ifcmpeq (2 + int (length (compStmt jmb stmt))) # |
|
2120 compStmt jmb stmt @ |
|
2121 [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" |
|
2122 and ?f1.0=comb_nil and ?f2.0 = "pushST [PrimT Boolean]" |
|
2123 and ?f3.0="compTpExpr jmb G expr \<box> popST 2 \<box> compTpStmt jmb G stmt \<box> nochangeST" |
|
2124 in bc_mt_corresp_comb_inside) |
|
2125 apply (simp (no_asm_simp))+ |
|
2126 apply (rule_tac T="(PrimT Boolean)" in bc_mt_corresp_LitPush) |
|
2127 apply (simp (no_asm_simp) add: start_sttp_resp_def)+ |
|
2128 |
|
2129 apply (drule_tac ?bc1.0="[LitPush (Bool False)]" and ?bc2.0 = "compExpr jmb expr" |
|
2130 and ?bc3.0="Ifcmpeq (2 + int (length (compStmt jmb stmt))) # |
|
2131 compStmt jmb stmt @ |
|
2132 [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" |
|
2133 and ?f1.0="pushST [PrimT Boolean]" and ?f2.0 = "compTpExpr jmb G expr" |
|
2134 and ?f3.0="popST 2 \<box> compTpStmt jmb G stmt \<box> nochangeST" |
|
2135 in bc_mt_corresp_comb_inside) |
|
2136 apply (simp (no_asm_simp))+ |
|
2137 apply (simp (no_asm_simp) add: pushST_def) |
|
2138 apply (rule wt_method_compTpExpr_corresp) apply assumption+ |
|
2139 apply (simp (no_asm_simp))+ |
|
2140 |
|
2141 |
|
2142 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr" |
|
2143 and inst = "Ifcmpeq (2 + int (length (compStmt jmb stmt)))" |
|
2144 and ?bc3.0 = "compStmt jmb stmt @ |
|
2145 [Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" |
|
2146 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr" and ?f2.0 = "popST 2" |
|
2147 and ?f3.0="compTpStmt jmb G stmt \<box> nochangeST" |
|
2148 in bc_mt_corresp_comb_wt_instr) |
|
2149 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
|
2150 apply (simp (no_asm_simp) add: start_sttp_resp_comb) |
|
2151 |
|
2152 (* wt_instr *) |
|
2153 apply (intro strip) |
|
2154 apply (rule_tac ts="PrimT Boolean" and ts'="PrimT Boolean" |
|
2155 and ST=ST and LT=LT |
|
2156 in wt_instr_Ifcmpeq) |
|
2157 apply (simp (no_asm_simp)) |
|
2158 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
|
2159 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
|
2160 (* current pc *) |
|
2161 apply (simp add: length_compTpExpr pushST_def) |
|
2162 apply (simp only: compTpExpr_LT_ST) |
|
2163 (* Suc pc *) |
|
2164 apply (simp add: length_compTpExpr pushST_def) |
|
2165 apply (simp add: popST_def start_sttp_resp_comb) |
|
2166 (* jump goal *) |
|
2167 apply (simp (no_asm_simp) only: int_outside_right nat_int, simp (no_asm_simp)) |
|
2168 apply (simp add: length_compTpExpr pushST_def) |
|
2169 apply (simp add: popST_def start_sttp_resp_comb length_compTpStmt) |
|
2170 apply (simp only: compTpStmt_LT_ST) |
|
2171 apply (simp add: nochangeST_def) |
|
2172 (* check_type *) |
|
2173 apply (subgoal_tac " |
|
2174 (mt_sttp_flatten (f' (ST, LT)) ! length ([LitPush (Bool False)] @ compExpr jmb expr)) = |
|
2175 (Some (PrimT Boolean # PrimT Boolean # ST, LT))") |
|
2176 apply (simp only:) |
|
2177 apply (simp (no_asm_simp)) apply (rule trans, rule mt_sttp_flatten_comb_length) |
|
2178 apply (rule HOL.refl) apply (simp (no_asm_simp) add: length_compTpExpr) |
|
2179 apply (simp (no_asm_simp) add: length_compTpExpr pushST_def) |
|
2180 apply (simp only: compTpExpr_LT_ST_rewr) |
|
2181 (* contracting\<dots> *) |
|
2182 apply (rule contracting_popST) |
|
2183 |
|
2184 apply (drule_tac |
|
2185 ?bc1.0="[LitPush (Bool False)] @ compExpr jmb expr @ |
|
2186 [Ifcmpeq (2 + int (length (compStmt jmb stmt)))] " |
|
2187 and ?bc2.0 = "compStmt jmb stmt" |
|
2188 and ?bc3.0="[Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))]" |
|
2189 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2" |
|
2190 and ?f2.0 = "compTpStmt jmb G stmt" |
|
2191 and ?f3.0="nochangeST" |
|
2192 in bc_mt_corresp_comb_inside) |
|
2193 apply (simp (no_asm_simp))+ |
|
2194 apply (simp (no_asm_simp) add: pushST_def popST_def compTpExpr_LT_ST) |
|
2195 apply (simp only: compTpExpr_LT_ST) |
|
2196 apply (simp (no_asm_simp)) |
|
2197 apply (simp (no_asm_simp) add: length_compTpExpr)+ |
|
2198 |
|
2199 |
|
2200 apply (drule_tac ?bc1.0 = "[LitPush (Bool False)] @ compExpr jmb expr @ [Ifcmpeq (2 + int (length (compStmt jmb stmt)))] @ compStmt jmb stmt" |
|
2201 and inst = "Goto (-2 + (- int (length (compStmt jmb stmt)) - int (length (compExpr jmb expr))))" |
|
2202 and ?bc3.0 = "[]" |
|
2203 and ?f1.0="pushST [PrimT Boolean] \<box> compTpExpr jmb G expr \<box> popST 2 \<box> |
|
2204 compTpStmt jmb G stmt" |
|
2205 and ?f2.0 = "nochangeST" |
|
2206 and ?f3.0="comb_nil" |
|
2207 in bc_mt_corresp_comb_wt_instr) |
|
2208 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt)+ |
|
2209 apply (intro strip) |
|
2210 apply (rule wt_instr_Goto) |
|
2211 apply arith |
|
2212 apply arith |
|
2213 (* \<dots> ! nat (int pc + i) = \<dots> ! pc *) |
|
2214 apply (simp (no_asm_simp)) |
|
2215 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt) |
|
2216 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def) |
|
2217 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
|
2218 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt) |
|
2219 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
|
2220 apply (simp (no_asm_simp) add: pushST_def popST_def nochangeST_def) |
|
2221 apply (simp (no_asm_simp) add: length_compTpExpr length_compTpStmt) |
|
2222 apply (simp only: compTpExpr_LT_ST compTpStmt_LT_ST) |
|
2223 |
|
2224 apply (simp add: length_compTpExpr length_compTpStmt) (* check_type *) |
|
2225 apply (simp add: pushST_def popST_def compTpExpr_LT_ST compTpStmt_LT_ST) |
2237 apply (simp add: pushST_def popST_def compTpExpr_LT_ST compTpStmt_LT_ST) |
2226 apply (rule contracting_nochangeST) |
2238 apply (rule contracting_nochangeST) |
2227 apply simp |
2239 apply simp |
2228 |
2240 |
2229 done |
2241 done |
2230 |
2242 |
2231 |
2243 |
2232 (**********************************************************************************) |
2244 (**********************************************************************************) |
2233 |
2245 |
2234 |
2246 |
2237 wf_java_mdecl G C ((mn, pTs), rT, jmb); mxr = length LT; |
2249 wf_java_mdecl G C ((mn, pTs), rT, jmb); mxr = length LT; |
2238 length LT = (length pns) + (length lvars) + 1; vn \<in> set (map fst lvars); |
2250 length LT = (length pns) + (length lvars) + 1; vn \<in> set (map fst lvars); |
2239 bc = (compInit jmb (vn,ty)); f = (compTpInit jmb (vn,ty)); |
2251 bc = (compInit jmb (vn,ty)); f = (compTpInit jmb (vn,ty)); |
2240 is_type G ty \<rbrakk> |
2252 is_type G ty \<rbrakk> |
2241 \<Longrightarrow> bc_mt_corresp bc f (ST, LT) (comp G) rT mxr (length bc)" |
2253 \<Longrightarrow> bc_mt_corresp bc f (ST, LT) (comp G) rT mxr (length bc)" |
2242 apply (simp add: compInit_def compTpInit_def split_beta) |
2254 apply (simp add: compInit_def compTpInit_def split_beta) |
2243 apply (rule_tac ?bc1.0="[load_default_val ty]" and ?bc2.0="[Store (index jmb vn)]" |
2255 apply (rule_tac ?bc1.0="[load_default_val ty]" and ?bc2.0="[Store (index jmb vn)]" |
2244 in bc_mt_corresp_comb) |
2256 in bc_mt_corresp_comb) |
2245 apply simp+ |
2257 apply simp+ |
2246 apply (simp add: load_default_val_def) |
2258 apply (simp add: load_default_val_def) |
2247 apply (rule typeof_default_val [THEN exE]) |
2259 apply (rule typeof_default_val [THEN exE]) |
2248 |
2260 |
2249 apply (rule bc_mt_corresp_LitPush_CT) apply assumption |
2261 apply (rule bc_mt_corresp_LitPush_CT, assumption) |
2250 apply (simp add: comp_is_type) |
2262 apply (simp add: comp_is_type) |
2251 apply (simp add: pushST_def) |
2263 apply (simp add: pushST_def) |
2252 apply (rule bc_mt_corresp_Store_init) |
2264 apply (rule bc_mt_corresp_Store_init) |
2253 apply simp |
2265 apply simp |
2254 apply (rule index_length_lvars [THEN conjunct2]) |
2266 apply (rule index_length_lvars [THEN conjunct2]) |
2255 apply auto |
2267 apply auto |
2256 done |
2268 done |
2257 |
2269 |
2258 |
2270 |
2259 lemma wt_method_compTpInitLvars_corresp_aux [rule_format (no_asm)]: " |
2271 lemma wt_method_compTpInitLvars_corresp_aux [rule_format (no_asm)]: " |
2260 \<forall> lvars_pre lvars0 ST LT. |
2272 \<forall> lvars_pre lvars0 ST LT. |
2261 jmb = (pns,lvars0,blk,res) \<and> |
2273 jmb = (pns,lvars0,blk,res) \<and> |
2262 lvars0 = (lvars_pre @ lvars) \<and> |
2274 lvars0 = (lvars_pre @ lvars) \<and> |
2263 length LT = (length pns) + (length lvars0) + 1 \<and> |
2275 length LT = (length pns) + (length lvars0) + 1 \<and> |
2264 wf_java_mdecl G C ((mn, pTs), rT, jmb) |
2276 wf_java_mdecl G C ((mn, pTs), rT, jmb) |
2265 \<longrightarrow> bc_mt_corresp (compInitLvars jmb lvars) (compTpInitLvars jmb lvars) (ST, LT) (comp G) rT |
2277 \<longrightarrow> bc_mt_corresp (compInitLvars jmb lvars) (compTpInitLvars jmb lvars) (ST, LT) (comp G) rT |
2266 (length LT) (length (compInitLvars jmb lvars))" |
2278 (length LT) (length (compInitLvars jmb lvars))" |
2267 apply (induct lvars) |
2279 apply (induct lvars) |
2268 apply (simp add: compInitLvars_def) |
2280 apply (simp add: compInitLvars_def) |
2269 |
2281 |
2270 apply (intro strip, (erule conjE)+) |
2282 apply (intro strip, (erule conjE)+) |
2271 apply (subgoal_tac "\<exists> vn ty. a = (vn, ty)") |
2283 apply (subgoal_tac "\<exists> vn ty. a = (vn, ty)") |
2272 prefer 2 apply (simp (no_asm_simp)) |
2284 prefer 2 |
|
2285 apply (simp (no_asm_simp)) |
2273 apply ((erule exE)+, simp (no_asm_simp)) |
2286 apply ((erule exE)+, simp (no_asm_simp)) |
2274 apply (drule_tac x="lvars_pre @ [a]" in spec) |
2287 apply (drule_tac x="lvars_pre @ [a]" in spec) |
2275 apply (drule_tac x="lvars0" in spec) |
2288 apply (drule_tac x="lvars0" in spec) |
2276 apply (simp (no_asm_simp) add: compInitLvars_def) |
2289 apply (simp (no_asm_simp) add: compInitLvars_def) |
2277 apply (rule_tac ?bc1.0="compInit jmb a" and ?bc2.0="compInitLvars jmb lvars" |
2290 apply (rule_tac ?bc1.0="compInit jmb a" and ?bc2.0="compInitLvars jmb lvars" |
2278 in bc_mt_corresp_comb) |
2291 in bc_mt_corresp_comb) |
2279 apply (simp (no_asm_simp) add: compInitLvars_def)+ |
2292 apply (simp (no_asm_simp) add: compInitLvars_def)+ |
2280 |
2293 |
2281 apply (rule_tac vn=vn and ty=ty in wt_method_compTpInit_corresp) |
2294 apply (rule_tac vn=vn and ty=ty in wt_method_compTpInit_corresp) |
2282 apply assumption+ |
2295 apply assumption+ |
2283 apply (simp (no_asm_simp))+ |
2296 apply (simp (no_asm_simp))+ |
2284 apply (simp add: wf_java_mdecl_def) (* is_type G ty *) |
2297 apply (simp add: wf_java_mdecl_def) (* is_type G ty *) |
2285 apply (simp add: compTpInit_def storeST_def pushST_def) |
2298 apply (simp add: compTpInit_def storeST_def pushST_def) |
2286 apply simp |
2299 apply simp |
2287 done |
2300 done |
2288 |
2301 |
2289 |
2302 |
2290 lemma wt_method_compTpInitLvars_corresp: "\<lbrakk> jmb = (pns,lvars,blk,res); |
2303 lemma wt_method_compTpInitLvars_corresp: "\<lbrakk> jmb = (pns,lvars,blk,res); |
2291 wf_java_mdecl G C ((mn, pTs), rT, jmb); |
2304 wf_java_mdecl G C ((mn, pTs), rT, jmb); |
2292 length LT = (length pns) + (length lvars) + 1; mxr = (length LT); |
2305 length LT = (length pns) + (length lvars) + 1; mxr = (length LT); |
2293 bc = (compInitLvars jmb lvars); f= (compTpInitLvars jmb lvars) \<rbrakk> |
2306 bc = (compInitLvars jmb lvars); f= (compTpInitLvars jmb lvars) \<rbrakk> |
2294 \<Longrightarrow> bc_mt_corresp bc f (ST, LT) (comp G) rT mxr (length bc)" |
2307 \<Longrightarrow> bc_mt_corresp bc f (ST, LT) (comp G) rT mxr (length bc)" |
2295 apply (simp only:) |
2308 apply (simp only:) |
2296 apply (subgoal_tac "bc_mt_corresp (compInitLvars (pns, lvars, blk, res) lvars) |
2309 apply (subgoal_tac "bc_mt_corresp (compInitLvars (pns, lvars, blk, res) lvars) |
2297 (compTpInitLvars (pns, lvars, blk, res) lvars) (ST, LT) (TranslComp.comp G) rT |
2310 (compTpInitLvars (pns, lvars, blk, res) lvars) (ST, LT) (TranslComp.comp G) rT |
2298 (length LT) (length (compInitLvars (pns, lvars, blk, res) lvars))") |
2311 (length LT) (length (compInitLvars (pns, lvars, blk, res) lvars))") |
2299 apply simp |
2312 apply simp |
2300 apply (rule_tac lvars_pre="[]" in wt_method_compTpInitLvars_corresp_aux) |
2313 apply (rule_tac lvars_pre="[]" in wt_method_compTpInitLvars_corresp_aux) |
2301 apply auto |
2314 apply auto |
2302 done |
2315 done |
2303 |
2316 |
2304 |
2317 |
2305 (**********************************************************************************) |
2318 (**********************************************************************************) |
2306 |
2319 |
2307 |
2320 |
2388 check_type cG mxs (1+length pTs+mxl) (OK (Some (T # ST, LT))) \<longrightarrow> |
2403 check_type cG mxs (1+length pTs+mxl) (OK (Some (T # ST, LT))) \<longrightarrow> |
2389 wt_instr_altern Return cG rT (mt_of (f' sttp0)) mxs (1+length pTs+mxl) |
2404 wt_instr_altern Return cG rT (mt_of (f' sttp0)) mxs (1+length pTs+mxl) |
2390 (Suc (length bc)) empty_et (length bc) |
2405 (Suc (length bc)) empty_et (length bc) |
2391 \<rbrakk> |
2406 \<rbrakk> |
2392 \<Longrightarrow> wt_method_altern cG C pTs rT mxs mxl bc' empty_et (mt_of (f' sttp0))" |
2407 \<Longrightarrow> wt_method_altern cG C pTs rT mxs mxl bc' empty_et (mt_of (f' sttp0))" |
2393 apply (subgoal_tac "check_type cG (length start_ST) (Suc (length pTs + mxl)) |
2408 apply (subgoal_tac "check_type cG (length start_ST) (Suc (length pTs + mxl)) |
2394 (OK (Some (start_ST, start_LT C pTs mxl)))") |
2409 (OK (Some (start_ST, start_LT C pTs mxl)))") |
2395 apply (subgoal_tac "check_type cG mxs (1+length pTs+mxl) (OK (Some (T # ST, LT)))") |
2410 apply (subgoal_tac "check_type cG mxs (1+length pTs+mxl) (OK (Some (T # ST, LT)))") |
2396 |
2411 |
2397 apply (simp add: wt_method_altern_def) |
2412 apply (simp add: wt_method_altern_def) |
2398 |
2413 |
2399 (* length (.. f ..) = length bc *) |
2414 (* length (.. f ..) = length bc *) |
2400 apply (rule conjI) |
2415 apply (rule conjI) |
2401 apply (simp add: bc_mt_corresp_def split_beta) |
2416 apply (simp add: bc_mt_corresp_def split_beta) |
2402 |
2417 |
2403 (* check_bounded *) |
2418 (* check_bounded *) |
2404 apply (rule conjI) |
2419 apply (rule conjI) |
2405 apply (simp add: bc_mt_corresp_def split_beta check_bounded_def) |
2420 apply (simp add: bc_mt_corresp_def split_beta check_bounded_def) |
2406 apply (erule conjE)+ |
2421 apply (erule conjE)+ |
2407 apply (intro strip) |
2422 apply (intro strip) |
2408 apply (subgoal_tac "pc < (length bc) \<or> pc = length bc") |
2423 apply (subgoal_tac "pc < (length bc) \<or> pc = length bc") |
2409 apply (erule disjE) |
2424 apply (erule disjE) |
2410 (* case pc < length bc *) |
2425 (* case pc < length bc *) |
2411 apply (subgoal_tac "(bc' ! pc) = (bc ! pc)") |
2426 apply (subgoal_tac "(bc' ! pc) = (bc ! pc)") |
2412 apply (simp add: wt_instr_altern_def eff_def) |
2427 apply (simp add: wt_instr_altern_def eff_def) |
|
2428 (* subgoal *) |
|
2429 apply (simp add: nth_append) |
|
2430 (* case pc = length bc *) |
|
2431 apply (subgoal_tac "(bc' ! pc) = Return") |
|
2432 apply (simp add: wt_instr_altern_def) |
2413 (* subgoal *) |
2433 (* subgoal *) |
|
2434 apply (simp add: nth_append) |
|
2435 |
|
2436 (* subgoal pc < length bc \<or> pc = length bc *) |
|
2437 apply arith |
|
2438 |
|
2439 (* wt_start *) |
|
2440 apply (rule conjI) |
|
2441 apply (simp add: wt_start_def start_sttp_resp_cons_def split_beta) |
|
2442 apply (drule_tac x=sttp0 in spec) apply (erule exE) |
|
2443 apply (simp add: mt_sttp_flatten_def start_ST_def start_LT_def) |
|
2444 |
|
2445 (* wt_instr *) |
|
2446 apply (intro strip) |
|
2447 apply (subgoal_tac "pc < (length bc) \<or> pc = length bc") |
|
2448 apply (erule disjE) |
|
2449 |
|
2450 (* pc < (length bc) *) |
|
2451 apply (simp (no_asm_use) add: bc_mt_corresp_def mt_sttp_flatten_def split_beta) |
|
2452 apply (erule conjE)+ |
|
2453 apply (drule mp, assumption)+ |
|
2454 apply (erule conjE)+ |
|
2455 apply (drule spec, drule mp, assumption) |
|
2456 apply (simp add: nth_append) |
|
2457 apply (simp (no_asm_simp) add: comb_def split_beta nochangeST_def) |
|
2458 |
|
2459 (* pc = length bc *) |
|
2460 apply (simp add: nth_append) |
|
2461 |
|
2462 (* subgoal pc < (length bc) \<or> pc = length bc *) |
|
2463 apply arith |
|
2464 |
|
2465 (* subgoals *) |
|
2466 apply (simp (no_asm_use) add: bc_mt_corresp_def split_beta) |
|
2467 apply (subgoal_tac "check_type cG (length (fst sttp0)) (Suc (length pTs + mxl)) |
|
2468 (OK (Some sttp0))") |
|
2469 apply ((erule conjE)+, drule mp, assumption) |
2414 apply (simp add: nth_append) |
2470 apply (simp add: nth_append) |
2415 (* case pc = length bc *) |
2471 apply (simp (no_asm_simp) add: comb_def nochangeST_def split_beta) |
2416 apply (subgoal_tac "(bc' ! pc) = Return") |
2472 apply (simp (no_asm_simp)) |
2417 apply (simp add: wt_instr_altern_def) |
2473 |
2418 (* subgoal *) |
2474 apply (rule check_type_start, assumption+) |
2419 apply (simp add: nth_append) |
2475 done |
2420 |
|
2421 (* subgoal pc < length bc \<or> pc = length bc *) |
|
2422 apply arith |
|
2423 |
|
2424 (* wt_start *) |
|
2425 apply (rule conjI) |
|
2426 apply (simp add: wt_start_def start_sttp_resp_cons_def split_beta) |
|
2427 apply (drule_tac x=sttp0 in spec) apply (erule exE) |
|
2428 apply (simp add: mt_sttp_flatten_def start_ST_def start_LT_def) |
|
2429 |
|
2430 (* wt_instr *) |
|
2431 apply (intro strip) |
|
2432 apply (subgoal_tac "pc < (length bc) \<or> pc = length bc") |
|
2433 apply (erule disjE) |
|
2434 |
|
2435 (* pc < (length bc) *) |
|
2436 apply (simp (no_asm_use) add: bc_mt_corresp_def mt_sttp_flatten_def split_beta) |
|
2437 apply (erule conjE)+ |
|
2438 apply (drule mp, assumption)+ |
|
2439 apply (erule conjE)+ |
|
2440 apply (drule spec, drule mp, assumption) |
|
2441 apply (simp add: nth_append) |
|
2442 apply (simp (no_asm_simp) add: comb_def split_beta nochangeST_def) |
|
2443 |
|
2444 (* pc = length bc *) |
|
2445 apply (simp add: nth_append) |
|
2446 |
|
2447 (* subgoal pc < (length bc) \<or> pc = length bc *) |
|
2448 apply arith |
|
2449 |
|
2450 (* subgoals *) |
|
2451 apply (simp (no_asm_use) add: bc_mt_corresp_def split_beta) |
|
2452 apply (subgoal_tac "check_type cG (length (fst sttp0)) (Suc (length pTs + mxl)) |
|
2453 (OK (Some sttp0))") |
|
2454 apply ((erule conjE)+, drule mp, assumption) |
|
2455 apply (simp add: nth_append) |
|
2456 apply (simp (no_asm_simp) add: comb_def nochangeST_def split_beta) |
|
2457 apply (simp (no_asm_simp)) |
|
2458 |
|
2459 apply (rule check_type_start, assumption+) |
|
2460 done |
|
2461 |
2476 |
2462 |
2477 |
2463 lemma wt_instr_Return: "\<lbrakk>fst f ! pc = Some (T # ST, LT); (G \<turnstile> T \<preceq> rT); pc < max_pc; |
2478 lemma wt_instr_Return: "\<lbrakk>fst f ! pc = Some (T # ST, LT); (G \<turnstile> T \<preceq> rT); pc < max_pc; |
2464 check_type (TranslComp.comp G) mxs mxr (OK (Some (T # ST, LT))) |
2479 check_type (TranslComp.comp G) mxs mxr (OK (Some (T # ST, LT))) |
2465 \<rbrakk> |
2480 \<rbrakk> |
2466 \<Longrightarrow> wt_instr_altern Return (comp G) rT (mt_of f) mxs mxr max_pc empty_et pc" |
2481 \<Longrightarrow> wt_instr_altern Return (comp G) rT (mt_of f) mxs mxr max_pc empty_et pc" |
2467 apply (case_tac "(mt_of f ! pc)") |
2482 apply (case_tac "(mt_of f ! pc)") |
2468 apply (simp add: wt_instr_altern_def eff_def norm_eff_def app_def)+ |
2483 apply (simp add: wt_instr_altern_def eff_def norm_eff_def app_def)+ |
2469 apply (drule sym) |
2484 apply (drule sym) |
2470 apply (simp add: comp_widen xcpt_app_def) |
2485 apply (simp add: comp_widen xcpt_app_def) |
2471 done |
2486 done |
2472 |
2487 |
2473 |
2488 |
2477 mt = (compTpMethod G C jmdcl); |
2492 mt = (compTpMethod G C jmdcl); |
2478 (mxs, mxl, bc, et) = mtd_mb (compMethod G C jmdcl) \<rbrakk> |
2493 (mxs, mxl, bc, et) = mtd_mb (compMethod G C jmdcl) \<rbrakk> |
2479 \<Longrightarrow> wt_method (comp G) C pTs rT mxs mxl bc et mt" |
2494 \<Longrightarrow> wt_method (comp G) C pTs rT mxs mxl bc et mt" |
2480 |
2495 |
2481 (* show statement for wt_method_altern *) |
2496 (* show statement for wt_method_altern *) |
2482 apply (rule wt_method_altern_wt_method) |
2497 apply (rule wt_method_altern_wt_method) |
2483 |
2498 |
2484 apply (subgoal_tac "wf_java_mdecl G C jmdcl") |
2499 apply (subgoal_tac "wf_java_mdecl G C jmdcl") |
2485 apply (subgoal_tac "wf_mhead G (mn, pTs) rT") |
2500 apply (subgoal_tac "wf_mhead G (mn, pTs) rT") |
2486 apply (subgoal_tac "is_class G C") |
2501 apply (subgoal_tac "is_class G C") |
2487 apply (subgoal_tac "\<forall> jmb. \<exists> pns lvars blk res. jmb = (pns, lvars, blk, res)") |
2502 apply (subgoal_tac "\<forall>jmb. \<exists> pns lvars blk res. jmb = (pns, lvars, blk, res)") |
2488 apply (drule_tac x=jmb in spec, (erule exE)+) |
2503 apply (drule_tac x=jmb in spec, (erule exE)+) |
2489 apply (subgoal_tac "\<exists> E. (E = (local_env G C (mn, pTs) pns lvars) \<and> E \<turnstile> blk \<surd> \<and> |
2504 apply (subgoal_tac "\<exists>E. (E = (local_env G C (mn, pTs) pns lvars) \<and> E \<turnstile> blk \<surd> \<and> |
2490 (\<exists>T. E\<turnstile>res::T \<and> G\<turnstile>T\<preceq>rT))") |
2505 (\<exists>T. E\<turnstile>res::T \<and> G\<turnstile>T\<preceq>rT))") |
2491 apply (erule exE, (erule conjE)+)+ |
2506 apply (erule exE, (erule conjE)+)+ |
2492 apply (simp add: compMethod_def compTpMethod_def split_beta) |
2507 apply (simp add: compMethod_def compTpMethod_def split_beta) |
2493 apply (rule_tac T=T and LT="inited_LT C pTs lvars" and ST=start_ST in wt_method_comp_aux) |
2508 apply (rule_tac T=T and LT="inited_LT C pTs lvars" and ST=start_ST in wt_method_comp_aux) |
2494 |
2509 |
2495 (* bc *) |
2510 (* bc *) |
2496 apply (simp only: append_assoc [symmetric]) |
2511 apply (simp only: append_assoc [symmetric]) |
2497 |
2512 |
2498 (* comb *) |
2513 (* comb *) |
2499 apply (simp only: comb_assoc [symmetric]) |
2514 apply (simp only: comb_assoc [symmetric]) |
2500 |
2515 |
2501 (* bc_corresp *) |
2516 (* bc_corresp *) |
2502 apply (rule wt_method_comp_wo_return) |
2517 apply (rule wt_method_comp_wo_return) |
2503 apply assumption+ |
2518 apply assumption+ |
2504 apply (simp (no_asm_use) only: append_assoc) |
2519 apply (simp (no_asm_use) only: append_assoc) |
2505 apply (rule HOL.refl) |
2520 apply (rule HOL.refl) |
2506 apply (simp (no_asm_simp))+ |
2521 apply (simp (no_asm_simp))+ |
2507 apply (simp (no_asm_simp) add: inited_LT_def) |
2522 apply (simp (no_asm_simp) add: inited_LT_def) |
2508 |
2523 |
2509 (* start_sttp_resp *) |
2524 (* start_sttp_resp *) |
2510 apply (simp add: start_sttp_resp_cons_comb_cons_r)+ |
2525 apply (simp add: start_sttp_resp_cons_comb_cons_r)+ |
2511 |
2526 |
2512 (* wf_mhead / is_class *) |
2527 (* wf_mhead / is_class *) |
2513 apply (simp add: wf_mhead_def comp_is_type) |
2528 apply (simp add: wf_mhead_def comp_is_type) |
2514 apply (simp add: comp_is_class) |
2529 apply (simp add: comp_is_class) |
2515 |
2530 |
2516 (* sttp_of .. = (T # ST, LT) *) |
2531 (* sttp_of .. = (T # ST, LT) *) |
2517 apply (simp (no_asm_simp) add: compTpInitLvars_LT_ST compTpExpr_LT_ST compTpStmt_LT_ST is_inited_LT_def) |
2532 apply (simp (no_asm_simp) add: compTpInitLvars_LT_ST compTpExpr_LT_ST compTpStmt_LT_ST is_inited_LT_def) |
2518 apply (subgoal_tac "(snd (compTpInitLvars (pns, lvars, blk, res) lvars |
2533 apply (subgoal_tac "(snd (compTpInitLvars (pns, lvars, blk, res) lvars |
2519 (start_ST, start_LT C pTs (length lvars)))) |
2534 (start_ST, start_LT C pTs (length lvars)))) |
2520 = (start_ST, inited_LT C pTs lvars)") |
2535 = (start_ST, inited_LT C pTs lvars)") |
2521 prefer 2 apply (rule compTpInitLvars_LT_ST) apply (rule HOL.refl) apply assumption |
2536 prefer 2 |
2522 apply (subgoal_tac "(snd (compTpStmt (pns, lvars, blk, res) G blk |
2537 apply (rule compTpInitLvars_LT_ST) |
2523 (start_ST, inited_LT C pTs lvars))) |
2538 apply (rule HOL.refl) |
2524 = (start_ST, inited_LT C pTs lvars)") |
2539 apply assumption |
2525 prefer 2 apply (erule conjE)+ |
2540 apply (subgoal_tac "(snd (compTpStmt (pns, lvars, blk, res) G blk |
2526 apply (rule compTpStmt_LT_ST) apply (rule HOL.refl) apply assumption+ |
2541 (start_ST, inited_LT C pTs lvars))) |
2527 apply (simp only:)+ apply (simp (no_asm_simp) add: is_inited_LT_def) |
2542 = (start_ST, inited_LT C pTs lvars)") |
2528 apply (simp (no_asm_simp) add: is_inited_LT_def) |
2543 prefer 2 apply (erule conjE)+ |
2529 |
2544 apply (rule compTpStmt_LT_ST) |
2530 |
2545 apply (rule HOL.refl) |
2531 (* Return *) |
2546 apply assumption+ |
2532 apply (intro strip) |
2547 apply (simp only:)+ |
2533 apply (rule_tac T=T and ST=start_ST and LT="inited_LT C pTs lvars" in wt_instr_Return) |
2548 apply (simp (no_asm_simp) add: is_inited_LT_def) |
2534 apply (simp (no_asm_simp) add: nth_append |
2549 apply (simp (no_asm_simp) add: is_inited_LT_def) |
2535 length_compTpInitLvars length_compTpStmt length_compTpExpr) |
2550 |
2536 apply (simp only: compTpInitLvars_LT_ST compTpStmt_LT_ST compTpExpr_LT_ST |
2551 |
2537 nochangeST_def) |
2552 (* Return *) |
2538 apply (simp only: is_inited_LT_def compTpStmt_LT_ST compTpExpr_LT_ST) |
2553 apply (intro strip) |
2539 apply (simp (no_asm_simp))+ |
2554 apply (rule_tac T=T and ST=start_ST and LT="inited_LT C pTs lvars" in wt_instr_Return) |
2540 apply simp |
2555 apply (simp (no_asm_simp) add: nth_append length_compTpInitLvars length_compTpStmt length_compTpExpr) |
2541 |
2556 apply (simp only: compTpInitLvars_LT_ST compTpStmt_LT_ST compTpExpr_LT_ST nochangeST_def) |
2542 (* subgoal \<exists> E. \<dots> *) |
2557 apply (simp only: is_inited_LT_def compTpStmt_LT_ST compTpExpr_LT_ST) |
2543 apply (simp add: wf_java_mdecl_def local_env_def) |
2558 apply (simp (no_asm_simp))+ |
2544 |
2559 apply simp |
2545 (* subgoal jmb = (\<dots>) *) |
2560 |
2546 apply (simp only: split_paired_All, simp) |
2561 (* subgoal \<exists> E. \<dots> *) |
2547 |
2562 apply (simp add: wf_java_mdecl_def local_env_def) |
2548 (* subgoal is_class / wf_mhead / wf_java_mdecl *) |
2563 |
2549 apply (blast intro: methd [THEN conjunct2]) |
2564 (* subgoal jmb = (\<dots>) *) |
2550 apply (frule wf_prog_wf_mdecl, assumption+) apply (simp only:) apply (simp add: wf_mdecl_def) |
2565 apply (simp only: split_paired_All, simp) |
2551 apply (rule wf_java_prog_wf_java_mdecl, assumption+) |
2566 |
2552 done |
2567 (* subgoal is_class / wf_mhead / wf_java_mdecl *) |
|
2568 apply (blast intro: methd [THEN conjunct2]) |
|
2569 apply (frule wf_prog_wf_mdecl, assumption+) |
|
2570 apply (simp only:) |
|
2571 apply (simp add: wf_mdecl_def) |
|
2572 apply (rule wf_java_prog_wf_java_mdecl, assumption+) |
|
2573 done |
2553 |
2574 |
2554 |
2575 |
2555 lemma comp_set_ms: "(C, D, fs, cms)\<in>set (comp G) |
2576 lemma comp_set_ms: "(C, D, fs, cms)\<in>set (comp G) |
2556 \<Longrightarrow> \<exists> ms. (C, D, fs, ms) \<in>set G \<and> cms = map (compMethod G C) ms" |
2577 \<Longrightarrow> \<exists> ms. (C, D, fs, ms) \<in>set G \<and> cms = map (compMethod G C) ms" |
2557 by (auto simp: comp_def compClass_def) |
2578 by (auto simp: comp_def compClass_def) |
2558 |
2579 |
2559 |
2580 |
2560 (* ---------------------------------------------------------------------- *) |
2581 (* ---------------------------------------------------------------------- *) |
2561 |
2582 |
2562 subsection "Main Theorem" |
2583 subsection "Main Theorem" |
2563 (* MAIN THEOREM: |
2584 (* MAIN THEOREM: |
2564 Methodtype computed by comp is correct for bytecode generated by compTp *) |
2585 Methodtype computed by comp is correct for bytecode generated by compTp *) |
2565 theorem wt_prog_comp: "wf_java_prog G \<Longrightarrow> wt_jvm_prog (comp G) (compTp G)" |
2586 theorem wt_prog_comp: "wf_java_prog G \<Longrightarrow> wt_jvm_prog (comp G) (compTp G)" |
2566 apply (simp add: wf_prog_def) |
2587 apply (simp add: wf_prog_def) |
2567 |
2588 |
2568 apply (subgoal_tac "wf_java_prog G") prefer 2 apply (simp add: wf_prog_def) |
2589 apply (subgoal_tac "wf_java_prog G") |
2569 apply (simp (no_asm_simp) add: wf_prog_def wt_jvm_prog_def) |
2590 prefer 2 |
2570 apply (simp add: comp_ws_prog) |
2591 apply (simp add: wf_prog_def) |
2571 |
2592 apply (simp (no_asm_simp) add: wf_prog_def wt_jvm_prog_def) |
2572 apply (intro strip) |
2593 apply (simp add: comp_ws_prog) |
2573 apply (subgoal_tac "\<exists> C D fs cms. c = (C, D, fs, cms)") |
2594 |
2574 apply clarify |
2595 apply (intro strip) |
2575 apply (frule comp_set_ms) |
2596 apply (subgoal_tac "\<exists>C D fs cms. c = (C, D, fs, cms)") |
2576 apply clarify |
2597 apply clarify |
2577 apply (drule bspec, assumption) |
2598 apply (frule comp_set_ms) |
2578 apply (rule conjI) |
2599 apply clarify |
2579 |
2600 apply (drule bspec, assumption) |
2580 (* wf_mrT *) |
2601 apply (rule conjI) |
2581 apply (case_tac "C = Object") |
2602 |
2582 apply (simp add: wf_mrT_def) |
2603 (* wf_mrT *) |
2583 apply (subgoal_tac "is_class G D") |
2604 apply (case_tac "C = Object") |
2584 apply (simp add: comp_wf_mrT) |
2605 apply (simp add: wf_mrT_def) |
2585 apply (simp add: wf_prog_def ws_prog_def ws_cdecl_def) |
2606 apply (subgoal_tac "is_class G D") |
2586 apply blast |
2607 apply (simp add: comp_wf_mrT) |
2587 |
2608 apply (simp add: wf_prog_def ws_prog_def ws_cdecl_def) |
2588 (* wf_cdecl_mdecl *) |
2609 apply blast |
2589 apply (simp add: wf_cdecl_mdecl_def) |
2610 |
2590 apply (simp add: split_beta) |
2611 (* wf_cdecl_mdecl *) |
2591 apply (intro strip) |
2612 apply (simp add: wf_cdecl_mdecl_def) |
2592 |
2613 apply (simp add: split_beta) |
2593 (* show wt_method \<dots> *) |
2614 apply (intro strip) |
2594 apply (subgoal_tac "\<exists> sig rT mb. x = (sig, rT, mb)") |
2615 |
2595 apply (erule exE)+ |
2616 (* show wt_method \<dots> *) |
2596 apply (simp (no_asm_simp) add: compMethod_def split_beta) |
2617 apply (subgoal_tac "\<exists>sig rT mb. x = (sig, rT, mb)") |
2597 apply (erule conjE)+ |
2618 apply (erule exE)+ |
2598 apply (drule_tac x="(sig, rT, mb)" in bspec) apply simp |
2619 apply (simp (no_asm_simp) add: compMethod_def split_beta) |
2599 apply (rule_tac mn="fst sig" and pTs="snd sig" in wt_method_comp) |
2620 apply (erule conjE)+ |
2600 apply assumption+ |
2621 apply (drule_tac x="(sig, rT, mb)" in bspec) |
2601 apply simp |
2622 apply simp |
2602 apply (simp (no_asm_simp) add: compTp_def) |
2623 apply (rule_tac mn="fst sig" and pTs="snd sig" in wt_method_comp) |
2603 apply (simp (no_asm_simp) add: compMethod_def split_beta) |
2624 apply assumption+ |
2604 apply (frule WellForm.methd) apply assumption+ |
2625 apply simp |
2605 apply simp |
2626 apply (simp (no_asm_simp) add: compTp_def) |
2606 apply simp |
2627 apply (simp (no_asm_simp) add: compMethod_def split_beta) |
2607 apply (simp add: compMethod_def split_beta) |
2628 apply (frule WellForm.methd) apply assumption+ |
2608 apply auto |
2629 apply simp |
2609 done |
2630 apply simp |
|
2631 apply (simp add: compMethod_def split_beta) |
|
2632 apply auto |
|
2633 done |
2610 |
2634 |
2611 |
2635 |
2612 |
2636 |
2613 (**********************************************************************************) |
2637 (**********************************************************************************) |
2614 |
2638 |