diff -r e5432ec161ff -r 596baae88a88 src/HOL/BNF/BNF_Def.thy --- a/src/HOL/BNF/BNF_Def.thy Tue May 07 11:27:29 2013 +0200 +++ b/src/HOL/BNF/BNF_Def.thy Tue May 07 14:22:54 2013 +0200 @@ -21,10 +21,18 @@ "R1 ^-1 \ R2 ^-1 \ R1 \ R2" unfolding converse_def by auto +lemma conversep_mono: +"R1 ^--1 \ R2 ^--1 \ R1 \ R2" +unfolding conversep.simps by auto + lemma converse_shift: "R1 \ R2 ^-1 \ R1 ^-1 \ R2" unfolding converse_def by auto +lemma conversep_shift: +"R1 \ R2 ^--1 \ R1 ^--1 \ R2" +unfolding conversep.simps by auto + definition convol ("<_ , _>") where " \ %a. (f a, g a)" @@ -42,6 +50,10 @@ "\f x = f' x; g x = g' x; P x\ \ x \ {(f' a, g' a) |a. P a}" unfolding convol_def by auto +lemma convol_mem_GrpI: +"\g x = g' x; x \ A\ \ x \ (Collect (split (Grp A g)))" +unfolding convol_def Grp_def by auto + definition csquare where "csquare A f1 f2 p1 p2 \ (\ a \ A. f1 (p1 a) = f2 (p2 a))" @@ -91,48 +103,111 @@ lemma Id_alt: "Id = Gr UNIV id" unfolding Gr_def by auto +lemma eq_alt: "op = = Grp UNIV id" +unfolding Grp_def by auto + +lemma leq_conversepI: "R = op = \ R \ R^--1" + by auto + +lemma eq_OOI: "R = op = \ R = R OO R" + by auto + lemma Gr_UNIV_id: "f = id \ (Gr UNIV f)^-1 O Gr UNIV f = Gr UNIV f" unfolding Gr_def by auto +lemma Grp_UNIV_id: "f = id \ (Grp UNIV f)^--1 OO Grp UNIV f = Grp UNIV f" +unfolding Grp_def by auto + +lemma Grp_UNIV_idI: "x = y \ Grp UNIV id x y" +unfolding Grp_def by auto + lemma Gr_mono: "A \ B \ Gr A f \ Gr B f" unfolding Gr_def by auto +lemma Grp_mono: "A \ B \ Grp A f \ Grp B f" +unfolding Grp_def by auto + +lemma GrpI: "\f x = y; x \ A\ \ Grp A f x y" +unfolding Grp_def by auto + +lemma GrpE: "Grp A f x y \ (\f x = y; x \ A\ \ R) \ R" +unfolding Grp_def by auto + +lemma Collect_split_Grp_eqD: "z \ Collect (split (Grp A f)) \ (f \ fst) z = snd z" +unfolding Grp_def o_def by auto + +lemma Collect_split_Grp_inD: "z \ Collect (split (Grp A f)) \ fst z \ A" +unfolding Grp_def o_def by auto + lemma wpull_Gr: "wpull (Gr A f) A (f ` A) f id fst snd" unfolding wpull_def Gr_def by auto +lemma wpull_Grp: +"wpull (Collect (split (Grp A f))) A (f ` A) f id fst snd" +unfolding wpull_def Grp_def by auto + definition "pick_middle P Q a c = (SOME b. (a,b) \ P \ (b,c) \ Q)" +definition "pick_middlep P Q a c = (SOME b. P a b \ Q b c)" + lemma pick_middle: "(a,c) \ P O Q \ (a, pick_middle P Q a c) \ P \ (pick_middle P Q a c, c) \ Q" -unfolding pick_middle_def apply(rule someI_ex) -using assms unfolding relcomp_def by auto +unfolding pick_middle_def apply(rule someI_ex) by auto + +lemma pick_middlep: +"(P OO Q) a c \ P a (pick_middlep P Q a c) \ Q (pick_middlep P Q a c) c" +unfolding pick_middlep_def apply(rule someI_ex) by auto definition fstO where "fstO P Q ac = (fst ac, pick_middle P Q (fst ac) (snd ac))" definition sndO where "sndO P Q ac = (pick_middle P Q (fst ac) (snd ac), snd ac)" +definition fstOp where "fstOp P Q ac = (fst ac, pick_middlep P Q (fst ac) (snd ac))" +definition sndOp where "sndOp P Q ac = (pick_middlep P Q (fst ac) (snd ac), (snd ac))" + lemma fstO_in: "ac \ P O Q \ fstO P Q ac \ P" -unfolding fstO_def -by (subst (asm) surjective_pairing) (rule pick_middle[THEN conjunct1]) +unfolding fstO_def by (subst (asm) surjective_pairing) (rule pick_middle[THEN conjunct1]) + +lemma fstOp_in: "ac \ Collect (split (P OO Q)) \ fstOp P Q ac \ Collect (split P)" +unfolding fstOp_def mem_Collect_eq +by (subst (asm) surjective_pairing, unfold prod.cases) (erule pick_middlep[THEN conjunct1]) lemma fst_fstO: "fst bc = (fst \ fstO P Q) bc" unfolding comp_def fstO_def by simp +lemma fst_fstOp: "fst bc = (fst \ fstOp P Q) bc" +unfolding comp_def fstOp_def by simp + lemma snd_sndO: "snd bc = (snd \ sndO P Q) bc" unfolding comp_def sndO_def by simp +lemma snd_sndOp: "snd bc = (snd \ sndOp P Q) bc" +unfolding comp_def sndOp_def by simp + lemma sndO_in: "ac \ P O Q \ sndO P Q ac \ Q" unfolding sndO_def by (subst (asm) surjective_pairing) (rule pick_middle[THEN conjunct2]) +lemma sndOp_in: "ac \ Collect (split (P OO Q)) \ sndOp P Q ac \ Collect (split Q)" +unfolding sndOp_def mem_Collect_eq +by (subst (asm) surjective_pairing, unfold prod.cases) (erule pick_middlep[THEN conjunct2]) + lemma csquare_fstO_sndO: "csquare (P O Q) snd fst (fstO P Q) (sndO P Q)" unfolding csquare_def fstO_def sndO_def using pick_middle by simp +lemma csquare_fstOp_sndOp: +"csquare (Collect (split (P OO Q))) snd fst (fstOp P Q) (sndOp P Q)" +unfolding csquare_def fstOp_def sndOp_def using pick_middlep by simp + lemma wppull_fstO_sndO: shows "wppull (P O Q) P Q snd fst fst snd (fstO P Q) (sndO P Q)" using pick_middle unfolding wppull_def fstO_def sndO_def relcomp_def by auto +lemma wppull_fstOp_sndOp: +shows "wppull (Collect (split (P OO Q))) (Collect (split P)) (Collect (split Q)) snd fst fst snd (fstOp P Q) (sndOp P Q)" +using pick_middlep unfolding wppull_def fstOp_def sndOp_def relcompp.simps by auto + lemma snd_fst_flip: "snd xy = (fst o (%(x, y). (y, x))) xy" by (simp split: prod.split) @@ -142,11 +217,17 @@ lemma flip_rel: "A \ (R ^-1) \ (%(x, y). (y, x)) ` A \ R" by auto +lemma flip_pred: "A \ Collect (split (R ^--1)) \ (%(x, y). (y, x)) ` A \ Collect (split R)" +by auto + lemma pointfreeE: "f o g = f' o g' \ f (g x) = f' (g' x)" unfolding o_def fun_eq_iff by simp -lemma eqset_imp_iff_pair: "A = B \ (a, b) \ A \ (a, b) \ B" -by (rule eqset_imp_iff) +lemma Collect_split_mono: "A \ B \ Collect (split A) \ Collect (split B)" + by auto + +lemma predicate2_cong: "A = B \ A a b \ B a b" +by metis lemma fun_cong_pair: "f = g \ f {(a, b). R a b} = g {(a, b). R a b}" by (rule fun_cong) @@ -161,4 +242,5 @@ ML_file "Tools/bnf_def_tactics.ML" ML_file "Tools/bnf_def.ML" + end