| author | wenzelm | 
| Mon, 17 May 2021 23:38:16 +0200 | |
| changeset 73722 | 9e1de6fb9579 | 
| parent 67613 | ce654b0e6d69 | 
| child 80914 | d97fdabd9e2b | 
| permissions | -rw-r--r-- | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
26806diff
changeset | 1 | (* Title: HOL/UNITY/ELT.thy | 
| 8044 | 2 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | 
| 3 | Copyright 1999 University of Cambridge | |
| 4 | ||
| 5 | leadsTo strengthened with a specification of the allowable sets transient parts | |
| 8122 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 6 | |
| 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 7 | TRY INSTEAD (to get rid of the {} and to gain strong induction)
 | 
| 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 8 | |
| 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 9 |   elt :: "['a set set, 'a program, 'a set] => ('a set) set"
 | 
| 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 10 | |
| 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 11 | inductive "elt CC F B" | 
| 13790 | 12 | intros | 
| 8122 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 13 | |
| 13790 | 14 | Weaken: "A <= B ==> A : elt CC F B" | 
| 8122 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 15 | |
| 13790 | 16 | ETrans: "[| F : A ensures A'; A-A' : CC; A' : elt CC F B |] | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
26806diff
changeset | 17 | ==> A : elt CC F B" | 
| 8122 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 18 | |
| 13790 | 19 |     Union:  "{A. A: S} : Pow (elt CC F B) ==> (Union S) : elt CC F B"
 | 
| 8122 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 20 | |
| 
b43ad07660b9
working version, with Alloc now working on the same state space as the whole
 paulson parents: 
8072diff
changeset | 21 | monos Pow_mono | 
| 8044 | 22 | *) | 
| 23 | ||
| 63146 | 24 | section\<open>Progress Under Allowable Sets\<close> | 
| 13798 | 25 | |
| 16417 | 26 | theory ELT imports Project begin | 
| 8044 | 27 | |
| 23767 | 28 | inductive_set | 
| 8044 | 29 | (*LEADS-TO constant for the inductive definition*) | 
| 30 |   elt :: "['a set set, 'a program] => ('a set * 'a set) set"
 | |
| 23767 | 31 | for CC :: "'a set set" and F :: "'a program" | 
| 32 | where | |
| 8044 | 33 | |
| 67613 | 34 |    Basis:  "[| F \<in> A ensures B;  A-B \<in> (insert {} CC) |] ==> (A,B) \<in> elt CC F"
 | 
| 8044 | 35 | |
| 67613 | 36 | | Trans: "[| (A,B) \<in> elt CC F; (B,C) \<in> elt CC F |] ==> (A,C) \<in> elt CC F" | 
| 8044 | 37 | |
| 67613 | 38 | | Union: "\<forall>A\<in>S. (A,B) \<in> elt CC F ==> (Union S, B) \<in> elt CC F" | 
| 8044 | 39 | |
| 40 | ||
| 36866 | 41 | definition | 
| 8128 | 42 | (*the set of all sets determined by f alone*) | 
| 43 | givenBy :: "['a => 'b] => 'a set set" | |
| 36866 | 44 | where "givenBy f = range (%B. f-` B)" | 
| 8044 | 45 | |
| 36866 | 46 | definition | 
| 8044 | 47 | (*visible version of the LEADS-TO relation*) | 
| 48 | leadsETo :: "['a set, 'a set set, 'a set] => 'a program set" | |
| 49 |                                         ("(3_/ leadsTo[_]/ _)" [80,0,80] 80)
 | |
| 67613 | 50 |   where "leadsETo A CC B = {F. (A,B) \<in> elt CC F}"
 | 
| 8044 | 51 | |
| 36866 | 52 | definition | 
| 8044 | 53 | LeadsETo :: "['a set, 'a set set, 'a set] => 'a program set" | 
| 54 |                                         ("(3_/ LeadsTo[_]/ _)" [80,0,80] 80)
 | |
