author | eberlm |
Wed, 25 May 2016 12:24:00 +0200 | |
changeset 63144 | 76130b7cc450 |
parent 63040 | eb4ddd18d635 |
child 69085 | 9999d7823b8f |
permissions | -rw-r--r-- |
13673 | 1 |
(* Title: HOL/MicroJava/Comp/Index.thy |
2 |
Author: Martin Strecker |
|
3 |
*) |
|
4 |
||
5 |
(* Index of variable in list of parameter names and local variables *) |
|
6 |
||
17778 | 7 |
theory Index |
8 |
imports AuxLemmas DefsComp |
|
9 |
begin |
|
13673 | 10 |
|
11 |
(*indexing a variable name among all variable declarations in a method body*) |
|
35416
d8d7d1b785af
replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents:
32960
diff
changeset
|
12 |
definition index :: "java_mb => vname => nat" where |
13673 | 13 |
"index == \<lambda> (pn,lv,blk,res) v. |
14 |
if v = This |
|
15 |
then 0 |
|
16 |
else Suc (length (takeWhile (\<lambda> z. z~=v) (pn @ map fst lv)))" |
|
17 |
||
18 |
||
19 |
lemma index_length_pns: " |
|
20 |
\<lbrakk> i = index (pns,lvars,blk,res) vn; |
|
60304 | 21 |
wf_java_mdecl G C ((mn,pTs),rT, (pns,lvars,blk,res)); |
22 |
vn \<in> set pns\<rbrakk> |
|
13673 | 23 |
\<Longrightarrow> 0 < i \<and> i < Suc (length pns)" |
60304 | 24 |
apply (simp add: wf_java_mdecl_def index_def) |
25 |
apply (subgoal_tac "vn \<noteq> This") |
|
26 |
apply (auto intro: length_takeWhile) |
|
27 |
done |
|
13673 | 28 |
|
29 |
lemma index_length_lvars: " |
|
30 |
\<lbrakk> i = index (pns,lvars,blk,res) vn; |
|
60304 | 31 |
wf_java_mdecl G C ((mn,pTs),rT, (pns,lvars,blk,res)); |
32 |
vn \<in> set (map fst lvars)\<rbrakk> |
|
13673 | 33 |
\<Longrightarrow> (length pns) < i \<and> i < Suc((length pns) + (length lvars))" |
60304 | 34 |
apply (simp add: wf_java_mdecl_def index_def) |
35 |
apply (subgoal_tac "vn \<noteq> This") |
|
36 |
apply simp |
|
37 |
apply (subgoal_tac "\<forall> x \<in> set pns. (\<lambda>z. z \<noteq> vn) x") |
|
38 |
apply simp |
|
39 |
apply (subgoal_tac "length (takeWhile (\<lambda>z. z \<noteq> vn) (map fst lvars)) < length (map fst lvars)") |
|
40 |
apply simp |
|
41 |
apply (rule length_takeWhile) |
|
42 |
apply simp |
|
43 |
apply (simp add: map_of_in_set) |
|
44 |
apply (intro strip notI) |
|
45 |
apply simp |
|
46 |
apply blast |
|
47 |
done |
|
13673 | 48 |
|
49 |
||
50 |
(*** index ***) |
|
51 |
||
52 |
lemma select_at_index : |
|
60304 | 53 |
"x \<in> set (gjmb_plns (gmb G C S)) \<or> x = This |
54 |
\<Longrightarrow> (the (loc This) # glvs (gmb G C S) loc) ! (index (gmb G C S) x) = the (loc x)" |
|
55 |
apply (simp only: index_def gjmb_plns_def) |
|
56 |
apply (case_tac "gmb G C S" rule: prod.exhaust) |
|
57 |
apply (simp add: galldefs del: set_append map_append) |
|
58 |
apply (rename_tac a b) |
|
59 |
apply (case_tac b, simp add: gmb_def gjmb_lvs_def del: set_append map_append) |
|
60 |
apply (intro strip) |
|
61 |
apply (simp del: set_append map_append) |
|
62 |
apply (frule length_takeWhile) |
|
63 |
apply (frule_tac f = "(the \<circ> loc)" in nth_map) |
|
64 |
apply simp |
|
65 |
done |
|
13673 | 66 |
|
14045 | 67 |
lemma lift_if: "(f (if b then t else e)) = (if b then (f t) else (f e))" |
60304 | 68 |
by auto |
14045 | 69 |
|
13673 | 70 |
lemma update_at_index: " |
60304 | 71 |
\<lbrakk> distinct (gjmb_plns (gmb G C S)); |
72 |
x \<in> set (gjmb_plns (gmb G C S)); x \<noteq> This \<rbrakk> \<Longrightarrow> |
|
13673 | 73 |
locvars_xstate G C S (Norm (h, l))[index (gmb G C S) x := val] = |
60304 | 74 |
locvars_xstate G C S (Norm (h, l(x\<mapsto>val)))" |
75 |
apply (simp only: locvars_xstate_def locvars_locals_def index_def) |
|
76 |
apply (case_tac "gmb G C S" rule: prod.exhaust, simp) |
|
77 |
apply (rename_tac a b) |
|
78 |
apply (case_tac b, simp) |
|
79 |
apply (rule conjI) |
|
80 |
apply (simp add: gl_def) |
|
81 |
apply (simp add: galldefs del: set_append map_append) |
|
82 |
done |
|
13673 | 83 |
|
84 |
||
85 |
(* !!!! incomprehensible: why can't List.takeWhile_append2 be applied the same |
|
86 |
way in the second case as in the first case ? *) |
|
87 |
lemma index_of_var: "\<lbrakk> xvar \<notin> set pns; xvar \<notin> set (map fst zs); xvar \<noteq> This \<rbrakk> |
|
88 |
\<Longrightarrow> index (pns, zs @ ((xvar, xval) # xys), blk, res) xvar = Suc (length pns + length zs)" |
|
60304 | 89 |
apply (simp add: index_def) |
90 |
apply (subgoal_tac "(\<And>x. ((x \<in> (set pns)) \<Longrightarrow> ((\<lambda>z. (z \<noteq> xvar))x)))") |
|
91 |
apply simp |
|
92 |
apply (subgoal_tac "(takeWhile (\<lambda>z. z \<noteq> xvar) (map fst zs @ xvar # map fst xys)) = map fst zs @ (takeWhile (\<lambda>z. z \<noteq> xvar) (xvar # map fst xys))") |
|
93 |
apply simp |
|
94 |
apply (rule List.takeWhile_append2) |
|
95 |
apply auto |
|
96 |
done |
|
13673 | 97 |
|
98 |
||
99 |
||
100 |
||
63040 | 101 |
(* The following definition should replace the conditions in WellType.thy / wf_java_mdecl |
13673 | 102 |
*) |
35416
d8d7d1b785af
replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents:
32960
diff
changeset
|
103 |
definition disjoint_varnames :: "[vname list, (vname \<times> ty) list] \<Rightarrow> bool" where |
13673 | 104 |
"disjoint_varnames pns lvars \<equiv> |
105 |
distinct pns \<and> unique lvars \<and> This \<notin> set pns \<and> This \<notin> set (map fst lvars) \<and> |
|
106 |
(\<forall>pn\<in>set pns. pn \<notin> set (map fst lvars))" |
|
107 |
||
108 |
||
109 |
lemma index_of_var2: " |
|
110 |
disjoint_varnames pns (lvars_pre @ (vn, ty) # lvars_post) |
|
111 |
\<Longrightarrow> index (pns, lvars_pre @ (vn, ty) # lvars_post, blk, res) vn = |
|
112 |
Suc (length pns + length lvars_pre)" |
|
60304 | 113 |
apply (simp add: disjoint_varnames_def index_def unique_def) |
114 |
apply (subgoal_tac "vn \<noteq> This", simp) |
|
115 |
apply (subgoal_tac |
|
116 |
"takeWhile (\<lambda>z. z \<noteq> vn) (map fst lvars_pre @ vn # map fst lvars_post) = |
|
117 |
map fst lvars_pre @ takeWhile (\<lambda>z. z \<noteq> vn) (vn # map fst lvars_post)") |
|
118 |
apply simp |
|
119 |
apply (rule List.takeWhile_append2) |
|
120 |
apply auto |
|
121 |
done |
|
13673 | 122 |
|
123 |
lemma wf_java_mdecl_disjoint_varnames: |
|
60304 | 124 |
"wf_java_mdecl G C (S,rT,(pns,lvars,blk,res)) |
13673 | 125 |
\<Longrightarrow> disjoint_varnames pns lvars" |
60304 | 126 |
apply (cases S) |
127 |
apply (simp add: wf_java_mdecl_def disjoint_varnames_def map_of_in_set) |
|
128 |
done |
|
13673 | 129 |
|
130 |
lemma wf_java_mdecl_length_pTs_pns: |
|
131 |
"wf_java_mdecl G C ((mn, pTs), rT, pns, lvars, blk, res) |
|
132 |
\<Longrightarrow> length pTs = length pns" |
|
60304 | 133 |
by (simp add: wf_java_mdecl_def) |
13673 | 134 |
|
135 |
end |