src/HOL/HOLCF/FOCUS/Buffer_adm.thy
changeset 67613 ce654b0e6d69
parent 62175 8ffc4d0e652d
child 69597 ff784d5a5bfb
equal deleted inserted replaced
67610:4939494ed791 67613:ce654b0e6d69
     8 imports Buffer Stream_adm
     8 imports Buffer Stream_adm
     9 begin
     9 begin
    10 
    10 
    11 declare enat_0 [simp]
    11 declare enat_0 [simp]
    12 
    12 
    13 lemma BufAC_Asm_d2: "a\<leadsto>s:BufAC_Asm ==> ? d. a=Md d"
    13 lemma BufAC_Asm_d2: "a\<leadsto>s \<in> BufAC_Asm \<Longrightarrow> \<exists>d. a=Md d"
    14 by (drule BufAC_Asm_unfold [THEN iffD1], auto)
    14 by (drule BufAC_Asm_unfold [THEN iffD1], auto)
    15 
    15 
    16 lemma BufAC_Asm_d3:
    16 lemma BufAC_Asm_d3:
    17     "a\<leadsto>b\<leadsto>s:BufAC_Asm ==> ? d. a=Md d & b=\<bullet> & s:BufAC_Asm"
    17     "a\<leadsto>b\<leadsto>s \<in> BufAC_Asm \<Longrightarrow> \<exists>d. a=Md d \<and> b=\<bullet> \<and> s \<in> BufAC_Asm"
    18 by (drule BufAC_Asm_unfold [THEN iffD1], auto)
    18 by (drule BufAC_Asm_unfold [THEN iffD1], auto)
    19 
    19 
    20 lemma BufAC_Asm_F_def3:
    20 lemma BufAC_Asm_F_def3:
    21  "(s:BufAC_Asm_F A) = (s=<> | 
    21  "(s \<in> BufAC_Asm_F A) = (s=<> \<or>
    22   (? d. ft\<cdot>s=Def(Md d)) & (rt\<cdot>s=<> | ft\<cdot>(rt\<cdot>s)=Def \<bullet> & rt\<cdot>(rt\<cdot>s):A))"
    22   (\<exists>d. ft\<cdot>s=Def(Md d)) \<and> (rt\<cdot>s=<> \<or> ft\<cdot>(rt\<cdot>s)=Def \<bullet> \<and> rt\<cdot>(rt\<cdot>s) \<in> A))"
    23 by (unfold BufAC_Asm_F_def, auto)
    23 by (unfold BufAC_Asm_F_def, auto)
    24 
    24 
    25 lemma cont_BufAC_Asm_F: "inf_continuous BufAC_Asm_F"
    25 lemma cont_BufAC_Asm_F: "inf_continuous BufAC_Asm_F"
    26 by (auto simp add: inf_continuous_def BufAC_Asm_F_def3)
    26 by (auto simp add: inf_continuous_def BufAC_Asm_F_def3)
    27 
    27 
    28 lemma BufAC_Cmt_F_def3:
    28 lemma BufAC_Cmt_F_def3:
    29  "((s,t):BufAC_Cmt_F C) = (!d x.
    29  "((s,t) \<in> BufAC_Cmt_F C) = (\<forall>d x.
    30     (s = <>       --> t = <>                   ) & 
    30     (s = <>       \<longrightarrow> t = <>                   ) \<and>
    31     (s = Md d\<leadsto><>  --> t = <>                   ) & 
    31     (s = Md d\<leadsto><>  \<longrightarrow> t = <>                   ) \<and>
    32     (s = Md d\<leadsto>\<bullet>\<leadsto>x --> ft\<cdot>t = Def d & (x,rt\<cdot>t):C))"
    32     (s = Md d\<leadsto>\<bullet>\<leadsto>x \<longrightarrow> ft\<cdot>t = Def d & (x,rt\<cdot>t) \<in> C))"
    33 apply (unfold BufAC_Cmt_F_def)
    33 apply (unfold BufAC_Cmt_F_def)
    34 apply (subgoal_tac "!d x. (s = Md d\<leadsto>\<bullet>\<leadsto>x --> (? y. t = d\<leadsto>y & (x,y):C)) = 
    34 apply (subgoal_tac "\<forall>d x. (s = Md d\<leadsto>\<bullet>\<leadsto>x \<longrightarrow> (\<exists>y. t = d\<leadsto>y \<and> (x,y) \<in> C)) = 
    35                      (s = Md d\<leadsto>\<bullet>\<leadsto>x --> ft\<cdot>t = Def d & (x,rt\<cdot>t):C)")
    35                      (s = Md d\<leadsto>\<bullet>\<leadsto>x \<longrightarrow> ft\<cdot>t = Def d \<and> (x,rt\<cdot>t) \<in> C)")
    36 apply (simp)
    36 apply (simp)
    37 apply (auto intro: surjectiv_scons [symmetric])
    37 apply (auto intro: surjectiv_scons [symmetric])
    38 done
    38 done
    39 
    39 
    40 lemma cont_BufAC_Cmt_F: "inf_continuous BufAC_Cmt_F"
    40 lemma cont_BufAC_Cmt_F: "inf_continuous BufAC_Cmt_F"
    43 
    43 
    44 (**** adm_BufAC_Asm ***********************************************************)
    44 (**** adm_BufAC_Asm ***********************************************************)
    45 
    45 
    46 lemma BufAC_Asm_F_stream_monoP: "stream_monoP BufAC_Asm_F"
    46 lemma BufAC_Asm_F_stream_monoP: "stream_monoP BufAC_Asm_F"
    47 apply (unfold BufAC_Asm_F_def stream_monoP_def)
    47 apply (unfold BufAC_Asm_F_def stream_monoP_def)
    48 apply (rule_tac x="{x. (? d. x = Md d\<leadsto>\<bullet>\<leadsto><>)}" in exI)
    48 apply (rule_tac x="{x. (\<exists>d. x = Md d\<leadsto>\<bullet>\<leadsto><>)}" in exI)
    49 apply (rule_tac x="Suc (Suc 0)" in exI)
    49 apply (rule_tac x="Suc (Suc 0)" in exI)
    50 apply (clarsimp)
    50 apply (clarsimp)
    51 done
    51 done
    52 
    52 
    53 lemma adm_BufAC_Asm: "adm (%x. x:BufAC_Asm)"
    53 lemma adm_BufAC_Asm: "adm (\<lambda>x. x \<in> BufAC_Asm)"
    54 apply (unfold BufAC_Asm_def)
    54 apply (unfold BufAC_Asm_def)
    55 apply (rule cont_BufAC_Asm_F [THEN BufAC_Asm_F_stream_monoP [THEN fstream_gfp_admI]])
    55 apply (rule cont_BufAC_Asm_F [THEN BufAC_Asm_F_stream_monoP [THEN fstream_gfp_admI]])
    56 done
    56 done
    57 
    57 
    58 
    58 
    59 (**** adm_non_BufAC_Asm *******************************************************)
    59 (**** adm_non_BufAC_Asm *******************************************************)
    60 
    60 
    61 lemma BufAC_Asm_F_stream_antiP: "stream_antiP BufAC_Asm_F"
    61 lemma BufAC_Asm_F_stream_antiP: "stream_antiP BufAC_Asm_F"
    62 apply (unfold stream_antiP_def BufAC_Asm_F_def)
    62 apply (unfold stream_antiP_def BufAC_Asm_F_def)
    63 apply (intro strip)
    63 apply (intro strip)
    64 apply (rule_tac x="{x. (? d. x = Md d\<leadsto>\<bullet>\<leadsto><>)}" in exI)
    64 apply (rule_tac x="{x. (\<exists>d. x = Md d\<leadsto>\<bullet>\<leadsto><>)}" in exI)
    65 apply (rule_tac x="Suc (Suc 0)" in exI)
    65 apply (rule_tac x="Suc (Suc 0)" in exI)
    66 apply (rule conjI)
    66 apply (rule conjI)
    67 prefer 2
    67 prefer 2
    68 apply ( intro strip)
    68 apply ( intro strip)
    69 apply ( drule slen_mono)
    69 apply ( drule slen_mono)
    70 apply ( drule (1) order_trans)
    70 apply ( drule (1) order_trans)
    71 apply (force)+
    71 apply (force)+
    72 done
    72 done
    73 
    73 
    74 lemma adm_non_BufAC_Asm: "adm (%u. u~:BufAC_Asm)"
    74 lemma adm_non_BufAC_Asm: "adm (\<lambda>u. u \<notin> BufAC_Asm)"
    75 apply (unfold BufAC_Asm_def)
    75 apply (unfold BufAC_Asm_def)
    76 apply (rule cont_BufAC_Asm_F [THEN BufAC_Asm_F_stream_antiP [THEN fstream_non_gfp_admI]])
    76 apply (rule cont_BufAC_Asm_F [THEN BufAC_Asm_F_stream_antiP [THEN fstream_non_gfp_admI]])
    77 done
    77 done
    78 
    78 
    79 (**** adm_BufAC ***************************************************************)
    79 (**** adm_BufAC ***************************************************************)
    80 
    80 
    81 (*adm_non_BufAC_Asm*)
    81 (*adm_non_BufAC_Asm*)
    82 lemma BufAC_Asm_cong [rule_format]: "!f ff. f:BufEq --> ff:BufEq --> s:BufAC_Asm --> f\<cdot>s = ff\<cdot>s"
    82 lemma BufAC_Asm_cong [rule_format]: "\<forall>f ff. f \<in> BufEq \<longrightarrow> ff \<in> BufEq \<longrightarrow> s \<in> BufAC_Asm \<longrightarrow> f\<cdot>s = ff\<cdot>s"
    83 apply (rule fstream_ind2)
    83 apply (rule fstream_ind2)
    84 apply (simp add: adm_non_BufAC_Asm)
    84 apply (simp add: adm_non_BufAC_Asm)
    85 apply   (force dest: Buf_f_empty)
    85 apply   (force dest: Buf_f_empty)
    86 apply  (force dest!: BufAC_Asm_d2
    86 apply  (force dest!: BufAC_Asm_d2
    87               dest: Buf_f_d elim: ssubst)
    87               dest: Buf_f_d elim: ssubst)
    90 apply (fast elim: ssubst)
    90 apply (fast elim: ssubst)
    91 done
    91 done
    92 
    92 
    93 (*adm_non_BufAC_Asm,BufAC_Asm_cong*)
    93 (*adm_non_BufAC_Asm,BufAC_Asm_cong*)
    94 lemma BufAC_Cmt_d_req:
    94 lemma BufAC_Cmt_d_req:
    95 "!!X. [|f:BufEq; s:BufAC_Asm; (s, f\<cdot>s):BufAC_Cmt|] ==> (a\<leadsto>b\<leadsto>s, f\<cdot>(a\<leadsto>b\<leadsto>s)):BufAC_Cmt"
    95 "\<And>X. [|f \<in> BufEq; s \<in> BufAC_Asm; (s, f\<cdot>s) \<in> BufAC_Cmt|] ==> (a\<leadsto>b\<leadsto>s, f\<cdot>(a\<leadsto>b\<leadsto>s)) \<in> BufAC_Cmt"
    96 apply (rule BufAC_Cmt_unfold [THEN iffD2])
    96 apply (rule BufAC_Cmt_unfold [THEN iffD2])
    97 apply (intro strip)
    97 apply (intro strip)
    98 apply (frule Buf_f_d_req)
    98 apply (frule Buf_f_d_req)
    99 apply (auto elim: BufAC_Asm_cong [THEN subst])
    99 apply (auto elim: BufAC_Asm_cong [THEN subst])
   100 done
   100 done
   114 apply ( force dest!: fstream_prefix
   114 apply ( force dest!: fstream_prefix
   115               dest: BufAC_Asm_d3 intro!: BufAC_Asm_d_req)
   115               dest: BufAC_Asm_d3 intro!: BufAC_Asm_d_req)
   116 done
   116 done
   117 
   117 
   118 (*adm_BufAC_Asm,BufAC_Asm_antiton,adm_non_BufAC_Asm,BufAC_Asm_cong*)
   118 (*adm_BufAC_Asm,BufAC_Asm_antiton,adm_non_BufAC_Asm,BufAC_Asm_cong*)
   119 lemma BufAC_Cmt_2stream_monoP: "f:BufEq ==> ? l. !i x s. s:BufAC_Asm --> x << s --> enat (l i) < #x --> 
   119 lemma BufAC_Cmt_2stream_monoP: "f \<in> BufEq \<Longrightarrow> \<exists>l. \<forall>i x s. s \<in> BufAC_Asm \<longrightarrow> x << s \<longrightarrow> enat (l i) < #x \<longrightarrow>
   120                      (x,f\<cdot>x):(BufAC_Cmt_F ^^ i) top --> 
   120                      (x,f\<cdot>x) \<in> (BufAC_Cmt_F ^^ i) top \<longrightarrow>
   121                      (s,f\<cdot>s):(BufAC_Cmt_F ^^ i) top"
   121                      (s,f\<cdot>s) \<in> (BufAC_Cmt_F ^^ i) top"
   122 apply (rule_tac x="%i. 2*i" in exI)
   122 apply (rule_tac x="%i. 2*i" in exI)
   123 apply (rule allI)
   123 apply (rule allI)
   124 apply (induct_tac "i")
   124 apply (induct_tac "i")
   125 apply ( simp)
   125 apply ( simp)
   126 apply (simp add: add.commute)
   126 apply (simp add: add.commute)
   188 apply (fast)
   188 apply (fast)
   189 done
   189 done
   190 
   190 
   191 (*adm_BufAC_Asm,BufAC_Asm_antiton,adm_non_BufAC_Asm,BufAC_Asm_cong,
   191 (*adm_BufAC_Asm,BufAC_Asm_antiton,adm_non_BufAC_Asm,BufAC_Asm_cong,
   192   BufAC_Cmt_2stream_monoP*)
   192   BufAC_Cmt_2stream_monoP*)
   193 lemma adm_BufAC: "f:BufEq ==> adm (%s. s:BufAC_Asm --> (s, f\<cdot>s):BufAC_Cmt)"
   193 lemma adm_BufAC: "f \<in> BufEq \<Longrightarrow> adm (\<lambda>s. s \<in> BufAC_Asm \<longrightarrow> (s, f\<cdot>s) \<in> BufAC_Cmt)"
   194 apply (rule flatstream_admI)
   194 apply (rule flatstream_admI)
   195 apply (subst BufAC_Cmt_iterate_all)
   195 apply (subst BufAC_Cmt_iterate_all)
   196 apply (drule BufAC_Cmt_2stream_monoP)
   196 apply (drule BufAC_Cmt_2stream_monoP)
   197 apply safe
   197 apply safe
   198 apply (drule spec, erule exE)
   198 apply (drule spec, erule exE)