9791
|
1 |
(* Title: HOL/BCV/Err.ML
|
|
2 |
ID: $Id$
|
|
3 |
Author: Tobias Nipkow
|
|
4 |
Copyright 2000 TUM
|
|
5 |
*)
|
|
6 |
|
|
7 |
Goalw [lesub_def] "e1 <=_(le r) e2 == le r e1 e2";
|
|
8 |
by (Simp_tac 1);
|
|
9 |
qed "unfold_lesub_err";
|
|
10 |
|
|
11 |
Goalw [lesub_def,Err.le_def] "!x. x <=_r x ==> e <=_(Err.le r) e";
|
|
12 |
by (asm_simp_tac (simpset() addsplits [err.split]) 1);
|
|
13 |
qed "le_err_refl";
|
|
14 |
|
|
15 |
Goalw [unfold_lesub_err,le_def] "order r ==> \
|
|
16 |
\ e1 <=_(le r) e2 --> e2 <=_(le r) e3 --> e1 <=_(le r) e3";
|
|
17 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
|
18 |
by (blast_tac (claset() addIs [order_trans]) 1);
|
|
19 |
qed_spec_mp "le_err_trans";
|
|
20 |
|
|
21 |
Goalw [unfold_lesub_err,le_def]
|
|
22 |
"order r ==> e1 <=_(le r) e2 --> e2 <=_(le r) e1 --> e1=e2";
|
|
23 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
|
24 |
by (blast_tac (claset() addIs [order_antisym]) 1);
|
|
25 |
qed_spec_mp "le_err_antisym";
|
|
26 |
|
|
27 |
|
|
28 |
Goalw [unfold_lesub_err,le_def]
|
|
29 |
"(OK x <=_(le r) OK y) = (x <=_r y)";
|
|
30 |
by (Simp_tac 1);
|
|
31 |
qed "OK_le_err_OK";
|
|
32 |
|
|
33 |
|
|
34 |
Goal "order(le r) = order r";
|
10172
|
35 |
by (rtac iffI 1);
|
|
36 |
by (stac order_def 1);
|
|
37 |
by (blast_tac (claset() addDs [order_antisym,OK_le_err_OK RS iffD2]
|
9791
|
38 |
addIs [order_trans,OK_le_err_OK RS iffD1]) 1);
|
10172
|
39 |
by (stac order_def 1);
|
|
40 |
by (blast_tac (claset() addIs [le_err_refl,le_err_trans,le_err_antisym]
|
9791
|
41 |
addDs [order_refl]) 1);
|
|
42 |
qed "order_le_err";
|
|
43 |
AddIffs [order_le_err];
|
|
44 |
|
|
45 |
|
|
46 |
Goalw [unfold_lesub_err,le_def]
|
|
47 |
"e <=_(le r) Err";
|
|
48 |
by (Simp_tac 1);
|
|
49 |
qed "le_Err";
|
|
50 |
AddIffs [le_Err];
|
|
51 |
|
|
52 |
Goalw [unfold_lesub_err,le_def]
|
|
53 |
"Err <=_(le r) e = (e = Err)";
|
|
54 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
|
55 |
qed "Err_le_conv";
|
|
56 |
AddIffs [Err_le_conv];
|
|
57 |
|
|
58 |
Goalw [unfold_lesub_err,le_def]
|
|
59 |
"e <=_(le r) OK x = (? y. e = OK y & y <=_r x)";
|
|
60 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
|
61 |
qed "le_OK_conv";
|
|
62 |
AddIffs [le_OK_conv];
|
|
63 |
|
|
64 |
Goalw [unfold_lesub_err,le_def]
|
|
65 |
"OK x <=_(le r) e = (e = Err | (? y. e = OK y & x <=_r y))";
|
|
66 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
|
67 |
qed "OK_le_conv";
|
|
68 |
|
|
69 |
Goalw [top_def] "top (le r) Err";
|
|
70 |
by (Simp_tac 1);
|
|
71 |
qed "top_Err";
|
|
72 |
AddIffs [top_Err];
|
|
73 |
|
|
74 |
Goalw [lesssub_def,lesub_def,le_def]
|
|
75 |
"OK x <_(le r) e = (e=Err | (? y. e = OK y & x <_r y))";
|
|
76 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
|
77 |
qed_spec_mp "OK_less_conv";
|
|
78 |
AddIffs [OK_less_conv];
|
|
79 |
|
|
80 |
Goalw [lesssub_def,lesub_def,le_def] "~(Err <_(le r) x)";
|
|
81 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
|
82 |
qed_spec_mp "not_Err_less";
|
|
83 |
AddIffs [not_Err_less];
|
|
84 |
|
|
85 |
|
|
86 |
Goalw
|
|
87 |
[semilat_Def,closed_def,plussub_def,lesub_def,lift2_def,Err.le_def,err_def]
|
|
88 |
"semilat(A,r,f) ==> semilat(err A, Err.le r, lift2(%x y. OK(f x y)))";
|
|
89 |
by (asm_full_simp_tac (simpset() addsplits [err.split]) 1);
|
|
90 |
by (Blast_tac 1);
|
|
91 |
qed "semilat_errI";
|
|
92 |
|
|
93 |
Goalw [sl_def,esl_def]
|
|
94 |
"!!L. semilat L ==> err_semilat(esl L)";
|
10172
|
95 |
by (split_all_tac 1);
|
|
96 |
by (asm_full_simp_tac (simpset() addsimps [semilat_errI]) 1);
|
9791
|
97 |
qed "err_semilat_eslI";
|
|
98 |
|
|
99 |
Goalw [acc_def,lesub_def,le_def,lesssub_def]
|
|
100 |
"acc r ==> acc(le r)";
|
|
101 |
by (asm_full_simp_tac (simpset() addsimps [wf_eq_minimal] addsplits [err.split]) 1);
|
|
102 |
by (Clarify_tac 1);
|
|
103 |
by (case_tac "Err : Q" 1);
|
|
104 |
by (Blast_tac 1);
|
|
105 |
by (eres_inst_tac [("x","{a . OK a : Q}")] allE 1);
|
|
106 |
by (case_tac "x" 1);
|
|
107 |
by (Fast_tac 1);
|
|
108 |
by (Blast_tac 1);
|
|
109 |
qed "acc_err";
|
|
110 |
Addsimps [acc_err];
|
|
111 |
AddSIs [acc_err];
|
|
112 |
|
|
113 |
Goalw [err_def] "Err : err A";
|
|
114 |
by (Simp_tac 1);
|
|
115 |
qed "Err_in_err";
|
|
116 |
AddIffs [Err_in_err];
|
|
117 |
|
|
118 |
Goalw [err_def] "(OK x : err A) = (x:A)";
|
|
119 |
by (Auto_tac);
|
|
120 |
qed "OK_in_err";
|
|
121 |
AddIffs [OK_in_err];
|
|
122 |
|
|
123 |
|
|
124 |
(** lift **)
|
|
125 |
|
|
126 |
Goalw [lift_def]
|
|
127 |
"[| e : err S; !x:S. e = OK x --> f x : err S |] ==> lift f e : err S";
|
|
128 |
by (asm_simp_tac (simpset() addsplits [err.split]) 1);
|
10172
|
129 |
by (Blast_tac 1);
|
9791
|
130 |
qed "lift_in_errI";
|
|
131 |
|
|
132 |
(** lift2 **)
|
|
133 |
|
|
134 |
Goalw [lift2_def,plussub_def] "Err +_(lift2 f) x = Err";
|
10172
|
135 |
by (Simp_tac 1);
|
9791
|
136 |
qed "Err_lift2";
|
|
137 |
|
|
138 |
Goalw [lift2_def,plussub_def] "x +_(lift2 f) Err = Err";
|
10172
|
139 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
9791
|
140 |
qed "lift2_Err";
|
|
141 |
|
|
142 |
Goalw [lift2_def,plussub_def] "OK x +_(lift2 f) OK y = x +_f y";
|
10172
|
143 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
9791
|
144 |
qed "OK_lift2_OK";
|
|
145 |
|
|
146 |
Addsimps [Err_lift2,lift2_Err,OK_lift2_OK];
|
|
147 |
|
|
148 |
(** sup **)
|
|
149 |
|
|
150 |
Goalw [plussub_def,Err.sup_def,Err.lift2_def] "Err +_(Err.sup f) x = Err";
|
|
151 |
by (Simp_tac 1);
|
|
152 |
qed "Err_sup_Err";
|
|
153 |
|
|
154 |
Goalw [plussub_def,Err.sup_def,Err.lift2_def] "x +_(Err.sup f) Err = Err";
|
|
155 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
|
156 |
qed "Err_sup_Err2";
|
|
157 |
|
|
158 |
Goalw [plussub_def,Err.sup_def,Err.lift2_def]
|
|
159 |
"OK x +_(Err.sup f) OK y = OK(x +_f y)";
|
|
160 |
by (Simp_tac 1);
|
|
161 |
qed "Err_sup_OK";
|
|
162 |
|
|
163 |
Addsimps [Err_sup_Err,Err_sup_Err2,Err_sup_OK];
|
|
164 |
|
|
165 |
Goalw [Err.sup_def,lift2_def,plussub_def]
|
|
166 |
"(Err.sup f ex ey = OK z) = (? x y. ex = OK x & ey = OK y & f x y = z)";
|
10172
|
167 |
by (rtac iffI 1);
|
|
168 |
by (Clarify_tac 2);
|
9791
|
169 |
by (Asm_simp_tac 2);
|
10172
|
170 |
by (asm_full_simp_tac (simpset() addsplits [err.split_asm]) 1);
|
9791
|
171 |
qed "Err_sup_eq_OK_conv";
|
|
172 |
AddIffs [Err_sup_eq_OK_conv];
|
|
173 |
|
|
174 |
Goalw [Err.sup_def,lift2_def,plussub_def]
|
|
175 |
"(Err.sup f ex ey = Err) = (ex=Err | ey=Err)";
|
10172
|
176 |
by (simp_tac (simpset() addsplits [err.split]) 1);
|
9791
|
177 |
qed "Err_sup_eq_Err";
|
|
178 |
AddIffs [Err_sup_eq_Err];
|
|
179 |
|
|
180 |
|
|
181 |
(*** semilat (err A) (le r) f ***)
|
|
182 |
|
|
183 |
Goal "[| x: err A; semilat(err A, le r, f) |] ==> Err +_f x = Err";
|
10172
|
184 |
by (blast_tac (claset() addIs [le_iff_plus_unchanged RS iffD1,le_iff_plus_unchanged2 RS iffD1]) 1);
|
9791
|
185 |
qed "semilat_le_err_Err_plus";
|
|
186 |
|
|
187 |
Goal "[| x: err A; semilat(err A, le r, f) |] ==> x +_f Err = Err";
|
10172
|
188 |
by (blast_tac (claset() addIs [le_iff_plus_unchanged RS iffD1,le_iff_plus_unchanged2 RS iffD1]) 1);
|
9791
|
189 |
qed "semilat_le_err_plus_Err";
|
|
190 |
|
|
191 |
Addsimps [semilat_le_err_Err_plus,semilat_le_err_plus_Err];
|
|
192 |
|
|
193 |
Goal "[| x:A; y:A; semilat(err A, le r, f); OK x +_f OK y = OK z |] \
|
|
194 |
\ ==> x <=_r z";
|
10172
|
195 |
by (rtac (OK_le_err_OK RS iffD1) 1);
|
|
196 |
by (etac subst 1);
|
|
197 |
by (Asm_simp_tac 1);
|
9791
|
198 |
qed "semilat_le_err_OK1";
|
|
199 |
|
|
200 |
Goal "[| x:A; y:A; semilat(err A, le r, f); OK x +_f OK y = OK z |] \
|
|
201 |
\ ==> y <=_r z";
|
10172
|
202 |
by (rtac (OK_le_err_OK RS iffD1) 1);
|
|
203 |
by (etac subst 1);
|
|
204 |
by (Asm_simp_tac 1);
|
9791
|
205 |
qed "semilat_le_err_OK2";
|
|
206 |
|
|
207 |
Goalw [order_def] "[| x=y; order r |] ==> x <=_r y";
|
10172
|
208 |
by (Blast_tac 1);
|
9791
|
209 |
qed "eq_order_le";
|
|
210 |
|
|
211 |
Goal
|
|
212 |
"[| x:A; y:A; semilat(err A, le r, fe) |] ==> \
|
|
213 |
\ ((OK x) +_fe (OK y) = Err) = (~(? z:A. x <=_r z & y <=_r z))";
|
10172
|
214 |
by (rtac iffI 1);
|
9791
|
215 |
by (Clarify_tac 1);
|
10172
|
216 |
by (dtac (OK_le_err_OK RS iffD2) 1);
|
|
217 |
by (dtac (OK_le_err_OK RS iffD2) 1);
|
|
218 |
by (dtac semilat_lub 1);
|
|
219 |
by (assume_tac 1);
|
|
220 |
by (assume_tac 1);
|
|
221 |
by (Asm_simp_tac 1);
|
|
222 |
by (Asm_simp_tac 1);
|
|
223 |
by (Asm_simp_tac 1);
|
|
224 |
by (Asm_full_simp_tac 1);
|
|
225 |
by (case_tac "(OK x) +_fe (OK y)" 1);
|
|
226 |
by (assume_tac 1);
|
|
227 |
by (rename_tac "z" 1);
|
|
228 |
by (subgoal_tac "OK z: err A" 1);
|
|
229 |
by (dtac eq_order_le 1);
|
|
230 |
by (Blast_tac 1);
|
|
231 |
by (blast_tac (claset() addDs [rotate_prems 3 (plus_le_conv RS iffD1)]) 1);
|
|
232 |
by (etac subst 1);
|
|
233 |
by (blast_tac (claset() addIs [closedD]) 1);
|
9791
|
234 |
qed "OK_plus_OK_eq_Err_conv";
|
|
235 |
Addsimps [OK_plus_OK_eq_Err_conv];
|
|
236 |
|
|
237 |
(*** semilat (err(Union AS)) ***)
|
|
238 |
|
|
239 |
(* FIXME? *)
|
|
240 |
Goal "(!x. (? y:A. x = f y) --> P x) = (!y:A. P(f y))";
|
10172
|
241 |
by (Blast_tac 1);
|
9791
|
242 |
qed "all_bex_swap_lemma";
|
|
243 |
AddIffs [all_bex_swap_lemma];
|
|
244 |
|
|
245 |
Goalw [closed_def,err_def]
|
|
246 |
"[| !A:AS. closed (err A) (lift2 f); AS ~= {}; \
|
|
247 |
\ !A:AS.!B:AS. A~=B --> (!a:A.!b:B. a +_f b = Err) |] \
|
|
248 |
\ ==> closed (err(Union AS)) (lift2 f)";
|
10172
|
249 |
by (Asm_full_simp_tac 1);
|
|
250 |
by (Clarify_tac 1);
|
|
251 |
by (Asm_full_simp_tac 1);
|
|
252 |
by (Fast_tac 1);
|
9791
|
253 |
qed "closed_err_Union_lift2I";
|
|
254 |
|
|
255 |
(* If AS = {} the thm collapses to
|
|
256 |
order r & closed {Err} f & Err +_f Err = Err
|
|
257 |
which may not hold *)
|
|
258 |
Goalw [semilat_def,sl_def]
|
|
259 |
"[| !A:AS. err_semilat(A, r, f); AS ~= {}; \
|
|
260 |
\ !A:AS.!B:AS. A~=B --> (!a:A.!b:B. ~ a <=_r b & a +_f b = Err) |] \
|
|
261 |
\ ==> err_semilat(Union AS, r, f)";
|
10172
|
262 |
by (asm_full_simp_tac (simpset() addsimps [closed_err_Union_lift2I]) 1);
|
|
263 |
by (rtac conjI 1);
|
|
264 |
by (Blast_tac 1);
|
|
265 |
by (asm_full_simp_tac (simpset() addsimps [err_def]) 1);
|
|
266 |
by (rtac conjI 1);
|
|
267 |
by (Clarify_tac 1);
|
|
268 |
by (rename_tac "A a u B b" 1);
|
|
269 |
by (case_tac "A = B" 1);
|
|
270 |
by (Asm_full_simp_tac 1);
|
|
271 |
by (Asm_full_simp_tac 1);
|
|
272 |
by (rtac conjI 1);
|
|
273 |
by (Clarify_tac 1);
|
|
274 |
by (rename_tac "A a u B b" 1);
|
|
275 |
by (case_tac "A = B" 1);
|
|
276 |
by (Asm_full_simp_tac 1);
|
|
277 |
by (Asm_full_simp_tac 1);
|
|
278 |
by (Clarify_tac 1);
|
|
279 |
by (rename_tac "A ya yb B yd z C c a b" 1);
|
|
280 |
by (case_tac "A = B" 1);
|
|
281 |
by (case_tac "A = C" 1);
|
|
282 |
by (Asm_full_simp_tac 1);
|
|
283 |
by (rotate_tac ~1 1);
|
|
284 |
by (Asm_full_simp_tac 1);
|
|
285 |
by (rotate_tac ~1 1);
|
|
286 |
by (case_tac "B = C" 1);
|
|
287 |
by (Asm_full_simp_tac 1);
|
|
288 |
by (rotate_tac ~1 1);
|
|
289 |
by (Asm_full_simp_tac 1);
|
9791
|
290 |
qed "err_semilat_UnionI";
|