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" |