author | wenzelm |
Tue, 19 Oct 2021 18:24:33 +0200 | |
changeset 74551 | 375e8e1a2139 |
parent 74503 | 403ce50e6a2a |
child 80914 | d97fdabd9e2b |
permissions | -rw-r--r-- |
13820 | 1 |
(* Title: HOL/Hoare/SchorrWaite.thy |
2 |
Author: Farhad Mehta |
|
3 |
Copyright 2003 TUM |
|
4 |
*) |
|
5 |
||
72990 | 6 |
section \<open>Proof of the Schorr-Waite graph marking algorithm\<close> |
13820 | 7 |
|
72990 | 8 |
theory SchorrWaite |
9 |
imports HeapSyntax |
|
10 |
begin |
|
13820 | 11 |
|
72990 | 12 |
subsection \<open>Machinery for the Schorr-Waite proof\<close> |
13820 | 13 |
|
36866 | 14 |
definition |
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
15 |
\<comment> \<open>Relations induced by a mapping\<close> |
13820 | 16 |
rel :: "('a \<Rightarrow> 'a ref) \<Rightarrow> ('a \<times> 'a) set" |
36866 | 17 |
where "rel m = {(x,y). m x = Ref y}" |
18 |
||
19 |
definition |
|
13820 | 20 |
relS :: "('a \<Rightarrow> 'a ref) set \<Rightarrow> ('a \<times> 'a) set" |
60585 | 21 |
where "relS M = (\<Union>m \<in> M. rel m)" |
36866 | 22 |
|
23 |
definition |
|
13820 | 24 |
addrs :: "'a ref set \<Rightarrow> 'a set" |
36866 | 25 |
where "addrs P = {a. Ref a \<in> P}" |
26 |
||
27 |
definition |
|
13820 | 28 |
reachable :: "('a \<times> 'a) set \<Rightarrow> 'a ref set \<Rightarrow> 'a set" |
36866 | 29 |
where "reachable r P = (r\<^sup>* `` addrs P)" |
13820 | 30 |
|
31 |
lemmas rel_defs = relS_def rel_def |
|
32 |
||
62042 | 33 |
text \<open>Rewrite rules for relations induced by a mapping\<close> |
13820 | 34 |
|
35 |
lemma self_reachable: "b \<in> B \<Longrightarrow> b \<in> R\<^sup>* `` B" |
|
36 |
apply blast |
|
37 |
done |
|
38 |
||
39 |
lemma oneStep_reachable: "b \<in> R``B \<Longrightarrow> b \<in> R\<^sup>* `` B" |
|
40 |
apply blast |
|
41 |
done |
|
42 |
||
43 |
lemma still_reachable: "\<lbrakk>B\<subseteq>Ra\<^sup>*``A; \<forall> (x,y) \<in> Rb-Ra. y\<in> (Ra\<^sup>*``A)\<rbrakk> \<Longrightarrow> Rb\<^sup>* `` B \<subseteq> Ra\<^sup>* `` A " |
|
42154 | 44 |
apply (clarsimp simp only:Image_iff) |
13820 | 45 |
apply (erule rtrancl_induct) |
46 |
apply blast |
|
47 |
apply (subgoal_tac "(y, z) \<in> Ra\<union>(Rb-Ra)") |
|
48 |
apply (erule UnE) |
|
49 |
apply (auto intro:rtrancl_into_rtrancl) |
|
50 |
apply blast |
|
51 |
done |
|
52 |
||
53 |
lemma still_reachable_eq: "\<lbrakk> A\<subseteq>Rb\<^sup>*``B; B\<subseteq>Ra\<^sup>*``A; \<forall> (x,y) \<in> Ra-Rb. y \<in>(Rb\<^sup>*``B); \<forall> (x,y) \<in> Rb-Ra. y\<in> (Ra\<^sup>*``A)\<rbrakk> \<Longrightarrow> Ra\<^sup>*``A = Rb\<^sup>*``B " |
|
54 |
apply (rule equalityI) |
|
55 |
apply (erule still_reachable ,assumption)+ |
|
56 |
done |
|
57 |
||
58 |
lemma reachable_null: "reachable mS {Null} = {}" |
|
59 |
apply (simp add: reachable_def addrs_def) |
|
60 |
done |
|
61 |
||
62 |
lemma reachable_empty: "reachable mS {} = {}" |
|
63 |
apply (simp add: reachable_def addrs_def) |
|
64 |
done |
|
65 |
||
66 |
lemma reachable_union: "(reachable mS aS \<union> reachable mS bS) = reachable mS (aS \<union> bS)" |
|
67 |
apply (simp add: reachable_def rel_defs addrs_def) |
|
68 |
apply blast |
|
69 |
done |
|
70 |
||
71 |
lemma reachable_union_sym: "reachable r (insert a aS) = (r\<^sup>* `` addrs {a}) \<union> reachable r aS" |
|
72 |
apply (simp add: reachable_def rel_defs addrs_def) |
|
73 |
apply blast |
|
74 |
done |
|
75 |
||
76 |
lemma rel_upd1: "(a,b) \<notin> rel (r(q:=t)) \<Longrightarrow> (a,b) \<in> rel r \<Longrightarrow> a=q" |
|
77 |
apply (rule classical) |
|
78 |
apply (simp add:rel_defs fun_upd_apply) |
|
79 |
done |
|
80 |
||
81 |
lemma rel_upd2: "(a,b) \<notin> rel r \<Longrightarrow> (a,b) \<in> rel (r(q:=t)) \<Longrightarrow> a=q" |
|
82 |
apply (rule classical) |
|
83 |
apply (simp add:rel_defs fun_upd_apply) |
|
84 |
done |
|
85 |
||
36866 | 86 |
definition |
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
87 |
\<comment> \<open>Restriction of a relation\<close> |
13820 | 88 |
restr ::"('a \<times> 'a) set \<Rightarrow> ('a \<Rightarrow> bool) \<Rightarrow> ('a \<times> 'a) set" ("(_/ | _)" [50, 51] 50) |
36866 | 89 |
where "restr r m = {(x,y). (x,y) \<in> r \<and> \<not> m x}" |
13820 | 90 |
|
62042 | 91 |
text \<open>Rewrite rules for the restriction of a relation\<close> |
13820 | 92 |
|
93 |
lemma restr_identity[simp]: |
|
94 |
" (\<forall>x. \<not> m x) \<Longrightarrow> (R |m) = R" |
|
95 |
by (auto simp add:restr_def) |
|
96 |
||
97 |
lemma restr_rtrancl[simp]: " \<lbrakk>m l\<rbrakk> \<Longrightarrow> (R | m)\<^sup>* `` {l} = {l}" |
|
98 |
by (auto simp add:restr_def elim:converse_rtranclE) |
|
99 |
||
100 |
lemma [simp]: " \<lbrakk>m l\<rbrakk> \<Longrightarrow> (l,x) \<in> (R | m)\<^sup>* = (l=x)" |
|
101 |
by (auto simp add:restr_def elim:converse_rtranclE) |
|
102 |
||
103 |
lemma restr_upd: "((rel (r (q := t)))|(m(q := True))) = ((rel (r))|(m(q := True))) " |
|
104 |
apply (auto simp:restr_def rel_def fun_upd_apply) |
|
105 |
apply (rename_tac a b) |
|
106 |
apply (case_tac "a=q") |
|
107 |
apply auto |
|
108 |
done |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
109 |
|
13820 | 110 |
lemma restr_un: "((r \<union> s)|m) = (r|m) \<union> (s|m)" |
111 |
by (auto simp add:restr_def) |
|
112 |
||
113 |
lemma rel_upd3: "(a, b) \<notin> (r|(m(q := t))) \<Longrightarrow> (a,b) \<in> (r|m) \<Longrightarrow> a = q " |
|
114 |
apply (rule classical) |
|
115 |
apply (simp add:restr_def fun_upd_apply) |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
116 |
done |
13820 | 117 |
|
36866 | 118 |
definition |
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
119 |
\<comment> \<open>A short form for the stack mapping function for List\<close> |
13820 | 120 |
S :: "('a \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> 'a ref) \<Rightarrow> ('a \<Rightarrow> 'a ref) \<Rightarrow> ('a \<Rightarrow> 'a ref)" |
36866 | 121 |
where "S c l r = (\<lambda>x. if c x then r x else l x)" |
13820 | 122 |
|
62042 | 123 |
text \<open>Rewrite rules for Lists using S as their mapping\<close> |
13820 | 124 |
|
125 |
lemma [rule_format,simp]: |
|
126 |
"\<forall>p. a \<notin> set stack \<longrightarrow> List (S c l r) p stack = List (S (c(a:=x)) (l(a:=y)) (r(a:=z))) p stack" |
|
127 |
apply(induct_tac stack) |
|
128 |
apply(simp add:fun_upd_apply S_def)+ |
|
129 |
done |
|
130 |
||
131 |
lemma [rule_format,simp]: |
|
132 |
"\<forall>p. a \<notin> set stack \<longrightarrow> List (S c l (r(a:=z))) p stack = List (S c l r) p stack" |
|
133 |
apply(induct_tac stack) |
|
134 |
apply(simp add:fun_upd_apply S_def)+ |
|
135 |
done |
|
136 |
||
137 |
lemma [rule_format,simp]: |
|
138 |
"\<forall>p. a \<notin> set stack \<longrightarrow> List (S c (l(a:=z)) r) p stack = List (S c l r) p stack" |
|
139 |
apply(induct_tac stack) |
|
140 |
apply(simp add:fun_upd_apply S_def)+ |
|
141 |
done |
|
142 |
||
143 |
lemma [rule_format,simp]: |
|
144 |
"\<forall>p. a \<notin> set stack \<longrightarrow> List (S (c(a:=z)) l r) p stack = List (S c l r) p stack" |
|
145 |
apply(induct_tac stack) |
|
146 |
apply(simp add:fun_upd_apply S_def)+ |
|
147 |
done |
|
148 |
||
38353 | 149 |
primrec |
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
150 |
\<comment> \<open>Recursive definition of what is means for a the graph/stack structure to be reconstructible\<close> |
13820 | 151 |
stkOk :: "('a \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> 'a ref) \<Rightarrow> ('a \<Rightarrow> 'a ref) \<Rightarrow> ('a \<Rightarrow> 'a ref) \<Rightarrow> ('a \<Rightarrow> 'a ref) \<Rightarrow> 'a ref \<Rightarrow>'a list \<Rightarrow> bool" |
38353 | 152 |
where |
153 |
stkOk_nil: "stkOk c l r iL iR t [] = True" |
|
154 |
| stkOk_cons: |
|
155 |
"stkOk c l r iL iR t (p#stk) = (stkOk c l r iL iR (Ref p) (stk) \<and> |
|
156 |
iL p = (if c p then l p else t) \<and> |
|
157 |
iR p = (if c p then t else r p))" |
|
13820 | 158 |
|
62042 | 159 |
text \<open>Rewrite rules for stkOk\<close> |
13820 | 160 |
|
161 |
lemma [simp]: "\<And>t. \<lbrakk> x \<notin> set xs; Ref x\<noteq>t \<rbrakk> \<Longrightarrow> |
|
162 |
stkOk (c(x := f)) l r iL iR t xs = stkOk c l r iL iR t xs" |
|
163 |
apply (induct xs) |
|
164 |
apply (auto simp:eq_sym_conv) |
|
165 |
done |
|
166 |
||
167 |
lemma [simp]: "\<And>t. \<lbrakk> x \<notin> set xs; Ref x\<noteq>t \<rbrakk> \<Longrightarrow> |
|
168 |
stkOk c (l(x := g)) r iL iR t xs = stkOk c l r iL iR t xs" |
|
169 |
apply (induct xs) |
|
170 |
apply (auto simp:eq_sym_conv) |
|
171 |
done |
|
172 |
||
173 |
lemma [simp]: "\<And>t. \<lbrakk> x \<notin> set xs; Ref x\<noteq>t \<rbrakk> \<Longrightarrow> |
|
174 |
stkOk c l (r(x := g)) iL iR t xs = stkOk c l r iL iR t xs" |
|
175 |
apply (induct xs) |
|
176 |
apply (auto simp:eq_sym_conv) |
|
177 |
done |
|
178 |
||
179 |
lemma stkOk_r_rewrite [simp]: "\<And>x. x \<notin> set xs \<Longrightarrow> |
|
180 |
stkOk c l (r(x := g)) iL iR (Ref x) xs = stkOk c l r iL iR (Ref x) xs" |
|
181 |
apply (induct xs) |
|
182 |
apply (auto simp:eq_sym_conv) |
|
183 |
done |
|
184 |
||
185 |
lemma [simp]: "\<And>x. x \<notin> set xs \<Longrightarrow> |
|
186 |
stkOk c (l(x := g)) r iL iR (Ref x) xs = stkOk c l r iL iR (Ref x) xs" |
|
187 |
apply (induct xs) |
|
188 |
apply (auto simp:eq_sym_conv) |
|
189 |
done |
|
190 |
||
191 |
lemma [simp]: "\<And>x. x \<notin> set xs \<Longrightarrow> |
|
192 |
stkOk (c(x := g)) l r iL iR (Ref x) xs = stkOk c l r iL iR (Ref x) xs" |
|
193 |
apply (induct xs) |
|
194 |
apply (auto simp:eq_sym_conv) |
|
195 |
done |
|
196 |
||
197 |
||
72990 | 198 |
subsection \<open>The Schorr-Waite algorithm\<close> |
13820 | 199 |
|
200 |
theorem SchorrWaiteAlgorithm: |
|
201 |
"VARS c m l r t p q root |
|
202 |
{R = reachable (relS {l, r}) {root} \<and> (\<forall>x. \<not> m x) \<and> iR = r \<and> iL = l} |
|
203 |
t := root; p := Null; |
|
204 |
WHILE p \<noteq> Null \<or> t \<noteq> Null \<and> \<not> t^.m |
|
205 |
INV {\<exists>stack. |
|
67410 | 206 |
List (S c l r) p stack \<and> \<comment> \<open>\<open>i1\<close>\<close> |
207 |
(\<forall>x \<in> set stack. m x) \<and> \<comment> \<open>\<open>i2\<close>\<close> |
|
208 |
R = reachable (relS{l, r}) {t,p} \<and> \<comment> \<open>\<open>i3\<close>\<close> |
|
209 |
(\<forall>x. x \<in> R \<and> \<not>m x \<longrightarrow> \<comment> \<open>\<open>i4\<close>\<close> |
|
13820 | 210 |
x \<in> reachable (relS{l,r}|m) ({t}\<union>set(map r stack))) \<and> |
67410 | 211 |
(\<forall>x. m x \<longrightarrow> x \<in> R) \<and> \<comment> \<open>\<open>i5\<close>\<close> |
212 |
(\<forall>x. x \<notin> set stack \<longrightarrow> r x = iR x \<and> l x = iL x) \<and> \<comment> \<open>\<open>i6\<close>\<close> |
|
213 |
(stkOk c l r iL iR t stack) \<comment> \<open>\<open>i7\<close>\<close>} |
|
13820 | 214 |
DO IF t = Null \<or> t^.m |
215 |
THEN IF p^.c |
|
67410 | 216 |
THEN q := t; t := p; p := p^.r; t^.r := q \<comment> \<open>\<open>pop\<close>\<close> |
217 |
ELSE q := t; t := p^.r; p^.r := p^.l; \<comment> \<open>\<open>swing\<close>\<close> |
|
13820 | 218 |
p^.l := q; p^.c := True FI |
67410 | 219 |
ELSE q := p; p := t; t := t^.l; p^.l := q; \<comment> \<open>\<open>push\<close>\<close> |
13820 | 220 |
p^.m := True; p^.c := False FI OD |
221 |
{(\<forall>x. (x \<in> R) = m x) \<and> (r = iR \<and> l = iL) }" |
|
74503
403ce50e6a2a
separated commands from annotations to be able to abstract about the latter only
nipkow
parents:
72990
diff
changeset
|
222 |
(is "Valid |
403ce50e6a2a
separated commands from annotations to be able to abstract about the latter only
nipkow
parents:
72990
diff
changeset
|
223 |
{(c, m, l, r, t, p, q, root). ?Pre c m l r root} |
403ce50e6a2a
separated commands from annotations to be able to abstract about the latter only
nipkow
parents:
72990
diff
changeset
|
224 |
(Seq _ (Seq _ (While {(c, m, l, r, t, p, q, root). ?whileB m t p} _))) |
403ce50e6a2a
separated commands from annotations to be able to abstract about the latter only
nipkow
parents:
72990
diff
changeset
|
225 |
(Aseq _ (Aseq _ (Awhile {(c, m, l, r, t, p, q, root). ?inv c m l r t p} _ _))) _") |
13820 | 226 |
proof (vcg) |
227 |
{ |
|
228 |
||
229 |
fix c m l r t p q root |
|
230 |
assume "?Pre c m l r root" |
|
231 |
thus "?inv c m l r root Null" by (auto simp add: reachable_def addrs_def) |
|
232 |
next |
|
233 |
||
234 |
fix c m l r t p q |
|
235 |
let "\<exists>stack. ?Inv stack" = "?inv c m l r t p" |
|
236 |
assume a: "?inv c m l r t p \<and> \<not>(p \<noteq> Null \<or> t \<noteq> Null \<and> \<not> t^.m)" |
|
237 |
then obtain stack where inv: "?Inv stack" by blast |
|
238 |
from a have pNull: "p = Null" and tDisj: "t=Null \<or> (t\<noteq>Null \<and> t^.m )" by auto |
|
239 |
let "?I1 \<and> _ \<and> _ \<and> ?I4 \<and> ?I5 \<and> ?I6 \<and> _" = "?Inv stack" |
|
240 |
from inv have i1: "?I1" and i4: "?I4" and i5: "?I5" and i6: "?I6" by simp+ |
|
241 |
from pNull i1 have stackEmpty: "stack = []" by simp |
|
242 |
from tDisj i4 have RisMarked[rule_format]: "\<forall>x. x \<in> R \<longrightarrow> m x" by(auto simp: reachable_def addrs_def stackEmpty) |
|
39302
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents:
39198
diff
changeset
|
243 |
from i5 i6 show "(\<forall>x.(x \<in> R) = m x) \<and> r = iR \<and> l = iL" by(auto simp: stackEmpty fun_eq_iff intro:RisMarked) |
13820 | 244 |
|
245 |
next |
|
246 |
fix c m l r t p q root |
|
247 |
let "\<exists>stack. ?Inv stack" = "?inv c m l r t p" |
|
248 |
let "\<exists>stack. ?popInv stack" = "?inv c m l (r(p \<rightarrow> t)) p (p^.r)" |
|
249 |
let "\<exists>stack. ?swInv stack" = |
|
250 |
"?inv (c(p \<rightarrow> True)) m (l(p \<rightarrow> t)) (r(p \<rightarrow> p^.l)) (p^.r) p" |
|
251 |
let "\<exists>stack. ?puInv stack" = |
|
252 |
"?inv (c(t \<rightarrow> False)) (m(t \<rightarrow> True)) (l(t \<rightarrow> p)) r (t^.l) t" |
|
253 |
let "?ifB1" = "(t = Null \<or> t^.m)" |
|
254 |
let "?ifB2" = "p^.c" |
|
255 |
||
74503
403ce50e6a2a
separated commands from annotations to be able to abstract about the latter only
nipkow
parents:
72990
diff
changeset
|
256 |
assume "(\<exists>stack.?Inv stack) \<and> ?whileB m t p" |
403ce50e6a2a
separated commands from annotations to be able to abstract about the latter only
nipkow
parents:
72990
diff
changeset
|
257 |
then obtain stack where inv: "?Inv stack" and whileB: "?whileB m t p" by blast |
13820 | 258 |
let "?I1 \<and> ?I2 \<and> ?I3 \<and> ?I4 \<and> ?I5 \<and> ?I6 \<and> ?I7" = "?Inv stack" |
259 |
from inv have i1: "?I1" and i2: "?I2" and i3: "?I3" and i4: "?I4" |
|
260 |
and i5: "?I5" and i6: "?I6" and i7: "?I7" by simp+ |
|
261 |
have stackDist: "distinct (stack)" using i1 by (rule List_distinct) |
|
262 |
||
263 |
show "(?ifB1 \<longrightarrow> (?ifB2 \<longrightarrow> (\<exists>stack.?popInv stack)) \<and> |
|
264 |
(\<not>?ifB2 \<longrightarrow> (\<exists>stack.?swInv stack)) ) \<and> |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
265 |
(\<not>?ifB1 \<longrightarrow> (\<exists>stack.?puInv stack))" |
13820 | 266 |
proof - |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
267 |
{ |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
268 |
assume ifB1: "t = Null \<or> t^.m" and ifB2: "p^.c" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
269 |
from ifB1 whileB have pNotNull: "p \<noteq> Null" by auto |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
270 |
then obtain addr_p where addr_p_eq: "p = Ref addr_p" by auto |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
271 |
with i1 obtain stack_tl where stack_eq: "stack = (addr p) # stack_tl" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
272 |
by auto |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
273 |
with i2 have m_addr_p: "p^.m" by auto |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
274 |
have stackDist: "distinct (stack)" using i1 by (rule List_distinct) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
275 |
from stack_eq stackDist have p_notin_stack_tl: "addr p \<notin> set stack_tl" by simp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
276 |
let "?poI1\<and> ?poI2\<and> ?poI3\<and> ?poI4\<and> ?poI5\<and> ?poI6\<and> ?poI7" = "?popInv stack_tl" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
277 |
have "?popInv stack_tl" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
278 |
proof - |
13820 | 279 |
|
62042 | 280 |
\<comment> \<open>List property is maintained:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
281 |
from i1 p_notin_stack_tl ifB2 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
282 |
have poI1: "List (S c l (r(p \<rightarrow> t))) (p^.r) stack_tl" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
283 |
by(simp add: addr_p_eq stack_eq, simp add: S_def) |
13820 | 284 |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
285 |
moreover |
62042 | 286 |
\<comment> \<open>Everything on the stack is marked:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
287 |
from i2 have poI2: "\<forall> x \<in> set stack_tl. m x" by (simp add:stack_eq) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
288 |
moreover |
13820 | 289 |
|
62042 | 290 |
\<comment> \<open>Everything is still reachable:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
291 |
let "(R = reachable ?Ra ?A)" = "?I3" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
292 |
let "?Rb" = "(relS {l, r(p \<rightarrow> t)})" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
293 |
let "?B" = "{p, p^.r}" |
62042 | 294 |
\<comment> \<open>Our goal is \<open>R = reachable ?Rb ?B\<close>.\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
295 |
have "?Ra\<^sup>* `` addrs ?A = ?Rb\<^sup>* `` addrs ?B" (is "?L = ?R") |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
296 |
proof |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
297 |
show "?L \<subseteq> ?R" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
298 |
proof (rule still_reachable) |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
299 |
show "addrs ?A \<subseteq> ?Rb\<^sup>* `` addrs ?B" by(fastforce simp:addrs_def relS_def rel_def addr_p_eq |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
300 |
intro:oneStep_reachable Image_iff[THEN iffD2]) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
301 |
show "\<forall>(x,y) \<in> ?Ra-?Rb. y \<in> (?Rb\<^sup>* `` addrs ?B)" by (clarsimp simp:relS_def) |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
302 |
(fastforce simp add:rel_def Image_iff addrs_def dest:rel_upd1) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
303 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
304 |
show "?R \<subseteq> ?L" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
305 |
proof (rule still_reachable) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
306 |
show "addrs ?B \<subseteq> ?Ra\<^sup>* `` addrs ?A" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
307 |
by(fastforce simp:addrs_def rel_defs addr_p_eq |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
308 |
intro:oneStep_reachable Image_iff[THEN iffD2]) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
309 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
310 |
show "\<forall>(x, y)\<in>?Rb-?Ra. y\<in>(?Ra\<^sup>*``addrs ?A)" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
311 |
by (clarsimp simp:relS_def) |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
312 |
(fastforce simp add:rel_def Image_iff addrs_def dest:rel_upd2) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
313 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
314 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
315 |
with i3 have poI3: "R = reachable ?Rb ?B" by (simp add:reachable_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
316 |
moreover |
13820 | 317 |
|
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
318 |
\<comment> \<open>If it is reachable and not marked, it is still reachable using...\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
319 |
let "\<forall>x. x \<in> R \<and> \<not> m x \<longrightarrow> x \<in> reachable ?Ra ?A" = ?I4 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
320 |
let "?Rb" = "relS {l, r(p \<rightarrow> t)} | m" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
321 |
let "?B" = "{p} \<union> set (map (r(p \<rightarrow> t)) stack_tl)" |
62042 | 322 |
\<comment> \<open>Our goal is \<open>\<forall>x. x \<in> R \<and> \<not> m x \<longrightarrow> x \<in> reachable ?Rb ?B\<close>.\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
323 |
let ?T = "{t, p^.r}" |
13820 | 324 |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
325 |
have "?Ra\<^sup>* `` addrs ?A \<subseteq> ?Rb\<^sup>* `` (addrs ?B \<union> addrs ?T)" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
326 |
proof (rule still_reachable) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
327 |
have rewrite: "\<forall>s\<in>set stack_tl. (r(p \<rightarrow> t)) s = r s" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
328 |
by (auto simp add:p_notin_stack_tl intro:fun_upd_other) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
329 |
show "addrs ?A \<subseteq> ?Rb\<^sup>* `` (addrs ?B \<union> addrs ?T)" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
330 |
by (fastforce cong:map_cong simp:stack_eq addrs_def rewrite intro:self_reachable) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
331 |
show "\<forall>(x, y)\<in>?Ra-?Rb. y\<in>(?Rb\<^sup>*``(addrs ?B \<union> addrs ?T))" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
332 |
by (clarsimp simp:restr_def relS_def) |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
333 |
(fastforce simp add:rel_def Image_iff addrs_def dest:rel_upd1) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
334 |
qed |
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
335 |
\<comment> \<open>We now bring a term from the right to the left of the subset relation.\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
336 |
hence subset: "?Ra\<^sup>* `` addrs ?A - ?Rb\<^sup>* `` addrs ?T \<subseteq> ?Rb\<^sup>* `` addrs ?B" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
337 |
by blast |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
338 |
have poI4: "\<forall>x. x \<in> R \<and> \<not> m x \<longrightarrow> x \<in> reachable ?Rb ?B" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
339 |
proof (rule allI, rule impI) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
340 |
fix x |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
341 |
assume a: "x \<in> R \<and> \<not> m x" |
69597 | 342 |
\<comment> \<open>First, a disjunction on \<^term>\<open>p^.r\<close> used later in the proof\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
343 |
have pDisj:"p^.r = Null \<or> (p^.r \<noteq> Null \<and> p^.r^.m)" using poI1 poI2 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
344 |
by auto |
69597 | 345 |
\<comment> \<open>\<^term>\<open>x\<close> belongs to the left hand side of @{thm[source] subset}:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
346 |
have incl: "x \<in> ?Ra\<^sup>*``addrs ?A" using a i4 by (simp only:reachable_def, clarsimp) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
347 |
have excl: "x \<notin> ?Rb\<^sup>*`` addrs ?T" using pDisj ifB1 a by (auto simp add:addrs_def) |
62042 | 348 |
\<comment> \<open>And therefore also belongs to the right hand side of @{thm[source]subset},\<close> |
349 |
\<comment> \<open>which corresponds to our goal.\<close> |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
350 |
from incl excl subset show "x \<in> reachable ?Rb ?B" by (auto simp add:reachable_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
351 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
352 |
moreover |
13820 | 353 |
|
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
354 |
\<comment> \<open>If it is marked, then it is reachable\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
355 |
from i5 have poI5: "\<forall>x. m x \<longrightarrow> x \<in> R" . |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
356 |
moreover |
13820 | 357 |
|
69597 | 358 |
\<comment> \<open>If it is not on the stack, then its \<^term>\<open>l\<close> and \<^term>\<open>r\<close> fields are unchanged\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
359 |
from i7 i6 ifB2 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
360 |
have poI6: "\<forall>x. x \<notin> set stack_tl \<longrightarrow> (r(p \<rightarrow> t)) x = iR x \<and> l x = iL x" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
361 |
by(auto simp: addr_p_eq stack_eq fun_upd_apply) |
13820 | 362 |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
363 |
moreover |
13820 | 364 |
|
69597 | 365 |
\<comment> \<open>If it is on the stack, then its \<^term>\<open>l\<close> and \<^term>\<open>r\<close> fields can be reconstructed\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
366 |
from p_notin_stack_tl i7 have poI7: "stkOk c l (r(p \<rightarrow> t)) iL iR p stack_tl" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
367 |
by (clarsimp simp:stack_eq addr_p_eq) |
13820 | 368 |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
369 |
ultimately show "?popInv stack_tl" by simp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
370 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
371 |
hence "\<exists>stack. ?popInv stack" .. |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
372 |
} |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
373 |
moreover |
13820 | 374 |
|
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
375 |
\<comment> \<open>Proofs of the Swing and Push arm follow.\<close> |
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
376 |
\<comment> \<open>Since they are in principle simmilar to the Pop arm proof,\<close> |
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
377 |
\<comment> \<open>we show fewer comments and use frequent pattern matching.\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
378 |
{ |
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
379 |
\<comment> \<open>Swing arm\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
380 |
assume ifB1: "?ifB1" and nifB2: "\<not>?ifB2" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
381 |
from ifB1 whileB have pNotNull: "p \<noteq> Null" by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
382 |
then obtain addr_p where addr_p_eq: "p = Ref addr_p" by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
383 |
with i1 obtain stack_tl where stack_eq: "stack = (addr p) # stack_tl" by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
384 |
with i2 have m_addr_p: "p^.m" by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
385 |
from stack_eq stackDist have p_notin_stack_tl: "(addr p) \<notin> set stack_tl" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
386 |
by simp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
387 |
let "?swI1\<and>?swI2\<and>?swI3\<and>?swI4\<and>?swI5\<and>?swI6\<and>?swI7" = "?swInv stack" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
388 |
have "?swInv stack" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
389 |
proof - |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
390 |
|
62042 | 391 |
\<comment> \<open>List property is maintained:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
392 |
from i1 p_notin_stack_tl nifB2 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
393 |
have swI1: "?swI1" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
394 |
by (simp add:addr_p_eq stack_eq, simp add:S_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
395 |
moreover |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
396 |
|
62042 | 397 |
\<comment> \<open>Everything on the stack is marked:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
398 |
from i2 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
399 |
have swI2: "?swI2" . |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
400 |
moreover |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
401 |
|
62042 | 402 |
\<comment> \<open>Everything is still reachable:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
403 |
let "R = reachable ?Ra ?A" = "?I3" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
404 |
let "R = reachable ?Rb ?B" = "?swI3" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
405 |
have "?Ra\<^sup>* `` addrs ?A = ?Rb\<^sup>* `` addrs ?B" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
406 |
proof (rule still_reachable_eq) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
407 |
show "addrs ?A \<subseteq> ?Rb\<^sup>* `` addrs ?B" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
408 |
by(fastforce simp:addrs_def rel_defs addr_p_eq intro:oneStep_reachable Image_iff[THEN iffD2]) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
409 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
410 |
show "addrs ?B \<subseteq> ?Ra\<^sup>* `` addrs ?A" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
411 |
by(fastforce simp:addrs_def rel_defs addr_p_eq intro:oneStep_reachable Image_iff[THEN iffD2]) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
412 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
413 |
show "\<forall>(x, y)\<in>?Ra-?Rb. y\<in>(?Rb\<^sup>*``addrs ?B)" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
414 |
by (clarsimp simp:relS_def) (fastforce simp add:rel_def Image_iff addrs_def fun_upd_apply dest:rel_upd1) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
415 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
416 |
show "\<forall>(x, y)\<in>?Rb-?Ra. y\<in>(?Ra\<^sup>*``addrs ?A)" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
417 |
by (clarsimp simp:relS_def) (fastforce simp add:rel_def Image_iff addrs_def fun_upd_apply dest:rel_upd2) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
418 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
419 |
with i3 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
420 |
have swI3: "?swI3" by (simp add:reachable_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
421 |
moreover |
13820 | 422 |
|
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
423 |
\<comment> \<open>If it is reachable and not marked, it is still reachable using...\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
424 |
let "\<forall>x. x \<in> R \<and> \<not> m x \<longrightarrow> x \<in> reachable ?Ra ?A" = ?I4 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
425 |
let "\<forall>x. x \<in> R \<and> \<not> m x \<longrightarrow> x \<in> reachable ?Rb ?B" = ?swI4 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
426 |
let ?T = "{t}" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
427 |
have "?Ra\<^sup>*``addrs ?A \<subseteq> ?Rb\<^sup>*``(addrs ?B \<union> addrs ?T)" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
428 |
proof (rule still_reachable) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
429 |
have rewrite: "(\<forall>s\<in>set stack_tl. (r(addr p := l(addr p))) s = r s)" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
430 |
by (auto simp add:p_notin_stack_tl intro:fun_upd_other) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
431 |
show "addrs ?A \<subseteq> ?Rb\<^sup>* `` (addrs ?B \<union> addrs ?T)" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
432 |
by (fastforce cong:map_cong simp:stack_eq addrs_def rewrite intro:self_reachable) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
433 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
434 |
show "\<forall>(x, y)\<in>?Ra-?Rb. y\<in>(?Rb\<^sup>*``(addrs ?B \<union> addrs ?T))" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
435 |
by (clarsimp simp:relS_def restr_def) (fastforce simp add:rel_def Image_iff addrs_def fun_upd_apply dest:rel_upd1) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
436 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
437 |
then have subset: "?Ra\<^sup>*``addrs ?A - ?Rb\<^sup>*``addrs ?T \<subseteq> ?Rb\<^sup>*``addrs ?B" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
438 |
by blast |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
439 |
have ?swI4 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
440 |
proof (rule allI, rule impI) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
441 |
fix x |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
442 |
assume a: "x \<in> R \<and>\<not> m x" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
443 |
with i4 addr_p_eq stack_eq have inc: "x \<in> ?Ra\<^sup>*``addrs ?A" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
444 |
by (simp only:reachable_def, clarsimp) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
445 |
with ifB1 a |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
446 |
have exc: "x \<notin> ?Rb\<^sup>*`` addrs ?T" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
447 |
by (auto simp add:addrs_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
448 |
from inc exc subset show "x \<in> reachable ?Rb ?B" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
449 |
by (auto simp add:reachable_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
450 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
451 |
moreover |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
452 |
|
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
453 |
\<comment> \<open>If it is marked, then it is reachable\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
454 |
from i5 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
455 |
have "?swI5" . |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
456 |
moreover |
13820 | 457 |
|
69597 | 458 |
\<comment> \<open>If it is not on the stack, then its \<^term>\<open>l\<close> and \<^term>\<open>r\<close> fields are unchanged\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
459 |
from i6 stack_eq |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
460 |
have "?swI6" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
461 |
by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
462 |
moreover |
13820 | 463 |
|
69597 | 464 |
\<comment> \<open>If it is on the stack, then its \<^term>\<open>l\<close> and \<^term>\<open>r\<close> fields can be reconstructed\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
465 |
from stackDist i7 nifB2 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
466 |
have "?swI7" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
467 |
by (clarsimp simp:addr_p_eq stack_eq) |
13820 | 468 |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
469 |
ultimately show ?thesis by auto |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
470 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
471 |
then have "\<exists>stack. ?swInv stack" by blast |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
472 |
} |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
473 |
moreover |
13820 | 474 |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
475 |
{ |
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
476 |
\<comment> \<open>Push arm\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
477 |
assume nifB1: "\<not>?ifB1" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
478 |
from nifB1 whileB have tNotNull: "t \<noteq> Null" by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
479 |
then obtain addr_t where addr_t_eq: "t = Ref addr_t" by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
480 |
with i1 obtain new_stack where new_stack_eq: "new_stack = (addr t) # stack" by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
481 |
from tNotNull nifB1 have n_m_addr_t: "\<not> (t^.m)" by clarsimp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
482 |
with i2 have t_notin_stack: "(addr t) \<notin> set stack" by blast |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
483 |
let "?puI1\<and>?puI2\<and>?puI3\<and>?puI4\<and>?puI5\<and>?puI6\<and>?puI7" = "?puInv new_stack" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
484 |
have "?puInv new_stack" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
485 |
proof - |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
486 |
|
62042 | 487 |
\<comment> \<open>List property is maintained:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
488 |
from i1 t_notin_stack |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
489 |
have puI1: "?puI1" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
490 |
by (simp add:addr_t_eq new_stack_eq, simp add:S_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
491 |
moreover |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
492 |
|
62042 | 493 |
\<comment> \<open>Everything on the stack is marked:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
494 |
from i2 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
495 |
have puI2: "?puI2" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
496 |
by (simp add:new_stack_eq fun_upd_apply) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
497 |
moreover |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
498 |
|
62042 | 499 |
\<comment> \<open>Everything is still reachable:\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
500 |
let "R = reachable ?Ra ?A" = "?I3" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
501 |
let "R = reachable ?Rb ?B" = "?puI3" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
502 |
have "?Ra\<^sup>* `` addrs ?A = ?Rb\<^sup>* `` addrs ?B" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
503 |
proof (rule still_reachable_eq) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
504 |
show "addrs ?A \<subseteq> ?Rb\<^sup>* `` addrs ?B" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
505 |
by(fastforce simp:addrs_def rel_defs addr_t_eq intro:oneStep_reachable Image_iff[THEN iffD2]) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
506 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
507 |
show "addrs ?B \<subseteq> ?Ra\<^sup>* `` addrs ?A" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
508 |
by(fastforce simp:addrs_def rel_defs addr_t_eq intro:oneStep_reachable Image_iff[THEN iffD2]) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
509 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
510 |
show "\<forall>(x, y)\<in>?Ra-?Rb. y\<in>(?Rb\<^sup>*``addrs ?B)" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
511 |
by (clarsimp simp:relS_def) (fastforce simp add:rel_def Image_iff addrs_def dest:rel_upd1) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
512 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
513 |
show "\<forall>(x, y)\<in>?Rb-?Ra. y\<in>(?Ra\<^sup>*``addrs ?A)" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
514 |
by (clarsimp simp:relS_def) (fastforce simp add:rel_def Image_iff addrs_def fun_upd_apply dest:rel_upd2) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
515 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
516 |
with i3 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
517 |
have puI3: "?puI3" by (simp add:reachable_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
518 |
moreover |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
519 |
|
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
520 |
\<comment> \<open>If it is reachable and not marked, it is still reachable using...\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
521 |
let "\<forall>x. x \<in> R \<and> \<not> m x \<longrightarrow> x \<in> reachable ?Ra ?A" = ?I4 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
522 |
let "\<forall>x. x \<in> R \<and> \<not> ?new_m x \<longrightarrow> x \<in> reachable ?Rb ?B" = ?puI4 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
523 |
let ?T = "{t}" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
524 |
have "?Ra\<^sup>*``addrs ?A \<subseteq> ?Rb\<^sup>*``(addrs ?B \<union> addrs ?T)" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
525 |
proof (rule still_reachable) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
526 |
show "addrs ?A \<subseteq> ?Rb\<^sup>* `` (addrs ?B \<union> addrs ?T)" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
527 |
by (fastforce simp:new_stack_eq addrs_def intro:self_reachable) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
528 |
next |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
529 |
show "\<forall>(x, y)\<in>?Ra-?Rb. y\<in>(?Rb\<^sup>*``(addrs ?B \<union> addrs ?T))" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
530 |
by (clarsimp simp:relS_def new_stack_eq restr_un restr_upd) |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
531 |
(fastforce simp add:rel_def Image_iff restr_def addrs_def fun_upd_apply addr_t_eq dest:rel_upd3) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
532 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
533 |
then have subset: "?Ra\<^sup>*``addrs ?A - ?Rb\<^sup>*``addrs ?T \<subseteq> ?Rb\<^sup>*``addrs ?B" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
534 |
by blast |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
535 |
have ?puI4 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
536 |
proof (rule allI, rule impI) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
537 |
fix x |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
538 |
assume a: "x \<in> R \<and> \<not> ?new_m x" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
539 |
have xDisj: "x=(addr t) \<or> x\<noteq>(addr t)" by simp |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
540 |
with i4 a have inc: "x \<in> ?Ra\<^sup>*``addrs ?A" |
44890
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
nipkow
parents:
42154
diff
changeset
|
541 |
by (fastforce simp:addr_t_eq addrs_def reachable_def intro:self_reachable) |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
542 |
have exc: "x \<notin> ?Rb\<^sup>*`` addrs ?T" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
543 |
using xDisj a n_m_addr_t |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
544 |
by (clarsimp simp add:addrs_def addr_t_eq) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
545 |
from inc exc subset show "x \<in> reachable ?Rb ?B" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
546 |
by (auto simp add:reachable_def) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
547 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
548 |
moreover |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
549 |
|
67443
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents:
67410
diff
changeset
|
550 |
\<comment> \<open>If it is marked, then it is reachable\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
551 |
from i5 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
552 |
have "?puI5" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
553 |
by (auto simp:addrs_def i3 reachable_def addr_t_eq fun_upd_apply intro:self_reachable) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
554 |
moreover |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
555 |
|
69597 | 556 |
\<comment> \<open>If it is not on the stack, then its \<^term>\<open>l\<close> and \<^term>\<open>r\<close> fields are unchanged\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
557 |
from i6 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
558 |
have "?puI6" |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
559 |
by (simp add:new_stack_eq) |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
560 |
moreover |
13820 | 561 |
|
69597 | 562 |
\<comment> \<open>If it is on the stack, then its \<^term>\<open>l\<close> and \<^term>\<open>r\<close> fields can be reconstructed\<close> |
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
563 |
from stackDist i6 t_notin_stack i7 |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
564 |
have "?puI7" by (clarsimp simp:addr_t_eq new_stack_eq) |
13820 | 565 |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
566 |
ultimately show ?thesis by auto |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
567 |
qed |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
568 |
then have "\<exists>stack. ?puInv stack" by blast |
13820 | 569 |
|
32960
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
570 |
} |
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents:
16417
diff
changeset
|
571 |
ultimately show ?thesis by blast |
13820 | 572 |
qed |
573 |
} |
|
574 |
qed |
|
575 |
||
576 |
end |