src/HOL/MicroJava/BV/Opt.thy
changeset 13006 51c5f3f11d16
parent 12911 704713ca07ea
child 13062 4b1edf2f6bd2
equal deleted inserted replaced
13005:42a54d6cec15 13006:51c5f3f11d16
     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]: 
   100 apply auto
   100 apply auto
   101 done 
   101 done 
   102 
   102 
   103 
   103 
   104 lemma semilat_opt:
   104 lemma semilat_opt:
   105   "!!L. err_semilat L ==> err_semilat (Opt.esl L)"
   105   "\<And>L. err_semilat L \<Longrightarrow> err_semilat (Opt.esl L)"
   106 proof (unfold Opt.esl_def Err.sl_def, simp add: split_tupled_all)
   106 proof (unfold Opt.esl_def Err.sl_def, simp add: split_tupled_all)
   107   
   107   
   108   fix A r f
   108   fix A r f
   109   assume s: "semilat (err A, Err.le r, lift2 f)"
   109   assume s: "semilat (err A, Err.le r, lift2 f)"
   110  
   110  
   139 
   139 
   140     { fix a b
   140     { fix a b
   141       assume ab: "x = OK a" "y = OK b"
   141       assume ab: "x = OK a" "y = OK b"
   142       
   142       
   143       with x 
   143       with x 
   144       have a: "!!c. a = Some c ==> c : A"
   144       have a: "\<And>c. a = Some c \<Longrightarrow> c : A"
   145         by (clarsimp simp add: opt_def)
   145         by (clarsimp simp add: opt_def)
   146 
   146 
   147       from ab y
   147       from ab y
   148       have b: "!!d. b = Some d ==> d : A"
   148       have b: "\<And>d. b = Some d \<Longrightarrow> d : A"
   149         by (clarsimp simp add: opt_def)
   149         by (clarsimp simp add: opt_def)
   150       
   150       
   151       { fix c d assume "a = Some c" "b = Some d"
   151       { fix c d assume "a = Some c" "b = Some d"
   152         with ab x y
   152         with ab x y
   153         have "c:A & d:A"
   153         have "c:A & d:A"
   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)
   281  apply blast
   281  apply blast
   282 apply blast
   282 apply blast
   283 done 
   283 done 
   284 
   284 
   285 lemma option_map_in_optionI:
   285 lemma option_map_in_optionI:
   286   "[| ox : opt S; !x:S. ox = Some x --> f x : S |] 
   286   "\<lbrakk> ox : opt S; !x:S. ox = Some x \<longrightarrow> f x : S \<rbrakk> 
   287   ==> option_map f ox : opt S";
   287   \<Longrightarrow> option_map f ox : opt S";
   288 apply (unfold option_map_def)
   288 apply (unfold option_map_def)
   289 apply (simp split: option.split)
   289 apply (simp split: option.split)
   290 apply blast
   290 apply blast
   291 done 
   291 done 
   292 
   292