src/HOL/HOLCF/Product_Cpo.thy
changeset 55414 eab03e9cee8a
parent 44066 d74182c93f04
child 58880 0baae4311a9f
equal deleted inserted replaced
55413:a8e96847523c 55414:eab03e9cee8a
   211 
   211 
   212 lemmas cont2cont_fst [simp, cont2cont] = cont_compose [OF cont_fst]
   212 lemmas cont2cont_fst [simp, cont2cont] = cont_compose [OF cont_fst]
   213 
   213 
   214 lemmas cont2cont_snd [simp, cont2cont] = cont_compose [OF cont_snd]
   214 lemmas cont2cont_snd [simp, cont2cont] = cont_compose [OF cont_snd]
   215 
   215 
   216 lemma cont2cont_prod_case:
   216 lemma cont2cont_case_prod:
   217   assumes f1: "\<And>a b. cont (\<lambda>x. f x a b)"
   217   assumes f1: "\<And>a b. cont (\<lambda>x. f x a b)"
   218   assumes f2: "\<And>x b. cont (\<lambda>a. f x a b)"
   218   assumes f2: "\<And>x b. cont (\<lambda>a. f x a b)"
   219   assumes f3: "\<And>x a. cont (\<lambda>b. f x a b)"
   219   assumes f3: "\<And>x a. cont (\<lambda>b. f x a b)"
   220   assumes g: "cont (\<lambda>x. g x)"
   220   assumes g: "cont (\<lambda>x. g x)"
   221   shows "cont (\<lambda>x. case g x of (a, b) \<Rightarrow> f x a b)"
   221   shows "cont (\<lambda>x. case g x of (a, b) \<Rightarrow> f x a b)"
   231   assumes f1: "\<And>y. cont (\<lambda>x. f (x, y))"
   231   assumes f1: "\<And>y. cont (\<lambda>x. f (x, y))"
   232   assumes f2: "\<And>x. cont (\<lambda>y. f (x, y))"
   232   assumes f2: "\<And>x. cont (\<lambda>y. f (x, y))"
   233   shows "cont f"
   233   shows "cont f"
   234 proof -
   234 proof -
   235   have "cont (\<lambda>(x, y). f (x, y))"
   235   have "cont (\<lambda>(x, y). f (x, y))"
   236     by (intro cont2cont_prod_case f1 f2 cont2cont)
   236     by (intro cont2cont_case_prod f1 f2 cont2cont)
   237   thus "cont f"
   237   thus "cont f"
   238     by (simp only: split_eta)
   238     by (simp only: split_eta)
   239 qed
   239 qed
   240 
   240 
   241 lemma prod_cont_iff:
   241 lemma prod_cont_iff:
   244 apply (erule cont_compose [OF _ cont_pair1])
   244 apply (erule cont_compose [OF _ cont_pair1])
   245 apply (erule cont_compose [OF _ cont_pair2])
   245 apply (erule cont_compose [OF _ cont_pair2])
   246 apply (simp only: prod_contI)
   246 apply (simp only: prod_contI)
   247 done
   247 done
   248 
   248 
   249 lemma cont2cont_prod_case' [simp, cont2cont]:
   249 lemma cont2cont_case_prod' [simp, cont2cont]:
   250   assumes f: "cont (\<lambda>p. f (fst p) (fst (snd p)) (snd (snd p)))"
   250   assumes f: "cont (\<lambda>p. f (fst p) (fst (snd p)) (snd (snd p)))"
   251   assumes g: "cont (\<lambda>x. g x)"
   251   assumes g: "cont (\<lambda>x. g x)"
   252   shows "cont (\<lambda>x. prod_case (f x) (g x))"
   252   shows "cont (\<lambda>x. case_prod (f x) (g x))"
   253 using assms by (simp add: cont2cont_prod_case prod_cont_iff)
   253 using assms by (simp add: cont2cont_case_prod prod_cont_iff)
   254 
   254 
   255 text {* The simple version (due to Joachim Breitner) is needed if
   255 text {* The simple version (due to Joachim Breitner) is needed if
   256   either element type of the pair is not a cpo. *}
   256   either element type of the pair is not a cpo. *}
   257 
   257 
   258 lemma cont2cont_split_simple [simp, cont2cont]:
   258 lemma cont2cont_split_simple [simp, cont2cont]:
   260  shows "cont (\<lambda>x. case p of (a, b) \<Rightarrow> f x a b)"
   260  shows "cont (\<lambda>x. case p of (a, b) \<Rightarrow> f x a b)"
   261 using assms by (cases p) auto
   261 using assms by (cases p) auto
   262 
   262 
   263 text {* Admissibility of predicates on product types. *}
   263 text {* Admissibility of predicates on product types. *}
   264 
   264 
   265 lemma adm_prod_case [simp]:
   265 lemma adm_case_prod [simp]:
   266   assumes "adm (\<lambda>x. P x (fst (f x)) (snd (f x)))"
   266   assumes "adm (\<lambda>x. P x (fst (f x)) (snd (f x)))"
   267   shows "adm (\<lambda>x. case f x of (a, b) \<Rightarrow> P x a b)"
   267   shows "adm (\<lambda>x. case f x of (a, b) \<Rightarrow> P x a b)"
   268 unfolding prod_case_beta using assms .
   268 unfolding case_prod_beta using assms .
   269 
   269 
   270 subsection {* Compactness and chain-finiteness *}
   270 subsection {* Compactness and chain-finiteness *}
   271 
   271 
   272 lemma fst_below_iff: "fst (x::'a \<times> 'b) \<sqsubseteq> y \<longleftrightarrow> x \<sqsubseteq> (y, snd x)"
   272 lemma fst_below_iff: "fst (x::'a \<times> 'b) \<sqsubseteq> y \<longleftrightarrow> x \<sqsubseteq> (y, snd x)"
   273 unfolding below_prod_def by simp
   273 unfolding below_prod_def by simp