| 36866 | 55 | where "LeadsETo A CC B = | 
| 67613 | 56 |       {F. F \<in> (reachable F Int A) leadsTo[(%C. reachable F Int C) ` CC] B}"
 | 
| 8044 | 57 | |
| 13790 | 58 | |
| 59 | (*** givenBy ***) | |
| 60 | ||
| 61 | lemma givenBy_id [simp]: "givenBy id = UNIV" | |
| 62 | by (unfold givenBy_def, auto) | |
| 63 | ||
| 67613 | 64 | lemma givenBy_eq_all: "(givenBy v) = {A. \<forall>x\<in>A. \<forall>y. v x = v y \<longrightarrow> y \<in> A}"
 | 
| 13790 | 65 | apply (unfold givenBy_def, safe) | 
| 59807 | 66 | apply (rule_tac [2] x = "v ` _" in image_eqI, auto) | 
| 13790 | 67 | done | 
| 68 | ||
| 67613 | 69 | lemma givenByI: "(\<And>x y. [| x \<in> A; v x = v y |] ==> y \<in> A) ==> A \<in> givenBy v" | 
| 13790 | 70 | by (subst givenBy_eq_all, blast) | 
| 71 | ||
| 67613 | 72 | lemma givenByD: "[| A \<in> givenBy v; x \<in> A; v x = v y |] ==> y \<in> A" | 
| 13790 | 73 | by (unfold givenBy_def, auto) | 
| 74 | ||
| 67613 | 75 | lemma empty_mem_givenBy [iff]: "{} \<in> givenBy v"
 | 
| 13790 | 76 | by (blast intro!: givenByI) | 
| 77 | ||
| 67613 | 78 | lemma givenBy_imp_eq_Collect: "A \<in> givenBy v ==> \<exists>P. A = {s. P(v s)}"
 | 
| 79 | apply (rule_tac x = "\<lambda>n. \<exists>s. v s = n \<and> s \<in> A" in exI) | |
| 13790 | 80 | apply (simp (no_asm_use) add: givenBy_eq_all) | 
| 81 | apply blast | |
| 82 | done | |
| 83 | ||
| 67613 | 84 | lemma Collect_mem_givenBy: "{s. P(v s)} \<in> givenBy v"
 | 
| 13790 | 85 | by (unfold givenBy_def, best) | 
| 86 | ||
| 67613 | 87 | lemma givenBy_eq_Collect: "givenBy v = {A. \<exists>P. A = {s. P(v s)}}"
 | 
| 13790 | 88 | by (blast intro: Collect_mem_givenBy givenBy_imp_eq_Collect) | 
| 89 | ||
| 90 | (*preserving v preserves properties given by v*) | |
| 91 | lemma preserves_givenBy_imp_stable: | |
| 67613 | 92 | "[| F \<in> preserves v; D \<in> givenBy v |] ==> F \<in> stable D" | 
| 13798 | 93 | by (force simp add: preserves_subset_stable [THEN subsetD] givenBy_eq_Collect) | 
| 13790 | 94 | |
| 95 | lemma givenBy_o_subset: "givenBy (w o v) <= givenBy v" | |
| 96 | apply (simp (no_asm) add: givenBy_eq_Collect) | |
| 97 | apply best | |
| 98 | done | |
| 99 | ||
| 100 | lemma givenBy_DiffI: | |
| 67613 | 101 | "[| A \<in> givenBy v; B \<in> givenBy v |] ==> A-B \<in> givenBy v" | 
| 13790 | 102 | apply (simp (no_asm_use) add: givenBy_eq_Collect) | 
| 103 | apply safe | |
| 59807 | 104 | apply (rule_tac x = "%z. R z & ~ Q z" for R Q in exI) | 
| 26806 | 105 | unfolding set_diff_eq | 
| 26349 | 106 | apply auto | 
| 13790 | 107 | done | 
| 108 | ||
| 109 | ||
| 110 | (** Standard leadsTo rules **) | |
| 111 | ||
| 112 | lemma leadsETo_Basis [intro]: | |
| 67613 | 113 |      "[| F \<in> A ensures B;  A-B \<in> insert {} CC |] ==> F \<in> A leadsTo[CC] B"
 | 
| 13790 | 114 | apply (unfold leadsETo_def) | 
| 115 | apply (blast intro: elt.Basis) | |
| 116 | done | |
| 117 | ||
| 118 | lemma leadsETo_Trans: | |
| 67613 | 119 | "[| F \<in> A leadsTo[CC] B; F \<in> B leadsTo[CC] C |] ==> F \<in> A leadsTo[CC] C" | 
| 13790 | 120 | apply (unfold leadsETo_def) | 
| 121 | apply (blast intro: elt.Trans) | |
| 122 | done | |
| 123 | ||
| 124 | ||
| 125 | (*Useful with cancellation, disjunction*) | |
| 126 | lemma leadsETo_Un_duplicate: | |
| 67613 | 127 | "F \<in> A leadsTo[CC] (A' \<union> A') \<Longrightarrow> F \<in> A leadsTo[CC] A'" | 
| 13819 | 128 | by (simp add: Un_ac) | 
| 13790 | 129 | |
| 130 | lemma leadsETo_Un_duplicate2: | |
| 67613 | 131 | "F \<in> A leadsTo[CC] (A' \<union> C \<union> C) ==> F \<in> A leadsTo[CC] (A' Un C)" | 
| 13790 | 132 | by (simp add: Un_ac) | 
| 133 | ||
| 134 | (*The Union introduction rule as we should have liked to state it*) | |
| 135 | lemma leadsETo_Union: | |
| 67613 | 136 | "(\<And>A. A \<in> S \<Longrightarrow> F \<in> A leadsTo[CC] B) \<Longrightarrow> F \<in> (\<Union>S) leadsTo[CC] B" | 
| 13790 | 137 | apply (unfold leadsETo_def) | 
| 138 | apply (blast intro: elt.Union) | |
| 139 | done | |
| 140 | ||
| 141 | lemma leadsETo_UN: | |
| 67613 | 142 | "(\<And>i. i \<in> I \<Longrightarrow> F \<in> (A i) leadsTo[CC] B) | 
| 143 | ==> F \<in> (UN i:I. A i) leadsTo[CC] B" | |
| 13790 | 144 | apply (blast intro: leadsETo_Union) | 
| 145 | done | |
| 146 | ||
| 147 | (*The INDUCTION rule as we should have liked to state it*) | |
| 148 | lemma leadsETo_induct: | |
| 67613 | 149 | "[| F \<in> za leadsTo[CC] zb; | 
| 150 |       !!A B. [| F \<in> A ensures B;  A-B \<in> insert {} CC |] ==> P A B;  
 | |
| 151 | !!A B C. [| F \<in> A leadsTo[CC] B; P A B; F \<in> B leadsTo[CC] C; P B C |] | |
| 13790 | 152 | ==> P A C; | 
| 67613 | 153 | !!B S. \<forall>A\<in>S. F \<in> A leadsTo[CC] B & P A B ==> P (\<Union>S) B | 
| 13790 | 154 | |] ==> P za zb" | 
| 155 | apply (unfold leadsETo_def) | |
| 156 | apply (drule CollectD) | |
| 157 | apply (erule elt.induct, blast+) | |
| 158 | done | |
| 159 | ||
| 160 | ||
| 161 | (** New facts involving leadsETo **) | |
| 162 | ||
| 163 | lemma leadsETo_mono: "CC' <= CC ==> (A leadsTo[CC'] B) <= (A leadsTo[CC] B)" | |
| 164 | apply safe | |
| 165 | apply (erule leadsETo_induct) | |
| 166 | prefer 3 apply (blast intro: leadsETo_Union) | |
| 167 | prefer 2 apply (blast intro: leadsETo_Trans) | |
| 46577 | 168 | apply blast | 
| 13790 | 169 | done | 
| 170 | ||
| 171 | lemma leadsETo_Trans_Un: | |
| 67613 | 172 | "[| F \<in> A leadsTo[CC] B; F \<in> B leadsTo[DD] C |] | 
| 173 | ==> F \<in> A leadsTo[CC Un DD] C" | |
| 13790 | 174 | by (blast intro: leadsETo_mono [THEN subsetD] leadsETo_Trans) | 
| 175 | ||
| 176 | lemma leadsETo_Union_Int: | |
| 67613 | 177 | "(!!A. A \<in> S ==> F \<in> (A Int C) leadsTo[CC] B) | 
| 178 | ==> F \<in> (\<Union>S Int C) leadsTo[CC] B" | |
| 13790 | 179 | apply (unfold leadsETo_def) | 
| 180 | apply (simp only: Int_Union_Union) | |
| 181 | apply (blast intro: elt.Union) | |
| 182 | done | |
| 183 | ||
| 184 | (*Binary union introduction rule*) | |
| 185 | lemma leadsETo_Un: | |
| 67613 | 186 | "[| F \<in> A leadsTo[CC] C; F \<in> B leadsTo[CC] C |] | 
| 187 | ==> F \<in> (A Un B) leadsTo[CC] C" | |
| 44106 | 188 |   using leadsETo_Union [of "{A, B}" F CC C] by auto
 | 
| 13790 | 189 | |
| 190 | lemma single_leadsETo_I: | |
| 67613 | 191 |      "(\<And>x. x \<in> A ==> F \<in> {x} leadsTo[CC] B) \<Longrightarrow> F \<in> A leadsTo[CC] B"
 | 
| 13819 | 192 | by (subst UN_singleton [symmetric], rule leadsETo_UN, blast) | 
| 13790 | 193 | |
| 194 | ||
| 67613 | 195 | lemma subset_imp_leadsETo: "A<=B \<Longrightarrow> F \<in> A leadsTo[CC] B" | 
| 13819 | 196 | by (simp add: subset_imp_ensures [THEN leadsETo_Basis] | 
| 197 | Diff_eq_empty_iff [THEN iffD2]) | |
| 13790 | 198 | |
| 199 | lemmas empty_leadsETo = empty_subsetI [THEN subset_imp_leadsETo, simp] | |
| 200 | ||
| 201 | ||
| 202 | ||
| 203 | (** Weakening laws **) | |
| 204 | ||
| 205 | lemma leadsETo_weaken_R: | |
| 67613 | 206 | "[| F \<in> A leadsTo[CC] A'; A'<=B' |] ==> F \<in> A leadsTo[CC] B'" | 
| 13819 | 207 | by (blast intro: subset_imp_leadsETo leadsETo_Trans) | 
| 13790 | 208 | |
| 46911 | 209 | lemma leadsETo_weaken_L: | 
| 67613 | 210 | "[| F \<in> A leadsTo[CC] A'; B<=A |] ==> F \<in> B leadsTo[CC] A'" | 
| 13819 | 211 | by (blast intro: leadsETo_Trans subset_imp_leadsETo) | 
| 13790 | 212 | |
| 213 | (*Distributes over binary unions*) | |
| 214 | lemma leadsETo_Un_distrib: | |
| 67613 | 215 | "F \<in> (A Un B) leadsTo[CC] C = | 
| 216 | (F \<in> A leadsTo[CC] C \<and> F \<in> B leadsTo[CC] C)" | |
| 13819 | 217 | by (blast intro: leadsETo_Un leadsETo_weaken_L) | 
| 13790 | 218 | |
| 219 | lemma leadsETo_UN_distrib: | |
| 67613 | 220 | "F \<in> (UN i:I. A i) leadsTo[CC] B = | 
| 221 | (\<forall>i\<in>I. F \<in> (A i) leadsTo[CC] B)" | |
| 13819 | 222 | by (blast intro: leadsETo_UN leadsETo_weaken_L) | 
| 13790 | 223 | |
| 224 | lemma leadsETo_Union_distrib: | |
| 67613 | 225 | "F \<in> (\<Union>S) leadsTo[CC] B = (\<forall>A\<in>S. F \<in> A leadsTo[CC] B)" | 
| 13819 | 226 | by (blast intro: leadsETo_Union leadsETo_weaken_L) | 
| 13790 | 227 | |
| 228 | lemma leadsETo_weaken: | |
| 67613 | 229 | "[| F \<in> A leadsTo[CC'] A'; B<=A; A'<=B'; CC' <= CC |] | 
| 230 | ==> F \<in> B leadsTo[CC] B'" | |
| 13790 | 231 | apply (drule leadsETo_mono [THEN subsetD], assumption) | 
| 13819 | 232 | apply (blast del: subsetCE | 
| 233 | intro: leadsETo_weaken_R leadsETo_weaken_L leadsETo_Trans) | |
| 13790 | 234 | done | 
| 235 | ||
| 236 | lemma leadsETo_givenBy: | |
| 67613 | 237 | "[| F \<in> A leadsTo[CC] A'; CC <= givenBy v |] | 
| 238 | ==> F \<in> A leadsTo[givenBy v] A'" | |
| 46577 | 239 | by (blast intro: leadsETo_weaken) | 
| 13790 | 240 | |
| 241 | ||
| 242 | (*Set difference*) | |
| 243 | lemma leadsETo_Diff: | |
| 67613 | 244 | "[| F \<in> (A-B) leadsTo[CC] C; F \<in> B leadsTo[CC] C |] | 
| 245 | ==> F \<in> A leadsTo[CC] C" | |
| 13790 | 246 | by (blast intro: leadsETo_Un leadsETo_weaken) | 
| 247 | ||
| 248 | ||
| 249 | (*Binary union version*) | |
| 250 | lemma leadsETo_Un_Un: | |
| 67613 | 251 | "[| F \<in> A leadsTo[CC] A'; F \<in> B leadsTo[CC] B' |] | 
| 252 | ==> F \<in> (A Un B) leadsTo[CC] (A' Un B')" | |
| 13790 | 253 | by (blast intro: leadsETo_Un leadsETo_weaken_R) | 
| 254 | ||
| 255 | ||
| 256 | (** The cancellation law **) | |
| 257 | ||
| 258 | lemma leadsETo_cancel2: | |
| 67613 | 259 | "[| F \<in> A leadsTo[CC] (A' Un B); F \<in> B leadsTo[CC] B' |] | 
| 260 | ==> F \<in> A leadsTo[CC] (A' Un B')" | |
| 13790 | 261 | by (blast intro: leadsETo_Un_Un subset_imp_leadsETo leadsETo_Trans) | 
| 262 | ||
| 263 | lemma leadsETo_cancel1: | |
| 67613 | 264 | "[| F \<in> A leadsTo[CC] (B Un A'); F \<in> B leadsTo[CC] B' |] | 
| 265 | ==> F \<in> A leadsTo[CC] (B' Un A')" | |
| 13790 | 266 | apply (simp add: Un_commute) | 
| 267 | apply (blast intro!: leadsETo_cancel2) | |
| 268 | done | |
| 269 | ||
| 270 | lemma leadsETo_cancel_Diff1: | |
| 67613 | 271 | "[| F \<in> A leadsTo[CC] (B Un A'); F \<in> (B-A') leadsTo[CC] B' |] | 
| 272 | ==> F \<in> A leadsTo[CC] (B' Un A')" | |
| 13790 | 273 | apply (rule leadsETo_cancel1) | 
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13798diff
changeset | 274 | prefer 2 apply assumption | 
| 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13798diff
changeset | 275 | apply simp_all | 
| 13790 | 276 | done | 
| 277 | ||
| 278 | ||
| 279 | (** PSP: Progress-Safety-Progress **) | |
| 280 | ||
| 281 | (*Special case of PSP: Misra's "stable conjunction"*) | |
| 282 | lemma e_psp_stable: | |
| 67613 | 283 | "[| F \<in> A leadsTo[CC] A'; F \<in> stable B; \<forall>C\<in>CC. C Int B \<in> CC |] | 
| 284 | ==> F \<in> (A Int B) leadsTo[CC] (A' Int B)" | |
| 13790 | 285 | apply (unfold stable_def) | 
| 286 | apply (erule leadsETo_induct) | |
| 287 | prefer 3 apply (blast intro: leadsETo_Union_Int) | |
| 288 | prefer 2 apply (blast intro: leadsETo_Trans) | |
| 289 | apply (rule leadsETo_Basis) | |
| 290 | prefer 2 apply (force simp add: Diff_Int_distrib2 [symmetric]) | |
| 13819 | 291 | apply (simp add: ensures_def Diff_Int_distrib2 [symmetric] | 
| 292 | Int_Un_distrib2 [symmetric]) | |
| 13790 | 293 | apply (blast intro: transient_strengthen constrains_Int) | 
| 294 | done | |
| 295 | ||
| 296 | lemma e_psp_stable2: | |
| 67613 | 297 | "[| F \<in> A leadsTo[CC] A'; F \<in> stable B; \<forall>C\<in>CC. C Int B \<in> CC |] | 
| 298 | ==> F \<in> (B Int A) leadsTo[CC] (B Int A')" | |
| 13790 | 299 | by (simp (no_asm_simp) add: e_psp_stable Int_ac) | 
| 300 | ||
| 301 | lemma e_psp: | |
| 67613 | 302 | "[| F \<in> A leadsTo[CC] A'; F \<in> B co B'; | 
| 303 | \<forall>C\<in>CC. C Int B Int B' \<in> CC |] | |
| 304 | ==> F \<in> (A Int B') leadsTo[CC] ((A' Int B) Un (B' - B))" | |
| 13790 | 305 | apply (erule leadsETo_induct) | 
| 306 | prefer 3 apply (blast intro: leadsETo_Union_Int) | |
| 307 | (*Transitivity case has a delicate argument involving "cancellation"*) | |
| 308 | apply (rule_tac [2] leadsETo_Un_duplicate2) | |
| 309 | apply (erule_tac [2] leadsETo_cancel_Diff1) | |
| 310 | prefer 2 | |
| 311 | apply (simp add: Int_Diff Diff_triv) | |
| 312 | apply (blast intro: leadsETo_weaken_L dest: constrains_imp_subset) | |
| 313 | (*Basis case*) | |
| 314 | apply (rule leadsETo_Basis) | |
| 315 | apply (blast intro: psp_ensures) | |
| 316 | apply (subgoal_tac "A Int B' - (Ba Int B Un (B' - B)) = (A - Ba) Int B Int B'") | |
| 317 | apply auto | |
| 318 | done | |
| 319 | ||
| 320 | lemma e_psp2: | |
| 67613 | 321 | "[| F \<in> A leadsTo[CC] A'; F \<in> B co B'; | 
| 322 | \<forall>C\<in>CC. C Int B Int B' \<in> CC |] | |
| 323 | ==> F \<in> (B' Int A) leadsTo[CC] ((B Int A') Un (B' - B))" | |
| 13790 | 324 | by (simp add: e_psp Int_ac) | 
| 325 | ||
| 326 | ||
| 327 | (*** Special properties involving the parameter [CC] ***) | |
| 328 | ||
| 329 | (*??IS THIS NEEDED?? or is it just an example of what's provable??*) | |
| 330 | lemma gen_leadsETo_imp_Join_leadsETo: | |
| 67613 | 331 | "[| F \<in> (A leadsTo[givenBy v] B); G \<in> preserves v; | 
| 332 | F\<squnion>G \<in> stable C |] | |
| 333 | ==> F\<squnion>G \<in> ((C Int A) leadsTo[(%D. C Int D) ` givenBy v] B)" | |
| 13790 | 334 | apply (erule leadsETo_induct) | 
| 335 | prefer 3 | |
| 336 | apply (subst Int_Union) | |
| 337 | apply (blast intro: leadsETo_UN) | |
| 338 | prefer 2 | |
| 339 | apply (blast intro: e_psp_stable2 [THEN leadsETo_weaken_L] leadsETo_Trans) | |
| 340 | apply (rule leadsETo_Basis) | |
| 13819 | 341 | apply (auto simp add: Diff_eq_empty_iff [THEN iffD2] | 
| 46577 | 342 | Int_Diff ensures_def givenBy_eq_Collect) | 
| 13790 | 343 | prefer 3 apply (blast intro: transient_strengthen) | 
| 344 | apply (drule_tac [2] P1 = P in preserves_subset_stable [THEN subsetD]) | |
| 345 | apply (drule_tac P1 = P in preserves_subset_stable [THEN subsetD]) | |
| 346 | apply (unfold stable_def) | |
| 347 | apply (blast intro: constrains_Int [THEN constrains_weaken])+ | |
| 348 | done | |
| 349 | ||
| 350 | (**** Relationship with traditional "leadsTo", strong & weak ****) | |
| 351 | ||
| 352 | (** strong **) | |
| 353 | ||
| 354 | lemma leadsETo_subset_leadsTo: "(A leadsTo[CC] B) <= (A leadsTo B)" | |
| 355 | apply safe | |
| 356 | apply (erule leadsETo_induct) | |
| 13819 | 357 | prefer 3 apply (blast intro: leadsTo_Union) | 
| 358 | prefer 2 apply (blast intro: leadsTo_Trans, blast) | |
| 13790 | 359 | done | 
| 360 | ||
| 361 | lemma leadsETo_UNIV_eq_leadsTo: "(A leadsTo[UNIV] B) = (A leadsTo B)" | |
| 362 | apply safe | |
| 363 | apply (erule leadsETo_subset_leadsTo [THEN subsetD]) | |
| 364 | (*right-to-left case*) | |
| 365 | apply (erule leadsTo_induct) | |
| 13819 | 366 | prefer 3 apply (blast intro: leadsETo_Union) | 
| 367 | prefer 2 apply (blast intro: leadsETo_Trans, blast) | |
| 13790 | 368 | done | 
| 369 | ||
| 370 | (**** weak ****) | |
| 371 | ||
| 372 | lemma LeadsETo_eq_leadsETo: | |
| 373 | "A LeadsTo[CC] B = | |
| 67613 | 374 |         {F. F \<in> (reachable F Int A) leadsTo[(%C. reachable F Int C) ` CC]  
 | 
| 13790 | 375 | (reachable F Int B)}" | 
| 376 | apply (unfold LeadsETo_def) | |
| 377 | apply (blast dest: e_psp_stable2 intro: leadsETo_weaken) | |
| 378 | done | |
| 379 | ||
| 380 | (*** Introduction rules: Basis, Trans, Union ***) | |
| 381 | ||
| 382 | lemma LeadsETo_Trans: | |
| 67613 | 383 | "[| F \<in> A LeadsTo[CC] B; F \<in> B LeadsTo[CC] C |] | 
| 384 | ==> F \<in> A LeadsTo[CC] C" | |
| 13790 | 385 | apply (simp add: LeadsETo_eq_leadsETo) | 
| 386 | apply (blast intro: leadsETo_Trans) | |
| 387 | done | |
| 388 | ||
| 389 | lemma LeadsETo_Union: | |
| 67613 | 390 | "(\<And>A. A \<in> S \<Longrightarrow> F \<in> A LeadsTo[CC] B) \<Longrightarrow> F \<in> (\<Union>S) LeadsTo[CC] B" | 
| 13790 | 391 | apply (simp add: LeadsETo_def) | 
| 392 | apply (subst Int_Union) | |
| 393 | apply (blast intro: leadsETo_UN) | |
| 394 | done | |
| 395 | ||
| 396 | lemma LeadsETo_UN: | |
| 67613 | 397 | "(\<And>i. i \<in> I \<Longrightarrow> F \<in> (A i) LeadsTo[CC] B) | 
| 398 | \<Longrightarrow> F \<in> (UN i:I. A i) LeadsTo[CC] B" | |
| 13790 | 399 | apply (blast intro: LeadsETo_Union) | 
| 400 | done | |
| 401 | ||
| 402 | (*Binary union introduction rule*) | |
| 403 | lemma LeadsETo_Un: | |
| 67613 | 404 | "[| F \<in> A LeadsTo[CC] C; F \<in> B LeadsTo[CC] C |] | 
| 405 | ==> F \<in> (A Un B) LeadsTo[CC] C" | |
| 44106 | 406 |   using LeadsETo_Union [of "{A, B}" F CC C] by auto
 | 
| 13790 | 407 | |
| 408 | (*Lets us look at the starting state*) | |
| 409 | lemma single_LeadsETo_I: | |
| 67613 | 410 |      "(\<And>s. s \<in> A ==> F \<in> {s} LeadsTo[CC] B) \<Longrightarrow> F \<in> A LeadsTo[CC] B"
 | 
| 13819 | 411 | by (subst UN_singleton [symmetric], rule LeadsETo_UN, blast) | 
| 13790 | 412 | |
| 413 | lemma subset_imp_LeadsETo: | |
| 67613 | 414 | "A <= B \<Longrightarrow> F \<in> A LeadsTo[CC] B" | 
| 13790 | 415 | apply (simp (no_asm) add: LeadsETo_def) | 
| 416 | apply (blast intro: subset_imp_leadsETo) | |
| 417 | done | |
| 418 | ||
| 45605 | 419 | lemmas empty_LeadsETo = empty_subsetI [THEN subset_imp_LeadsETo] | 
| 13790 | 420 | |
| 46911 | 421 | lemma LeadsETo_weaken_R: | 
| 67613 | 422 | "[| F \<in> A LeadsTo[CC] A'; A' <= B' |] ==> F \<in> A LeadsTo[CC] B'" | 
| 46911 | 423 | apply (simp add: LeadsETo_def) | 
| 13790 | 424 | apply (blast intro: leadsETo_weaken_R) | 
| 425 | done | |
| 426 | ||
| 46911 | 427 | lemma LeadsETo_weaken_L: | 
| 67613 | 428 | "[| F \<in> A LeadsTo[CC] A'; B <= A |] ==> F \<in> B LeadsTo[CC] A'" | 
| 46911 | 429 | apply (simp add: LeadsETo_def) | 
| 13790 | 430 | apply (blast intro: leadsETo_weaken_L) | 
| 431 | done | |
| 432 | ||
| 433 | lemma LeadsETo_weaken: | |
| 67613 | 434 | "[| F \<in> A LeadsTo[CC'] A'; | 
| 13790 | 435 | B <= A; A' <= B'; CC' <= CC |] | 
| 67613 | 436 | ==> F \<in> B LeadsTo[CC] B'" | 
| 13790 | 437 | apply (simp (no_asm_use) add: LeadsETo_def) | 
| 438 | apply (blast intro: leadsETo_weaken) | |
| 439 | done | |
| 440 | ||
| 441 | lemma LeadsETo_subset_LeadsTo: "(A LeadsTo[CC] B) <= (A LeadsTo B)" | |
| 442 | apply (unfold LeadsETo_def LeadsTo_def) | |
| 443 | apply (blast intro: leadsETo_subset_leadsTo [THEN subsetD]) | |
| 444 | done | |
| 445 | ||
| 446 | (*Postcondition can be strengthened to (reachable F Int B) *) | |
| 447 | lemma reachable_ensures: | |
| 67613 | 448 | "F \<in> A ensures B \<Longrightarrow> F \<in> (reachable F Int A) ensures B" | 
| 13790 | 449 | apply (rule stable_ensures_Int [THEN ensures_weaken_R], auto) | 
| 450 | done | |
| 451 | ||
| 452 | lemma lel_lemma: | |
| 67613 | 453 | "F \<in> A leadsTo B \<Longrightarrow> F \<in> (reachable F Int A) leadsTo[Pow(reachable F)] B" | 
| 13790 | 454 | apply (erule leadsTo_induct) | 
| 46577 | 455 | apply (blast intro: reachable_ensures) | 
| 13790 | 456 | apply (blast dest: e_psp_stable2 intro: leadsETo_Trans leadsETo_weaken_L) | 
| 457 | apply (subst Int_Union) | |
| 458 | apply (blast intro: leadsETo_UN) | |
| 459 | done | |
| 460 | ||
| 461 | lemma LeadsETo_UNIV_eq_LeadsTo: "(A LeadsTo[UNIV] B) = (A LeadsTo B)" | |
| 462 | apply safe | |
| 463 | apply (erule LeadsETo_subset_LeadsTo [THEN subsetD]) | |
| 464 | (*right-to-left case*) | |
| 465 | apply (unfold LeadsETo_def LeadsTo_def) | |
| 13836 | 466 | apply (blast intro: lel_lemma [THEN leadsETo_weaken]) | 
| 13790 | 467 | done | 
| 468 | ||
| 469 | ||
| 470 | (**** EXTEND/PROJECT PROPERTIES ****) | |
| 471 | ||
| 46912 | 472 | context Extend | 
| 473 | begin | |
| 474 | ||
| 475 | lemma givenBy_o_eq_extend_set: | |
| 13819 | 476 | "givenBy (v o f) = extend_set h ` (givenBy v)" | 
| 13836 | 477 | apply (simp add: givenBy_eq_Collect) | 
| 478 | apply (rule equalityI, best) | |
| 479 | apply blast | |
| 480 | done | |
| 13790 | 481 | |
| 46912 | 482 | lemma givenBy_eq_extend_set: "givenBy f = range (extend_set h)" | 
| 13836 | 483 | by (simp add: givenBy_eq_Collect, best) | 
| 13790 | 484 | |
| 46912 | 485 | lemma extend_set_givenBy_I: | 
| 67613 | 486 | "D \<in> givenBy v ==> extend_set h D \<in> givenBy (v o f)" | 
| 13836 | 487 | apply (simp (no_asm_use) add: givenBy_eq_all, blast) | 
| 13790 | 488 | done | 
| 489 | ||
| 46912 | 490 | lemma leadsETo_imp_extend_leadsETo: | 
| 67613 | 491 | "F \<in> A leadsTo[CC] B | 
| 492 | ==> extend h F \<in> (extend_set h A) leadsTo[extend_set h ` CC] | |
| 13790 | 493 | (extend_set h B)" | 
| 494 | apply (erule leadsETo_induct) | |
| 46577 | 495 | apply (force intro: subset_imp_ensures | 
| 13790 | 496 | simp add: extend_ensures extend_set_Diff_distrib [symmetric]) | 
| 497 | apply (blast intro: leadsETo_Trans) | |
| 498 | apply (simp add: leadsETo_UN extend_set_Union) | |
| 499 | done | |
| 500 | ||
| 501 | ||
| 502 | (*This version's stronger in the "ensures" precondition | |
| 503 | BUT there's no ensures_weaken_L*) | |
| 46912 | 504 | lemma Join_project_ensures_strong: | 
| 67613 | 505 | "[| project h C G \<notin> transient (project_set h C Int (A-B)) | | 
| 13790 | 506 |            project_set h C Int (A - B) = {};   
 | 
| 67613 | 507 | extend h F\<squnion>G \<in> stable C; | 
| 508 | F\<squnion>project h C G \<in> (project_set h C Int A) ensures B |] | |
| 509 | ==> extend h F\<squnion>G \<in> (C Int extend_set h A) ensures (extend_set h B)" | |
| 13790 | 510 | apply (subst Int_extend_set_lemma [symmetric]) | 
| 511 | apply (rule Join_project_ensures) | |
| 512 | apply (auto simp add: Int_Diff) | |
| 513 | done | |
| 514 | ||
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13798diff
changeset | 515 | (*NOT WORKING. MODIFY AS IN Project.thy | 
| 46912 | 516 | lemma pld_lemma: | 
| 13819 | 517 | "[| extend h F\<squnion>G : stable C; | 
| 518 | F\<squnion>project h C G : (project_set h C Int A) leadsTo[(%D. project_set h C Int D)`givenBy v] B; | |
| 13790 | 519 | G : preserves (v o f) |] | 
| 13819 | 520 | ==> extend h F\<squnion>G : | 
| 13790 | 521 | (C Int extend_set h (project_set h C Int A)) | 
| 522 | leadsTo[(%D. C Int extend_set h D)`givenBy v] (extend_set h B)" | |
| 523 | apply (erule leadsETo_induct) | |
| 524 | prefer 3 | |
| 525 | apply (simp del: UN_simps add: Int_UN_distrib leadsETo_UN extend_set_Union) | |
| 526 | prefer 2 | |
| 527 | apply (blast intro: e_psp_stable2 [THEN leadsETo_weaken_L] leadsETo_Trans) | |
| 528 | txt{*Base case is hard*}
 | |
| 529 | apply auto | |
| 530 | apply (force intro: leadsETo_Basis subset_imp_ensures) | |
| 531 | apply (rule leadsETo_Basis) | |
| 532 | prefer 2 | |
| 533 | apply (simp add: Int_Diff Int_extend_set_lemma extend_set_Diff_distrib [symmetric]) | |
| 534 | apply (rule Join_project_ensures_strong) | |
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13798diff
changeset | 535 | apply (auto intro: project_stable_project_set simp add: Int_left_absorb) | 
| 13790 | 536 | apply (simp (no_asm_simp) add: stable_ensures_Int [THEN ensures_weaken_R] Int_lower2 project_stable_project_set extend_stable_project_set) | 
| 537 | done | |
| 538 | ||
| 46912 | 539 | lemma project_leadsETo_D_lemma: | 
| 13819 | 540 | "[| extend h F\<squnion>G : stable C; | 
| 541 | F\<squnion>project h C G : | |
| 13790 | 542 | (project_set h C Int A) | 
| 543 | leadsTo[(%D. project_set h C Int D)`givenBy v] B; | |
| 544 | G : preserves (v o f) |] | |
| 13819 | 545 | ==> extend h F\<squnion>G : (C Int extend_set h A) | 
| 13790 | 546 | leadsTo[(%D. C Int extend_set h D)`givenBy v] (extend_set h B)" | 
| 547 | apply (rule pld_lemma [THEN leadsETo_weaken]) | |
| 548 | apply (auto simp add: split_extended_all) | |
| 549 | done | |
| 550 | ||
| 46912 | 551 | lemma project_leadsETo_D: | 
| 13819 | 552 | "[| F\<squnion>project h UNIV G : A leadsTo[givenBy v] B; | 
| 13790 | 553 | G : preserves (v o f) |] | 
| 13819 | 554 | ==> extend h F\<squnion>G : (extend_set h A) | 
| 13790 | 555 | leadsTo[givenBy (v o f)] (extend_set h B)" | 
| 556 | apply (cut_tac project_leadsETo_D_lemma [of _ _ UNIV], auto) | |
| 557 | apply (erule leadsETo_givenBy) | |
| 558 | apply (rule givenBy_o_eq_extend_set [THEN equalityD2]) | |
| 559 | done | |
| 560 | ||
| 46912 | 561 | lemma project_LeadsETo_D: | 
| 13819 | 562 | "[| F\<squnion>project h (reachable (extend h F\<squnion>G)) G | 
| 13790 | 563 | : A LeadsTo[givenBy v] B; | 
| 564 | G : preserves (v o f) |] | |
| 13819 | 565 | ==> extend h F\<squnion>G : | 
| 13790 | 566 | (extend_set h A) LeadsTo[givenBy (v o f)] (extend_set h B)" | 
| 567 | apply (cut_tac subset_refl [THEN stable_reachable, THEN project_leadsETo_D_lemma]) | |
| 568 | apply (auto simp add: LeadsETo_def) | |
| 569 | apply (erule leadsETo_mono [THEN [2] rev_subsetD]) | |
| 570 | apply (blast intro: extend_set_givenBy_I) | |
| 571 | apply (simp add: project_set_reachable_extend_eq [symmetric]) | |
| 572 | done | |
| 573 | ||
| 46912 | 574 | lemma extending_leadsETo: | 
| 13790 | 575 | "(ALL G. extend h F ok G --> G : preserves (v o f)) | 
| 576 | ==> extending (%G. UNIV) h F | |
| 577 | (extend_set h A leadsTo[givenBy (v o f)] extend_set h B) | |
| 578 | (A leadsTo[givenBy v] B)" | |
| 579 | apply (unfold extending_def) | |
| 580 | apply (auto simp add: project_leadsETo_D) | |
| 581 | done | |
| 582 | ||
| 46912 | 583 | lemma extending_LeadsETo: | 
| 13790 | 584 | "(ALL G. extend h F ok G --> G : preserves (v o f)) | 
| 13819 | 585 | ==> extending (%G. reachable (extend h F\<squnion>G)) h F | 
| 13790 | 586 | (extend_set h A LeadsTo[givenBy (v o f)] extend_set h B) | 
| 587 | (A LeadsTo[givenBy v] B)" | |
| 588 | apply (unfold extending_def) | |
| 589 | apply (blast intro: project_LeadsETo_D) | |
| 590 | done | |
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13798diff
changeset | 591 | *) | 
| 13790 | 592 | |
| 593 | ||
| 594 | (*** leadsETo in the precondition ***) | |
| 595 | ||
| 596 | (*Lemma for the Trans case*) | |
| 46912 | 597 | lemma pli_lemma: | 
| 67613 | 598 | "[| extend h F\<squnion>G \<in> stable C; | 
| 13819 | 599 | F\<squnion>project h C G | 
| 67613 | 600 | \<in> project_set h C Int project_set h A leadsTo project_set h B |] | 
| 13819 | 601 | ==> F\<squnion>project h C G | 
| 67613 | 602 | \<in> project_set h C Int project_set h A leadsTo | 
| 13790 | 603 | project_set h C Int project_set h B" | 
| 604 | apply (rule psp_stable2 [THEN leadsTo_weaken_L]) | |
| 605 | apply (auto simp add: project_stable_project_set extend_stable_project_set) | |
| 606 | done | |
| 607 | ||
| 46912 | 608 | lemma project_leadsETo_I_lemma: | 
| 67613 | 609 | "[| extend h F\<squnion>G \<in> stable C; | 
| 610 | extend h F\<squnion>G \<in> | |
| 13790 | 611 | (C Int A) leadsTo[(%D. C Int D)`givenBy f] B |] | 
| 13819 | 612 | ==> F\<squnion>project h C G | 
| 67613 | 613 | \<in> (project_set h C Int project_set h (C Int A)) leadsTo (project_set h B)" | 
| 13790 | 614 | apply (erule leadsETo_induct) | 
| 615 | prefer 3 | |
| 616 | apply (simp only: Int_UN_distrib project_set_Union) | |
| 617 | apply (blast intro: leadsTo_UN) | |
| 618 | prefer 2 apply (blast intro: leadsTo_Trans pli_lemma) | |
| 619 | apply (simp add: givenBy_eq_extend_set) | |
| 620 | apply (rule leadsTo_Basis) | |
| 621 | apply (blast intro: ensures_extend_set_imp_project_ensures) | |
| 622 | done | |
| 623 | ||
| 46912 | 624 | lemma project_leadsETo_I: | 
| 67613 | 625 | "extend h F\<squnion>G \<in> (extend_set h A) leadsTo[givenBy f] (extend_set h B) | 
| 626 | \<Longrightarrow> F\<squnion>project h UNIV G \<in> A leadsTo B" | |
| 13790 | 627 | apply (rule project_leadsETo_I_lemma [THEN leadsTo_weaken], auto) | 
| 628 | done | |
| 629 | ||
| 46912 | 630 | lemma project_LeadsETo_I: | 
| 67613 | 631 | "extend h F\<squnion>G \<in> (extend_set h A) LeadsTo[givenBy f] (extend_set h B) | 
| 632 | \<Longrightarrow> F\<squnion>project h (reachable (extend h F\<squnion>G)) G | |
| 633 | \<in> A LeadsTo B" | |
| 13790 | 634 | apply (simp (no_asm_use) add: LeadsTo_def LeadsETo_def) | 
| 635 | apply (rule project_leadsETo_I_lemma [THEN leadsTo_weaken]) | |
| 636 | apply (auto simp add: project_set_reachable_extend_eq [symmetric]) | |
| 637 | done | |
| 638 | ||
| 46912 | 639 | lemma projecting_leadsTo: | 
| 67613 | 640 | "projecting (\<lambda>G. UNIV) h F | 
| 13790 | 641 | (extend_set h A leadsTo[givenBy f] extend_set h B) | 
| 642 | (A leadsTo B)" | |
| 643 | apply (unfold projecting_def) | |
| 644 | apply (force dest: project_leadsETo_I) | |
| 645 | done | |
| 646 | ||
| 46912 | 647 | lemma projecting_LeadsTo: | 
| 67613 | 648 | "projecting (\<lambda>G. reachable (extend h F\<squnion>G)) h F | 
| 13790 | 649 | (extend_set h A LeadsTo[givenBy f] extend_set h B) | 
| 650 | (A LeadsTo B)" | |
| 651 | apply (unfold projecting_def) | |
| 652 | apply (force dest: project_LeadsETo_I) | |
| 653 | done | |
| 654 | ||
| 8044 | 655 | end | 
| 46912 | 656 | |
| 657 | end |