| author | wenzelm | 
| Sun, 18 Feb 2024 15:03:47 +0100 | |
| changeset 79662 | dca6ea3b7a01 | 
| 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: 
67410diff
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: 
67410diff
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: 
16417diff
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: 
16417diff
changeset | 116 | done | 
| 13820 | 117 | |
| 36866 | 118 | definition | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
67410diff
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: 
72990diff
changeset | 222 | (is "Valid | 
| 
403ce50e6a2a
separated commands from annotations to be able to abstract about the latter only
 nipkow parents: 
72990diff
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: 
72990diff
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: 
72990diff
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: 
39198diff
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: 
72990diff
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: 
72990diff
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: 
16417diff
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: 
16417diff
changeset | 267 |         {
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 272 | by auto | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 277 | have "?popInv stack_tl" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 281 | from i1 p_notin_stack_tl ifB2 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 291 | let "(R = reachable ?Ra ?A)" = "?I3" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 292 |             let "?Rb" = "(relS {l, r(p \<rightarrow> t)})"
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 296 | proof | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 297 | show "?L \<subseteq> ?R" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 298 | proof (rule still_reachable) | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 300 | intro:oneStep_reachable Image_iff[THEN iffD2]) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
42154diff
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: 
16417diff
changeset | 303 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 304 | show "?R \<subseteq> ?L" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 305 | proof (rule still_reachable) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 306 | show "addrs ?B \<subseteq> ?Ra\<^sup>* `` addrs ?A" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 308 | intro:oneStep_reachable Image_iff[THEN iffD2]) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 309 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 311 | by (clarsimp simp:relS_def) | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 313 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 314 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 316 | moreover | 
| 13820 | 317 | |
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 323 |             let ?T = "{t, p^.r}"
 | 
| 13820 | 324 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 326 | proof (rule still_reachable) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 329 | show "addrs ?A \<subseteq> ?Rb\<^sup>* `` (addrs ?B \<union> addrs ?T)" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
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: 
16417diff
changeset | 332 | by (clarsimp simp:restr_def relS_def) | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 334 | qed | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
16417diff
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: 
16417diff
changeset | 337 | by blast | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 339 | proof (rule allI, rule impI) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 340 | fix x | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 351 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 352 | moreover | 
| 13820 | 353 | |
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 359 | from i7 i6 ifB2 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 369 | ultimately show "?popInv stack_tl" by simp | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 370 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 371 | hence "\<exists>stack. ?popInv stack" .. | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 372 | } | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 373 | moreover | 
| 13820 | 374 | |
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
67410diff
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: 
67410diff
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: 
16417diff
changeset | 378 |         {
 | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
changeset | 379 | \<comment> \<open>Swing arm\<close> | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 380 | assume ifB1: "?ifB1" and nifB2: "\<not>?ifB2" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 386 | by simp | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 388 | have "?swInv stack" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 389 | proof - | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 392 | from i1 p_notin_stack_tl nifB2 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 393 | have swI1: "?swI1" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 395 | moreover | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 398 | from i2 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 399 | have swI2: "?swI2" . | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 400 | moreover | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 403 | let "R = reachable ?Ra ?A" = "?I3" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 404 | let "R = reachable ?Rb ?B" = "?swI3" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 406 | proof (rule still_reachable_eq) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 407 | show "addrs ?A \<subseteq> ?Rb\<^sup>* `` addrs ?B" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 409 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 410 | show "addrs ?B \<subseteq> ?Ra\<^sup>* `` addrs ?A" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 412 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
42154diff
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: 
16417diff
changeset | 415 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
42154diff
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: 
16417diff
changeset | 418 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 419 | with i3 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 420 | have swI3: "?swI3" by (simp add:reachable_def) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 421 | moreover | 
| 13820 | 422 | |
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 426 |             let ?T = "{t}"
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 428 | proof (rule still_reachable) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 431 | show "addrs ?A \<subseteq> ?Rb\<^sup>* `` (addrs ?B \<union> addrs ?T)" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 433 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
42154diff
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: 
16417diff
changeset | 436 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 438 | by blast | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 439 | have ?swI4 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 440 | proof (rule allI, rule impI) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 441 | fix x | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 444 | by (simp only:reachable_def, clarsimp) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 445 | with ifB1 a | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 446 | have exc: "x \<notin> ?Rb\<^sup>*`` addrs ?T" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 447 | by (auto simp add:addrs_def) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 449 | by (auto simp add:reachable_def) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 450 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 451 | moreover | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 452 | |
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
16417diff
changeset | 454 | from i5 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 455 | have "?swI5" . | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 459 | from i6 stack_eq | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 460 | have "?swI6" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 461 | by clarsimp | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 465 | from stackDist i7 nifB2 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 466 | have "?swI7" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 469 | ultimately show ?thesis by auto | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 470 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 471 | then have "\<exists>stack. ?swInv stack" by blast | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 472 | } | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 473 | moreover | 
| 13820 | 474 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 475 |         {
 | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
changeset | 476 | \<comment> \<open>Push arm\<close> | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 477 | assume nifB1: "\<not>?ifB1" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 484 | have "?puInv new_stack" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 485 | proof - | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 488 | from i1 t_notin_stack | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 489 | have puI1: "?puI1" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 491 | moreover | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 494 | from i2 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 495 | have puI2: "?puI2" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 497 | moreover | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 500 | let "R = reachable ?Ra ?A" = "?I3" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 501 | let "R = reachable ?Rb ?B" = "?puI3" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 503 | proof (rule still_reachable_eq) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 504 | show "addrs ?A \<subseteq> ?Rb\<^sup>* `` addrs ?B" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 506 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 507 | show "addrs ?B \<subseteq> ?Ra\<^sup>* `` addrs ?A" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 509 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
42154diff
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: 
16417diff
changeset | 512 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
42154diff
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: 
16417diff
changeset | 515 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 516 | with i3 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 517 | have puI3: "?puI3" by (simp add:reachable_def) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 518 | moreover | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 519 | |
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 523 |             let ?T = "{t}"
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 525 | proof (rule still_reachable) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 526 | show "addrs ?A \<subseteq> ?Rb\<^sup>* `` (addrs ?B \<union> addrs ?T)" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 528 | next | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
42154diff
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: 
16417diff
changeset | 532 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 534 | by blast | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 535 | have ?puI4 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 536 | proof (rule allI, rule impI) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 537 | fix x | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 540 | with i4 a have inc: "x \<in> ?Ra\<^sup>*``addrs ?A" | 
| 44890 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 nipkow parents: 
42154diff
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: 
16417diff
changeset | 542 | have exc: "x \<notin> ?Rb\<^sup>*`` addrs ?T" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 543 | using xDisj a n_m_addr_t | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
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: 
16417diff
changeset | 546 | by (auto simp add:reachable_def) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 547 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 548 | moreover | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 549 | |
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
67410diff
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: 
16417diff
changeset | 551 | from i5 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 552 | have "?puI5" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 554 | moreover | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 557 | from i6 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 558 | have "?puI6" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 559 | by (simp add:new_stack_eq) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 563 | from stackDist i6 t_notin_stack i7 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 566 | ultimately show ?thesis by auto | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 567 | qed | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
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: 
16417diff
changeset | 570 | } | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
16417diff
changeset | 571 | ultimately show ?thesis by blast | 
| 13820 | 572 | qed | 
| 573 | } | |
| 574 | qed | |
| 575 | ||
| 576 | end |