| author | wenzelm | 
| Sat, 12 Nov 2016 10:29:01 +0100 | |
| changeset 64500 | 159ea1055b39 | 
| parent 61392 | 331be2820f90 | 
| child 69587 | 53982d5ec0bb | 
| permissions | -rw-r--r-- | 
| 11479 | 1  | 
(* Title: ZF/UNITY/Union.thy  | 
2  | 
Author: Sidi O Ehmety, Computer Laboratory  | 
|
3  | 
Copyright 2001 University of Cambridge  | 
|
4  | 
||
5  | 
Unions of programs  | 
|
6  | 
||
| 46953 | 7  | 
Partly from Misra's Chapter 5 \<in> Asynchronous Compositions of Programs  | 
| 11479 | 8  | 
|
9  | 
Theory ported form HOL..  | 
|
10  | 
||
11  | 
*)  | 
|
12  | 
||
| 24893 | 13  | 
theory Union imports SubstAx FP  | 
14  | 
begin  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
15  | 
|
| 24893 | 16  | 
definition  | 
| 46953 | 17  | 
(*FIXME: conjoin Init(F) \<inter> Init(G) \<noteq> 0 *)  | 
| 24893 | 18  | 
ok :: "[i, i] => o" (infixl "ok" 65) where  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
19  | 
"F ok G == Acts(F) \<subseteq> AllowedActs(G) &  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
20  | 
Acts(G) \<subseteq> AllowedActs(F)"  | 
| 11479 | 21  | 
|
| 24893 | 22  | 
definition  | 
| 46953 | 23  | 
(*FIXME: conjoin (\<Inter>i \<in> I. Init(F(i))) \<noteq> 0 *)  | 
| 24893 | 24  | 
OK :: "[i, i=>i] => o" where  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
25  | 
    "OK(I,F) == (\<forall>i \<in> I. \<forall>j \<in> I-{i}. Acts(F(i)) \<subseteq> AllowedActs(F(j)))"
 | 
| 11479 | 26  | 
|
| 24893 | 27  | 
definition  | 
28  | 
JOIN :: "[i, i=>i] => i" where  | 
|
| 11479 | 29  | 
"JOIN(I,F) == if I = 0 then SKIP else  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
30  | 
mk_program(\<Inter>i \<in> I. Init(F(i)), \<Union>i \<in> I. Acts(F(i)),  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
31  | 
\<Inter>i \<in> I. AllowedActs(F(i)))"  | 
| 11479 | 32  | 
|
| 24893 | 33  | 
definition  | 
| 61392 | 34  | 
Join :: "[i, i] => i" (infixl "\<squnion>" 65) where  | 
35  | 
"F \<squnion> G == mk_program (Init(F) \<inter> Init(G), Acts(F) \<union> Acts(G),  | 
|
| 46823 | 36  | 
AllowedActs(F) \<inter> AllowedActs(G))"  | 
| 24893 | 37  | 
definition  | 
| 11479 | 38  | 
(*Characterizes safety properties. Used with specifying AllowedActs*)  | 
| 24893 | 39  | 
safety_prop :: "i => o" where  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
40  | 
"safety_prop(X) == X\<subseteq>program &  | 
| 46823 | 41  | 
SKIP \<in> X & (\<forall>G \<in> program. Acts(G) \<subseteq> (\<Union>F \<in> X. Acts(F)) \<longrightarrow> G \<in> X)"  | 
| 46953 | 42  | 
|
| 11479 | 43  | 
syntax  | 
| 61392 | 44  | 
  "_JOIN1"  :: "[pttrns, i] => i"     ("(3\<Squnion>_./ _)" 10)
 | 
45  | 
  "_JOIN"   :: "[pttrn, i, i] => i"   ("(3\<Squnion>_ \<in> _./ _)" 10)
 | 
