src/HOL/BNF_GFP.thy
changeset 55578 32774e40afb0
parent 55542 4394bb0b522b
child 55644 b657146dc030
equal deleted inserted replaced
55577:a6c2379078c8 55578:32774e40afb0
     8 *)
     8 *)
     9 
     9 
    10 header {* Greatest Fixed Point Operation on Bounded Natural Functors *}
    10 header {* Greatest Fixed Point Operation on Bounded Natural Functors *}
    11 
    11 
    12 theory BNF_GFP
    12 theory BNF_GFP
    13 imports BNF_FP_Base List_Prefix String
    13 imports BNF_FP_Base String
    14 keywords
    14 keywords
    15   "codatatype" :: thy_decl and
    15   "codatatype" :: thy_decl and
    16   "primcorecursive" :: thy_goal and
    16   "primcorecursive" :: thy_goal and
    17   "primcorec" :: thy_decl
    17   "primcorec" :: thy_decl
    18 begin
    18 begin
   147 by simp
   147 by simp
   148 
   148 
   149 lemma image_convolD: "\<lbrakk>(a, b) \<in> <f, g> ` X\<rbrakk> \<Longrightarrow> \<exists>x. x \<in> X \<and> a = f x \<and> b = g x"
   149 lemma image_convolD: "\<lbrakk>(a, b) \<in> <f, g> ` X\<rbrakk> \<Longrightarrow> \<exists>x. x \<in> X \<and> a = f x \<and> b = g x"
   150 unfolding convol_def by auto
   150 unfolding convol_def by auto
   151 
   151 
   152 (*Extended Sublist*)
       
   153 
       
   154 definition clists where "clists r = |lists (Field r)|"
       
   155 
       
   156 definition prefCl where
       
   157   "prefCl Kl = (\<forall> kl1 kl2. prefixeq kl1 kl2 \<and> kl2 \<in> Kl \<longrightarrow> kl1 \<in> Kl)"
       
   158 definition PrefCl where
       
   159   "PrefCl A n = (\<forall>kl kl'. kl \<in> A n \<and> prefixeq kl' kl \<longrightarrow> (\<exists>m\<le>n. kl' \<in> A m))"
       
   160 
       
   161 lemma prefCl_UN:
       
   162   "\<lbrakk>\<And>n. PrefCl A n\<rbrakk> \<Longrightarrow> prefCl (\<Union>n. A n)"
       
   163 unfolding prefCl_def PrefCl_def by fastforce
       
   164 
       
   165 definition Succ where "Succ Kl kl = {k . kl @ [k] \<in> Kl}"
   152 definition Succ where "Succ Kl kl = {k . kl @ [k] \<in> Kl}"
   166 definition Shift where "Shift Kl k = {kl. k # kl \<in> Kl}"
   153 definition Shift where "Shift Kl k = {kl. k # kl \<in> Kl}"
   167 definition shift where "shift lab k = (\<lambda>kl. lab (k # kl))"
   154 definition shift where "shift lab k = (\<lambda>kl. lab (k # kl))"
   168 
   155 
   169 lemma empty_Shift: "\<lbrakk>[] \<in> Kl; k \<in> Succ Kl []\<rbrakk> \<Longrightarrow> [] \<in> Shift Kl k"
   156 lemma empty_Shift: "\<lbrakk>[] \<in> Kl; k \<in> Succ Kl []\<rbrakk> \<Longrightarrow> [] \<in> Shift Kl k"
   170 unfolding Shift_def Succ_def by simp
   157 unfolding Shift_def Succ_def by simp
   171 
   158 
   172 lemma Shift_clists: "Kl \<subseteq> Field (clists r) \<Longrightarrow> Shift Kl k \<subseteq> Field (clists r)"
       
   173 unfolding Shift_def clists_def Field_card_of by auto
       
   174 
       
   175 lemma Shift_prefCl: "prefCl Kl \<Longrightarrow> prefCl (Shift Kl k)"
       
   176 unfolding prefCl_def Shift_def
       
   177 proof safe
       
   178   fix kl1 kl2
       
   179   assume "\<forall>kl1 kl2. prefixeq kl1 kl2 \<and> kl2 \<in> Kl \<longrightarrow> kl1 \<in> Kl"
       
   180     "prefixeq kl1 kl2" "k # kl2 \<in> Kl"
       
   181   thus "k # kl1 \<in> Kl" using Cons_prefixeq_Cons[of k kl1 k kl2] by blast
       
   182 qed
       
   183 
       
   184 lemma not_in_Shift: "kl \<notin> Shift Kl x \<Longrightarrow> x # kl \<notin> Kl"
       
   185 unfolding Shift_def by simp
       
   186 
       
   187 lemma SuccD: "k \<in> Succ Kl kl \<Longrightarrow> kl @ [k] \<in> Kl"
   159 lemma SuccD: "k \<in> Succ Kl kl \<Longrightarrow> kl @ [k] \<in> Kl"
   188 unfolding Succ_def by simp
   160 unfolding Succ_def by simp
   189 
   161 
   190 lemmas SuccE = SuccD[elim_format]
   162 lemmas SuccE = SuccD[elim_format]
   191 
   163 
   195 lemma ShiftD: "kl \<in> Shift Kl k \<Longrightarrow> k # kl \<in> Kl"
   167 lemma ShiftD: "kl \<in> Shift Kl k \<Longrightarrow> k # kl \<in> Kl"
   196 unfolding Shift_def by simp
   168 unfolding Shift_def by simp
   197 
   169 
   198 lemma Succ_Shift: "Succ (Shift Kl k) kl = Succ Kl (k # kl)"
   170 lemma Succ_Shift: "Succ (Shift Kl k) kl = Succ Kl (k # kl)"
   199 unfolding Succ_def Shift_def by auto
   171 unfolding Succ_def Shift_def by auto
   200 
       
   201 lemma Nil_clists: "{[]} \<subseteq> Field (clists r)"
       
   202 unfolding clists_def Field_card_of by auto
       
   203 
       
   204 lemma Cons_clists:
       
   205   "\<lbrakk>x \<in> Field r; xs \<in> Field (clists r)\<rbrakk> \<Longrightarrow> x # xs \<in> Field (clists r)"
       
   206 unfolding clists_def Field_card_of by auto
       
   207 
   172 
   208 lemma length_Cons: "length (x # xs) = Suc (length xs)"
   173 lemma length_Cons: "length (x # xs) = Suc (length xs)"
   209 by simp
   174 by simp
   210 
   175 
   211 lemma length_append_singleton: "length (xs @ [x]) = Suc (length xs)"
   176 lemma length_append_singleton: "length (xs @ [x]) = Suc (length xs)"
   227 unfolding toCard_def using someI_ex[OF ex_toCard_pred] .
   192 unfolding toCard_def using someI_ex[OF ex_toCard_pred] .
   228 
   193 
   229 lemma toCard_inj: "\<lbrakk>|A| \<le>o r; Card_order r; x \<in> A; y \<in> A\<rbrakk> \<Longrightarrow>
   194 lemma toCard_inj: "\<lbrakk>|A| \<le>o r; Card_order r; x \<in> A; y \<in> A\<rbrakk> \<Longrightarrow>
   230   toCard A r x = toCard A r y \<longleftrightarrow> x = y"
   195   toCard A r x = toCard A r y \<longleftrightarrow> x = y"
   231 using toCard_pred_toCard unfolding inj_on_def toCard_pred_def by blast
   196 using toCard_pred_toCard unfolding inj_on_def toCard_pred_def by blast
   232 
       
   233 lemma toCard: "\<lbrakk>|A| \<le>o r; Card_order r; b \<in> A\<rbrakk> \<Longrightarrow> toCard A r b \<in> Field r"
       
   234 using toCard_pred_toCard unfolding toCard_pred_def by blast
       
   235 
   197 
   236 definition "fromCard A r k \<equiv> SOME b. b \<in> A \<and> toCard A r b = k"
   198 definition "fromCard A r k \<equiv> SOME b. b \<in> A \<and> toCard A r b = k"
   237 
   199 
   238 lemma fromCard_toCard:
   200 lemma fromCard_toCard:
   239 "\<lbrakk>|A| \<le>o r; Card_order r; b \<in> A\<rbrakk> \<Longrightarrow> fromCard A r (toCard A r b) = b"
   201 "\<lbrakk>|A| \<le>o r; Card_order r; b \<in> A\<rbrakk> \<Longrightarrow> fromCard A r (toCard A r b) = b"