40 |
42 |
41 funPair :: "['a => 'b, 'a => 'c, 'a] => 'b * 'c" |
43 funPair :: "['a => 'b, 'a => 'c, 'a] => 'b * 'c" |
42 "funPair f g == %x. (f x, g x)" |
44 "funPair f g == %x. (f x, g x)" |
43 |
45 |
44 |
46 |
45 (*** component <= ***) |
47 subsection{*The component relation*} |
46 lemma componentI: |
48 lemma componentI: |
47 "H <= F | H <= G ==> H <= (F Join G)" |
49 "H <= F | H <= G ==> H <= (F Join G)" |
48 apply (unfold component_def, auto) |
50 apply (unfold component_def, auto) |
49 apply (rule_tac x = "G Join Ga" in exI) |
51 apply (rule_tac x = "G Join Ga" in exI) |
50 apply (rule_tac [2] x = "G Join F" in exI) |
52 apply (rule_tac [2] x = "G Join F" in exI) |
74 lemma component_Join1: "F <= (F Join G)" |
76 lemma component_Join1: "F <= (F Join G)" |
75 by (unfold component_def, blast) |
77 by (unfold component_def, blast) |
76 |
78 |
77 lemma component_Join2: "G <= (F Join G)" |
79 lemma component_Join2: "G <= (F Join G)" |
78 apply (unfold component_def) |
80 apply (unfold component_def) |
79 apply (simp (no_asm) add: Join_commute) |
81 apply (simp add: Join_commute, blast) |
80 apply blast |
|
81 done |
82 done |
82 |
83 |
83 lemma Join_absorb1: "F<=G ==> F Join G = G" |
84 lemma Join_absorb1: "F<=G ==> F Join G = G" |
84 by (auto simp add: component_def Join_left_absorb) |
85 by (auto simp add: component_def Join_left_absorb) |
85 |
86 |
86 lemma Join_absorb2: "G<=F ==> F Join G = F" |
87 lemma Join_absorb2: "G<=F ==> F Join G = F" |
87 by (auto simp add: Join_ac component_def) |
88 by (auto simp add: Join_ac component_def) |
88 |
89 |
89 lemma JN_component_iff: "((JOIN I F) <= H) = (ALL i: I. F i <= H)" |
90 lemma JN_component_iff: "((JOIN I F) <= H) = (ALL i: I. F i <= H)" |
90 apply (simp (no_asm) add: component_eq_subset) |
91 by (simp add: component_eq_subset, blast) |
91 apply blast |
|
92 done |
|
93 |
92 |
94 lemma component_JN: "i : I ==> (F i) <= (JN i:I. (F i))" |
93 lemma component_JN: "i : I ==> (F i) <= (JN i:I. (F i))" |
95 apply (unfold component_def) |
94 apply (unfold component_def) |
96 apply (blast intro: JN_absorb) |
95 apply (blast intro: JN_absorb) |
97 done |
96 done |
105 apply (simp (no_asm_use) add: component_eq_subset) |
104 apply (simp (no_asm_use) add: component_eq_subset) |
106 apply (blast intro!: program_equalityI) |
105 apply (blast intro!: program_equalityI) |
107 done |
106 done |
108 |
107 |
109 lemma Join_component_iff: "((F Join G) <= H) = (F <= H & G <= H)" |
108 lemma Join_component_iff: "((F Join G) <= H) = (F <= H & G <= H)" |
110 apply (simp (no_asm) add: component_eq_subset) |
109 by (simp add: component_eq_subset, blast) |
111 apply blast |
|
112 done |
|
113 |
110 |
114 lemma component_constrains: "[| F <= G; G : A co B |] ==> F : A co B" |
111 lemma component_constrains: "[| F <= G; G : A co B |] ==> F : A co B" |
115 by (auto simp add: constrains_def component_eq_subset) |
112 by (auto simp add: constrains_def component_eq_subset) |
116 |
113 |
117 (*Used in Guar.thy to show that programs are partially ordered*) |
114 (*Used in Guar.thy to show that programs are partially ordered*) |
118 lemmas program_less_le = strict_component_def [THEN meta_eq_to_obj_eq] |
115 lemmas program_less_le = strict_component_def [THEN meta_eq_to_obj_eq] |
119 |
116 |
120 |
117 |
121 (*** preserves ***) |
118 subsection{*The preserves property*} |
122 |
119 |
123 lemma preservesI: "(!!z. F : stable {s. v s = z}) ==> F : preserves v" |
120 lemma preservesI: "(!!z. F : stable {s. v s = z}) ==> F : preserves v" |
124 by (unfold preserves_def, blast) |
121 by (unfold preserves_def, blast) |
125 |
122 |
126 lemma preserves_imp_eq: |
123 lemma preserves_imp_eq: |
133 apply (unfold preserves_def, auto) |
130 apply (unfold preserves_def, auto) |
134 done |
131 done |
135 |
132 |
136 lemma JN_preserves [iff]: |
133 lemma JN_preserves [iff]: |
137 "(JOIN I F : preserves v) = (ALL i:I. F i : preserves v)" |
134 "(JOIN I F : preserves v) = (ALL i:I. F i : preserves v)" |
138 apply (simp (no_asm) add: JN_stable preserves_def) |
135 apply (simp add: JN_stable preserves_def, blast) |
139 apply blast |
|
140 done |
136 done |
141 |
137 |
142 lemma SKIP_preserves [iff]: "SKIP : preserves v" |
138 lemma SKIP_preserves [iff]: "SKIP : preserves v" |
143 by (auto simp add: preserves_def) |
139 by (auto simp add: preserves_def) |
144 |
140 |
151 (* (F : preserves (funPair v w)) = (F : preserves v Int preserves w) *) |
147 (* (F : preserves (funPair v w)) = (F : preserves v Int preserves w) *) |
152 declare preserves_funPair [THEN eqset_imp_iff, iff] |
148 declare preserves_funPair [THEN eqset_imp_iff, iff] |
153 |
149 |
154 |
150 |
155 lemma funPair_o_distrib: "(funPair f g) o h = funPair (f o h) (g o h)" |
151 lemma funPair_o_distrib: "(funPair f g) o h = funPair (f o h) (g o h)" |
156 apply (simp (no_asm) add: funPair_def o_def) |
152 by (simp add: funPair_def o_def) |
157 done |
|
158 |
153 |
159 lemma fst_o_funPair [simp]: "fst o (funPair f g) = f" |
154 lemma fst_o_funPair [simp]: "fst o (funPair f g) = f" |
160 apply (simp (no_asm) add: funPair_def o_def) |
155 by (simp add: funPair_def o_def) |
161 done |
|
162 |
156 |
163 lemma snd_o_funPair [simp]: "snd o (funPair f g) = g" |
157 lemma snd_o_funPair [simp]: "snd o (funPair f g) = g" |
164 apply (simp (no_asm) add: funPair_def o_def) |
158 by (simp add: funPair_def o_def) |
165 done |
|
166 |
159 |
167 lemma subset_preserves_o: "preserves v <= preserves (w o v)" |
160 lemma subset_preserves_o: "preserves v <= preserves (w o v)" |
168 by (force simp add: preserves_def stable_def constrains_def) |
161 by (force simp add: preserves_def stable_def constrains_def) |
169 |
162 |
170 lemma preserves_subset_stable: "preserves v <= stable {s. P (v s)}" |
163 lemma preserves_subset_stable: "preserves v <= stable {s. P (v s)}" |
242 lemmas strict_component_of_eq = |
235 lemmas strict_component_of_eq = |
243 strict_component_of_def [THEN meta_eq_to_obj_eq, standard] |
236 strict_component_of_def [THEN meta_eq_to_obj_eq, standard] |
244 |
237 |
245 (** localize **) |
238 (** localize **) |
246 lemma localize_Init_eq [simp]: "Init (localize v F) = Init F" |
239 lemma localize_Init_eq [simp]: "Init (localize v F) = Init F" |
247 apply (unfold localize_def) |
240 by (simp add: localize_def) |
248 apply (simp (no_asm)) |
|
249 done |
|
250 |
241 |
251 lemma localize_Acts_eq [simp]: "Acts (localize v F) = Acts F" |
242 lemma localize_Acts_eq [simp]: "Acts (localize v F) = Acts F" |
252 apply (unfold localize_def) |
243 by (simp add: localize_def) |
253 apply (simp (no_asm)) |
|
254 done |
|
255 |
244 |
256 lemma localize_AllowedActs_eq [simp]: |
245 lemma localize_AllowedActs_eq [simp]: |
257 "AllowedActs (localize v F) = AllowedActs F Int (UN G:(preserves v). Acts G)" |
246 "AllowedActs (localize v F) = AllowedActs F Int (UN G:(preserves v). Acts G)" |
258 apply (unfold localize_def, auto) |
247 by (unfold localize_def, auto) |
259 done |
|
260 |
248 |
261 end |
249 end |