blanchet@55059: (* Title: HOL/BNF_Def.thy blanchet@48975: Author: Dmitriy Traytel, TU Muenchen blanchet@57398: Author: Jasmin Blanchette, TU Muenchen blanchet@57698: Copyright 2012, 2013, 2014 blanchet@48975: blanchet@48975: Definition of bounded natural functors. blanchet@48975: *) blanchet@48975: wenzelm@58889: section {* Definition of Bounded Natural Functors *} blanchet@48975: blanchet@48975: theory BNF_Def blanchet@57398: imports BNF_Cardinal_Arithmetic Fun_Def_Base blanchet@48975: keywords blanchet@49286: "print_bnfs" :: diag and blanchet@51836: "bnf" :: thy_goal blanchet@48975: begin blanchet@48975: desharna@58104: lemma Collect_splitD: "x \ Collect (split A) \ A (fst x) (snd x)" desharna@58104: by auto desharna@58104: blanchet@57398: definition desharna@58446: rel_sum :: "('a \ 'c \ bool) \ ('b \ 'd \ bool) \ 'a + 'b \ 'c + 'd \ bool" desharna@58446: where desharna@58446: "rel_sum R1 R2 x y = desharna@58446: (case (x, y) of (Inl x, Inl y) \ R1 x y desharna@58446: | (Inr x, Inr y) \ R2 x y desharna@58446: | _ \ False)" desharna@58446: desharna@58446: definition blanchet@57398: rel_fun :: "('a \ 'c \ bool) \ ('b \ 'd \ bool) \ ('a \ 'b) \ ('c \ 'd) \ bool" blanchet@57398: where blanchet@57398: "rel_fun A B = (\f g. \x y. A x y \ B (f x) (g y))" blanchet@57398: blanchet@57398: lemma rel_funI [intro]: blanchet@57398: assumes "\x y. A x y \ B (f x) (g y)" blanchet@57398: shows "rel_fun A B f g" blanchet@57398: using assms by (simp add: rel_fun_def) blanchet@57398: blanchet@57398: lemma rel_funD: blanchet@57398: assumes "rel_fun A B f g" and "A x y" blanchet@57398: shows "B (f x) (g y)" blanchet@57398: using assms by (simp add: rel_fun_def) blanchet@57398: desharna@58104: definition rel_set :: "('a \ 'b \ bool) \ 'a set \ 'b set \ bool" desharna@58104: where "rel_set R = (\A B. (\x\A. \y\B. R x y) \ (\y\B. \x\A. R x y))" desharna@58104: desharna@58104: lemma rel_setI: desharna@58104: assumes "\x. x \ A \ \y\B. R x y" desharna@58104: assumes "\y. y \ B \ \x\A. R x y" desharna@58104: shows "rel_set R A B" desharna@58104: using assms unfolding rel_set_def by simp desharna@58104: desharna@58104: lemma predicate2_transferD: desharna@58104: "\rel_fun R1 (rel_fun R2 (op =)) P Q; a \ A; b \ B; A \ {(x, y). R1 x y}; B \ {(x, y). R2 x y}\ \ desharna@58104: P (fst a) (fst b) \ Q (snd a) (snd b)" desharna@58104: unfolding rel_fun_def by (blast dest!: Collect_splitD) desharna@58104: blanchet@57398: definition collect where blanchet@58352: "collect F x = (\f \ F. f x)" blanchet@57398: blanchet@57398: lemma fstI: "x = (y, z) \ fst x = y" blanchet@58352: by simp blanchet@57398: blanchet@57398: lemma sndI: "x = (y, z) \ snd x = z" blanchet@58352: by simp blanchet@57398: blanchet@57398: lemma bijI': "\\x y. (f x = f y) = (x = y); \y. \x. y = f x\ \ bij f" blanchet@58352: unfolding bij_def inj_on_def by auto blast blanchet@57398: blanchet@57398: (* Operator: *) blanchet@57398: definition "Gr A f = {(a, f a) | a. a \ A}" blanchet@57398: blanchet@57398: definition "Grp A f = (\a b. b = f a \ a \ A)" blanchet@57398: blanchet@57398: definition vimage2p where blanchet@57398: "vimage2p f g R = (\x y. R (f x) (g y))" blanchet@57398: blanchet@56635: lemma collect_comp: "collect F \ g = collect ((\f. f \ g) ` F)" blanchet@55066: by (rule ext) (auto simp only: comp_apply collect_def) traytel@51893: wenzelm@57641: definition convol ("\(_,/ _)\") where blanchet@58352: "\f, g\ \ \a. (f a, g a)" traytel@49495: blanchet@58352: lemma fst_convol: "fst \ \f, g\ = f" blanchet@58352: apply(rule ext) blanchet@58352: unfolding convol_def by simp traytel@49495: blanchet@58352: lemma snd_convol: "snd \ \f, g\ = g" blanchet@58352: apply(rule ext) blanchet@58352: unfolding convol_def by simp traytel@49495: traytel@51893: lemma convol_mem_GrpI: blanchet@58352: "x \ A \ \id, g\ x \ (Collect (split (Grp A g)))" blanchet@58352: unfolding convol_def Grp_def by auto traytel@51893: blanchet@49312: definition csquare where blanchet@58352: "csquare A f1 f2 p1 p2 \ (\ a \ A. f1 (p1 a) = f2 (p2 a))" blanchet@49312: traytel@51893: lemma eq_alt: "op = = Grp UNIV id" blanchet@58352: unfolding Grp_def by auto traytel@51893: traytel@51893: lemma leq_conversepI: "R = op = \ R \ R^--1" traytel@51893: by auto traytel@51893: traytel@54841: lemma leq_OOI: "R = op = \ R \ R OO R" traytel@51893: by auto traytel@51893: traytel@53561: lemma OO_Grp_alt: "(Grp A f)^--1 OO Grp A g = (\x y. \z. z \ A \ f z = x \ g z = y)" traytel@53561: unfolding Grp_def by auto traytel@53561: traytel@51893: lemma Grp_UNIV_id: "f = id \ (Grp UNIV f)^--1 OO Grp UNIV f = Grp UNIV f" blanchet@58352: unfolding Grp_def by auto traytel@51893: traytel@51893: lemma Grp_UNIV_idI: "x = y \ Grp UNIV id x y" blanchet@58352: unfolding Grp_def by auto traytel@51893: traytel@51893: lemma Grp_mono: "A \ B \ Grp A f \ Grp B f" blanchet@58352: unfolding Grp_def by auto traytel@51893: traytel@51893: lemma GrpI: "\f x = y; x \ A\ \ Grp A f x y" blanchet@58352: unfolding Grp_def by auto traytel@51893: traytel@51893: lemma GrpE: "Grp A f x y \ (\f x = y; x \ A\ \ R) \ R" blanchet@58352: unfolding Grp_def by auto traytel@51893: traytel@51893: lemma Collect_split_Grp_eqD: "z \ Collect (split (Grp A f)) \ (f \ fst) z = snd z" blanchet@58352: unfolding Grp_def comp_def by auto traytel@51893: traytel@51893: lemma Collect_split_Grp_inD: "z \ Collect (split (Grp A f)) \ fst z \ A" blanchet@58352: unfolding Grp_def comp_def by auto traytel@51893: traytel@51893: definition "pick_middlep P Q a c = (SOME b. P a b \ Q b c)" traytel@51893: traytel@51893: lemma pick_middlep: blanchet@58352: "(P OO Q) a c \ P a (pick_middlep P Q a c) \ Q (pick_middlep P Q a c) c" blanchet@58352: unfolding pick_middlep_def apply(rule someI_ex) by auto blanchet@49312: blanchet@58352: definition fstOp where blanchet@58352: "fstOp P Q ac = (fst ac, pick_middlep P Q (fst ac) (snd ac))" blanchet@58352: blanchet@58352: definition sndOp where blanchet@58352: "sndOp P Q ac = (pick_middlep P Q (fst ac) (snd ac), (snd ac))" traytel@51893: traytel@51893: lemma fstOp_in: "ac \ Collect (split (P OO Q)) \ fstOp P Q ac \ Collect (split P)" blanchet@58352: unfolding fstOp_def mem_Collect_eq blanchet@58352: by (subst (asm) surjective_pairing, unfold prod.case) (erule pick_middlep[THEN conjunct1]) blanchet@49312: traytel@51893: lemma fst_fstOp: "fst bc = (fst \ fstOp P Q) bc" blanchet@58352: unfolding comp_def fstOp_def by simp traytel@51893: traytel@51893: lemma snd_sndOp: "snd bc = (snd \ sndOp P Q) bc" blanchet@58352: unfolding comp_def sndOp_def by simp traytel@51893: traytel@51893: lemma sndOp_in: "ac \ Collect (split (P OO Q)) \ sndOp P Q ac \ Collect (split Q)" blanchet@58352: unfolding sndOp_def mem_Collect_eq blanchet@58352: by (subst (asm) surjective_pairing, unfold prod.case) (erule pick_middlep[THEN conjunct2]) traytel@51893: traytel@51893: lemma csquare_fstOp_sndOp: blanchet@58352: "csquare (Collect (split (P OO Q))) snd fst (fstOp P Q) (sndOp P Q)" blanchet@58352: unfolding csquare_def fstOp_def sndOp_def using pick_middlep by simp traytel@51893: blanchet@56635: lemma snd_fst_flip: "snd xy = (fst \ (%(x, y). (y, x))) xy" blanchet@58352: by (simp split: prod.split) blanchet@49312: blanchet@56635: lemma fst_snd_flip: "fst xy = (snd \ (%(x, y). (y, x))) xy" blanchet@58352: by (simp split: prod.split) blanchet@49312: traytel@51893: lemma flip_pred: "A \ Collect (split (R ^--1)) \ (%(x, y). (y, x)) ` A \ Collect (split R)" blanchet@58352: by auto traytel@51893: traytel@51893: lemma Collect_split_mono: "A \ B \ Collect (split A) \ Collect (split B)" traytel@51893: by auto traytel@51893: traytel@51916: lemma Collect_split_mono_strong: traytel@55163: "\X = fst ` A; Y = snd ` A; \a\X. \b \ Y. P a b \ Q a b; A \ Collect (split P)\ \ blanchet@58352: A \ Collect (split Q)" traytel@51916: by fastforce traytel@51916: traytel@55163: traytel@51917: lemma predicate2_eqD: "A = B \ A a b \ B a b" blanchet@58352: by simp blanchet@49537: blanchet@58352: lemma case_sum_o_inj: "case_sum f g \ Inl = f" "case_sum f g \ Inr = g" blanchet@58352: by auto traytel@52635: blanchet@58352: lemma map_sum_o_inj: "map_sum f g o Inl = Inl o f" "map_sum f g o Inr = Inr o g" blanchet@58352: by auto traytel@57802: traytel@52635: lemma card_order_csum_cone_cexp_def: traytel@52635: "card_order r \ ( |A1| +c cone) ^c r = |Func UNIV (Inl ` A1 \ {Inr ()})|" traytel@52635: unfolding cexp_def cone_def Field_csum Field_card_of by (auto dest: Field_card_order) traytel@52635: traytel@52635: lemma If_the_inv_into_in_Func: traytel@52635: "\inj_on g C; C \ B \ {x}\ \ blanchet@58352: (\i. if i \ g ` C then the_inv_into C g i else x) \ Func UNIV (B \ {x})" blanchet@58352: unfolding Func_def by (auto dest: the_inv_into_into) traytel@52635: traytel@52635: lemma If_the_inv_into_f_f: blanchet@58352: "\i \ C; inj_on g C\ \ ((\i. if i \ g ` C then the_inv_into C g i else x) \ g) i = id i" blanchet@58352: unfolding Func_def by (auto elim: the_inv_into_f_f) traytel@52635: blanchet@56635: lemma the_inv_f_o_f_id: "inj f \ (the_inv f \ f) z = id z" blanchet@56635: by (simp add: the_inv_f_f) blanchet@56635: traytel@52731: lemma vimage2pI: "R (f x) (g y) \ vimage2p f g R x y" traytel@52731: unfolding vimage2p_def by - traytel@52719: blanchet@55945: lemma rel_fun_iff_leq_vimage2p: "(rel_fun R S) f g = (R \ vimage2p f g S)" blanchet@55945: unfolding rel_fun_def vimage2p_def by auto traytel@52719: wenzelm@57641: lemma convol_image_vimage2p: "\f \ fst, g \ snd\ ` Collect (split (vimage2p f g R)) \ Collect (split R)" traytel@52731: unfolding vimage2p_def convol_def by auto traytel@52719: traytel@54961: lemma vimage2p_Grp: "vimage2p f g P = Grp UNIV f OO P OO (Grp UNIV g)\\" traytel@54961: unfolding vimage2p_def Grp_def by auto traytel@54961: desharna@58106: lemma subst_Pair: "P x y \ a = (x, y) \ P (fst a) (snd a)" desharna@58106: by simp desharna@58106: blanchet@58352: lemma comp_apply_eq: "f (g x) = h (k x) \ (f \ g) x = (h \ k) x" blanchet@58352: unfolding comp_apply by assumption blanchet@58352: blanchet@57398: ML_file "Tools/BNF/bnf_util.ML" blanchet@57398: ML_file "Tools/BNF/bnf_tactics.ML" blanchet@55062: ML_file "Tools/BNF/bnf_def_tactics.ML" blanchet@55062: ML_file "Tools/BNF/bnf_def.ML" blanchet@49309: blanchet@48975: end