9 header {* \isaheader{More about Options} *} |
9 header {* \isaheader{More about Options} *} |
10 |
10 |
11 theory Opt = Err: |
11 theory Opt = Err: |
12 |
12 |
13 constdefs |
13 constdefs |
14 le :: "'a ord => 'a option ord" |
14 le :: "'a ord \<Rightarrow> 'a option ord" |
15 "le r o1 o2 == case o2 of None => o1=None | |
15 "le r o1 o2 == case o2 of None \<Rightarrow> o1=None | |
16 Some y => (case o1 of None => True |
16 Some y \<Rightarrow> (case o1 of None \<Rightarrow> True |
17 | Some x => x <=_r y)" |
17 | Some x \<Rightarrow> x <=_r y)" |
18 |
18 |
19 opt :: "'a set => 'a option set" |
19 opt :: "'a set \<Rightarrow> 'a option set" |
20 "opt A == insert None {x . ? y:A. x = Some y}" |
20 "opt A == insert None {x . ? y:A. x = Some y}" |
21 |
21 |
22 sup :: "'a ebinop => 'a option ebinop" |
22 sup :: "'a ebinop \<Rightarrow> 'a option ebinop" |
23 "sup f o1 o2 == |
23 "sup f o1 o2 == |
24 case o1 of None => OK o2 | Some x => (case o2 of None => OK o1 |
24 case o1 of None \<Rightarrow> OK o2 | Some x \<Rightarrow> (case o2 of None \<Rightarrow> OK o1 |
25 | Some y => (case f x y of Err => Err | OK z => OK (Some z)))" |
25 | Some y \<Rightarrow> (case f x y of Err \<Rightarrow> Err | OK z \<Rightarrow> OK (Some z)))" |
26 |
26 |
27 esl :: "'a esl => 'a option esl" |
27 esl :: "'a esl \<Rightarrow> 'a option esl" |
28 "esl == %(A,r,f). (opt A, le r, sup f)" |
28 "esl == %(A,r,f). (opt A, le r, sup f)" |
29 |
29 |
30 lemma unfold_le_opt: |
30 lemma unfold_le_opt: |
31 "o1 <=_(le r) o2 = |
31 "o1 <=_(le r) o2 = |
32 (case o2 of None => o1=None | |
32 (case o2 of None \<Rightarrow> o1=None | |
33 Some y => (case o1 of None => True | Some x => x <=_r y))" |
33 Some y \<Rightarrow> (case o1 of None \<Rightarrow> True | Some x \<Rightarrow> x <=_r y))" |
34 apply (unfold lesub_def le_def) |
34 apply (unfold lesub_def le_def) |
35 apply (rule refl) |
35 apply (rule refl) |
36 done |
36 done |
37 |
37 |
38 lemma le_opt_refl: |
38 lemma le_opt_refl: |
39 "order r ==> o1 <=_(le r) o1" |
39 "order r \<Longrightarrow> o1 <=_(le r) o1" |
40 by (simp add: unfold_le_opt split: option.split) |
40 by (simp add: unfold_le_opt split: option.split) |
41 |
41 |
42 lemma le_opt_trans [rule_format]: |
42 lemma le_opt_trans [rule_format]: |
43 "order r ==> |
43 "order r \<Longrightarrow> |
44 o1 <=_(le r) o2 --> o2 <=_(le r) o3 --> o1 <=_(le r) o3" |
44 o1 <=_(le r) o2 \<longrightarrow> o2 <=_(le r) o3 \<longrightarrow> o1 <=_(le r) o3" |
45 apply (simp add: unfold_le_opt split: option.split) |
45 apply (simp add: unfold_le_opt split: option.split) |
46 apply (blast intro: order_trans) |
46 apply (blast intro: order_trans) |
47 done |
47 done |
48 |
48 |
49 lemma le_opt_antisym [rule_format]: |
49 lemma le_opt_antisym [rule_format]: |
50 "order r ==> o1 <=_(le r) o2 --> o2 <=_(le r) o1 --> o1=o2" |
50 "order r \<Longrightarrow> o1 <=_(le r) o2 \<longrightarrow> o2 <=_(le r) o1 \<longrightarrow> o1=o2" |
51 apply (simp add: unfold_le_opt split: option.split) |
51 apply (simp add: unfold_le_opt split: option.split) |
52 apply (blast intro: order_antisym) |
52 apply (blast intro: order_antisym) |
53 done |
53 done |
54 |
54 |
55 lemma order_le_opt [intro!,simp]: |
55 lemma order_le_opt [intro!,simp]: |
56 "order r ==> order(le r)" |
56 "order r \<Longrightarrow> order(le r)" |
57 apply (subst order_def) |
57 apply (subst order_def) |
58 apply (blast intro: le_opt_refl le_opt_trans le_opt_antisym) |
58 apply (blast intro: le_opt_refl le_opt_trans le_opt_antisym) |
59 done |
59 done |
60 |
60 |
61 lemma None_bot [iff]: |
61 lemma None_bot [iff]: |
223 |
223 |
224 with ok xyz |
224 with ok xyz |
225 obtain "OK d:err A" "OK e:err A" "OK g:err A" |
225 obtain "OK d:err A" "OK e:err A" "OK g:err A" |
226 by simp |
226 by simp |
227 with lub |
227 with lub |
228 have "[| (OK d) <=_(Err.le r) (OK g); (OK e) <=_(Err.le r) (OK g) |] |
228 have "\<lbrakk> (OK d) <=_(Err.le r) (OK g); (OK e) <=_(Err.le r) (OK g) \<rbrakk> |
229 ==> (OK d) +_(lift2 f) (OK e) <=_(Err.le r) (OK g)" |
229 \<Longrightarrow> (OK d) +_(lift2 f) (OK e) <=_(Err.le r) (OK g)" |
230 by blast |
230 by blast |
231 hence "[| d <=_r g; e <=_r g |] ==> \<exists>y. d +_f e = OK y \<and> y <=_r g" |
231 hence "\<lbrakk> d <=_r g; e <=_r g \<rbrakk> \<Longrightarrow> \<exists>y. d +_f e = OK y \<and> y <=_r g" |
232 by simp |
232 by simp |
233 |
233 |
234 with ok some xyz xz yz |
234 with ok some xyz xz yz |
235 have "x +_?f y <=_?r z" |
235 have "x +_?f y <=_?r z" |
236 by (auto simp add: sup_def le_def lesub_def lift2_def plussub_def Err.le_def) |
236 by (auto simp add: sup_def le_def lesub_def lift2_def plussub_def Err.le_def) |
261 apply (case_tac "x") |
261 apply (case_tac "x") |
262 apply simp+ |
262 apply simp+ |
263 done |
263 done |
264 |
264 |
265 lemma Top_le_conv: |
265 lemma Top_le_conv: |
266 "[| order r; top r T |] ==> (T <=_r x) = (x = T)" |
266 "\<lbrakk> order r; top r T \<rbrakk> \<Longrightarrow> (T <=_r x) = (x = T)" |
267 apply (unfold top_def) |
267 apply (unfold top_def) |
268 apply (blast intro: order_antisym) |
268 apply (blast intro: order_antisym) |
269 done |
269 done |
270 |
270 |
271 |
271 |
272 lemma acc_le_optI [intro!]: |
272 lemma acc_le_optI [intro!]: |
273 "acc r ==> acc(le r)" |
273 "acc r \<Longrightarrow> acc(le r)" |
274 apply (unfold acc_def lesub_def le_def lesssub_def) |
274 apply (unfold acc_def lesub_def le_def lesssub_def) |
275 apply (simp add: wf_eq_minimal split: option.split) |
275 apply (simp add: wf_eq_minimal split: option.split) |
276 apply clarify |
276 apply clarify |
277 apply (case_tac "? a. Some a : Q") |
277 apply (case_tac "? a. Some a : Q") |
278 apply (erule_tac x = "{a . Some a : Q}" in allE) |
278 apply (erule_tac x = "{a . Some a : Q}" in allE) |