|
| 11479 | 46  | 
|
47  | 
translations  | 
|
| 61392 | 48  | 
"\<Squnion>x \<in> A. B" == "CONST JOIN(A, (\<lambda>x. B))"  | 
49  | 
"\<Squnion>x y. B" == "\<Squnion>x. \<Squnion>y. B"  | 
|
50  | 
"\<Squnion>x. B" == "CONST JOIN(CONST state, (\<lambda>x. B))"  | 
|
| 11479 | 51  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
52  | 
|
| 60770 | 53  | 
subsection\<open>SKIP\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
54  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
55  | 
lemma reachable_SKIP [simp]: "reachable(SKIP) = state"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
56  | 
by (force elim: reachable.induct intro: reachable.intros)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
57  | 
|
| 61392 | 58  | 
text\<open>Elimination programify from ok and \<squnion>\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
59  | 
|
| 46823 | 60  | 
lemma ok_programify_left [iff]: "programify(F) ok G \<longleftrightarrow> F ok G"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
61  | 
by (simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
62  | 
|
| 46823 | 63  | 
lemma ok_programify_right [iff]: "F ok programify(G) \<longleftrightarrow> F ok G"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
64  | 
by (simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
65  | 
|
| 61392 | 66  | 
lemma Join_programify_left [simp]: "programify(F) \<squnion> G = F \<squnion> G"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
67  | 
by (simp add: Join_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
68  | 
|
| 61392 | 69  | 
lemma Join_programify_right [simp]: "F \<squnion> programify(G) = F \<squnion> G"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
70  | 
by (simp add: Join_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
71  | 
|
| 60770 | 72  | 
subsection\<open>SKIP and safety properties\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
73  | 
|
| 46823 | 74  | 
lemma SKIP_in_constrains_iff [iff]: "(SKIP \<in> A co B) \<longleftrightarrow> (A\<subseteq>B & st_set(A))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
75  | 
by (unfold constrains_def st_set_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
76  | 
|
| 46823 | 77  | 
lemma SKIP_in_Constrains_iff [iff]: "(SKIP \<in> A Co B)\<longleftrightarrow> (state \<inter> A\<subseteq>B)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
78  | 
by (unfold Constrains_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
79  | 
|
| 46823 | 80  | 
lemma SKIP_in_stable [iff]: "SKIP \<in> stable(A) \<longleftrightarrow> st_set(A)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
81  | 
by (auto simp add: stable_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
82  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
83  | 
lemma SKIP_in_Stable [iff]: "SKIP \<in> Stable(A)"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
84  | 
by (unfold Stable_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
85  | 
|
| 60770 | 86  | 
subsection\<open>Join and JOIN types\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
87  | 
|
| 61392 | 88  | 
lemma Join_in_program [iff,TC]: "F \<squnion> G \<in> program"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
89  | 
by (unfold Join_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
90  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
91  | 
lemma JOIN_in_program [iff,TC]: "JOIN(I,F) \<in> program"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
92  | 
by (unfold JOIN_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
93  | 
|
| 60770 | 94  | 
subsection\<open>Init, Acts, and AllowedActs of Join and JOIN\<close>  | 
| 61392 | 95  | 
lemma Init_Join [simp]: "Init(F \<squnion> G) = Init(F) \<inter> Init(G)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
96  | 
by (simp add: Int_assoc Join_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
97  | 
|
| 61392 | 98  | 
lemma Acts_Join [simp]: "Acts(F \<squnion> G) = Acts(F) \<union> Acts(G)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
99  | 
by (simp add: Int_Un_distrib2 cons_absorb Join_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
100  | 
|
| 61392 | 101  | 
lemma AllowedActs_Join [simp]: "AllowedActs(F \<squnion> G) =  | 
| 46823 | 102  | 
AllowedActs(F) \<inter> AllowedActs(G)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
103  | 
apply (simp add: Int_assoc cons_absorb Join_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
104  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
105  | 
|
| 60770 | 106  | 
subsection\<open>Join's algebraic laws\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
107  | 
|
| 61392 | 108  | 
lemma Join_commute: "F \<squnion> G = G \<squnion> F"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
109  | 
by (simp add: Join_def Un_commute Int_commute)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
110  | 
|
| 61392 | 111  | 
lemma Join_left_commute: "A \<squnion> (B \<squnion> C) = B \<squnion> (A \<squnion> C)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
112  | 
apply (simp add: Join_def Int_Un_distrib2 cons_absorb)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
113  | 
apply (simp add: Un_ac Int_ac Int_Un_distrib2 cons_absorb)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
114  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
115  | 
|
| 61392 | 116  | 
lemma Join_assoc: "(F \<squnion> G) \<squnion> H = F \<squnion> (G \<squnion> H)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
117  | 
by (simp add: Un_ac Join_def cons_absorb Int_assoc Int_Un_distrib2)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
118  | 
|
| 60770 | 119  | 
subsection\<open>Needed below\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
120  | 
lemma cons_id [simp]: "cons(id(state), Pow(state * state)) = Pow(state*state)"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
121  | 
by auto  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
122  | 
|
| 61392 | 123  | 
lemma Join_SKIP_left [simp]: "SKIP \<squnion> F = programify(F)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
124  | 
apply (unfold Join_def SKIP_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
125  | 
apply (auto simp add: Int_absorb cons_eq)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
126  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
127  | 
|
| 61392 | 128  | 
lemma Join_SKIP_right [simp]: "F \<squnion> SKIP = programify(F)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
129  | 
apply (subst Join_commute)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
130  | 
apply (simp add: Join_SKIP_left)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
131  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
132  | 
|
| 61392 | 133  | 
lemma Join_absorb [simp]: "F \<squnion> F = programify(F)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
134  | 
by (rule program_equalityI, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
135  | 
|
| 61392 | 136  | 
lemma Join_left_absorb: "F \<squnion> (F \<squnion> G) = F \<squnion> G"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
137  | 
by (simp add: Join_assoc [symmetric])  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
138  | 
|
| 60770 | 139  | 
subsection\<open>Join is an AC-operator\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
140  | 
lemmas Join_ac = Join_assoc Join_left_absorb Join_commute Join_left_commute  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
141  | 
|
| 61392 | 142  | 
subsection\<open>Eliminating programify form JOIN and OK expressions\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
143  | 
|
| 46823 | 144  | 
lemma OK_programify [iff]: "OK(I, %x. programify(F(x))) \<longleftrightarrow> OK(I, F)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
145  | 
by (simp add: OK_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
146  | 
|
| 61392 | 147  | 
lemma JOIN_programify [iff]: "JOIN(I, %x. programify(F(x))) = JOIN(I, F)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
148  | 
by (simp add: JOIN_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
149  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
150  | 
|
| 61392 | 151  | 
subsection\<open>JOIN\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
152  | 
|
| 61392 | 153  | 
lemma JOIN_empty [simp]: "JOIN(0, F) = SKIP"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
154  | 
by (unfold JOIN_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
155  | 
|
| 61392 | 156  | 
lemma Init_JOIN [simp]:  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
157  | 
"Init(\<Squnion>i \<in> I. F(i)) = (if I=0 then state else (\<Inter>i \<in> I. Init(F(i))))"  | 
| 
14095
 
a1ba833d6b61
Changed many Intersection rules from i:I to I~=0 to avoid introducing a new
 
paulson 
parents: 
14093 
diff
changeset
 | 
158  | 
by (simp add: JOIN_def INT_extend_simps del: INT_simps)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
159  | 
|
| 61392 | 160  | 
lemma Acts_JOIN [simp]:  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
161  | 
"Acts(JOIN(I,F)) = cons(id(state), \<Union>i \<in> I. Acts(F(i)))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
162  | 
apply (unfold JOIN_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
163  | 
apply (auto simp del: INT_simps UN_simps)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
164  | 
apply (rule equalityI)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
165  | 
apply (auto dest: Acts_type [THEN subsetD])  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
166  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
167  | 
|
| 61392 | 168  | 
lemma AllowedActs_JOIN [simp]:  | 
| 46953 | 169  | 
"AllowedActs(\<Squnion>i \<in> I. F(i)) =  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
170  | 
(if I=0 then Pow(state*state) else (\<Inter>i \<in> I. AllowedActs(F(i))))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
171  | 
apply (unfold JOIN_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
172  | 
apply (rule equalityI)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
173  | 
apply (auto elim!: not_emptyE dest: AllowedActs_type [THEN subsetD])  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
174  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
175  | 
|
| 61392 | 176  | 
lemma JOIN_cons [simp]: "(\<Squnion>i \<in> cons(a,I). F(i)) = F(a) \<squnion> (\<Squnion>i \<in> I. F(i))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
177  | 
by (rule program_equalityI, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
178  | 
|
| 61392 | 179  | 
lemma JOIN_cong [cong]:  | 
| 46953 | 180  | 
"[| I=J; !!i. i \<in> J ==> F(i) = G(i) |] ==>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
181  | 
(\<Squnion>i \<in> I. F(i)) = (\<Squnion>i \<in> J. G(i))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
182  | 
by (simp add: JOIN_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
183  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
184  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
185  | 
|
| 61392 | 186  | 
subsection\<open>JOIN laws\<close>  | 
187  | 
lemma JOIN_absorb: "k \<in> I ==>F(k) \<squnion> (\<Squnion>i \<in> I. F(i)) = (\<Squnion>i \<in> I. F(i))"  | 
|
188  | 
apply (subst JOIN_cons [symmetric])  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
189  | 
apply (auto simp add: cons_absorb)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
190  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
191  | 
|
| 61392 | 192  | 
lemma JOIN_Un: "(\<Squnion>i \<in> I \<union> J. F(i)) = ((\<Squnion>i \<in> I. F(i)) \<squnion> (\<Squnion>i \<in> J. F(i)))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
193  | 
apply (rule program_equalityI)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
194  | 
apply (simp_all add: UN_Un INT_Un)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
195  | 
apply (simp_all del: INT_simps add: INT_extend_simps, blast)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
196  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
197  | 
|
| 61392 | 198  | 
lemma JOIN_constant: "(\<Squnion>i \<in> I. c) = (if I=0 then SKIP else programify(c))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
199  | 
by (rule program_equalityI, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
200  | 
|
| 61392 | 201  | 
lemma JOIN_Join_distrib:  | 
202  | 
"(\<Squnion>i \<in> I. F(i) \<squnion> G(i)) = (\<Squnion>i \<in> I. F(i)) \<squnion> (\<Squnion>i \<in> I. G(i))"  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
203  | 
apply (rule program_equalityI)  | 
| 46953 | 204  | 
apply (simp_all add: INT_Int_distrib, blast)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
205  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
206  | 
|
| 61392 | 207  | 
lemma JOIN_Join_miniscope: "(\<Squnion>i \<in> I. F(i) \<squnion> G) = ((\<Squnion>i \<in> I. F(i) \<squnion> G))"  | 
208  | 
by (simp add: JOIN_Join_distrib JOIN_constant)  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
209  | 
|
| 61392 | 210  | 
text\<open>Used to prove guarantees_JOIN_I\<close>  | 
211  | 
lemma JOIN_Join_diff: "i \<in> I==>F(i) \<squnion> JOIN(I - {i}, F) = JOIN(I, F)"
 | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
212  | 
apply (rule program_equalityI)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
213  | 
apply (auto elim!: not_emptyE)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
214  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
215  | 
|
| 60770 | 216  | 
subsection\<open>Safety: co, stable, FP\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
217  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
218  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
219  | 
(*Fails if I=0 because it collapses to SKIP \<in> A co B, i.e. to A\<subseteq>B. So an  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
220  | 
alternative precondition is A\<subseteq>B, but most proofs using this rule require  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
221  | 
I to be nonempty for other reasons anyway.*)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
222  | 
|
| 61392 | 223  | 
lemma JOIN_constrains:  | 
| 46823 | 224  | 
"i \<in> I==>(\<Squnion>i \<in> I. F(i)) \<in> A co B \<longleftrightarrow> (\<forall>i \<in> I. programify(F(i)) \<in> A co B)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
225  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
226  | 
apply (unfold constrains_def JOIN_def st_set_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
227  | 
prefer 2 apply blast  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
228  | 
apply (rename_tac j act y z)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
229  | 
apply (cut_tac F = "F (j) " in Acts_type)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
230  | 
apply (drule_tac x = act in bspec, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
231  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
232  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
233  | 
lemma Join_constrains [iff]:  | 
| 61392 | 234  | 
"(F \<squnion> G \<in> A co B) \<longleftrightarrow> (programify(F) \<in> A co B & programify(G) \<in> A co B)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
235  | 
by (auto simp add: constrains_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
236  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
237  | 
lemma Join_unless [iff]:  | 
| 61392 | 238  | 
"(F \<squnion> G \<in> A unless B) \<longleftrightarrow>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
239  | 
(programify(F) \<in> A unless B & programify(G) \<in> A unless B)"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
240  | 
by (simp add: Join_constrains unless_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
241  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
242  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
243  | 
(*Analogous weak versions FAIL; see Misra [1994] 5.4.1, Substitution Axiom.  | 
| 61392 | 244  | 
reachable (F \<squnion> G) could be much bigger than reachable F, reachable G  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
245  | 
*)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
246  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
247  | 
lemma Join_constrains_weaken:  | 
| 46953 | 248  | 
"[| F \<in> A co A'; G \<in> B co B' |]  | 
| 61392 | 249  | 
==> F \<squnion> G \<in> (A \<inter> B) co (A' \<union> B')"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
250  | 
apply (subgoal_tac "st_set (A) & st_set (B) & F \<in> program & G \<in> program")  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
251  | 
prefer 2 apply (blast dest: constrainsD2, simp)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
252  | 
apply (blast intro: constrains_weaken)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
253  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
254  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
255  | 
(*If I=0, it degenerates to SKIP \<in> state co 0, which is false.*)  | 
| 61392 | 256  | 
lemma JOIN_constrains_weaken:  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
257  | 
assumes major: "(!!i. i \<in> I ==> F(i) \<in> A(i) co A'(i))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
258  | 
and minor: "i \<in> I"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
259  | 
shows "(\<Squnion>i \<in> I. F(i)) \<in> (\<Inter>i \<in> I. A(i)) co (\<Union>i \<in> I. A'(i))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
260  | 
apply (cut_tac minor)  | 
| 61392 | 261  | 
apply (simp (no_asm_simp) add: JOIN_constrains)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
262  | 
apply clarify  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
263  | 
apply (rename_tac "j")  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
264  | 
apply (frule_tac i = j in major)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
265  | 
apply (frule constrainsD2, simp)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
266  | 
apply (blast intro: constrains_weaken)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
267  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
268  | 
|
| 61392 | 269  | 
lemma JOIN_stable:  | 
| 46823 | 270  | 
"(\<Squnion>i \<in> I. F(i)) \<in> stable(A) \<longleftrightarrow> ((\<forall>i \<in> I. programify(F(i)) \<in> stable(A)) & st_set(A))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
271  | 
apply (auto simp add: stable_def constrains_def JOIN_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
272  | 
apply (cut_tac F = "F (i) " in Acts_type)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
273  | 
apply (drule_tac x = act in bspec, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
274  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
275  | 
|
| 61392 | 276  | 
lemma initially_JOIN_I:  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
277  | 
assumes major: "(!!i. i \<in> I ==>F(i) \<in> initially(A))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
278  | 
and minor: "i \<in> I"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
279  | 
shows "(\<Squnion>i \<in> I. F(i)) \<in> initially(A)"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
280  | 
apply (cut_tac minor)  | 
| 46953 | 281  | 
apply (auto elim!: not_emptyE simp add: Inter_iff initially_def)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
282  | 
apply (frule_tac i = x in major)  | 
| 46953 | 283  | 
apply (auto simp add: initially_def)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
284  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
285  | 
|
| 61392 | 286  | 
lemma invariant_JOIN_I:  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
287  | 
assumes major: "(!!i. i \<in> I ==> F(i) \<in> invariant(A))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
288  | 
and minor: "i \<in> I"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
289  | 
shows "(\<Squnion>i \<in> I. F(i)) \<in> invariant(A)"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
290  | 
apply (cut_tac minor)  | 
| 61392 | 291  | 
apply (auto intro!: initially_JOIN_I dest: major simp add: invariant_def JOIN_stable)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
292  | 
apply (erule_tac V = "i \<in> I" in thin_rl)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
293  | 
apply (frule major)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
294  | 
apply (drule_tac [2] major)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
295  | 
apply (auto simp add: invariant_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
296  | 
apply (frule stableD2, force)+  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
297  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
298  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
299  | 
lemma Join_stable [iff]:  | 
| 61392 | 300  | 
" (F \<squnion> G \<in> stable(A)) \<longleftrightarrow>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
301  | 
(programify(F) \<in> stable(A) & programify(G) \<in> stable(A))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
302  | 
by (simp add: stable_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
303  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
304  | 
lemma initially_JoinI [intro!]:  | 
| 61392 | 305  | 
"[| F \<in> initially(A); G \<in> initially(A) |] ==> F \<squnion> G \<in> initially(A)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
306  | 
by (unfold initially_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
307  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
308  | 
lemma invariant_JoinI:  | 
| 46953 | 309  | 
"[| F \<in> invariant(A); G \<in> invariant(A) |]  | 
| 61392 | 310  | 
==> F \<squnion> G \<in> invariant(A)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
311  | 
apply (subgoal_tac "F \<in> program&G \<in> program")  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
312  | 
prefer 2 apply (blast dest: invariantD2)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
313  | 
apply (simp add: invariant_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
314  | 
apply (auto intro: Join_in_program)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
315  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
316  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
317  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
318  | 
(* Fails if I=0 because \<Inter>i \<in> 0. A(i) = 0 *)  | 
| 61392 | 319  | 
lemma FP_JOIN: "i \<in> I ==> FP(\<Squnion>i \<in> I. F(i)) = (\<Inter>i \<in> I. FP (programify(F(i))))"  | 
320  | 
by (auto simp add: FP_def Inter_def st_set_def JOIN_stable)  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
321  | 
|
| 60770 | 322  | 
subsection\<open>Progress: transient, ensures\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
323  | 
|
| 61392 | 324  | 
lemma JOIN_transient:  | 
| 46953 | 325  | 
"i \<in> I ==>  | 
| 46823 | 326  | 
(\<Squnion>i \<in> I. F(i)) \<in> transient(A) \<longleftrightarrow> (\<exists>i \<in> I. programify(F(i)) \<in> transient(A))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
327  | 
apply (auto simp add: transient_def JOIN_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
328  | 
apply (unfold st_set_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
329  | 
apply (drule_tac [2] x = act in bspec)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
330  | 
apply (auto dest: Acts_type [THEN subsetD])  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
331  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
332  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
333  | 
lemma Join_transient [iff]:  | 
| 61392 | 334  | 
"F \<squnion> G \<in> transient(A) \<longleftrightarrow>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
335  | 
(programify(F) \<in> transient(A) | programify(G) \<in> transient(A))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
336  | 
apply (auto simp add: transient_def Join_def Int_Un_distrib2)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
337  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
338  | 
|
| 61392 | 339  | 
lemma Join_transient_I1: "F \<in> transient(A) ==> F \<squnion> G \<in> transient(A)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
340  | 
by (simp add: Join_transient transientD2)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
341  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
342  | 
|
| 61392 | 343  | 
lemma Join_transient_I2: "G \<in> transient(A) ==> F \<squnion> G \<in> transient(A)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
344  | 
by (simp add: Join_transient transientD2)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
345  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
346  | 
(*If I=0 it degenerates to (SKIP \<in> A ensures B) = False, i.e. to ~(A\<subseteq>B) *)  | 
| 61392 | 347  | 
lemma JOIN_ensures:  | 
| 46953 | 348  | 
"i \<in> I ==>  | 
349  | 
(\<Squnion>i \<in> I. F(i)) \<in> A ensures B \<longleftrightarrow>  | 
|
350  | 
((\<forall>i \<in> I. programify(F(i)) \<in> (A-B) co (A \<union> B)) &  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
351  | 
(\<exists>i \<in> I. programify(F(i)) \<in> A ensures B))"  | 
| 61392 | 352  | 
by (auto simp add: ensures_def JOIN_constrains JOIN_transient)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
353  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
354  | 
|
| 46953 | 355  | 
lemma Join_ensures:  | 
| 61392 | 356  | 
"F \<squnion> G \<in> A ensures B \<longleftrightarrow>  | 
| 46953 | 357  | 
(programify(F) \<in> (A-B) co (A \<union> B) & programify(G) \<in> (A-B) co (A \<union> B) &  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
358  | 
(programify(F) \<in> transient (A-B) | programify(G) \<in> transient (A-B)))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
359  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
360  | 
apply (unfold ensures_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
361  | 
apply (auto simp add: Join_transient)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
362  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
363  | 
|
| 46953 | 364  | 
lemma stable_Join_constrains:  | 
365  | 
"[| F \<in> stable(A); G \<in> A co A' |]  | 
|
| 61392 | 366  | 
==> F \<squnion> G \<in> A co A'"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
367  | 
apply (unfold stable_def constrains_def Join_def st_set_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
368  | 
apply (cut_tac F = F in Acts_type)  | 
| 46953 | 369  | 
apply (cut_tac F = G in Acts_type, force)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
370  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
371  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
372  | 
(*Premise for G cannot use Always because F \<in> Stable A is  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
373  | 
weaker than G \<in> stable A *)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
374  | 
lemma stable_Join_Always1:  | 
| 61392 | 375  | 
"[| F \<in> stable(A); G \<in> invariant(A) |] ==> F \<squnion> G \<in> Always(A)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
376  | 
apply (subgoal_tac "F \<in> program & G \<in> program & st_set (A) ")  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
377  | 
prefer 2 apply (blast dest: invariantD2 stableD2)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
378  | 
apply (simp add: Always_def invariant_def initially_def Stable_eq_stable)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
379  | 
apply (force intro: stable_Int)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
380  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
381  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
382  | 
(*As above, but exchanging the roles of F and G*)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
383  | 
lemma stable_Join_Always2:  | 
| 61392 | 384  | 
"[| F \<in> invariant(A); G \<in> stable(A) |] ==> F \<squnion> G \<in> Always(A)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
385  | 
apply (subst Join_commute)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
386  | 
apply (blast intro: stable_Join_Always1)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
387  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
388  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
389  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
390  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
391  | 
lemma stable_Join_ensures1:  | 
| 61392 | 392  | 
"[| F \<in> stable(A); G \<in> A ensures B |] ==> F \<squnion> G \<in> A ensures B"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
393  | 
apply (subgoal_tac "F \<in> program & G \<in> program & st_set (A) ")  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
394  | 
prefer 2 apply (blast dest: stableD2 ensures_type [THEN subsetD])  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
395  | 
apply (simp (no_asm_simp) add: Join_ensures)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
396  | 
apply (simp add: stable_def ensures_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
397  | 
apply (erule constrains_weaken, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
398  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
399  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
400  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
401  | 
(*As above, but exchanging the roles of F and G*)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
402  | 
lemma stable_Join_ensures2:  | 
| 61392 | 403  | 
"[| F \<in> A ensures B; G \<in> stable(A) |] ==> F \<squnion> G \<in> A ensures B"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
404  | 
apply (subst Join_commute)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
405  | 
apply (blast intro: stable_Join_ensures1)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
406  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
407  | 
|
| 60770 | 408  | 
subsection\<open>The ok and OK relations\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
409  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
410  | 
lemma ok_SKIP1 [iff]: "SKIP ok F"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
411  | 
by (auto dest: Acts_type [THEN subsetD] simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
412  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
413  | 
lemma ok_SKIP2 [iff]: "F ok SKIP"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
414  | 
by (auto dest: Acts_type [THEN subsetD] simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
415  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
416  | 
lemma ok_Join_commute:  | 
| 61392 | 417  | 
"(F ok G & (F \<squnion> G) ok H) \<longleftrightarrow> (G ok H & F ok (G \<squnion> H))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
418  | 
by (auto simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
419  | 
|
| 46823 | 420  | 
lemma ok_commute: "(F ok G) \<longleftrightarrow>(G ok F)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
421  | 
by (auto simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
422  | 
|
| 45602 | 423  | 
lemmas ok_sym = ok_commute [THEN iffD1]  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
424  | 
|
| 61392 | 425  | 
lemma ok_iff_OK: "OK({<0,F>,<1,G>,<2,H>}, snd) \<longleftrightarrow> (F ok G & (F \<squnion> G) ok H)"
 | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
426  | 
by (simp add: ok_def Join_def OK_def Int_assoc cons_absorb  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
427  | 
Int_Un_distrib2 Ball_def, safe, force+)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
428  | 
|
| 61392 | 429  | 
lemma ok_Join_iff1 [iff]: "F ok (G \<squnion> H) \<longleftrightarrow> (F ok G & F ok H)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
430  | 
by (auto simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
431  | 
|
| 61392 | 432  | 
lemma ok_Join_iff2 [iff]: "(G \<squnion> H) ok F \<longleftrightarrow> (G ok F & H ok F)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
433  | 
by (auto simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
434  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
435  | 
(*useful? Not with the previous two around*)  | 
| 61392 | 436  | 
lemma ok_Join_commute_I: "[| F ok G; (F \<squnion> G) ok H |] ==> F ok (G \<squnion> H)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
437  | 
by (auto simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
438  | 
|
| 61392 | 439  | 
lemma ok_JOIN_iff1 [iff]: "F ok JOIN(I,G) \<longleftrightarrow> (\<forall>i \<in> I. F ok G(i))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
440  | 
by (force dest: Acts_type [THEN subsetD] elim!: not_emptyE simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
441  | 
|
| 61392 | 442  | 
lemma ok_JOIN_iff2 [iff]: "JOIN(I,G) ok F \<longleftrightarrow> (\<forall>i \<in> I. G(i) ok F)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
443  | 
apply (auto elim!: not_emptyE simp add: ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
444  | 
apply (blast dest: Acts_type [THEN subsetD])  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
445  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
446  | 
|
| 46823 | 447  | 
lemma OK_iff_ok: "OK(I,F) \<longleftrightarrow> (\<forall>i \<in> I. \<forall>j \<in> I-{i}. F(i) ok (F(j)))"
 | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
448  | 
by (auto simp add: ok_def OK_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
449  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
450  | 
lemma OK_imp_ok: "[| OK(I,F); i \<in> I; j \<in> I; i\<noteq>j|] ==> F(i) ok F(j)"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
451  | 
by (auto simp add: OK_iff_ok)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
452  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
453  | 
|
| 
14093
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
454  | 
lemma OK_0 [iff]: "OK(0,F)"  | 
| 
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
455  | 
by (simp add: OK_def)  | 
| 
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
456  | 
|
| 
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
457  | 
lemma OK_cons_iff:  | 
| 46953 | 458  | 
"OK(cons(i, I), F) \<longleftrightarrow>  | 
| 
14093
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
459  | 
(i \<in> I & OK(I, F)) | (i\<notin>I & OK(I, F) & F(i) ok JOIN(I,F))"  | 
| 
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
460  | 
apply (simp add: OK_iff_ok)  | 
| 46953 | 461  | 
apply (blast intro: ok_sym)  | 
| 
14093
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
462  | 
done  | 
| 
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
463  | 
|
| 
 
24382760fd89
converting more theories to Isar scripts, and tidying
 
paulson 
parents: 
14092 
diff
changeset
 | 
464  | 
|
| 60770 | 465  | 
subsection\<open>Allowed\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
466  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
467  | 
lemma Allowed_SKIP [simp]: "Allowed(SKIP) = program"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
468  | 
by (auto dest: Acts_type [THEN subsetD] simp add: Allowed_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
469  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
470  | 
lemma Allowed_Join [simp]:  | 
| 61392 | 471  | 
"Allowed(F \<squnion> G) =  | 
| 46823 | 472  | 
Allowed(programify(F)) \<inter> Allowed(programify(G))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
473  | 
apply (auto simp add: Allowed_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
474  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
475  | 
|
| 61392 | 476  | 
lemma Allowed_JOIN [simp]:  | 
| 46953 | 477  | 
"i \<in> I ==>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
478  | 
Allowed(JOIN(I,F)) = (\<Inter>i \<in> I. Allowed(programify(F(i))))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
479  | 
apply (auto simp add: Allowed_def, blast)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
480  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
481  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
482  | 
lemma ok_iff_Allowed:  | 
| 46953 | 483  | 
"F ok G \<longleftrightarrow> (programify(F) \<in> Allowed(programify(G)) &  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
484  | 
programify(G) \<in> Allowed(programify(F)))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
485  | 
by (simp add: ok_def Allowed_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
486  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
487  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
488  | 
lemma OK_iff_Allowed:  | 
| 46953 | 489  | 
"OK(I,F) \<longleftrightarrow>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
490  | 
  (\<forall>i \<in> I. \<forall>j \<in> I-{i}. programify(F(i)) \<in> Allowed(programify(F(j))))"
 | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
491  | 
apply (auto simp add: OK_iff_ok ok_iff_Allowed)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
492  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
493  | 
|
| 60770 | 494  | 
subsection\<open>safety_prop, for reasoning about given instances of "ok"\<close>  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
495  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
496  | 
lemma safety_prop_Acts_iff:  | 
| 46823 | 497  | 
"safety_prop(X) ==> (Acts(G) \<subseteq> cons(id(state), (\<Union>F \<in> X. Acts(F)))) \<longleftrightarrow> (programify(G) \<in> X)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
498  | 
apply (simp (no_asm_use) add: safety_prop_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
499  | 
apply clarify  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
500  | 
apply (case_tac "G \<in> program", simp_all, blast, safe)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
501  | 
prefer 2 apply force  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
502  | 
apply (force simp add: programify_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
503  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
504  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
505  | 
lemma safety_prop_AllowedActs_iff_Allowed:  | 
| 46953 | 506  | 
"safety_prop(X) ==>  | 
| 46823 | 507  | 
(\<Union>G \<in> X. Acts(G)) \<subseteq> AllowedActs(F) \<longleftrightarrow> (X \<subseteq> Allowed(programify(F)))"  | 
| 46953 | 508  | 
apply (simp add: Allowed_def safety_prop_Acts_iff [THEN iff_sym]  | 
509  | 
safety_prop_def, blast)  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
510  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
511  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
512  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
513  | 
lemma Allowed_eq:  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
514  | 
"safety_prop(X) ==> Allowed(mk_program(init, acts, \<Union>F \<in> X. Acts(F))) = X"  | 
| 46823 | 515  | 
apply (subgoal_tac "cons (id (state), \<Union>(RepFun (X, Acts)) \<inter> Pow (state * state)) = \<Union>(RepFun (X, Acts))")  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
516  | 
apply (rule_tac [2] equalityI)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
517  | 
apply (simp del: UN_simps add: Allowed_def safety_prop_Acts_iff safety_prop_def, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
518  | 
apply (force dest: Acts_type [THEN subsetD] simp add: safety_prop_def)+  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
519  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
520  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
521  | 
lemma def_prg_Allowed:  | 
| 46953 | 522  | 
"[| F == mk_program (init, acts, \<Union>F \<in> X. Acts(F)); safety_prop(X) |]  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
523  | 
==> Allowed(F) = X"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
524  | 
by (simp add: Allowed_eq)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
525  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
526  | 
(*For safety_prop to hold, the property must be satisfiable!*)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
527  | 
lemma safety_prop_constrains [iff]:  | 
| 46823 | 528  | 
"safety_prop(A co B) \<longleftrightarrow> (A \<subseteq> B & st_set(A))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
529  | 
by (simp add: safety_prop_def constrains_def st_set_def, blast)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
530  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
531  | 
(* To be used with resolution *)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
532  | 
lemma safety_prop_constrainsI [iff]:  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
533  | 
"[| A\<subseteq>B; st_set(A) |] ==>safety_prop(A co B)"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
534  | 
by auto  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
535  | 
|
| 46823 | 536  | 
lemma safety_prop_stable [iff]: "safety_prop(stable(A)) \<longleftrightarrow> st_set(A)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
537  | 
by (simp add: stable_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
538  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
539  | 
lemma safety_prop_stableI: "st_set(A) ==> safety_prop(stable(A))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
540  | 
by auto  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
541  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
542  | 
lemma safety_prop_Int [simp]:  | 
| 46823 | 543  | 
"[| safety_prop(X) ; safety_prop(Y) |] ==> safety_prop(X \<inter> Y)"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
544  | 
apply (simp add: safety_prop_def, safe, blast)  | 
| 46823 | 545  | 
apply (drule_tac [2] B = "\<Union>(RepFun (X \<inter> Y, Acts))" and C = "\<Union>(RepFun (Y, Acts))" in subset_trans)  | 
546  | 
apply (drule_tac B = "\<Union>(RepFun (X \<inter> Y, Acts))" and C = "\<Union>(RepFun (X, Acts))" in subset_trans)  | 
|
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
547  | 
apply blast+  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
548  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
549  | 
|
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
550  | 
(* If I=0 the conclusion becomes safety_prop(0) which is false *)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
551  | 
lemma safety_prop_Inter:  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
552  | 
assumes major: "(!!i. i \<in> I ==>safety_prop(X(i)))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
553  | 
and minor: "i \<in> I"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
554  | 
shows "safety_prop(\<Inter>i \<in> I. X(i))"  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
555  | 
apply (simp add: safety_prop_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
556  | 
apply (cut_tac minor, safe)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
557  | 
apply (simp (no_asm_use) add: Inter_iff)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
558  | 
apply clarify  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
559  | 
apply (frule major)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
560  | 
apply (drule_tac [2] i = xa in major)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
561  | 
apply (frule_tac [4] i = xa in major)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
562  | 
apply (auto simp add: safety_prop_def)  | 
| 46823 | 563  | 
apply (drule_tac B = "\<Union>(RepFun (\<Inter>(RepFun (I, X)), Acts))" and C = "\<Union>(RepFun (X (xa), Acts))" in subset_trans)  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
564  | 
apply blast+  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
565  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
566  | 
|
| 46953 | 567  | 
lemma def_UNION_ok_iff:  | 
568  | 
"[| F == mk_program(init,acts, \<Union>G \<in> X. Acts(G)); safety_prop(X) |]  | 
|
| 46823 | 569  | 
==> F ok G \<longleftrightarrow> (programify(G) \<in> X & acts \<inter> Pow(state*state) \<subseteq> AllowedActs(G))"  | 
| 
14092
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
570  | 
apply (unfold ok_def)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
571  | 
apply (drule_tac G = G in safety_prop_Acts_iff)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
572  | 
apply (cut_tac F = G in AllowedActs_type)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
573  | 
apply (cut_tac F = G in Acts_type, auto)  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
574  | 
done  | 
| 
 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 
paulson 
parents: 
12195 
diff
changeset
 | 
575  | 
|
| 11479 | 576  | 
end  |