# HG changeset patch # User huffman # Date 1210973137 -7200 # Node ID 8684b5240f111266d155a43f738e670ad29dde33 # Parent 19d8783a30de8b7e74135ce1a775eba628803a10 rename locales; add completion_approx constant to ideal_completion locale; add new set-like syntax for powerdomains; reorganized proofs diff -r 19d8783a30de -r 8684b5240f11 src/HOLCF/CompactBasis.thy --- a/src/HOLCF/CompactBasis.thy Fri May 16 22:35:25 2008 +0200 +++ b/src/HOLCF/CompactBasis.thy Fri May 16 23:25:37 2008 +0200 @@ -52,7 +52,7 @@ lemma ideal_principal: "ideal {x. x \ z}" apply (rule idealI) apply (rule_tac x=z in exI) -apply (fast intro: refl) +apply fast apply (rule_tac x=z in bexI, fast) apply fast apply (fast intro: trans_less) @@ -116,7 +116,7 @@ lemma is_lub_thelub0: "\\u. S <<| u; S <| x\ \ lub S \ x" by (erule exE, drule lubI, erule is_lub_lub) -locale plotkin_order = preorder r + +locale basis_take = preorder r + fixes take :: "nat \ 'a::type \ 'a" assumes take_less: "r (take n a) a" assumes take_take: "take n (take n a) = take n a" @@ -125,28 +125,28 @@ assumes finite_range_take: "finite (range (take n))" assumes take_covers: "\n. take n a = a" -locale bifinite_basis = plotkin_order r + +locale ideal_completion = basis_take r + fixes principal :: "'a::type \ 'b::cpo" - fixes approxes :: "'b::cpo \ 'a::type set" - assumes ideal_approxes: "\x. preorder.ideal r (approxes x)" - assumes cont_approxes: "cont approxes" - assumes approxes_principal: "\a. approxes (principal a) = {b. r b a}" - assumes subset_approxesD: "\x y. approxes x \ approxes y \ x \ y" + fixes rep :: "'b::cpo \ 'a::type set" + assumes ideal_rep: "\x. preorder.ideal r (rep x)" + assumes cont_rep: "cont rep" + assumes rep_principal: "\a. rep (principal a) = {b. r b a}" + assumes subset_repD: "\x y. rep x \ rep y \ x \ y" begin -lemma finite_take_approxes: "finite (take n ` approxes x)" +lemma finite_take_rep: "finite (take n ` rep x)" by (rule finite_subset [OF image_mono [OF subset_UNIV] finite_range_take]) lemma basis_fun_lemma0: fixes f :: "'a::type \ 'c::cpo" assumes f_mono: "\a b. r a b \ f a \ f b" - shows "\u. f ` take i ` approxes x <<| u" + shows "\u. f ` take i ` rep x <<| u" apply (rule finite_directed_has_lub) apply (rule finite_imageI) -apply (rule finite_take_approxes) +apply (rule finite_take_rep) apply (subst image_image) apply (rule directed_image_ideal) -apply (rule ideal_approxes) +apply (rule ideal_rep) apply (rule f_mono) apply (erule take_mono) done @@ -154,7 +154,7 @@ lemma basis_fun_lemma1: fixes f :: "'a::type \ 'c::cpo" assumes f_mono: "\a b. r a b \ f a \ f b" - shows "chain (\i. lub (f ` take i ` approxes x))" + shows "chain (\i. lub (f ` take i ` rep x))" apply (rule chainI) apply (rule is_lub_thelub0) apply (rule basis_fun_lemma0, erule f_mono) @@ -168,7 +168,7 @@ lemma basis_fun_lemma2: fixes f :: "'a::type \ 'c::cpo" assumes f_mono: "\a b. r a b \ f a \ f b" - shows "f ` approxes x <<| (\i. lub (f ` take i ` approxes x))" + shows "f ` rep x <<| (\i. lub (f ` take i ` rep x))" apply (rule is_lubI) apply (rule ub_imageI, rename_tac a) apply (cut_tac a=a in take_covers, erule exE, rename_tac i) @@ -191,74 +191,80 @@ lemma basis_fun_lemma: fixes f :: "'a::type \ 'c::cpo" assumes f_mono: "\a b. r a b \ f a \ f b" - shows "\u. f ` approxes x <<| u" + shows "\u. f ` rep x <<| u" by (rule exI, rule basis_fun_lemma2, erule f_mono) -lemma approxes_mono: "x \ y \ approxes x \ approxes y" -apply (drule cont_approxes [THEN cont2mono, THEN monofunE]) +lemma rep_mono: "x \ y \ rep x \ rep y" +apply (drule cont_rep [THEN cont2mono, THEN monofunE]) apply (simp add: set_cpo_simps) done -lemma approxes_contlub: - "chain Y \ approxes (\i. Y i) = (\i. approxes (Y i))" -by (simp add: cont2contlubE [OF cont_approxes] set_cpo_simps) +lemma rep_contlub: + "chain Y \ rep (\i. Y i) = (\i. rep (Y i))" +by (simp add: cont2contlubE [OF cont_rep] set_cpo_simps) -lemma less_def: "(x \ y) = (approxes x \ approxes y)" -by (rule iffI [OF approxes_mono subset_approxesD]) +lemma less_def: "x \ y \ rep x \ rep y" +by (rule iffI [OF rep_mono subset_repD]) -lemma approxes_eq: "approxes x = {a. principal a \ x}" -unfolding less_def approxes_principal +lemma rep_eq: "rep x = {a. principal a \ x}" +unfolding less_def rep_principal apply safe -apply (erule (1) idealD3 [OF ideal_approxes]) +apply (erule (1) idealD3 [OF ideal_rep]) apply (erule subsetD, simp add: refl) done -lemma mem_approxes_iff: "(a \ approxes x) = (principal a \ x)" -by (simp add: approxes_eq) +lemma mem_rep_iff_principal_less: "a \ rep x \ principal a \ x" +by (simp add: rep_eq) + +lemma principal_less_iff_mem_rep: "principal a \ x \ a \ rep x" +by (simp add: rep_eq) -lemma principal_less_iff: "(principal a \ x) = (a \ approxes x)" -by (simp add: approxes_eq) +lemma principal_less_iff: "principal a \ principal b \ r a b" +by (simp add: principal_less_iff_mem_rep rep_principal) -lemma approxesD: "a \ approxes x \ principal a \ x" -by (simp add: approxes_eq) +lemma principal_eq_iff: "principal a = principal b \ r a b \ r b a" +unfolding po_eq_conv [where 'a='b] principal_less_iff .. + +lemma repD: "a \ rep x \ principal a \ x" +by (simp add: rep_eq) lemma principal_mono: "r a b \ principal a \ principal b" -by (rule approxesD, simp add: approxes_principal) +by (simp add: principal_less_iff) lemma lessI: "(\a. principal a \ x \ principal a \ u) \ x \ u" -unfolding principal_less_iff +unfolding principal_less_iff_mem_rep by (simp add: less_def subset_eq) -lemma lub_principal_approxes: "principal ` approxes x <<| x" +lemma lub_principal_rep: "principal ` rep x <<| x" apply (rule is_lubI) apply (rule ub_imageI) -apply (erule approxesD) +apply (erule repD) apply (subst less_def) apply (rule subsetI) apply (drule (1) ub_imageD) -apply (simp add: approxes_eq) +apply (simp add: rep_eq) done definition basis_fun :: "('a::type \ 'c::cpo) \ 'b \ 'c" where - "basis_fun = (\f. (\ x. lub (f ` approxes x)))" + "basis_fun = (\f. (\ x. lub (f ` rep x)))" lemma basis_fun_beta: fixes f :: "'a::type \ 'c::cpo" assumes f_mono: "\a b. r a b \ f a \ f b" - shows "basis_fun f\x = lub (f ` approxes x)" + shows "basis_fun f\x = lub (f ` rep x)" unfolding basis_fun_def proof (rule beta_cfun) - have lub: "\x. \u. f ` approxes x <<| u" + have lub: "\x. \u. f ` rep x <<| u" using f_mono by (rule basis_fun_lemma) - show cont: "cont (\x. lub (f ` approxes x))" + show cont: "cont (\x. lub (f ` rep x))" apply (rule contI2) apply (rule monofunI) apply (rule is_lub_thelub0 [OF lub ub_imageI]) apply (rule is_ub_thelub0 [OF lub imageI]) - apply (erule (1) subsetD [OF approxes_mono]) + apply (erule (1) subsetD [OF rep_mono]) apply (rule is_lub_thelub0 [OF lub ub_imageI]) - apply (simp add: approxes_contlub, clarify) + apply (simp add: rep_contlub, clarify) apply (erule rev_trans_less [OF is_ub_thelub]) apply (erule is_ub_thelub0 [OF lub imageI]) done @@ -269,7 +275,7 @@ assumes f_mono: "\a b. r a b \ f a \ f b" shows "basis_fun f\(principal a) = f a" apply (subst basis_fun_beta, erule f_mono) -apply (subst approxes_principal) +apply (subst rep_principal) apply (rule lub_image_principal, erule f_mono) done @@ -290,10 +296,24 @@ done lemma compact_principal: "compact (principal a)" -by (rule compactI2, simp add: principal_less_iff approxes_contlub) +by (rule compactI2, simp add: principal_less_iff_mem_rep rep_contlub) + +definition + completion_approx :: "nat \ 'b \ 'b" where + "completion_approx = (\i. basis_fun (\a. principal (take i a)))" -lemma chain_basis_fun_take: - "chain (\i. basis_fun (\a. principal (take i a)))" +lemma completion_approx_beta: + "completion_approx i\x = (\a\rep x. principal (take i a))" +unfolding completion_approx_def +by (simp add: basis_fun_beta principal_mono take_mono) + +lemma completion_approx_principal: + "completion_approx i\(principal a) = principal (take i a)" +unfolding completion_approx_def +by (simp add: basis_fun_principal principal_mono take_mono) + +lemma chain_completion_approx: "chain completion_approx" +unfolding completion_approx_def apply (rule chainI) apply (rule basis_fun_mono) apply (erule principal_mono [OF take_mono]) @@ -301,53 +321,56 @@ apply (rule principal_mono [OF take_chain]) done -lemma lub_basis_fun_take: - "(\i. basis_fun (\a. principal (take i a))\x) = x" - apply (simp add: basis_fun_beta principal_mono take_mono) +lemma lub_completion_approx: "(\i. completion_approx i\x) = x" +unfolding completion_approx_beta apply (subst image_image [where f=principal, symmetric]) - apply (rule unique_lub [OF _ lub_principal_approxes]) + apply (rule unique_lub [OF _ lub_principal_rep]) apply (rule basis_fun_lemma2, erule principal_mono) done -lemma basis_fun_take_eq_principal: - "\a\approxes x. - basis_fun (\a. principal (take i a))\x = principal (take i a)" - apply (simp add: basis_fun_beta principal_mono take_mono) +lemma completion_approx_eq_principal: + "\a\rep x. completion_approx i\x = principal (take i a)" +unfolding completion_approx_beta apply (subst image_image [where f=principal, symmetric]) - apply (subgoal_tac "finite (principal ` take i ` approxes x)") - apply (subgoal_tac "directed (principal ` take i ` approxes x)") + apply (subgoal_tac "finite (principal ` take i ` rep x)") + apply (subgoal_tac "directed (principal ` take i ` rep x)") apply (drule (1) lub_finite_directed_in_self, fast) apply (subst image_image) apply (rule directed_image_ideal) - apply (rule ideal_approxes) + apply (rule ideal_rep) apply (erule principal_mono [OF take_mono]) apply (rule finite_imageI) - apply (rule finite_take_approxes) + apply (rule finite_take_rep) +done + +lemma completion_approx_idem: + "completion_approx i\(completion_approx i\x) = completion_approx i\x" +using completion_approx_eq_principal [where i=i and x=x] +by (auto simp add: completion_approx_principal take_take) + +lemma finite_fixes_completion_approx: + "finite {x. completion_approx i\x = x}" (is "finite ?S") +apply (subgoal_tac "?S \ principal ` range (take i)") +apply (erule finite_subset) +apply (rule finite_imageI) +apply (rule finite_range_take) +apply (clarify, erule subst) +apply (cut_tac x=x and i=i in completion_approx_eq_principal) +apply fast done lemma principal_induct: assumes adm: "adm P" assumes P: "\a. P (principal a)" shows "P x" - apply (subgoal_tac "P (\i. basis_fun (\a. principal (take i a))\x)") - apply (simp add: lub_basis_fun_take) + apply (subgoal_tac "P (\i. completion_approx i\x)") + apply (simp add: lub_completion_approx) apply (rule admD [OF adm]) - apply (simp add: chain_basis_fun_take) - apply (cut_tac x=x and i=i in basis_fun_take_eq_principal) + apply (simp add: chain_completion_approx) + apply (cut_tac x=x and i=i in completion_approx_eq_principal) apply (clarify, simp add: P) done -lemma finite_fixes_basis_fun_take: - "finite {x. basis_fun (\a. principal (take i a))\x = x}" (is "finite ?S") -apply (subgoal_tac "?S \ principal ` range (take i)") -apply (erule finite_subset) -apply (rule finite_imageI) -apply (rule finite_range_take) -apply (clarify, erule subst) -apply (cut_tac x=x and i=i in basis_fun_take_eq_principal) -apply fast -done - end @@ -359,7 +382,7 @@ by (fast intro: compact_approx) lemma compact_Rep_compact_basis [simp]: "compact (Rep_compact_basis a)" -by (rule Rep_compact_basis [simplified]) +by (rule Rep_compact_basis [unfolded mem_Collect_eq]) lemma Rep_Abs_compact_basis_approx [simp]: "Rep_compact_basis (Abs_compact_basis (approx n\x)) = approx n\x" @@ -520,7 +543,7 @@ done interpretation compact_basis: - bifinite_basis [sq_le compact_approx Rep_compact_basis compacts] + ideal_completion [sq_le compact_approx Rep_compact_basis compacts] proof (unfold_locales) fix n :: nat and a b :: "'a compact_basis" and x :: "'a" show "compact_approx n a \ a" @@ -620,12 +643,14 @@ "('a compact_basis \ 'b::type) \ ('b \ 'b \ 'b) \ 'a pd_basis \ 'b" where "fold_pd g f t = fold1 f (g ` Rep_pd_basis t)" -lemma (in ab_semigroup_idem_mult) fold_pd_PDUnit: - "fold_pd g (op *) (PDUnit x) = g x" +lemma fold_pd_PDUnit: + includes ab_semigroup_idem_mult f + shows "fold_pd g f (PDUnit x) = g x" unfolding fold_pd_def Rep_PDUnit by simp -lemma (in ab_semigroup_idem_mult) fold_pd_PDPlus: - "fold_pd g (op *) (PDPlus t u) = fold_pd g (op *) t * fold_pd g (op *) u" +lemma fold_pd_PDPlus: + includes ab_semigroup_idem_mult f + shows "fold_pd g f (PDPlus t u) = f (fold_pd g f t) (fold_pd g f u)" unfolding fold_pd_def Rep_PDPlus by (simp add: image_Un fold1_Un2) text {* approx-pd *} diff -r 19d8783a30de -r 8684b5240f11 src/HOLCF/ConvexPD.thy --- a/src/HOLCF/ConvexPD.thy Fri May 16 22:35:25 2008 +0200 +++ b/src/HOLCF/ConvexPD.thy Fri May 16 23:25:37 2008 +0200 @@ -148,14 +148,11 @@ done lemma ideal_Rep_convex_pd: "convex_le.ideal (Rep_convex_pd xs)" -by (rule Rep_convex_pd [simplified]) +by (rule Rep_convex_pd [unfolded mem_Collect_eq]) lemma Rep_convex_pd_mono: "xs \ ys \ Rep_convex_pd xs \ Rep_convex_pd ys" unfolding less_convex_pd_def less_set_eq . - -subsection {* Principal ideals *} - definition convex_principal :: "'a pd_basis \ 'a convex_pd" where "convex_principal t = Abs_convex_pd {u. u \\ t}" @@ -168,7 +165,7 @@ done interpretation convex_pd: - bifinite_basis [convex_le approx_pd convex_principal Rep_convex_pd] + ideal_completion [convex_le approx_pd convex_principal Rep_convex_pd] apply unfold_locales apply (rule approx_pd_convex_le) apply (rule approx_pd_idem) @@ -183,13 +180,16 @@ done lemma convex_principal_less_iff [simp]: - "(convex_principal t \ convex_principal u) = (t \\ u)" -unfolding less_convex_pd_def Rep_convex_principal less_set_eq -by (fast intro: convex_le_refl elim: convex_le_trans) + "convex_principal t \ convex_principal u \ t \\ u" +by (rule convex_pd.principal_less_iff) + +lemma convex_principal_eq_iff [simp]: + "convex_principal t = convex_principal u \ t \\ u \ u \\ t" +by (rule convex_pd.principal_eq_iff) lemma convex_principal_mono: "t \\ u \ convex_principal t \ convex_principal u" -by (rule convex_principal_less_iff [THEN iffD2]) +by (rule convex_pd.principal_mono) lemma compact_convex_principal: "compact (convex_principal t)" by (rule convex_pd.compact_principal) @@ -198,7 +198,7 @@ by (induct ys rule: convex_pd.principal_induct, simp, simp) instance convex_pd :: (bifinite) pcpo -by (intro_classes, fast intro: convex_pd_minimal) +by intro_classes (fast intro: convex_pd_minimal) lemma inst_convex_pd_pcpo: "\ = convex_principal (PDUnit compact_bot)" by (rule convex_pd_minimal [THEN UU_I, symmetric]) @@ -209,51 +209,27 @@ instance convex_pd :: (profinite) approx .. defs (overloaded) - approx_convex_pd_def: - "approx \ (\n. convex_pd.basis_fun (\t. convex_principal (approx_pd n t)))" + approx_convex_pd_def: "approx \ convex_pd.completion_approx" + +instance convex_pd :: (profinite) profinite +apply (intro_classes, unfold approx_convex_pd_def) +apply (simp add: convex_pd.chain_completion_approx) +apply (rule convex_pd.lub_completion_approx) +apply (rule convex_pd.completion_approx_idem) +apply (rule convex_pd.finite_fixes_completion_approx) +done + +instance convex_pd :: (bifinite) bifinite .. lemma approx_convex_principal [simp]: "approx n\(convex_principal t) = convex_principal (approx_pd n t)" unfolding approx_convex_pd_def -apply (rule convex_pd.basis_fun_principal) -apply (erule convex_principal_mono [OF approx_pd_convex_mono]) -done - -lemma chain_approx_convex_pd: - "chain (approx :: nat \ 'a convex_pd \ 'a convex_pd)" -unfolding approx_convex_pd_def -by (rule convex_pd.chain_basis_fun_take) - -lemma lub_approx_convex_pd: - "(\i. approx i\xs) = (xs::'a convex_pd)" -unfolding approx_convex_pd_def -by (rule convex_pd.lub_basis_fun_take) - -lemma approx_convex_pd_idem: - "approx n\(approx n\xs) = approx n\(xs::'a convex_pd)" -apply (induct xs rule: convex_pd.principal_induct, simp) -apply (simp add: approx_pd_idem) -done +by (rule convex_pd.completion_approx_principal) lemma approx_eq_convex_principal: "\t\Rep_convex_pd xs. approx n\xs = convex_principal (approx_pd n t)" unfolding approx_convex_pd_def -by (rule convex_pd.basis_fun_take_eq_principal) - -lemma finite_fixes_approx_convex_pd: - "finite {xs::'a convex_pd. approx n\xs = xs}" -unfolding approx_convex_pd_def -by (rule convex_pd.finite_fixes_basis_fun_take) - -instance convex_pd :: (profinite) profinite -apply intro_classes -apply (simp add: chain_approx_convex_pd) -apply (rule lub_approx_convex_pd) -apply (rule approx_convex_pd_idem) -apply (rule finite_fixes_approx_convex_pd) -done - -instance convex_pd :: (bifinite) bifinite .. +by (rule convex_pd.completion_approx_eq_principal) lemma compact_imp_convex_principal: "compact xs \ \t. xs = convex_principal t" @@ -266,10 +242,7 @@ lemma convex_principal_induct: "\adm P; \t. P (convex_principal t)\ \ P xs" -apply (erule approx_induct, rename_tac xs) -apply (cut_tac n=n and xs=xs in approx_eq_convex_principal) -apply (clarify, simp) -done +by (rule convex_pd.principal_induct) lemma convex_principal_induct2: "\\ys. adm (\xs. P xs ys); \xs. adm (\ys. P xs ys); @@ -282,54 +255,12 @@ done -subsection {* Monadic unit *} +subsection {* Monadic unit and plus *} definition convex_unit :: "'a \ 'a convex_pd" where "convex_unit = compact_basis.basis_fun (\a. convex_principal (PDUnit a))" -lemma convex_unit_Rep_compact_basis [simp]: - "convex_unit\(Rep_compact_basis a) = convex_principal (PDUnit a)" -unfolding convex_unit_def -apply (rule compact_basis.basis_fun_principal) -apply (rule convex_principal_mono) -apply (erule PDUnit_convex_mono) -done - -lemma convex_unit_strict [simp]: "convex_unit\\ = \" -unfolding inst_convex_pd_pcpo Rep_compact_bot [symmetric] by simp - -lemma approx_convex_unit [simp]: - "approx n\(convex_unit\x) = convex_unit\(approx n\x)" -apply (induct x rule: compact_basis_induct, simp) -apply (simp add: approx_Rep_compact_basis) -done - -lemma convex_unit_less_iff [simp]: - "(convex_unit\x \ convex_unit\y) = (x \ y)" - apply (rule iffI) - apply (rule bifinite_less_ext) - apply (drule_tac f="approx i" in monofun_cfun_arg, simp) - apply (cut_tac x="approx i\x" in compact_imp_Rep_compact_basis, simp) - apply (cut_tac x="approx i\y" in compact_imp_Rep_compact_basis, simp) - apply (clarify, simp add: compact_le_def) - apply (erule monofun_cfun_arg) -done - -lemma convex_unit_eq_iff [simp]: - "(convex_unit\x = convex_unit\y) = (x = y)" -unfolding po_eq_conv by simp - -lemma convex_unit_strict_iff [simp]: "(convex_unit\x = \) = (x = \)" -unfolding convex_unit_strict [symmetric] by (rule convex_unit_eq_iff) - -lemma compact_convex_unit_iff [simp]: - "compact (convex_unit\x) = compact x" -unfolding bifinite_compact_iff by simp - - -subsection {* Monadic plus *} - definition convex_plus :: "'a convex_pd \ 'a convex_pd \ 'a convex_pd" where "convex_plus = convex_pd.basis_fun (\t. convex_pd.basis_fun (\u. @@ -340,40 +271,69 @@ (infixl "+\" 65) where "xs +\ ys == convex_plus\xs\ys" +syntax + "_convex_pd" :: "args \ 'a convex_pd" ("{_}\") + +translations + "{x,xs}\" == "{x}\ +\ {xs}\" + "{x}\" == "CONST convex_unit\x" + +lemma convex_unit_Rep_compact_basis [simp]: + "{Rep_compact_basis a}\ = convex_principal (PDUnit a)" +unfolding convex_unit_def +by (simp add: compact_basis.basis_fun_principal + convex_principal_mono PDUnit_convex_mono) + lemma convex_plus_principal [simp]: - "convex_plus\(convex_principal t)\(convex_principal u) = - convex_principal (PDPlus t u)" + "convex_principal t +\ convex_principal u = convex_principal (PDPlus t u)" unfolding convex_plus_def by (simp add: convex_pd.basis_fun_principal convex_pd.basis_fun_mono PDPlus_convex_mono) +lemma approx_convex_unit [simp]: + "approx n\{x}\ = {approx n\x}\" +apply (induct x rule: compact_basis_induct, simp) +apply (simp add: approx_Rep_compact_basis) +done + lemma approx_convex_plus [simp]: - "approx n\(convex_plus\xs\ys) = convex_plus\(approx n\xs)\(approx n\ys)" + "approx n\(xs +\ ys) = approx n\xs +\ approx n\ys" by (induct xs ys rule: convex_principal_induct2, simp, simp, simp) -lemma convex_plus_commute: "convex_plus\xs\ys = convex_plus\ys\xs" -apply (induct xs ys rule: convex_principal_induct2, simp, simp) -apply (simp add: PDPlus_commute) -done - lemma convex_plus_assoc: - "convex_plus\(convex_plus\xs\ys)\zs = convex_plus\xs\(convex_plus\ys\zs)" + "(xs +\ ys) +\ zs = xs +\ (ys +\ zs)" apply (induct xs ys arbitrary: zs rule: convex_principal_induct2, simp, simp) apply (rule_tac xs=zs in convex_principal_induct, simp) apply (simp add: PDPlus_assoc) done -lemma convex_plus_absorb: "convex_plus\xs\xs = xs" +lemma convex_plus_commute: "xs +\ ys = ys +\ xs" +apply (induct xs ys rule: convex_principal_induct2, simp, simp) +apply (simp add: PDPlus_commute) +done + +lemma convex_plus_absorb: "xs +\ xs = xs" apply (induct xs rule: convex_principal_induct, simp) apply (simp add: PDPlus_absorb) done +interpretation aci_convex_plus: ab_semigroup_idem_mult ["op +\"] + by unfold_locales + (rule convex_plus_assoc convex_plus_commute convex_plus_absorb)+ + +lemma convex_plus_left_commute: "xs +\ (ys +\ zs) = ys +\ (xs +\ zs)" +by (rule aci_convex_plus.mult_left_commute) + +lemma convex_plus_left_absorb: "xs +\ (xs +\ ys) = xs +\ ys" +by (rule aci_convex_plus.mult_left_idem) + +lemmas convex_plus_aci = aci_convex_plus.mult_ac_idem + lemma convex_unit_less_plus_iff [simp]: - "(convex_unit\x \ convex_plus\ys\zs) = - (convex_unit\x \ ys \ convex_unit\x \ zs)" + "{x}\ \ ys +\ zs \ {x}\ \ ys \ {x}\ \ zs" apply (rule iffI) apply (subgoal_tac - "adm (\f. f\(convex_unit\x) \ f\ys \ f\(convex_unit\x) \ f\zs)") + "adm (\f. f\{x}\ \ f\ys \ f\{x}\ \ f\zs)") apply (drule admD, rule chain_approx) apply (drule_tac f="approx i" in monofun_cfun_arg) apply (cut_tac x="approx i\x" in compact_imp_Rep_compact_basis, simp) @@ -383,16 +343,15 @@ apply simp apply simp apply (erule conjE) - apply (subst convex_plus_absorb [of "convex_unit\x", symmetric]) + apply (subst convex_plus_absorb [of "{x}\", symmetric]) apply (erule (1) monofun_cfun [OF monofun_cfun_arg]) done lemma convex_plus_less_unit_iff [simp]: - "(convex_plus\xs\ys \ convex_unit\z) = - (xs \ convex_unit\z \ ys \ convex_unit\z)" + "xs +\ ys \ {z}\ \ xs \ {z}\ \ ys \ {z}\" apply (rule iffI) apply (subgoal_tac - "adm (\f. f\xs \ f\(convex_unit\z) \ f\ys \ f\(convex_unit\z))") + "adm (\f. f\xs \ f\{z}\ \ f\ys \ f\{z}\)") apply (drule admD, rule chain_approx) apply (drule_tac f="approx i" in monofun_cfun_arg) apply (cut_tac xs="approx i\xs" in compact_imp_convex_principal, simp) @@ -402,18 +361,46 @@ apply simp apply simp apply (erule conjE) - apply (subst convex_plus_absorb [of "convex_unit\z", symmetric]) + apply (subst convex_plus_absorb [of "{z}\", symmetric]) apply (erule (1) monofun_cfun [OF monofun_cfun_arg]) done +lemma convex_unit_less_iff [simp]: "{x}\ \ {y}\ \ x \ y" + apply (rule iffI) + apply (rule bifinite_less_ext) + apply (drule_tac f="approx i" in monofun_cfun_arg, simp) + apply (cut_tac x="approx i\x" in compact_imp_Rep_compact_basis, simp) + apply (cut_tac x="approx i\y" in compact_imp_Rep_compact_basis, simp) + apply (clarify, simp add: compact_le_def) + apply (erule monofun_cfun_arg) +done + +lemma convex_unit_eq_iff [simp]: "{x}\ = {y}\ \ x = y" +unfolding po_eq_conv by simp + +lemma convex_unit_strict [simp]: "{\}\ = \" +unfolding inst_convex_pd_pcpo Rep_compact_bot [symmetric] by simp + +lemma convex_unit_strict_iff [simp]: "{x}\ = \ \ x = \" +unfolding convex_unit_strict [symmetric] by (rule convex_unit_eq_iff) + +lemma compact_convex_unit_iff [simp]: + "compact {x}\ \ compact x" +unfolding bifinite_compact_iff by simp + +lemma compact_convex_plus [simp]: + "\compact xs; compact ys\ \ compact (xs +\ ys)" +apply (drule compact_imp_convex_principal)+ +apply (auto simp add: compact_convex_principal) +done + subsection {* Induction rules *} lemma convex_pd_induct1: assumes P: "adm P" - assumes unit: "\x. P (convex_unit\x)" - assumes insert: - "\x ys. \P (convex_unit\x); P ys\ \ P (convex_plus\(convex_unit\x)\ys)" + assumes unit: "\x. P {x}\" + assumes insert: "\x ys. \P {x}\; P ys\ \ P ({x}\ +\ ys)" shows "P (xs::'a convex_pd)" apply (induct xs rule: convex_principal_induct, rule P) apply (induct_tac t rule: pd_basis_induct1) @@ -426,8 +413,8 @@ lemma convex_pd_induct: assumes P: "adm P" - assumes unit: "\x. P (convex_unit\x)" - assumes plus: "\xs ys. \P xs; P ys\ \ P (convex_plus\xs\ys)" + assumes unit: "\x. P {x}\" + assumes plus: "\xs ys. \P xs; P ys\ \ P (xs +\ ys)" shows "P (xs::'a convex_pd)" apply (induct xs rule: convex_principal_induct, rule P) apply (induct_tac t rule: pd_basis_induct) @@ -443,9 +430,10 @@ "'a pd_basis \ ('a \ 'b convex_pd) \ 'b convex_pd" where "convex_bind_basis = fold_pd (\a. \ f. f\(Rep_compact_basis a)) - (\x y. \ f. convex_plus\(x\f)\(y\f))" + (\x y. \ f. x\f +\ y\f)" -lemma ACI_convex_bind: "ab_semigroup_idem_mult (\x y. \ f. convex_plus\(x\f)\(y\f))" +lemma ACI_convex_bind: + "ab_semigroup_idem_mult (\x y. \ f. x\f +\ y\f)" apply unfold_locales apply (simp add: convex_plus_assoc) apply (simp add: convex_plus_commute) @@ -456,11 +444,11 @@ "convex_bind_basis (PDUnit a) = (\ f. f\(Rep_compact_basis a))" "convex_bind_basis (PDPlus t u) = - (\ f. convex_plus\(convex_bind_basis t\f)\(convex_bind_basis u\f))" + (\ f. convex_bind_basis t\f +\ convex_bind_basis u\f)" unfolding convex_bind_basis_def apply - -apply (rule ab_semigroup_idem_mult.fold_pd_PDUnit [OF ACI_convex_bind]) -apply (rule ab_semigroup_idem_mult.fold_pd_PDPlus [OF ACI_convex_bind]) +apply (rule fold_pd_PDUnit [OF ACI_convex_bind]) +apply (rule fold_pd_PDPlus [OF ACI_convex_bind]) done lemma monofun_LAM: @@ -487,12 +475,11 @@ done lemma convex_bind_unit [simp]: - "convex_bind\(convex_unit\x)\f = f\x" + "convex_bind\{x}\\f = f\x" by (induct x rule: compact_basis_induct, simp, simp) lemma convex_bind_plus [simp]: - "convex_bind\(convex_plus\xs\ys)\f = - convex_plus\(convex_bind\xs\f)\(convex_bind\ys\f)" + "convex_bind\(xs +\ ys)\f = convex_bind\xs\f +\ convex_bind\ys\f" by (induct xs ys rule: convex_principal_induct2, simp, simp, simp) lemma convex_bind_strict [simp]: "convex_bind\\\f = f\\" @@ -503,7 +490,7 @@ definition convex_map :: "('a \ 'b) \ 'a convex_pd \ 'b convex_pd" where - "convex_map = (\ f xs. convex_bind\xs\(\ x. convex_unit\(f\x)))" + "convex_map = (\ f xs. convex_bind\xs\(\ x. {f\x}\))" definition convex_join :: "'a convex_pd convex_pd \ 'a convex_pd" where @@ -514,17 +501,15 @@ unfolding convex_map_def by simp lemma convex_map_plus [simp]: - "convex_map\f\(convex_plus\xs\ys) = - convex_plus\(convex_map\f\xs)\(convex_map\f\ys)" + "convex_map\f\(xs +\ ys) = convex_map\f\xs +\ convex_map\f\ys" unfolding convex_map_def by simp lemma convex_join_unit [simp]: - "convex_join\(convex_unit\xs) = xs" + "convex_join\{xs}\ = xs" unfolding convex_join_def by simp lemma convex_join_plus [simp]: - "convex_join\(convex_plus\xss\yss) = - convex_plus\(convex_join\xss)\(convex_join\yss)" + "convex_join\(xss +\ yss) = convex_join\xss +\ convex_join\yss" unfolding convex_join_def by simp lemma convex_map_ident: "convex_map\(\ x. x)\xs = xs" @@ -571,12 +556,11 @@ done lemma convex_to_upper_unit [simp]: - "convex_to_upper\(convex_unit\x) = upper_unit\x" + "convex_to_upper\{x}\ = {x}\" by (induct x rule: compact_basis_induct, simp, simp) lemma convex_to_upper_plus [simp]: - "convex_to_upper\(convex_plus\xs\ys) = - upper_plus\(convex_to_upper\xs)\(convex_to_upper\ys)" + "convex_to_upper\(xs +\ ys) = convex_to_upper\xs +\ convex_to_upper\ys" by (induct xs ys rule: convex_principal_induct2, simp, simp, simp) lemma approx_convex_to_upper: @@ -601,12 +585,11 @@ done lemma convex_to_lower_unit [simp]: - "convex_to_lower\(convex_unit\x) = lower_unit\x" + "convex_to_lower\{x}\ = {x}\" by (induct x rule: compact_basis_induct, simp, simp) lemma convex_to_lower_plus [simp]: - "convex_to_lower\(convex_plus\xs\ys) = - lower_plus\(convex_to_lower\xs)\(convex_to_lower\ys)" + "convex_to_lower\(xs +\ ys) = convex_to_lower\xs +\ convex_to_lower\ys" by (induct xs ys rule: convex_principal_induct2, simp, simp, simp) lemma approx_convex_to_lower: @@ -629,4 +612,19 @@ apply (simp add: approx_convex_to_upper approx_convex_to_lower convex_le_def) done +lemmas convex_plus_less_plus_iff = + convex_pd_less_iff [where xs="xs +\ ys" and ys="zs +\ ws", standard] + +lemmas convex_pd_less_simps = + convex_unit_less_plus_iff + convex_plus_less_unit_iff + convex_plus_less_plus_iff + convex_unit_less_iff + convex_to_upper_unit + convex_to_upper_plus + convex_to_lower_unit + convex_to_lower_plus + upper_pd_less_simps + lower_pd_less_simps + end diff -r 19d8783a30de -r 8684b5240f11 src/HOLCF/LowerPD.thy --- a/src/HOLCF/LowerPD.thy Fri May 16 22:35:25 2008 +0200 +++ b/src/HOLCF/LowerPD.thy Fri May 16 23:25:37 2008 +0200 @@ -103,13 +103,7 @@ done lemma ideal_Rep_lower_pd: "lower_le.ideal (Rep_lower_pd x)" -by (rule Rep_lower_pd [simplified]) - -lemma Rep_lower_pd_mono: "x \ y \ Rep_lower_pd x \ Rep_lower_pd y" -unfolding less_lower_pd_def less_set_eq . - - -subsection {* Principal ideals *} +by (rule Rep_lower_pd [unfolded mem_Collect_eq]) definition lower_principal :: "'a pd_basis \ 'a lower_pd" where @@ -123,7 +117,7 @@ done interpretation lower_pd: - bifinite_basis [lower_le approx_pd lower_principal Rep_lower_pd] + ideal_completion [lower_le approx_pd lower_principal Rep_lower_pd] apply unfold_locales apply (rule approx_pd_lower_le) apply (rule approx_pd_idem) @@ -138,32 +132,25 @@ done lemma lower_principal_less_iff [simp]: - "(lower_principal t \ lower_principal u) = (t \\ u)" -unfolding less_lower_pd_def Rep_lower_principal less_set_eq -by (fast intro: lower_le_refl elim: lower_le_trans) + "lower_principal t \ lower_principal u \ t \\ u" +by (rule lower_pd.principal_less_iff) + +lemma lower_principal_eq_iff: + "lower_principal t = lower_principal u \ t \\ u \ u \\ t" +by (rule lower_pd.principal_eq_iff) lemma lower_principal_mono: "t \\ u \ lower_principal t \ lower_principal u" -by (rule lower_principal_less_iff [THEN iffD2]) +by (rule lower_pd.principal_mono) lemma compact_lower_principal: "compact (lower_principal t)" -apply (rule compactI2) -apply (simp add: less_lower_pd_def) -apply (simp add: cont2contlubE [OF cont_Rep_lower_pd]) -apply (simp add: Rep_lower_principal set_cpo_simps) -apply (simp add: subset_eq) -apply (drule spec, drule mp, rule lower_le_refl) -apply (erule exE, rename_tac i) -apply (rule_tac x=i in exI) -apply clarify -apply (erule (1) lower_le.idealD3 [OF ideal_Rep_lower_pd]) -done +by (rule lower_pd.compact_principal) lemma lower_pd_minimal: "lower_principal (PDUnit compact_bot) \ ys" by (induct ys rule: lower_pd.principal_induct, simp, simp) instance lower_pd :: (bifinite) pcpo -by (intro_classes, fast intro: lower_pd_minimal) +by intro_classes (fast intro: lower_pd_minimal) lemma inst_lower_pd_pcpo: "\ = lower_principal (PDUnit compact_bot)" by (rule lower_pd_minimal [THEN UU_I, symmetric]) @@ -174,51 +161,27 @@ instance lower_pd :: (profinite) approx .. defs (overloaded) - approx_lower_pd_def: - "approx \ (\n. lower_pd.basis_fun (\t. lower_principal (approx_pd n t)))" + approx_lower_pd_def: "approx \ lower_pd.completion_approx" + +instance lower_pd :: (profinite) profinite +apply (intro_classes, unfold approx_lower_pd_def) +apply (simp add: lower_pd.chain_completion_approx) +apply (rule lower_pd.lub_completion_approx) +apply (rule lower_pd.completion_approx_idem) +apply (rule lower_pd.finite_fixes_completion_approx) +done + +instance lower_pd :: (bifinite) bifinite .. lemma approx_lower_principal [simp]: "approx n\(lower_principal t) = lower_principal (approx_pd n t)" unfolding approx_lower_pd_def -apply (rule lower_pd.basis_fun_principal) -apply (erule lower_principal_mono [OF approx_pd_lower_mono]) -done - -lemma chain_approx_lower_pd: - "chain (approx :: nat \ 'a lower_pd \ 'a lower_pd)" -unfolding approx_lower_pd_def -by (rule lower_pd.chain_basis_fun_take) - -lemma lub_approx_lower_pd: - "(\i. approx i\xs) = (xs::'a lower_pd)" -unfolding approx_lower_pd_def -by (rule lower_pd.lub_basis_fun_take) - -lemma approx_lower_pd_idem: - "approx n\(approx n\xs) = approx n\(xs::'a lower_pd)" -apply (induct xs rule: lower_pd.principal_induct, simp) -apply (simp add: approx_pd_idem) -done +by (rule lower_pd.completion_approx_principal) lemma approx_eq_lower_principal: "\t\Rep_lower_pd xs. approx n\xs = lower_principal (approx_pd n t)" unfolding approx_lower_pd_def -by (rule lower_pd.basis_fun_take_eq_principal) - -lemma finite_fixes_approx_lower_pd: - "finite {xs::'a lower_pd. approx n\xs = xs}" -unfolding approx_lower_pd_def -by (rule lower_pd.finite_fixes_basis_fun_take) - -instance lower_pd :: (profinite) profinite -apply intro_classes -apply (simp add: chain_approx_lower_pd) -apply (rule lub_approx_lower_pd) -apply (rule approx_lower_pd_idem) -apply (rule finite_fixes_approx_lower_pd) -done - -instance lower_pd :: (bifinite) bifinite .. +by (rule lower_pd.completion_approx_eq_principal) lemma compact_imp_lower_principal: "compact xs \ \t. xs = lower_principal t" @@ -231,10 +194,7 @@ lemma lower_principal_induct: "\adm P; \t. P (lower_principal t)\ \ P xs" -apply (erule approx_induct, rename_tac xs) -apply (cut_tac n=n and xs=xs in approx_eq_lower_principal) -apply (clarify, simp) -done +by (rule lower_pd.principal_induct) lemma lower_principal_induct2: "\\ys. adm (\xs. P xs ys); \xs. adm (\ys. P xs ys); @@ -247,54 +207,12 @@ done -subsection {* Monadic unit *} +subsection {* Monadic unit and plus *} definition lower_unit :: "'a \ 'a lower_pd" where "lower_unit = compact_basis.basis_fun (\a. lower_principal (PDUnit a))" -lemma lower_unit_Rep_compact_basis [simp]: - "lower_unit\(Rep_compact_basis a) = lower_principal (PDUnit a)" -unfolding lower_unit_def -apply (rule compact_basis.basis_fun_principal) -apply (rule lower_principal_mono) -apply (erule PDUnit_lower_mono) -done - -lemma lower_unit_strict [simp]: "lower_unit\\ = \" -unfolding inst_lower_pd_pcpo Rep_compact_bot [symmetric] by simp - -lemma approx_lower_unit [simp]: - "approx n\(lower_unit\x) = lower_unit\(approx n\x)" -apply (induct x rule: compact_basis_induct, simp) -apply (simp add: approx_Rep_compact_basis) -done - -lemma lower_unit_less_iff [simp]: - "(lower_unit\x \ lower_unit\y) = (x \ y)" - apply (rule iffI) - apply (rule bifinite_less_ext) - apply (drule_tac f="approx i" in monofun_cfun_arg, simp) - apply (cut_tac x="approx i\x" in compact_imp_Rep_compact_basis, simp) - apply (cut_tac x="approx i\y" in compact_imp_Rep_compact_basis, simp) - apply (clarify, simp add: compact_le_def) - apply (erule monofun_cfun_arg) -done - -lemma lower_unit_eq_iff [simp]: - "(lower_unit\x = lower_unit\y) = (x = y)" -unfolding po_eq_conv by simp - -lemma lower_unit_strict_iff [simp]: "(lower_unit\x = \) = (x = \)" -unfolding lower_unit_strict [symmetric] by (rule lower_unit_eq_iff) - -lemma compact_lower_unit_iff [simp]: - "compact (lower_unit\x) = compact x" -unfolding bifinite_compact_iff by simp - - -subsection {* Monadic plus *} - definition lower_plus :: "'a lower_pd \ 'a lower_pd \ 'a lower_pd" where "lower_plus = lower_pd.basis_fun (\t. lower_pd.basis_fun (\u. @@ -305,79 +223,89 @@ (infixl "+\" 65) where "xs +\ ys == lower_plus\xs\ys" +syntax + "_lower_pd" :: "args \ 'a lower_pd" ("{_}\") + +translations + "{x,xs}\" == "{x}\ +\ {xs}\" + "{x}\" == "CONST lower_unit\x" + +lemma lower_unit_Rep_compact_basis [simp]: + "{Rep_compact_basis a}\ = lower_principal (PDUnit a)" +unfolding lower_unit_def +by (simp add: compact_basis.basis_fun_principal + lower_principal_mono PDUnit_lower_mono) + lemma lower_plus_principal [simp]: - "lower_plus\(lower_principal t)\(lower_principal u) = - lower_principal (PDPlus t u)" + "lower_principal t +\ lower_principal u = lower_principal (PDPlus t u)" unfolding lower_plus_def by (simp add: lower_pd.basis_fun_principal lower_pd.basis_fun_mono PDPlus_lower_mono) +lemma approx_lower_unit [simp]: + "approx n\{x}\ = {approx n\x}\" +apply (induct x rule: compact_basis_induct, simp) +apply (simp add: approx_Rep_compact_basis) +done + lemma approx_lower_plus [simp]: - "approx n\(lower_plus\xs\ys) = lower_plus\(approx n\xs)\(approx n\ys)" + "approx n\(xs +\ ys) = (approx n\xs) +\ (approx n\ys)" by (induct xs ys rule: lower_principal_induct2, simp, simp, simp) -lemma lower_plus_commute: "lower_plus\xs\ys = lower_plus\ys\xs" -apply (induct xs ys rule: lower_principal_induct2, simp, simp) -apply (simp add: PDPlus_commute) -done - -lemma lower_plus_assoc: - "lower_plus\(lower_plus\xs\ys)\zs = lower_plus\xs\(lower_plus\ys\zs)" +lemma lower_plus_assoc: "(xs +\ ys) +\ zs = xs +\ (ys +\ zs)" apply (induct xs ys arbitrary: zs rule: lower_principal_induct2, simp, simp) apply (rule_tac xs=zs in lower_principal_induct, simp) apply (simp add: PDPlus_assoc) done -lemma lower_plus_absorb: "lower_plus\xs\xs = xs" +lemma lower_plus_commute: "xs +\ ys = ys +\ xs" +apply (induct xs ys rule: lower_principal_induct2, simp, simp) +apply (simp add: PDPlus_commute) +done + +lemma lower_plus_absorb: "xs +\ xs = xs" apply (induct xs rule: lower_principal_induct, simp) apply (simp add: PDPlus_absorb) done -lemma lower_plus_less1: "xs \ lower_plus\xs\ys" +interpretation aci_lower_plus: ab_semigroup_idem_mult ["op +\"] + by unfold_locales + (rule lower_plus_assoc lower_plus_commute lower_plus_absorb)+ + +lemma lower_plus_left_commute: "xs +\ (ys +\ zs) = ys +\ (xs +\ zs)" +by (rule aci_lower_plus.mult_left_commute) + +lemma lower_plus_left_absorb: "xs +\ (xs +\ ys) = xs +\ ys" +by (rule aci_lower_plus.mult_left_idem) + +lemmas lower_plus_aci = aci_lower_plus.mult_ac_idem + +lemma lower_plus_less1: "xs \ xs +\ ys" apply (induct xs ys rule: lower_principal_induct2, simp, simp) apply (simp add: PDPlus_lower_less) done -lemma lower_plus_less2: "ys \ lower_plus\xs\ys" +lemma lower_plus_less2: "ys \ xs +\ ys" by (subst lower_plus_commute, rule lower_plus_less1) -lemma lower_plus_least: "\xs \ zs; ys \ zs\ \ lower_plus\xs\ys \ zs" +lemma lower_plus_least: "\xs \ zs; ys \ zs\ \ xs +\ ys \ zs" apply (subst lower_plus_absorb [of zs, symmetric]) apply (erule (1) monofun_cfun [OF monofun_cfun_arg]) done lemma lower_plus_less_iff: - "(lower_plus\xs\ys \ zs) = (xs \ zs \ ys \ zs)" + "xs +\ ys \ zs \ xs \ zs \ ys \ zs" apply safe apply (erule trans_less [OF lower_plus_less1]) apply (erule trans_less [OF lower_plus_less2]) apply (erule (1) lower_plus_least) done -lemma lower_plus_strict_iff [simp]: - "(lower_plus\xs\ys = \) = (xs = \ \ ys = \)" -apply safe -apply (rule UU_I, erule subst, rule lower_plus_less1) -apply (rule UU_I, erule subst, rule lower_plus_less2) -apply (rule lower_plus_absorb) -done - -lemma lower_plus_strict1 [simp]: "lower_plus\\\ys = ys" -apply (rule antisym_less [OF _ lower_plus_less2]) -apply (simp add: lower_plus_least) -done - -lemma lower_plus_strict2 [simp]: "lower_plus\xs\\ = xs" -apply (rule antisym_less [OF _ lower_plus_less1]) -apply (simp add: lower_plus_least) -done - lemma lower_unit_less_plus_iff: - "(lower_unit\x \ lower_plus\ys\zs) = - (lower_unit\x \ ys \ lower_unit\x \ zs)" + "{x}\ \ ys +\ zs \ {x}\ \ ys \ {x}\ \ zs" apply (rule iffI) apply (subgoal_tac - "adm (\f. f\(lower_unit\x) \ f\ys \ f\(lower_unit\x) \ f\zs)") + "adm (\f. f\{x}\ \ f\ys \ f\{x}\ \ f\zs)") apply (drule admD, rule chain_approx) apply (drule_tac f="approx i" in monofun_cfun_arg) apply (cut_tac x="approx i\x" in compact_imp_Rep_compact_basis, simp) @@ -391,19 +319,65 @@ apply (erule trans_less [OF _ lower_plus_less2]) done +lemma lower_unit_less_iff [simp]: "{x}\ \ {y}\ \ x \ y" + apply (rule iffI) + apply (rule bifinite_less_ext) + apply (drule_tac f="approx i" in monofun_cfun_arg, simp) + apply (cut_tac x="approx i\x" in compact_imp_Rep_compact_basis, simp) + apply (cut_tac x="approx i\y" in compact_imp_Rep_compact_basis, simp) + apply (clarify, simp add: compact_le_def) + apply (erule monofun_cfun_arg) +done + lemmas lower_pd_less_simps = lower_unit_less_iff lower_plus_less_iff lower_unit_less_plus_iff +lemma lower_unit_eq_iff [simp]: "{x}\ = {y}\ \ x = y" +unfolding po_eq_conv by simp + +lemma lower_unit_strict [simp]: "{\}\ = \" +unfolding inst_lower_pd_pcpo Rep_compact_bot [symmetric] by simp + +lemma lower_unit_strict_iff [simp]: "{x}\ = \ \ x = \" +unfolding lower_unit_strict [symmetric] by (rule lower_unit_eq_iff) + +lemma lower_plus_strict_iff [simp]: + "xs +\ ys = \ \ xs = \ \ ys = \" +apply safe +apply (rule UU_I, erule subst, rule lower_plus_less1) +apply (rule UU_I, erule subst, rule lower_plus_less2) +apply (rule lower_plus_absorb) +done + +lemma lower_plus_strict1 [simp]: "\ +\ ys = ys" +apply (rule antisym_less [OF _ lower_plus_less2]) +apply (simp add: lower_plus_least) +done + +lemma lower_plus_strict2 [simp]: "xs +\ \ = xs" +apply (rule antisym_less [OF _ lower_plus_less1]) +apply (simp add: lower_plus_least) +done + +lemma compact_lower_unit_iff [simp]: "compact {x}\ \ compact x" +unfolding bifinite_compact_iff by simp + +lemma compact_lower_plus [simp]: + "\compact xs; compact ys\ \ compact (xs +\ ys)" +apply (drule compact_imp_lower_principal)+ +apply (auto simp add: compact_lower_principal) +done + subsection {* Induction rules *} lemma lower_pd_induct1: assumes P: "adm P" - assumes unit: "\x. P (lower_unit\x)" + assumes unit: "\x. P {x}\" assumes insert: - "\x ys. \P (lower_unit\x); P ys\ \ P (lower_plus\(lower_unit\x)\ys)" + "\x ys. \P {x}\; P ys\ \ P ({x}\ +\ ys)" shows "P (xs::'a lower_pd)" apply (induct xs rule: lower_principal_induct, rule P) apply (induct_tac t rule: pd_basis_induct1) @@ -416,8 +390,8 @@ lemma lower_pd_induct: assumes P: "adm P" - assumes unit: "\x. P (lower_unit\x)" - assumes plus: "\xs ys. \P xs; P ys\ \ P (lower_plus\xs\ys)" + assumes unit: "\x. P {x}\" + assumes plus: "\xs ys. \P xs; P ys\ \ P (xs +\ ys)" shows "P (xs::'a lower_pd)" apply (induct xs rule: lower_principal_induct, rule P) apply (induct_tac t rule: pd_basis_induct) @@ -433,9 +407,10 @@ "'a pd_basis \ ('a \ 'b lower_pd) \ 'b lower_pd" where "lower_bind_basis = fold_pd (\a. \ f. f\(Rep_compact_basis a)) - (\x y. \ f. lower_plus\(x\f)\(y\f))" + (\x y. \ f. x\f +\ y\f)" -lemma ACI_lower_bind: "ab_semigroup_idem_mult (\x y. \ f. lower_plus\(x\f)\(y\f))" +lemma ACI_lower_bind: + "ab_semigroup_idem_mult (\x y. \ f. x\f +\ y\f)" apply unfold_locales apply (simp add: lower_plus_assoc) apply (simp add: lower_plus_commute) @@ -446,11 +421,11 @@ "lower_bind_basis (PDUnit a) = (\ f. f\(Rep_compact_basis a))" "lower_bind_basis (PDPlus t u) = - (\ f. lower_plus\(lower_bind_basis t\f)\(lower_bind_basis u\f))" + (\ f. lower_bind_basis t\f +\ lower_bind_basis u\f)" unfolding lower_bind_basis_def apply - -apply (rule ab_semigroup_idem_mult.fold_pd_PDUnit [OF ACI_lower_bind]) -apply (rule ab_semigroup_idem_mult.fold_pd_PDPlus [OF ACI_lower_bind]) +apply (rule fold_pd_PDUnit [OF ACI_lower_bind]) +apply (rule fold_pd_PDPlus [OF ACI_lower_bind]) done lemma lower_bind_basis_mono: @@ -474,12 +449,11 @@ done lemma lower_bind_unit [simp]: - "lower_bind\(lower_unit\x)\f = f\x" + "lower_bind\{x}\\f = f\x" by (induct x rule: compact_basis_induct, simp, simp) lemma lower_bind_plus [simp]: - "lower_bind\(lower_plus\xs\ys)\f = - lower_plus\(lower_bind\xs\f)\(lower_bind\ys\f)" + "lower_bind\(xs +\ ys)\f = lower_bind\xs\f +\ lower_bind\ys\f" by (induct xs ys rule: lower_principal_induct2, simp, simp, simp) lemma lower_bind_strict [simp]: "lower_bind\\\f = f\\" @@ -490,28 +464,26 @@ definition lower_map :: "('a \ 'b) \ 'a lower_pd \ 'b lower_pd" where - "lower_map = (\ f xs. lower_bind\xs\(\ x. lower_unit\(f\x)))" + "lower_map = (\ f xs. lower_bind\xs\(\ x. {f\x}\))" definition lower_join :: "'a lower_pd lower_pd \ 'a lower_pd" where "lower_join = (\ xss. lower_bind\xss\(\ xs. xs))" lemma lower_map_unit [simp]: - "lower_map\f\(lower_unit\x) = lower_unit\(f\x)" + "lower_map\f\{x}\ = {f\x}\" unfolding lower_map_def by simp lemma lower_map_plus [simp]: - "lower_map\f\(lower_plus\xs\ys) = - lower_plus\(lower_map\f\xs)\(lower_map\f\ys)" + "lower_map\f\(xs +\ ys) = lower_map\f\xs +\ lower_map\f\ys" unfolding lower_map_def by simp lemma lower_join_unit [simp]: - "lower_join\(lower_unit\xs) = xs" + "lower_join\{xs}\ = xs" unfolding lower_join_def by simp lemma lower_join_plus [simp]: - "lower_join\(lower_plus\xss\yss) = - lower_plus\(lower_join\xss)\(lower_join\yss)" + "lower_join\(xss +\ yss) = lower_join\xss +\ lower_join\yss" unfolding lower_join_def by simp lemma lower_map_ident: "lower_map\(\ x. x)\xs = xs" diff -r 19d8783a30de -r 8684b5240f11 src/HOLCF/UpperPD.thy --- a/src/HOLCF/UpperPD.thy Fri May 16 22:35:25 2008 +0200 +++ b/src/HOLCF/UpperPD.thy Fri May 16 23:25:37 2008 +0200 @@ -101,7 +101,7 @@ done lemma ideal_Rep_upper_pd: "upper_le.ideal (Rep_upper_pd x)" -by (rule Rep_upper_pd [simplified]) +by (rule Rep_upper_pd [unfolded mem_Collect_eq]) definition upper_principal :: "'a pd_basis \ 'a upper_pd" where @@ -110,12 +110,12 @@ lemma Rep_upper_principal: "Rep_upper_pd (upper_principal t) = {u. u \\ t}" unfolding upper_principal_def -apply (rule Abs_upper_pd_inverse [simplified]) +apply (rule Abs_upper_pd_inverse [unfolded mem_Collect_eq]) apply (rule upper_le.ideal_principal) done interpretation upper_pd: - bifinite_basis [upper_le approx_pd upper_principal Rep_upper_pd] + ideal_completion [upper_le approx_pd upper_principal Rep_upper_pd] apply unfold_locales apply (rule approx_pd_upper_le) apply (rule approx_pd_idem) @@ -130,9 +130,12 @@ done lemma upper_principal_less_iff [simp]: - "(upper_principal t \ upper_principal u) = (t \\ u)" -unfolding less_upper_pd_def Rep_upper_principal less_set_eq -by (fast intro: upper_le_refl elim: upper_le_trans) + "upper_principal t \ upper_principal u \ t \\ u" +by (rule upper_pd.principal_less_iff) + +lemma upper_principal_eq_iff: + "upper_principal t = upper_principal u \ t \\ u \ u \\ t" +by (rule upper_pd.principal_eq_iff) lemma upper_principal_mono: "t \\ u \ upper_principal t \ upper_principal u" @@ -145,7 +148,7 @@ by (induct ys rule: upper_pd.principal_induct, simp, simp) instance upper_pd :: (bifinite) pcpo -by (intro_classes, fast intro: upper_pd_minimal) +by intro_classes (fast intro: upper_pd_minimal) lemma inst_upper_pd_pcpo: "\ = upper_principal (PDUnit compact_bot)" by (rule upper_pd_minimal [THEN UU_I, symmetric]) @@ -156,51 +159,27 @@ instance upper_pd :: (profinite) approx .. defs (overloaded) - approx_upper_pd_def: - "approx \ (\n. upper_pd.basis_fun (\t. upper_principal (approx_pd n t)))" + approx_upper_pd_def: "approx \ upper_pd.completion_approx" + +instance upper_pd :: (profinite) profinite +apply (intro_classes, unfold approx_upper_pd_def) +apply (simp add: upper_pd.chain_completion_approx) +apply (rule upper_pd.lub_completion_approx) +apply (rule upper_pd.completion_approx_idem) +apply (rule upper_pd.finite_fixes_completion_approx) +done + +instance upper_pd :: (bifinite) bifinite .. lemma approx_upper_principal [simp]: "approx n\(upper_principal t) = upper_principal (approx_pd n t)" unfolding approx_upper_pd_def -apply (rule upper_pd.basis_fun_principal) -apply (erule upper_principal_mono [OF approx_pd_upper_mono]) -done - -lemma chain_approx_upper_pd: - "chain (approx :: nat \ 'a upper_pd \ 'a upper_pd)" -unfolding approx_upper_pd_def -by (rule upper_pd.chain_basis_fun_take) - -lemma lub_approx_upper_pd: - "(\i. approx i\xs) = (xs::'a upper_pd)" -unfolding approx_upper_pd_def -by (rule upper_pd.lub_basis_fun_take) - -lemma approx_upper_pd_idem: - "approx n\(approx n\xs) = approx n\(xs::'a upper_pd)" -apply (induct xs rule: upper_pd.principal_induct, simp) -apply (simp add: approx_pd_idem) -done +by (rule upper_pd.completion_approx_principal) lemma approx_eq_upper_principal: "\t\Rep_upper_pd xs. approx n\xs = upper_principal (approx_pd n t)" unfolding approx_upper_pd_def -by (rule upper_pd.basis_fun_take_eq_principal) - -lemma finite_fixes_approx_upper_pd: - "finite {xs::'a upper_pd. approx n\xs = xs}" -unfolding approx_upper_pd_def -by (rule upper_pd.finite_fixes_basis_fun_take) - -instance upper_pd :: (profinite) profinite -apply intro_classes -apply (simp add: chain_approx_upper_pd) -apply (rule lub_approx_upper_pd) -apply (rule approx_upper_pd_idem) -apply (rule finite_fixes_approx_upper_pd) -done - -instance upper_pd :: (bifinite) bifinite .. +by (rule upper_pd.completion_approx_eq_principal) lemma compact_imp_upper_principal: "compact xs \ \t. xs = upper_principal t" @@ -213,10 +192,7 @@ lemma upper_principal_induct: "\adm P; \t. P (upper_principal t)\ \ P xs" -apply (erule approx_induct, rename_tac xs) -apply (cut_tac n=n and xs=xs in approx_eq_upper_principal) -apply (clarify, simp) -done +by (rule upper_pd.principal_induct) lemma upper_principal_induct2: "\\ys. adm (\xs. P xs ys); \xs. adm (\ys. P xs ys); @@ -229,54 +205,12 @@ done -subsection {* Monadic unit *} +subsection {* Monadic unit and plus *} definition upper_unit :: "'a \ 'a upper_pd" where "upper_unit = compact_basis.basis_fun (\a. upper_principal (PDUnit a))" -lemma upper_unit_Rep_compact_basis [simp]: - "upper_unit\(Rep_compact_basis a) = upper_principal (PDUnit a)" -unfolding upper_unit_def -apply (rule compact_basis.basis_fun_principal) -apply (rule upper_principal_mono) -apply (erule PDUnit_upper_mono) -done - -lemma upper_unit_strict [simp]: "upper_unit\\ = \" -unfolding inst_upper_pd_pcpo Rep_compact_bot [symmetric] by simp - -lemma approx_upper_unit [simp]: - "approx n\(upper_unit\x) = upper_unit\(approx n\x)" -apply (induct x rule: compact_basis_induct, simp) -apply (simp add: approx_Rep_compact_basis) -done - -lemma upper_unit_less_iff [simp]: - "(upper_unit\x \ upper_unit\y) = (x \ y)" - apply (rule iffI) - apply (rule bifinite_less_ext) - apply (drule_tac f="approx i" in monofun_cfun_arg, simp) - apply (cut_tac x="approx i\x" in compact_imp_Rep_compact_basis, simp) - apply (cut_tac x="approx i\y" in compact_imp_Rep_compact_basis, simp) - apply (clarify, simp add: compact_le_def) - apply (erule monofun_cfun_arg) -done - -lemma upper_unit_eq_iff [simp]: - "(upper_unit\x = upper_unit\y) = (x = y)" -unfolding po_eq_conv by simp - -lemma upper_unit_strict_iff [simp]: "(upper_unit\x = \) = (x = \)" -unfolding upper_unit_strict [symmetric] by (rule upper_unit_eq_iff) - -lemma compact_upper_unit_iff [simp]: - "compact (upper_unit\x) = compact x" -unfolding bifinite_compact_iff by simp - - -subsection {* Monadic plus *} - definition upper_plus :: "'a upper_pd \ 'a upper_pd \ 'a upper_pd" where "upper_plus = upper_pd.basis_fun (\t. upper_pd.basis_fun (\u. @@ -287,67 +221,89 @@ (infixl "+\" 65) where "xs +\ ys == upper_plus\xs\ys" +syntax + "_upper_pd" :: "args \ 'a upper_pd" ("{_}\") + +translations + "{x,xs}\" == "{x}\ +\ {xs}\" + "{x}\" == "CONST upper_unit\x" + +lemma upper_unit_Rep_compact_basis [simp]: + "{Rep_compact_basis a}\ = upper_principal (PDUnit a)" +unfolding upper_unit_def +by (simp add: compact_basis.basis_fun_principal + upper_principal_mono PDUnit_upper_mono) + lemma upper_plus_principal [simp]: - "upper_plus\(upper_principal t)\(upper_principal u) = - upper_principal (PDPlus t u)" + "upper_principal t +\ upper_principal u = upper_principal (PDPlus t u)" unfolding upper_plus_def by (simp add: upper_pd.basis_fun_principal upper_pd.basis_fun_mono PDPlus_upper_mono) +lemma approx_upper_unit [simp]: + "approx n\{x}\ = {approx n\x}\" +apply (induct x rule: compact_basis_induct, simp) +apply (simp add: approx_Rep_compact_basis) +done + lemma approx_upper_plus [simp]: - "approx n\(upper_plus\xs\ys) = upper_plus\(approx n\xs)\(approx n\ys)" + "approx n\(xs +\ ys) = (approx n\xs) +\ (approx n\ys)" by (induct xs ys rule: upper_principal_induct2, simp, simp, simp) -lemma upper_plus_commute: "upper_plus\xs\ys = upper_plus\ys\xs" -apply (induct xs ys rule: upper_principal_induct2, simp, simp) -apply (simp add: PDPlus_commute) -done - -lemma upper_plus_assoc: - "upper_plus\(upper_plus\xs\ys)\zs = upper_plus\xs\(upper_plus\ys\zs)" +lemma upper_plus_assoc: "(xs +\ ys) +\ zs = xs +\ (ys +\ zs)" apply (induct xs ys arbitrary: zs rule: upper_principal_induct2, simp, simp) apply (rule_tac xs=zs in upper_principal_induct, simp) apply (simp add: PDPlus_assoc) done -lemma upper_plus_absorb: "upper_plus\xs\xs = xs" +lemma upper_plus_commute: "xs +\ ys = ys +\ xs" +apply (induct xs ys rule: upper_principal_induct2, simp, simp) +apply (simp add: PDPlus_commute) +done + +lemma upper_plus_absorb: "xs +\ xs = xs" apply (induct xs rule: upper_principal_induct, simp) apply (simp add: PDPlus_absorb) done -lemma upper_plus_less1: "upper_plus\xs\ys \ xs" +interpretation aci_upper_plus: ab_semigroup_idem_mult ["op +\"] + by unfold_locales + (rule upper_plus_assoc upper_plus_commute upper_plus_absorb)+ + +lemma upper_plus_left_commute: "xs +\ (ys +\ zs) = ys +\ (xs +\ zs)" +by (rule aci_upper_plus.mult_left_commute) + +lemma upper_plus_left_absorb: "xs +\ (xs +\ ys) = xs +\ ys" +by (rule aci_upper_plus.mult_left_idem) + +lemmas upper_plus_aci = aci_upper_plus.mult_ac_idem + +lemma upper_plus_less1: "xs +\ ys \ xs" apply (induct xs ys rule: upper_principal_induct2, simp, simp) apply (simp add: PDPlus_upper_less) done -lemma upper_plus_less2: "upper_plus\xs\ys \ ys" +lemma upper_plus_less2: "xs +\ ys \ ys" by (subst upper_plus_commute, rule upper_plus_less1) -lemma upper_plus_greatest: "\xs \ ys; xs \ zs\ \ xs \ upper_plus\ys\zs" +lemma upper_plus_greatest: "\xs \ ys; xs \ zs\ \ xs \ ys +\ zs" apply (subst upper_plus_absorb [of xs, symmetric]) apply (erule (1) monofun_cfun [OF monofun_cfun_arg]) done lemma upper_less_plus_iff: - "(xs \ upper_plus\ys\zs) = (xs \ ys \ xs \ zs)" + "xs \ ys +\ zs \ xs \ ys \ xs \ zs" apply safe apply (erule trans_less [OF _ upper_plus_less1]) apply (erule trans_less [OF _ upper_plus_less2]) apply (erule (1) upper_plus_greatest) done -lemma upper_plus_strict1 [simp]: "upper_plus\\\ys = \" -by (rule UU_I, rule upper_plus_less1) - -lemma upper_plus_strict2 [simp]: "upper_plus\xs\\ = \" -by (rule UU_I, rule upper_plus_less2) - lemma upper_plus_less_unit_iff: - "(upper_plus\xs\ys \ upper_unit\z) = - (xs \ upper_unit\z \ ys \ upper_unit\z)" + "xs +\ ys \ {z}\ \ xs \ {z}\ \ ys \ {z}\" apply (rule iffI) apply (subgoal_tac - "adm (\f. f\xs \ f\(upper_unit\z) \ f\ys \ f\(upper_unit\z))") + "adm (\f. f\xs \ f\{z}\ \ f\ys \ f\{z}\)") apply (drule admD, rule chain_approx) apply (drule_tac f="approx i" in monofun_cfun_arg) apply (cut_tac xs="approx i\xs" in compact_imp_upper_principal, simp) @@ -361,19 +317,62 @@ apply (erule trans_less [OF upper_plus_less2]) done +lemma upper_unit_less_iff [simp]: "{x}\ \ {y}\ \ x \ y" + apply (rule iffI) + apply (rule bifinite_less_ext) + apply (drule_tac f="approx i" in monofun_cfun_arg, simp) + apply (cut_tac x="approx i\x" in compact_imp_Rep_compact_basis, simp) + apply (cut_tac x="approx i\y" in compact_imp_Rep_compact_basis, simp) + apply (clarify, simp add: compact_le_def) + apply (erule monofun_cfun_arg) +done + lemmas upper_pd_less_simps = upper_unit_less_iff upper_less_plus_iff upper_plus_less_unit_iff +lemma upper_unit_eq_iff [simp]: "{x}\ = {y}\ \ x = y" +unfolding po_eq_conv by simp + +lemma upper_unit_strict [simp]: "{\}\ = \" +unfolding inst_upper_pd_pcpo Rep_compact_bot [symmetric] by simp + +lemma upper_plus_strict1 [simp]: "\ +\ ys = \" +by (rule UU_I, rule upper_plus_less1) + +lemma upper_plus_strict2 [simp]: "xs +\ \ = \" +by (rule UU_I, rule upper_plus_less2) + +lemma upper_unit_strict_iff [simp]: "{x}\ = \ \ x = \" +unfolding upper_unit_strict [symmetric] by (rule upper_unit_eq_iff) + +lemma upper_plus_strict_iff [simp]: + "xs +\ ys = \ \ xs = \ \ ys = \" +apply (rule iffI) +apply (erule rev_mp) +apply (rule upper_principal_induct2 [where xs=xs and ys=ys], simp, simp) +apply (simp add: inst_upper_pd_pcpo upper_principal_eq_iff + upper_le_PDPlus_PDUnit_iff) +apply auto +done + +lemma compact_upper_unit_iff [simp]: "compact {x}\ \ compact x" +unfolding bifinite_compact_iff by simp + +lemma compact_upper_plus [simp]: + "\compact xs; compact ys\ \ compact (xs +\ ys)" +apply (drule compact_imp_upper_principal)+ +apply (auto simp add: compact_upper_principal) +done + subsection {* Induction rules *} lemma upper_pd_induct1: assumes P: "adm P" - assumes unit: "\x. P (upper_unit\x)" - assumes insert: - "\x ys. \P (upper_unit\x); P ys\ \ P (upper_plus\(upper_unit\x)\ys)" + assumes unit: "\x. P {x}\" + assumes insert: "\x ys. \P {x}\; P ys\ \ P ({x}\ +\ ys)" shows "P (xs::'a upper_pd)" apply (induct xs rule: upper_principal_induct, rule P) apply (induct_tac t rule: pd_basis_induct1) @@ -386,8 +385,8 @@ lemma upper_pd_induct: assumes P: "adm P" - assumes unit: "\x. P (upper_unit\x)" - assumes plus: "\xs ys. \P xs; P ys\ \ P (upper_plus\xs\ys)" + assumes unit: "\x. P {x}\" + assumes plus: "\xs ys. \P xs; P ys\ \ P (xs +\ ys)" shows "P (xs::'a upper_pd)" apply (induct xs rule: upper_principal_induct, rule P) apply (induct_tac t rule: pd_basis_induct) @@ -403,9 +402,10 @@ "'a pd_basis \ ('a \ 'b upper_pd) \ 'b upper_pd" where "upper_bind_basis = fold_pd (\a. \ f. f\(Rep_compact_basis a)) - (\x y. \ f. upper_plus\(x\f)\(y\f))" + (\x y. \ f. x\f +\ y\f)" -lemma ACI_upper_bind: "ab_semigroup_idem_mult (\x y. \ f. upper_plus\(x\f)\(y\f))" +lemma ACI_upper_bind: + "ab_semigroup_idem_mult (\x y. \ f. x\f +\ y\f)" apply unfold_locales apply (simp add: upper_plus_assoc) apply (simp add: upper_plus_commute) @@ -416,11 +416,11 @@ "upper_bind_basis (PDUnit a) = (\ f. f\(Rep_compact_basis a))" "upper_bind_basis (PDPlus t u) = - (\ f. upper_plus\(upper_bind_basis t\f)\(upper_bind_basis u\f))" + (\ f. upper_bind_basis t\f +\ upper_bind_basis u\f)" unfolding upper_bind_basis_def apply - -apply (rule ab_semigroup_idem_mult.fold_pd_PDUnit [OF ACI_upper_bind]) -apply (rule ab_semigroup_idem_mult.fold_pd_PDPlus [OF ACI_upper_bind]) +apply (rule fold_pd_PDUnit [OF ACI_upper_bind]) +apply (rule fold_pd_PDPlus [OF ACI_upper_bind]) done lemma upper_bind_basis_mono: @@ -444,12 +444,11 @@ done lemma upper_bind_unit [simp]: - "upper_bind\(upper_unit\x)\f = f\x" + "upper_bind\{x}\\f = f\x" by (induct x rule: compact_basis_induct, simp, simp) lemma upper_bind_plus [simp]: - "upper_bind\(upper_plus\xs\ys)\f = - upper_plus\(upper_bind\xs\f)\(upper_bind\ys\f)" + "upper_bind\(xs +\ ys)\f = upper_bind\xs\f +\ upper_bind\ys\f" by (induct xs ys rule: upper_principal_induct2, simp, simp, simp) lemma upper_bind_strict [simp]: "upper_bind\\\f = f\\" @@ -460,28 +459,26 @@ definition upper_map :: "('a \ 'b) \ 'a upper_pd \ 'b upper_pd" where - "upper_map = (\ f xs. upper_bind\xs\(\ x. upper_unit\(f\x)))" + "upper_map = (\ f xs. upper_bind\xs\(\ x. {f\x}\))" definition upper_join :: "'a upper_pd upper_pd \ 'a upper_pd" where "upper_join = (\ xss. upper_bind\xss\(\ xs. xs))" lemma upper_map_unit [simp]: - "upper_map\f\(upper_unit\x) = upper_unit\(f\x)" + "upper_map\f\{x}\ = {f\x}\" unfolding upper_map_def by simp lemma upper_map_plus [simp]: - "upper_map\f\(upper_plus\xs\ys) = - upper_plus\(upper_map\f\xs)\(upper_map\f\ys)" + "upper_map\f\(xs +\ ys) = upper_map\f\xs +\ upper_map\f\ys" unfolding upper_map_def by simp lemma upper_join_unit [simp]: - "upper_join\(upper_unit\xs) = xs" + "upper_join\{xs}\ = xs" unfolding upper_join_def by simp lemma upper_join_plus [simp]: - "upper_join\(upper_plus\xss\yss) = - upper_plus\(upper_join\xss)\(upper_join\yss)" + "upper_join\(xss +\ yss) = upper_join\xss +\ upper_join\yss" unfolding upper_join_def by simp lemma upper_map_ident: "upper_map\(\ x. x)\xs = xs"