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