# HG changeset patch # User huffman # Date 1289440568 28800 # Node ID 8e92772bc0e834667f3a59c4c983a03ef9ab4d4a # Parent 2ed71459136e85f1540d70d463a636c048b2d6e5 move map functions to new theory file Map_Functions; add theory file Plain_HOLCF diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Algebraic.thy --- a/src/HOLCF/Algebraic.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Algebraic.thy Wed Nov 10 17:56:08 2010 -0800 @@ -5,7 +5,7 @@ header {* Algebraic deflations *} theory Algebraic -imports Universal +imports Universal Map_Functions begin subsection {* Type constructor for finite deflations *} diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Bifinite.thy --- a/src/HOLCF/Bifinite.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Bifinite.thy Wed Nov 10 17:56:08 2010 -0800 @@ -5,7 +5,7 @@ header {* Bifinite domains *} theory Bifinite -imports Algebraic Cprod Sprod Ssum Up Lift One Tr Countable +imports Algebraic Map_Functions Countable begin subsection {* Class of bifinite domains *} diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Cfun.thy --- a/src/HOLCF/Cfun.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Cfun.thy Wed Nov 10 17:56:08 2010 -0800 @@ -479,24 +479,6 @@ lemma assoc_oo: "f oo (g oo h) = (f oo g) oo h" by (rule cfun_eqI, simp) -subsection {* Map operator for continuous function space *} - -definition - cfun_map :: "('b \ 'a) \ ('c \ 'd) \ ('a \ 'c) \ ('b \ 'd)" -where - "cfun_map = (\ a b f x. b\(f\(a\x)))" - -lemma cfun_map_beta [simp]: "cfun_map\a\b\f\x = b\(f\(a\x))" -unfolding cfun_map_def by simp - -lemma cfun_map_ID: "cfun_map\ID\ID = ID" -unfolding cfun_eq_iff by simp - -lemma cfun_map_map: - "cfun_map\f1\g1\(cfun_map\f2\g2\p) = - cfun_map\(\ x. f2\(f1\x))\(\ x. g1\(g2\x))\p" -by (rule cfun_eqI) simp - subsection {* Strictified functions *} default_sort pcpo diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Completion.thy --- a/src/HOLCF/Completion.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Completion.thy Wed Nov 10 17:56:08 2010 -0800 @@ -5,7 +5,7 @@ header {* Defining algebraic domains by ideal completion *} theory Completion -imports Cfun +imports Plain_HOLCF begin subsection {* Ideals over a preorder *} diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Cprod.thy --- a/src/HOLCF/Cprod.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Cprod.thy Wed Nov 10 17:56:08 2010 -0800 @@ -5,7 +5,7 @@ header {* The cpo of cartesian products *} theory Cprod -imports Deflation +imports Cfun begin default_sort cpo @@ -40,61 +40,4 @@ lemma csplit_Pair [simp]: "csplit\f\(x, y) = f\x\y" by (simp add: csplit_def) -subsection {* Map operator for product type *} - -definition - cprod_map :: "('a \ 'b) \ ('c \ 'd) \ 'a \ 'c \ 'b \ 'd" -where - "cprod_map = (\ f g p. (f\(fst p), g\(snd p)))" - -lemma cprod_map_Pair [simp]: "cprod_map\f\g\(x, y) = (f\x, g\y)" -unfolding cprod_map_def by simp - -lemma cprod_map_ID: "cprod_map\ID\ID = ID" -unfolding cfun_eq_iff by auto - -lemma cprod_map_map: - "cprod_map\f1\g1\(cprod_map\f2\g2\p) = - cprod_map\(\ x. f1\(f2\x))\(\ x. g1\(g2\x))\p" -by (induct p) simp - -lemma ep_pair_cprod_map: - assumes "ep_pair e1 p1" and "ep_pair e2 p2" - shows "ep_pair (cprod_map\e1\e2) (cprod_map\p1\p2)" -proof - interpret e1p1: ep_pair e1 p1 by fact - interpret e2p2: ep_pair e2 p2 by fact - fix x show "cprod_map\p1\p2\(cprod_map\e1\e2\x) = x" - by (induct x) simp - fix y show "cprod_map\e1\e2\(cprod_map\p1\p2\y) \ y" - by (induct y) (simp add: e1p1.e_p_below e2p2.e_p_below) -qed - -lemma deflation_cprod_map: - assumes "deflation d1" and "deflation d2" - shows "deflation (cprod_map\d1\d2)" -proof - interpret d1: deflation d1 by fact - interpret d2: deflation d2 by fact - fix x - show "cprod_map\d1\d2\(cprod_map\d1\d2\x) = cprod_map\d1\d2\x" - by (induct x) (simp add: d1.idem d2.idem) - show "cprod_map\d1\d2\x \ x" - by (induct x) (simp add: d1.below d2.below) -qed - -lemma finite_deflation_cprod_map: - assumes "finite_deflation d1" and "finite_deflation d2" - shows "finite_deflation (cprod_map\d1\d2)" -proof (rule finite_deflation_intro) - interpret d1: finite_deflation d1 by fact - interpret d2: finite_deflation d2 by fact - have "deflation d1" and "deflation d2" by fact+ - thus "deflation (cprod_map\d1\d2)" by (rule deflation_cprod_map) - have "{p. cprod_map\d1\d2\p = p} \ {x. d1\x = x} \ {y. d2\y = y}" - by clarsimp - thus "finite {p. cprod_map\d1\d2\p = p}" - by (rule finite_subset, simp add: d1.finite_fixes d2.finite_fixes) -qed - end diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Deflation.thy --- a/src/HOLCF/Deflation.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Deflation.thy Wed Nov 10 17:56:08 2010 -0800 @@ -5,7 +5,7 @@ header {* Continuous deflations and ep-pairs *} theory Deflation -imports Cfun +imports Plain_HOLCF begin default_sort cpo @@ -405,93 +405,4 @@ end -subsection {* Map operator for continuous functions *} - -lemma ep_pair_cfun_map: - assumes "ep_pair e1 p1" and "ep_pair e2 p2" - shows "ep_pair (cfun_map\p1\e2) (cfun_map\e1\p2)" -proof - interpret e1p1: ep_pair e1 p1 by fact - interpret e2p2: ep_pair e2 p2 by fact - fix f show "cfun_map\e1\p2\(cfun_map\p1\e2\f) = f" - by (simp add: cfun_eq_iff) - fix g show "cfun_map\p1\e2\(cfun_map\e1\p2\g) \ g" - apply (rule cfun_belowI, simp) - apply (rule below_trans [OF e2p2.e_p_below]) - apply (rule monofun_cfun_arg) - apply (rule e1p1.e_p_below) - done -qed - -lemma deflation_cfun_map: - assumes "deflation d1" and "deflation d2" - shows "deflation (cfun_map\d1\d2)" -proof - interpret d1: deflation d1 by fact - interpret d2: deflation d2 by fact - fix f - show "cfun_map\d1\d2\(cfun_map\d1\d2\f) = cfun_map\d1\d2\f" - by (simp add: cfun_eq_iff d1.idem d2.idem) - show "cfun_map\d1\d2\f \ f" - apply (rule cfun_belowI, simp) - apply (rule below_trans [OF d2.below]) - apply (rule monofun_cfun_arg) - apply (rule d1.below) - done -qed - -lemma finite_range_cfun_map: - assumes a: "finite (range (\x. a\x))" - assumes b: "finite (range (\y. b\y))" - shows "finite (range (\f. cfun_map\a\b\f))" (is "finite (range ?h)") -proof (rule finite_imageD) - let ?f = "\g. range (\x. (a\x, g\x))" - show "finite (?f ` range ?h)" - proof (rule finite_subset) - let ?B = "Pow (range (\x. a\x) \ range (\y. b\y))" - show "?f ` range ?h \ ?B" - by clarsimp - show "finite ?B" - by (simp add: a b) - qed - show "inj_on ?f (range ?h)" - proof (rule inj_onI, rule cfun_eqI, clarsimp) - fix x f g - assume "range (\x. (a\x, b\(f\(a\x)))) = range (\x. (a\x, b\(g\(a\x))))" - hence "range (\x. (a\x, b\(f\(a\x)))) \ range (\x. (a\x, b\(g\(a\x))))" - by (rule equalityD1) - hence "(a\x, b\(f\(a\x))) \ range (\x. (a\x, b\(g\(a\x))))" - by (simp add: subset_eq) - then obtain y where "(a\x, b\(f\(a\x))) = (a\y, b\(g\(a\y)))" - by (rule rangeE) - thus "b\(f\(a\x)) = b\(g\(a\x))" - by clarsimp - qed -qed - -lemma finite_deflation_cfun_map: - assumes "finite_deflation d1" and "finite_deflation d2" - shows "finite_deflation (cfun_map\d1\d2)" -proof (rule finite_deflation_intro) - interpret d1: finite_deflation d1 by fact - interpret d2: finite_deflation d2 by fact - have "deflation d1" and "deflation d2" by fact+ - thus "deflation (cfun_map\d1\d2)" by (rule deflation_cfun_map) - have "finite (range (\f. cfun_map\d1\d2\f))" - using d1.finite_range d2.finite_range - by (rule finite_range_cfun_map) - thus "finite {f. cfun_map\d1\d2\f = f}" - by (rule finite_range_imp_finite_fixes) -qed - -text {* Finite deflations are compact elements of the function space *} - -lemma finite_deflation_imp_compact: "finite_deflation d \ compact d" -apply (frule finite_deflation_imp_deflation) -apply (subgoal_tac "compact (cfun_map\d\d\d)") -apply (simp add: cfun_map_def deflation.idem eta_cfun) -apply (rule finite_deflation.compact) -apply (simp only: finite_deflation_cfun_map) -done - end diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Domain_Aux.thy --- a/src/HOLCF/Domain_Aux.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Domain_Aux.thy Wed Nov 10 17:56:08 2010 -0800 @@ -5,7 +5,7 @@ header {* Domain package support *} theory Domain_Aux -imports Ssum Sprod Fixrec +imports Map_Functions Fixrec uses ("Tools/Domain/domain_take_proofs.ML") begin diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Fixrec.thy --- a/src/HOLCF/Fixrec.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Fixrec.thy Wed Nov 10 17:56:08 2010 -0800 @@ -5,7 +5,7 @@ header "Package for defining recursive functions in HOLCF" theory Fixrec -imports Cprod Sprod Ssum Up One Tr Fix +imports Plain_HOLCF uses ("Tools/holcf_library.ML") ("Tools/fixrec.ML") diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/IsaMakefile --- a/src/HOLCF/IsaMakefile Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/IsaMakefile Wed Nov 10 17:56:08 2010 -0800 @@ -54,9 +54,11 @@ HOLCF.thy \ Lift.thy \ LowerPD.thy \ + Map_Functions.thy \ One.thy \ Pcpodef.thy \ Pcpo.thy \ + Plain_HOLCF.thy \ Porder.thy \ Powerdomains.thy \ Product_Cpo.thy \ diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Map_Functions.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOLCF/Map_Functions.thy Wed Nov 10 17:56:08 2010 -0800 @@ -0,0 +1,383 @@ +(* Title: HOLCF/Map_Functions.thy + Author: Brian Huffman +*) + +header {* Map functions for various types *} + +theory Map_Functions +imports Deflation +begin + +subsection {* Map operator for continuous function space *} + +default_sort cpo + +definition + cfun_map :: "('b \ 'a) \ ('c \ 'd) \ ('a \ 'c) \ ('b \ 'd)" +where + "cfun_map = (\ a b f x. b\(f\(a\x)))" + +lemma cfun_map_beta [simp]: "cfun_map\a\b\f\x = b\(f\(a\x))" +unfolding cfun_map_def by simp + +lemma cfun_map_ID: "cfun_map\ID\ID = ID" +unfolding cfun_eq_iff by simp + +lemma cfun_map_map: + "cfun_map\f1\g1\(cfun_map\f2\g2\p) = + cfun_map\(\ x. f2\(f1\x))\(\ x. g1\(g2\x))\p" +by (rule cfun_eqI) simp + +lemma ep_pair_cfun_map: + assumes "ep_pair e1 p1" and "ep_pair e2 p2" + shows "ep_pair (cfun_map\p1\e2) (cfun_map\e1\p2)" +proof + interpret e1p1: ep_pair e1 p1 by fact + interpret e2p2: ep_pair e2 p2 by fact + fix f show "cfun_map\e1\p2\(cfun_map\p1\e2\f) = f" + by (simp add: cfun_eq_iff) + fix g show "cfun_map\p1\e2\(cfun_map\e1\p2\g) \ g" + apply (rule cfun_belowI, simp) + apply (rule below_trans [OF e2p2.e_p_below]) + apply (rule monofun_cfun_arg) + apply (rule e1p1.e_p_below) + done +qed + +lemma deflation_cfun_map: + assumes "deflation d1" and "deflation d2" + shows "deflation (cfun_map\d1\d2)" +proof + interpret d1: deflation d1 by fact + interpret d2: deflation d2 by fact + fix f + show "cfun_map\d1\d2\(cfun_map\d1\d2\f) = cfun_map\d1\d2\f" + by (simp add: cfun_eq_iff d1.idem d2.idem) + show "cfun_map\d1\d2\f \ f" + apply (rule cfun_belowI, simp) + apply (rule below_trans [OF d2.below]) + apply (rule monofun_cfun_arg) + apply (rule d1.below) + done +qed + +lemma finite_range_cfun_map: + assumes a: "finite (range (\x. a\x))" + assumes b: "finite (range (\y. b\y))" + shows "finite (range (\f. cfun_map\a\b\f))" (is "finite (range ?h)") +proof (rule finite_imageD) + let ?f = "\g. range (\x. (a\x, g\x))" + show "finite (?f ` range ?h)" + proof (rule finite_subset) + let ?B = "Pow (range (\x. a\x) \ range (\y. b\y))" + show "?f ` range ?h \ ?B" + by clarsimp + show "finite ?B" + by (simp add: a b) + qed + show "inj_on ?f (range ?h)" + proof (rule inj_onI, rule cfun_eqI, clarsimp) + fix x f g + assume "range (\x. (a\x, b\(f\(a\x)))) = range (\x. (a\x, b\(g\(a\x))))" + hence "range (\x. (a\x, b\(f\(a\x)))) \ range (\x. (a\x, b\(g\(a\x))))" + by (rule equalityD1) + hence "(a\x, b\(f\(a\x))) \ range (\x. (a\x, b\(g\(a\x))))" + by (simp add: subset_eq) + then obtain y where "(a\x, b\(f\(a\x))) = (a\y, b\(g\(a\y)))" + by (rule rangeE) + thus "b\(f\(a\x)) = b\(g\(a\x))" + by clarsimp + qed +qed + +lemma finite_deflation_cfun_map: + assumes "finite_deflation d1" and "finite_deflation d2" + shows "finite_deflation (cfun_map\d1\d2)" +proof (rule finite_deflation_intro) + interpret d1: finite_deflation d1 by fact + interpret d2: finite_deflation d2 by fact + have "deflation d1" and "deflation d2" by fact+ + thus "deflation (cfun_map\d1\d2)" by (rule deflation_cfun_map) + have "finite (range (\f. cfun_map\d1\d2\f))" + using d1.finite_range d2.finite_range + by (rule finite_range_cfun_map) + thus "finite {f. cfun_map\d1\d2\f = f}" + by (rule finite_range_imp_finite_fixes) +qed + +text {* Finite deflations are compact elements of the function space *} + +lemma finite_deflation_imp_compact: "finite_deflation d \ compact d" +apply (frule finite_deflation_imp_deflation) +apply (subgoal_tac "compact (cfun_map\d\d\d)") +apply (simp add: cfun_map_def deflation.idem eta_cfun) +apply (rule finite_deflation.compact) +apply (simp only: finite_deflation_cfun_map) +done + +subsection {* Map operator for product type *} + +definition + cprod_map :: "('a \ 'b) \ ('c \ 'd) \ 'a \ 'c \ 'b \ 'd" +where + "cprod_map = (\ f g p. (f\(fst p), g\(snd p)))" + +lemma cprod_map_Pair [simp]: "cprod_map\f\g\(x, y) = (f\x, g\y)" +unfolding cprod_map_def by simp + +lemma cprod_map_ID: "cprod_map\ID\ID = ID" +unfolding cfun_eq_iff by auto + +lemma cprod_map_map: + "cprod_map\f1\g1\(cprod_map\f2\g2\p) = + cprod_map\(\ x. f1\(f2\x))\(\ x. g1\(g2\x))\p" +by (induct p) simp + +lemma ep_pair_cprod_map: + assumes "ep_pair e1 p1" and "ep_pair e2 p2" + shows "ep_pair (cprod_map\e1\e2) (cprod_map\p1\p2)" +proof + interpret e1p1: ep_pair e1 p1 by fact + interpret e2p2: ep_pair e2 p2 by fact + fix x show "cprod_map\p1\p2\(cprod_map\e1\e2\x) = x" + by (induct x) simp + fix y show "cprod_map\e1\e2\(cprod_map\p1\p2\y) \ y" + by (induct y) (simp add: e1p1.e_p_below e2p2.e_p_below) +qed + +lemma deflation_cprod_map: + assumes "deflation d1" and "deflation d2" + shows "deflation (cprod_map\d1\d2)" +proof + interpret d1: deflation d1 by fact + interpret d2: deflation d2 by fact + fix x + show "cprod_map\d1\d2\(cprod_map\d1\d2\x) = cprod_map\d1\d2\x" + by (induct x) (simp add: d1.idem d2.idem) + show "cprod_map\d1\d2\x \ x" + by (induct x) (simp add: d1.below d2.below) +qed + +lemma finite_deflation_cprod_map: + assumes "finite_deflation d1" and "finite_deflation d2" + shows "finite_deflation (cprod_map\d1\d2)" +proof (rule finite_deflation_intro) + interpret d1: finite_deflation d1 by fact + interpret d2: finite_deflation d2 by fact + have "deflation d1" and "deflation d2" by fact+ + thus "deflation (cprod_map\d1\d2)" by (rule deflation_cprod_map) + have "{p. cprod_map\d1\d2\p = p} \ {x. d1\x = x} \ {y. d2\y = y}" + by clarsimp + thus "finite {p. cprod_map\d1\d2\p = p}" + by (rule finite_subset, simp add: d1.finite_fixes d2.finite_fixes) +qed + +subsection {* Map function for lifted cpo *} + +definition + u_map :: "('a \ 'b) \ 'a u \ 'b u" +where + "u_map = (\ f. fup\(up oo f))" + +lemma u_map_strict [simp]: "u_map\f\\ = \" +unfolding u_map_def by simp + +lemma u_map_up [simp]: "u_map\f\(up\x) = up\(f\x)" +unfolding u_map_def by simp + +lemma u_map_ID: "u_map\ID = ID" +unfolding u_map_def by (simp add: cfun_eq_iff eta_cfun) + +lemma u_map_map: "u_map\f\(u_map\g\p) = u_map\(\ x. f\(g\x))\p" +by (induct p) simp_all + +lemma ep_pair_u_map: "ep_pair e p \ ep_pair (u_map\e) (u_map\p)" +apply default +apply (case_tac x, simp, simp add: ep_pair.e_inverse) +apply (case_tac y, simp, simp add: ep_pair.e_p_below) +done + +lemma deflation_u_map: "deflation d \ deflation (u_map\d)" +apply default +apply (case_tac x, simp, simp add: deflation.idem) +apply (case_tac x, simp, simp add: deflation.below) +done + +lemma finite_deflation_u_map: + assumes "finite_deflation d" shows "finite_deflation (u_map\d)" +proof (rule finite_deflation_intro) + interpret d: finite_deflation d by fact + have "deflation d" by fact + thus "deflation (u_map\d)" by (rule deflation_u_map) + have "{x. u_map\d\x = x} \ insert \ ((\x. up\x) ` {x. d\x = x})" + by (rule subsetI, case_tac x, simp_all) + thus "finite {x. u_map\d\x = x}" + by (rule finite_subset, simp add: d.finite_fixes) +qed + +subsection {* Map function for strict products *} + +default_sort pcpo + +definition + sprod_map :: "('a \ 'b) \ ('c \ 'd) \ 'a \ 'c \ 'b \ 'd" +where + "sprod_map = (\ f g. ssplit\(\ x y. (:f\x, g\y:)))" + +lemma sprod_map_strict [simp]: "sprod_map\a\b\\ = \" +unfolding sprod_map_def by simp + +lemma sprod_map_spair [simp]: + "x \ \ \ y \ \ \ sprod_map\f\g\(:x, y:) = (:f\x, g\y:)" +by (simp add: sprod_map_def) + +lemma sprod_map_spair': + "f\\ = \ \ g\\ = \ \ sprod_map\f\g\(:x, y:) = (:f\x, g\y:)" +by (cases "x = \ \ y = \") auto + +lemma sprod_map_ID: "sprod_map\ID\ID = ID" +unfolding sprod_map_def by (simp add: cfun_eq_iff eta_cfun) + +lemma sprod_map_map: + "\f1\\ = \; g1\\ = \\ \ + sprod_map\f1\g1\(sprod_map\f2\g2\p) = + sprod_map\(\ x. f1\(f2\x))\(\ x. g1\(g2\x))\p" +apply (induct p, simp) +apply (case_tac "f2\x = \", simp) +apply (case_tac "g2\y = \", simp) +apply simp +done + +lemma ep_pair_sprod_map: + assumes "ep_pair e1 p1" and "ep_pair e2 p2" + shows "ep_pair (sprod_map\e1\e2) (sprod_map\p1\p2)" +proof + interpret e1p1: pcpo_ep_pair e1 p1 unfolding pcpo_ep_pair_def by fact + interpret e2p2: pcpo_ep_pair e2 p2 unfolding pcpo_ep_pair_def by fact + fix x show "sprod_map\p1\p2\(sprod_map\e1\e2\x) = x" + by (induct x) simp_all + fix y show "sprod_map\e1\e2\(sprod_map\p1\p2\y) \ y" + apply (induct y, simp) + apply (case_tac "p1\x = \", simp, case_tac "p2\y = \", simp) + apply (simp add: monofun_cfun e1p1.e_p_below e2p2.e_p_below) + done +qed + +lemma deflation_sprod_map: + assumes "deflation d1" and "deflation d2" + shows "deflation (sprod_map\d1\d2)" +proof + interpret d1: deflation d1 by fact + interpret d2: deflation d2 by fact + fix x + show "sprod_map\d1\d2\(sprod_map\d1\d2\x) = sprod_map\d1\d2\x" + apply (induct x, simp) + apply (case_tac "d1\x = \", simp, case_tac "d2\y = \", simp) + apply (simp add: d1.idem d2.idem) + done + show "sprod_map\d1\d2\x \ x" + apply (induct x, simp) + apply (simp add: monofun_cfun d1.below d2.below) + done +qed + +lemma finite_deflation_sprod_map: + assumes "finite_deflation d1" and "finite_deflation d2" + shows "finite_deflation (sprod_map\d1\d2)" +proof (rule finite_deflation_intro) + interpret d1: finite_deflation d1 by fact + interpret d2: finite_deflation d2 by fact + have "deflation d1" and "deflation d2" by fact+ + thus "deflation (sprod_map\d1\d2)" by (rule deflation_sprod_map) + have "{x. sprod_map\d1\d2\x = x} \ insert \ + ((\(x, y). (:x, y:)) ` ({x. d1\x = x} \ {y. d2\y = y}))" + by (rule subsetI, case_tac x, auto simp add: spair_eq_iff) + thus "finite {x. sprod_map\d1\d2\x = x}" + by (rule finite_subset, simp add: d1.finite_fixes d2.finite_fixes) +qed + +subsection {* Map function for strict sums *} + +definition + ssum_map :: "('a \ 'b) \ ('c \ 'd) \ 'a \ 'c \ 'b \ 'd" +where + "ssum_map = (\ f g. sscase\(sinl oo f)\(sinr oo g))" + +lemma ssum_map_strict [simp]: "ssum_map\f\g\\ = \" +unfolding ssum_map_def by simp + +lemma ssum_map_sinl [simp]: "x \ \ \ ssum_map\f\g\(sinl\x) = sinl\(f\x)" +unfolding ssum_map_def by simp + +lemma ssum_map_sinr [simp]: "x \ \ \ ssum_map\f\g\(sinr\x) = sinr\(g\x)" +unfolding ssum_map_def by simp + +lemma ssum_map_sinl': "f\\ = \ \ ssum_map\f\g\(sinl\x) = sinl\(f\x)" +by (cases "x = \") simp_all + +lemma ssum_map_sinr': "g\\ = \ \ ssum_map\f\g\(sinr\x) = sinr\(g\x)" +by (cases "x = \") simp_all + +lemma ssum_map_ID: "ssum_map\ID\ID = ID" +unfolding ssum_map_def by (simp add: cfun_eq_iff eta_cfun) + +lemma ssum_map_map: + "\f1\\ = \; g1\\ = \\ \ + ssum_map\f1\g1\(ssum_map\f2\g2\p) = + ssum_map\(\ x. f1\(f2\x))\(\ x. g1\(g2\x))\p" +apply (induct p, simp) +apply (case_tac "f2\x = \", simp, simp) +apply (case_tac "g2\y = \", simp, simp) +done + +lemma ep_pair_ssum_map: + assumes "ep_pair e1 p1" and "ep_pair e2 p2" + shows "ep_pair (ssum_map\e1\e2) (ssum_map\p1\p2)" +proof + interpret e1p1: pcpo_ep_pair e1 p1 unfolding pcpo_ep_pair_def by fact + interpret e2p2: pcpo_ep_pair e2 p2 unfolding pcpo_ep_pair_def by fact + fix x show "ssum_map\p1\p2\(ssum_map\e1\e2\x) = x" + by (induct x) simp_all + fix y show "ssum_map\e1\e2\(ssum_map\p1\p2\y) \ y" + apply (induct y, simp) + apply (case_tac "p1\x = \", simp, simp add: e1p1.e_p_below) + apply (case_tac "p2\y = \", simp, simp add: e2p2.e_p_below) + done +qed + +lemma deflation_ssum_map: + assumes "deflation d1" and "deflation d2" + shows "deflation (ssum_map\d1\d2)" +proof + interpret d1: deflation d1 by fact + interpret d2: deflation d2 by fact + fix x + show "ssum_map\d1\d2\(ssum_map\d1\d2\x) = ssum_map\d1\d2\x" + apply (induct x, simp) + apply (case_tac "d1\x = \", simp, simp add: d1.idem) + apply (case_tac "d2\y = \", simp, simp add: d2.idem) + done + show "ssum_map\d1\d2\x \ x" + apply (induct x, simp) + apply (case_tac "d1\x = \", simp, simp add: d1.below) + apply (case_tac "d2\y = \", simp, simp add: d2.below) + done +qed + +lemma finite_deflation_ssum_map: + assumes "finite_deflation d1" and "finite_deflation d2" + shows "finite_deflation (ssum_map\d1\d2)" +proof (rule finite_deflation_intro) + interpret d1: finite_deflation d1 by fact + interpret d2: finite_deflation d2 by fact + have "deflation d1" and "deflation d2" by fact+ + thus "deflation (ssum_map\d1\d2)" by (rule deflation_ssum_map) + have "{x. ssum_map\d1\d2\x = x} \ + (\x. sinl\x) ` {x. d1\x = x} \ + (\x. sinr\x) ` {x. d2\x = x} \ {\}" + by (rule subsetI, case_tac x, simp_all) + thus "finite {x. ssum_map\d1\d2\x = x}" + by (rule finite_subset, simp add: d1.finite_fixes d2.finite_fixes) +qed + +end diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Plain_HOLCF.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOLCF/Plain_HOLCF.thy Wed Nov 10 17:56:08 2010 -0800 @@ -0,0 +1,15 @@ +(* Title: HOLCF/Plain_HOLCF.thy + Author: Brian Huffman +*) + +header {* Plain HOLCF *} + +theory Plain_HOLCF +imports Cfun Cprod Sprod Ssum Up Discrete Lift One Tr Fix +begin + +text {* + Basic HOLCF concepts and types; does not include definition packages. +*} + +end diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Sprod.thy --- a/src/HOLCF/Sprod.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Sprod.thy Wed Nov 10 17:56:08 2010 -0800 @@ -1,11 +1,12 @@ (* Title: HOLCF/Sprod.thy - Author: Franz Regensburger and Brian Huffman + Author: Franz Regensburger + Author: Brian Huffman *) header {* The type of strict products *} theory Sprod -imports Deflation +imports Cfun begin default_sort pcpo @@ -210,83 +211,4 @@ done qed -subsection {* Map function for strict products *} - -definition - sprod_map :: "('a \ 'b) \ ('c \ 'd) \ 'a \ 'c \ 'b \ 'd" -where - "sprod_map = (\ f g. ssplit\(\ x y. (:f\x, g\y:)))" - -lemma sprod_map_strict [simp]: "sprod_map\a\b\\ = \" -unfolding sprod_map_def by simp - -lemma sprod_map_spair [simp]: - "x \ \ \ y \ \ \ sprod_map\f\g\(:x, y:) = (:f\x, g\y:)" -by (simp add: sprod_map_def) - -lemma sprod_map_spair': - "f\\ = \ \ g\\ = \ \ sprod_map\f\g\(:x, y:) = (:f\x, g\y:)" -by (cases "x = \ \ y = \") auto - -lemma sprod_map_ID: "sprod_map\ID\ID = ID" -unfolding sprod_map_def by (simp add: cfun_eq_iff eta_cfun) - -lemma sprod_map_map: - "\f1\\ = \; g1\\ = \\ \ - sprod_map\f1\g1\(sprod_map\f2\g2\p) = - sprod_map\(\ x. f1\(f2\x))\(\ x. g1\(g2\x))\p" -apply (induct p, simp) -apply (case_tac "f2\x = \", simp) -apply (case_tac "g2\y = \", simp) -apply simp -done - -lemma ep_pair_sprod_map: - assumes "ep_pair e1 p1" and "ep_pair e2 p2" - shows "ep_pair (sprod_map\e1\e2) (sprod_map\p1\p2)" -proof - interpret e1p1: pcpo_ep_pair e1 p1 unfolding pcpo_ep_pair_def by fact - interpret e2p2: pcpo_ep_pair e2 p2 unfolding pcpo_ep_pair_def by fact - fix x show "sprod_map\p1\p2\(sprod_map\e1\e2\x) = x" - by (induct x) simp_all - fix y show "sprod_map\e1\e2\(sprod_map\p1\p2\y) \ y" - apply (induct y, simp) - apply (case_tac "p1\x = \", simp, case_tac "p2\y = \", simp) - apply (simp add: monofun_cfun e1p1.e_p_below e2p2.e_p_below) - done -qed - -lemma deflation_sprod_map: - assumes "deflation d1" and "deflation d2" - shows "deflation (sprod_map\d1\d2)" -proof - interpret d1: deflation d1 by fact - interpret d2: deflation d2 by fact - fix x - show "sprod_map\d1\d2\(sprod_map\d1\d2\x) = sprod_map\d1\d2\x" - apply (induct x, simp) - apply (case_tac "d1\x = \", simp, case_tac "d2\y = \", simp) - apply (simp add: d1.idem d2.idem) - done - show "sprod_map\d1\d2\x \ x" - apply (induct x, simp) - apply (simp add: monofun_cfun d1.below d2.below) - done -qed - -lemma finite_deflation_sprod_map: - assumes "finite_deflation d1" and "finite_deflation d2" - shows "finite_deflation (sprod_map\d1\d2)" -proof (rule finite_deflation_intro) - interpret d1: finite_deflation d1 by fact - interpret d2: finite_deflation d2 by fact - have "deflation d1" and "deflation d2" by fact+ - thus "deflation (sprod_map\d1\d2)" by (rule deflation_sprod_map) - have "{x. sprod_map\d1\d2\x = x} \ insert \ - ((\(x, y). (:x, y:)) ` ({x. d1\x = x} \ {y. d2\y = y}))" - by (rule subsetI, case_tac x, auto simp add: spair_eq_iff) - thus "finite {x. sprod_map\d1\d2\x = x}" - by (rule finite_subset, simp add: d1.finite_fixes d2.finite_fixes) -qed - end diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Ssum.thy --- a/src/HOLCF/Ssum.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Ssum.thy Wed Nov 10 17:56:08 2010 -0800 @@ -1,5 +1,6 @@ (* Title: HOLCF/Ssum.thy - Author: Franz Regensburger and Brian Huffman + Author: Franz Regensburger + Author: Brian Huffman *) header {* The type of strict sums *} @@ -194,88 +195,4 @@ apply (case_tac y, simp_all add: flat_below_iff) done -subsection {* Map function for strict sums *} - -definition - ssum_map :: "('a \ 'b) \ ('c \ 'd) \ 'a \ 'c \ 'b \ 'd" -where - "ssum_map = (\ f g. sscase\(sinl oo f)\(sinr oo g))" - -lemma ssum_map_strict [simp]: "ssum_map\f\g\\ = \" -unfolding ssum_map_def by simp - -lemma ssum_map_sinl [simp]: "x \ \ \ ssum_map\f\g\(sinl\x) = sinl\(f\x)" -unfolding ssum_map_def by simp - -lemma ssum_map_sinr [simp]: "x \ \ \ ssum_map\f\g\(sinr\x) = sinr\(g\x)" -unfolding ssum_map_def by simp - -lemma ssum_map_sinl': "f\\ = \ \ ssum_map\f\g\(sinl\x) = sinl\(f\x)" -by (cases "x = \") simp_all - -lemma ssum_map_sinr': "g\\ = \ \ ssum_map\f\g\(sinr\x) = sinr\(g\x)" -by (cases "x = \") simp_all - -lemma ssum_map_ID: "ssum_map\ID\ID = ID" -unfolding ssum_map_def by (simp add: cfun_eq_iff eta_cfun) - -lemma ssum_map_map: - "\f1\\ = \; g1\\ = \\ \ - ssum_map\f1\g1\(ssum_map\f2\g2\p) = - ssum_map\(\ x. f1\(f2\x))\(\ x. g1\(g2\x))\p" -apply (induct p, simp) -apply (case_tac "f2\x = \", simp, simp) -apply (case_tac "g2\y = \", simp, simp) -done - -lemma ep_pair_ssum_map: - assumes "ep_pair e1 p1" and "ep_pair e2 p2" - shows "ep_pair (ssum_map\e1\e2) (ssum_map\p1\p2)" -proof - interpret e1p1: pcpo_ep_pair e1 p1 unfolding pcpo_ep_pair_def by fact - interpret e2p2: pcpo_ep_pair e2 p2 unfolding pcpo_ep_pair_def by fact - fix x show "ssum_map\p1\p2\(ssum_map\e1\e2\x) = x" - by (induct x) simp_all - fix y show "ssum_map\e1\e2\(ssum_map\p1\p2\y) \ y" - apply (induct y, simp) - apply (case_tac "p1\x = \", simp, simp add: e1p1.e_p_below) - apply (case_tac "p2\y = \", simp, simp add: e2p2.e_p_below) - done -qed - -lemma deflation_ssum_map: - assumes "deflation d1" and "deflation d2" - shows "deflation (ssum_map\d1\d2)" -proof - interpret d1: deflation d1 by fact - interpret d2: deflation d2 by fact - fix x - show "ssum_map\d1\d2\(ssum_map\d1\d2\x) = ssum_map\d1\d2\x" - apply (induct x, simp) - apply (case_tac "d1\x = \", simp, simp add: d1.idem) - apply (case_tac "d2\y = \", simp, simp add: d2.idem) - done - show "ssum_map\d1\d2\x \ x" - apply (induct x, simp) - apply (case_tac "d1\x = \", simp, simp add: d1.below) - apply (case_tac "d2\y = \", simp, simp add: d2.below) - done -qed - -lemma finite_deflation_ssum_map: - assumes "finite_deflation d1" and "finite_deflation d2" - shows "finite_deflation (ssum_map\d1\d2)" -proof (rule finite_deflation_intro) - interpret d1: finite_deflation d1 by fact - interpret d2: finite_deflation d2 by fact - have "deflation d1" and "deflation d2" by fact+ - thus "deflation (ssum_map\d1\d2)" by (rule deflation_ssum_map) - have "{x. ssum_map\d1\d2\x = x} \ - (\x. sinl\x) ` {x. d1\x = x} \ - (\x. sinr\x) ` {x. d2\x = x} \ {\}" - by (rule subsetI, case_tac x, simp_all) - thus "finite {x. ssum_map\d1\d2\x = x}" - by (rule finite_subset, simp add: d1.finite_fixes d2.finite_fixes) -qed - end diff -r 2ed71459136e -r 8e92772bc0e8 src/HOLCF/Up.thy --- a/src/HOLCF/Up.thy Wed Nov 10 14:59:52 2010 -0800 +++ b/src/HOLCF/Up.thy Wed Nov 10 17:56:08 2010 -0800 @@ -1,11 +1,12 @@ (* Title: HOLCF/Up.thy - Author: Franz Regensburger and Brian Huffman + Author: Franz Regensburger + Author: Brian Huffman *) header {* The type of lifted values *} theory Up -imports Deflation +imports Cfun begin default_sort cpo @@ -259,47 +260,4 @@ lemma fup3 [simp]: "fup\up\x = x" by (cases x, simp_all) -subsection {* Map function for lifted cpo *} - -definition - u_map :: "('a \ 'b) \ 'a u \ 'b u" -where - "u_map = (\ f. fup\(up oo f))" - -lemma u_map_strict [simp]: "u_map\f\\ = \" -unfolding u_map_def by simp - -lemma u_map_up [simp]: "u_map\f\(up\x) = up\(f\x)" -unfolding u_map_def by simp - -lemma u_map_ID: "u_map\ID = ID" -unfolding u_map_def by (simp add: cfun_eq_iff eta_cfun) - -lemma u_map_map: "u_map\f\(u_map\g\p) = u_map\(\ x. f\(g\x))\p" -by (induct p) simp_all - -lemma ep_pair_u_map: "ep_pair e p \ ep_pair (u_map\e) (u_map\p)" -apply default -apply (case_tac x, simp, simp add: ep_pair.e_inverse) -apply (case_tac y, simp, simp add: ep_pair.e_p_below) -done - -lemma deflation_u_map: "deflation d \ deflation (u_map\d)" -apply default -apply (case_tac x, simp, simp add: deflation.idem) -apply (case_tac x, simp, simp add: deflation.below) -done - -lemma finite_deflation_u_map: - assumes "finite_deflation d" shows "finite_deflation (u_map\d)" -proof (rule finite_deflation_intro) - interpret d: finite_deflation d by fact - have "deflation d" by fact - thus "deflation (u_map\d)" by (rule deflation_u_map) - have "{x. u_map\d\x = x} \ insert \ ((\x. up\x) ` {x. d\x = x})" - by (rule subsetI, case_tac x, simp_all) - thus "finite {x. u_map\d\x = x}" - by (rule finite_subset, simp add: d.finite_fixes) -qed - end