(* Title: HOLCF/UpperPD.thy ID: $Id: UpperPD.thy,v 1.8 2008/05/19 21:49:23 huffman Exp $ Author: Brian Huffman *) header {* Upper powerdomain *} theory UpperPD imports CompactBasis begin subsection {* Basis preorder *} definition upper_le :: "'a pd_basis => 'a pd_basis => bool" (infix "≤\<sharp>" 50) where "upper_le = (λu v. ∀y∈Rep_pd_basis v. ∃x∈Rep_pd_basis u. x \<sqsubseteq> y)" lemma upper_le_refl [simp]: "t ≤\<sharp> t" unfolding upper_le_def by fast lemma upper_le_trans: "[|t ≤\<sharp> u; u ≤\<sharp> v|] ==> t ≤\<sharp> v" unfolding upper_le_def apply (rule ballI) apply (drule (1) bspec, erule bexE) apply (drule (1) bspec, erule bexE) apply (erule rev_bexI) apply (erule (1) trans_less) done interpretation upper_le: preorder [upper_le] by (rule preorder.intro, rule upper_le_refl, rule upper_le_trans) lemma upper_le_minimal [simp]: "PDUnit compact_bot ≤\<sharp> t" unfolding upper_le_def Rep_PDUnit by simp lemma PDUnit_upper_mono: "x \<sqsubseteq> y ==> PDUnit x ≤\<sharp> PDUnit y" unfolding upper_le_def Rep_PDUnit by simp lemma PDPlus_upper_mono: "[|s ≤\<sharp> t; u ≤\<sharp> v|] ==> PDPlus s u ≤\<sharp> PDPlus t v" unfolding upper_le_def Rep_PDPlus by fast lemma PDPlus_upper_less: "PDPlus t u ≤\<sharp> t" unfolding upper_le_def Rep_PDPlus by fast lemma upper_le_PDUnit_PDUnit_iff [simp]: "(PDUnit a ≤\<sharp> PDUnit b) = a \<sqsubseteq> b" unfolding upper_le_def Rep_PDUnit by fast lemma upper_le_PDPlus_PDUnit_iff: "(PDPlus t u ≤\<sharp> PDUnit a) = (t ≤\<sharp> PDUnit a ∨ u ≤\<sharp> PDUnit a)" unfolding upper_le_def Rep_PDPlus Rep_PDUnit by fast lemma upper_le_PDPlus_iff: "(t ≤\<sharp> PDPlus u v) = (t ≤\<sharp> u ∧ t ≤\<sharp> v)" unfolding upper_le_def Rep_PDPlus by fast lemma upper_le_induct [induct set: upper_le]: assumes le: "t ≤\<sharp> u" assumes 1: "!!a b. a \<sqsubseteq> b ==> P (PDUnit a) (PDUnit b)" assumes 2: "!!t u a. P t (PDUnit a) ==> P (PDPlus t u) (PDUnit a)" assumes 3: "!!t u v. [|P t u; P t v|] ==> P t (PDPlus u v)" shows "P t u" using le apply (induct u arbitrary: t rule: pd_basis_induct) apply (erule rev_mp) apply (induct_tac t rule: pd_basis_induct) apply (simp add: 1) apply (simp add: upper_le_PDPlus_PDUnit_iff) apply (simp add: 2) apply (subst PDPlus_commute) apply (simp add: 2) apply (simp add: upper_le_PDPlus_iff 3) done lemma approx_pd_upper_mono1: "i ≤ j ==> approx_pd i t ≤\<sharp> approx_pd j t" apply (induct t rule: pd_basis_induct) apply (simp add: compact_approx_mono1) apply (simp add: PDPlus_upper_mono) done lemma approx_pd_upper_le: "approx_pd i t ≤\<sharp> t" apply (induct t rule: pd_basis_induct) apply (simp add: compact_approx_le) apply (simp add: PDPlus_upper_mono) done lemma approx_pd_upper_mono: "t ≤\<sharp> u ==> approx_pd n t ≤\<sharp> approx_pd n u" apply (erule upper_le_induct) apply (simp add: compact_approx_mono) apply (simp add: upper_le_PDPlus_PDUnit_iff) apply (simp add: upper_le_PDPlus_iff) done subsection {* Type definition *} cpodef (open) 'a upper_pd = "{S::'a::profinite pd_basis set. upper_le.ideal S}" apply (simp add: upper_le.adm_ideal) apply (fast intro: upper_le.ideal_principal) done lemma ideal_Rep_upper_pd: "upper_le.ideal (Rep_upper_pd x)" by (rule Rep_upper_pd [unfolded mem_Collect_eq]) definition upper_principal :: "'a pd_basis => 'a upper_pd" where "upper_principal t = Abs_upper_pd {u. u ≤\<sharp> t}" lemma Rep_upper_principal: "Rep_upper_pd (upper_principal t) = {u. u ≤\<sharp> t}" unfolding upper_principal_def apply (rule Abs_upper_pd_inverse [unfolded mem_Collect_eq]) apply (rule upper_le.ideal_principal) done interpretation 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) apply (erule approx_pd_upper_mono) apply (rule approx_pd_upper_mono1, simp) apply (rule finite_range_approx_pd) apply (rule ex_approx_pd_eq) apply (rule ideal_Rep_upper_pd) apply (rule cont_Rep_upper_pd) apply (rule Rep_upper_principal) apply (simp only: less_upper_pd_def less_set_eq) done lemma upper_principal_less_iff [simp]: "upper_principal t \<sqsubseteq> upper_principal u <-> t ≤\<sharp> u" by (rule upper_pd.principal_less_iff) lemma upper_principal_eq_iff: "upper_principal t = upper_principal u <-> t ≤\<sharp> u ∧ u ≤\<sharp> t" by (rule upper_pd.principal_eq_iff) lemma upper_principal_mono: "t ≤\<sharp> u ==> upper_principal t \<sqsubseteq> upper_principal u" by (rule upper_pd.principal_mono) lemma compact_upper_principal: "compact (upper_principal t)" by (rule upper_pd.compact_principal) lemma upper_pd_minimal: "upper_principal (PDUnit compact_bot) \<sqsubseteq> ys" by (induct ys rule: upper_pd.principal_induct, simp, simp) instance upper_pd :: (bifinite) pcpo 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]) subsection {* Approximation *} instantiation upper_pd :: (profinite) profinite begin definition approx_upper_pd_def: "approx = upper_pd.completion_approx" instance 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 end 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 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.completion_approx_eq_principal) lemma compact_imp_upper_principal: "compact xs ==> ∃t. xs = upper_principal t" apply (drule bifinite_compact_eq_approx) apply (erule exE) apply (erule subst) apply (cut_tac n=i and xs=xs in approx_eq_upper_principal) apply fast done lemma upper_principal_induct: "[|adm P; !!t. P (upper_principal t)|] ==> P xs" by (rule upper_pd.principal_induct) lemma upper_principal_induct2: "[|!!ys. adm (λxs. P xs ys); !!xs. adm (λys. P xs ys); !!t u. P (upper_principal t) (upper_principal u)|] ==> P xs ys" apply (rule_tac x=ys in spec) apply (rule_tac xs=xs in upper_principal_induct, simp) apply (rule allI, rename_tac ys) apply (rule_tac xs=ys in upper_principal_induct, simp) apply simp done subsection {* Monadic unit and plus *} definition upper_unit :: "'a -> 'a upper_pd" where "upper_unit = compact_basis.basis_fun (λa. upper_principal (PDUnit a))" 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. upper_principal (PDPlus t u)))" abbreviation upper_add :: "'a upper_pd => 'a upper_pd => 'a upper_pd" (infixl "+\<sharp>" 65) where "xs +\<sharp> ys == upper_plus·xs·ys" syntax "_upper_pd" :: "args => 'a upper_pd" ("{_}\<sharp>") translations "{x,xs}\<sharp>" == "{x}\<sharp> +\<sharp> {xs}\<sharp>" "{x}\<sharp>" == "CONST upper_unit·x" lemma upper_unit_Rep_compact_basis [simp]: "{Rep_compact_basis a}\<sharp> = 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_principal t +\<sharp> 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}\<sharp> = {approx n·x}\<sharp>" apply (induct x rule: compact_basis_induct, simp) apply (simp add: approx_Rep_compact_basis) done lemma approx_upper_plus [simp]: "approx n·(xs +\<sharp> ys) = (approx n·xs) +\<sharp> (approx n·ys)" by (induct xs ys rule: upper_principal_induct2, simp, simp, simp) lemma upper_plus_assoc: "(xs +\<sharp> ys) +\<sharp> zs = xs +\<sharp> (ys +\<sharp> 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_commute: "xs +\<sharp> ys = ys +\<sharp> xs" apply (induct xs ys rule: upper_principal_induct2, simp, simp) apply (simp add: PDPlus_commute) done lemma upper_plus_absorb: "xs +\<sharp> xs = xs" apply (induct xs rule: upper_principal_induct, simp) apply (simp add: PDPlus_absorb) done interpretation aci_upper_plus: ab_semigroup_idem_mult ["op +\<sharp>"] by unfold_locales (rule upper_plus_assoc upper_plus_commute upper_plus_absorb)+ lemma upper_plus_left_commute: "xs +\<sharp> (ys +\<sharp> zs) = ys +\<sharp> (xs +\<sharp> zs)" by (rule aci_upper_plus.mult_left_commute) lemma upper_plus_left_absorb: "xs +\<sharp> (xs +\<sharp> ys) = xs +\<sharp> ys" by (rule aci_upper_plus.mult_left_idem) lemmas upper_plus_aci = aci_upper_plus.mult_ac_idem lemma upper_plus_less1: "xs +\<sharp> ys \<sqsubseteq> xs" apply (induct xs ys rule: upper_principal_induct2, simp, simp) apply (simp add: PDPlus_upper_less) done lemma upper_plus_less2: "xs +\<sharp> ys \<sqsubseteq> ys" by (subst upper_plus_commute, rule upper_plus_less1) lemma upper_plus_greatest: "[|xs \<sqsubseteq> ys; xs \<sqsubseteq> zs|] ==> xs \<sqsubseteq> ys +\<sharp> 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 \<sqsubseteq> ys +\<sharp> zs <-> xs \<sqsubseteq> ys ∧ xs \<sqsubseteq> 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_less_unit_iff: "xs +\<sharp> ys \<sqsubseteq> {z}\<sharp> <-> xs \<sqsubseteq> {z}\<sharp> ∨ ys \<sqsubseteq> {z}\<sharp>" apply (rule iffI) apply (subgoal_tac "adm (λf. f·xs \<sqsubseteq> f·{z}\<sharp> ∨ f·ys \<sqsubseteq> f·{z}\<sharp>)") 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) apply (cut_tac xs="approx i·ys" in compact_imp_upper_principal, simp) apply (cut_tac x="approx i·z" in compact_imp_Rep_compact_basis, simp) apply (clarify, simp add: upper_le_PDPlus_PDUnit_iff) apply simp apply simp apply (erule disjE) apply (erule trans_less [OF upper_plus_less1]) apply (erule trans_less [OF upper_plus_less2]) done lemma upper_unit_less_iff [simp]: "{x}\<sharp> \<sqsubseteq> {y}\<sharp> <-> x \<sqsubseteq> 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}\<sharp> = {y}\<sharp> <-> x = y" unfolding po_eq_conv by simp lemma upper_unit_strict [simp]: "{⊥}\<sharp> = ⊥" unfolding inst_upper_pd_pcpo Rep_compact_bot [symmetric] by simp lemma upper_plus_strict1 [simp]: "⊥ +\<sharp> ys = ⊥" by (rule UU_I, rule upper_plus_less1) lemma upper_plus_strict2 [simp]: "xs +\<sharp> ⊥ = ⊥" by (rule UU_I, rule upper_plus_less2) lemma upper_unit_strict_iff [simp]: "{x}\<sharp> = ⊥ <-> x = ⊥" unfolding upper_unit_strict [symmetric] by (rule upper_unit_eq_iff) lemma upper_plus_strict_iff [simp]: "xs +\<sharp> 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}\<sharp> <-> compact x" unfolding bifinite_compact_iff by simp lemma compact_upper_plus [simp]: "[|compact xs; compact ys|] ==> compact (xs +\<sharp> 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 {x}\<sharp>" assumes insert: "!!x ys. [|P {x}\<sharp>; P ys|] ==> P ({x}\<sharp> +\<sharp> ys)" shows "P (xs::'a upper_pd)" apply (induct xs rule: upper_principal_induct, rule P) apply (induct_tac t rule: pd_basis_induct1) apply (simp only: upper_unit_Rep_compact_basis [symmetric]) apply (rule unit) apply (simp only: upper_unit_Rep_compact_basis [symmetric] upper_plus_principal [symmetric]) apply (erule insert [OF unit]) done lemma upper_pd_induct: assumes P: "adm P" assumes unit: "!!x. P {x}\<sharp>" assumes plus: "!!xs ys. [|P xs; P ys|] ==> P (xs +\<sharp> ys)" shows "P (xs::'a upper_pd)" apply (induct xs rule: upper_principal_induct, rule P) apply (induct_tac t rule: pd_basis_induct) apply (simp only: upper_unit_Rep_compact_basis [symmetric] unit) apply (simp only: upper_plus_principal [symmetric] plus) done subsection {* Monadic bind *} definition upper_bind_basis :: "'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. x·f +\<sharp> y·f)" lemma ACI_upper_bind: "ab_semigroup_idem_mult (λx y. Λ f. x·f +\<sharp> y·f)" apply unfold_locales apply (simp add: upper_plus_assoc) apply (simp add: upper_plus_commute) apply (simp add: upper_plus_absorb eta_cfun) done lemma upper_bind_basis_simps [simp]: "upper_bind_basis (PDUnit a) = (Λ f. f·(Rep_compact_basis a))" "upper_bind_basis (PDPlus t u) = (Λ f. upper_bind_basis t·f +\<sharp> upper_bind_basis u·f)" unfolding upper_bind_basis_def apply - apply (rule fold_pd_PDUnit [OF ACI_upper_bind]) apply (rule fold_pd_PDPlus [OF ACI_upper_bind]) done lemma upper_bind_basis_mono: "t ≤\<sharp> u ==> upper_bind_basis t \<sqsubseteq> upper_bind_basis u" unfolding expand_cfun_less apply (erule upper_le_induct, safe) apply (simp add: compact_le_def monofun_cfun) apply (simp add: trans_less [OF upper_plus_less1]) apply (simp add: upper_less_plus_iff) done definition upper_bind :: "'a upper_pd -> ('a -> 'b upper_pd) -> 'b upper_pd" where "upper_bind = upper_pd.basis_fun upper_bind_basis" lemma upper_bind_principal [simp]: "upper_bind·(upper_principal t) = upper_bind_basis t" unfolding upper_bind_def apply (rule upper_pd.basis_fun_principal) apply (erule upper_bind_basis_mono) done lemma upper_bind_unit [simp]: "upper_bind·{x}\<sharp>·f = f·x" by (induct x rule: compact_basis_induct, simp, simp) lemma upper_bind_plus [simp]: "upper_bind·(xs +\<sharp> ys)·f = upper_bind·xs·f +\<sharp> upper_bind·ys·f" by (induct xs ys rule: upper_principal_induct2, simp, simp, simp) lemma upper_bind_strict [simp]: "upper_bind·⊥·f = f·⊥" unfolding upper_unit_strict [symmetric] by (rule upper_bind_unit) subsection {* Map and join *} definition upper_map :: "('a -> 'b) -> 'a upper_pd -> 'b upper_pd" where "upper_map = (Λ f xs. upper_bind·xs·(Λ x. {f·x}\<sharp>))" 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·{x}\<sharp> = {f·x}\<sharp>" unfolding upper_map_def by simp lemma upper_map_plus [simp]: "upper_map·f·(xs +\<sharp> ys) = upper_map·f·xs +\<sharp> upper_map·f·ys" unfolding upper_map_def by simp lemma upper_join_unit [simp]: "upper_join·{xs}\<sharp> = xs" unfolding upper_join_def by simp lemma upper_join_plus [simp]: "upper_join·(xss +\<sharp> yss) = upper_join·xss +\<sharp> upper_join·yss" unfolding upper_join_def by simp lemma upper_map_ident: "upper_map·(Λ x. x)·xs = xs" by (induct xs rule: upper_pd_induct, simp_all) lemma upper_map_map: "upper_map·f·(upper_map·g·xs) = upper_map·(Λ x. f·(g·x))·xs" by (induct xs rule: upper_pd_induct, simp_all) lemma upper_join_map_unit: "upper_join·(upper_map·upper_unit·xs) = xs" by (induct xs rule: upper_pd_induct, simp_all) lemma upper_join_map_join: "upper_join·(upper_map·upper_join·xsss) = upper_join·(upper_join·xsss)" by (induct xsss rule: upper_pd_induct, simp_all) lemma upper_join_map_map: "upper_join·(upper_map·(upper_map·f)·xss) = upper_map·f·(upper_join·xss)" by (induct xss rule: upper_pd_induct, simp_all) lemma upper_map_approx: "upper_map·(approx n)·xs = approx n·xs" by (induct xs rule: upper_pd_induct, simp_all) end
lemma upper_le_refl:
t ≤\<sharp> t
lemma upper_le_trans:
[| t ≤\<sharp> u; u ≤\<sharp> v |] ==> t ≤\<sharp> v
lemma upper_le_minimal:
PDUnit compact_bot ≤\<sharp> t
lemma PDUnit_upper_mono:
x << y ==> PDUnit x ≤\<sharp> PDUnit y
lemma PDPlus_upper_mono:
[| s ≤\<sharp> t; u ≤\<sharp> v |] ==> PDPlus s u ≤\<sharp> PDPlus t v
lemma PDPlus_upper_less:
PDPlus t u ≤\<sharp> t
lemma upper_le_PDUnit_PDUnit_iff:
(PDUnit a ≤\<sharp> PDUnit b) = a << b
lemma upper_le_PDPlus_PDUnit_iff:
(PDPlus t u ≤\<sharp> PDUnit a) = (t ≤\<sharp> PDUnit a ∨ u ≤\<sharp> PDUnit a)
lemma upper_le_PDPlus_iff:
(t ≤\<sharp> PDPlus u v) = (t ≤\<sharp> u ∧ t ≤\<sharp> v)
lemma upper_le_induct:
[| t ≤\<sharp> u; !!a b. a << b ==> P (PDUnit a) (PDUnit b);
!!t u a. P t (PDUnit a) ==> P (PDPlus t u) (PDUnit a);
!!t u v. [| P t u; P t v |] ==> P t (PDPlus u v) |]
==> P t u
lemma approx_pd_upper_mono1:
i ≤ j ==> approx_pd i t ≤\<sharp> approx_pd j t
lemma approx_pd_upper_le:
approx_pd i t ≤\<sharp> t
lemma approx_pd_upper_mono:
t ≤\<sharp> u ==> approx_pd n t ≤\<sharp> approx_pd n u
lemma ideal_Rep_upper_pd:
preorder.ideal op ≤\<sharp> (Rep_upper_pd x)
lemma Rep_upper_principal:
Rep_upper_pd (upper_principal t) = {u. u ≤\<sharp> t}
lemma upper_principal_less_iff:
upper_principal t << upper_principal u = (t ≤\<sharp> u)
lemma upper_principal_eq_iff:
(upper_principal t = upper_principal u) = (t ≤\<sharp> u ∧ u ≤\<sharp> t)
lemma upper_principal_mono:
t ≤\<sharp> u ==> upper_principal t << upper_principal u
lemma compact_upper_principal:
compact (upper_principal t)
lemma upper_pd_minimal:
upper_principal (PDUnit compact_bot) << ys
lemma inst_upper_pd_pcpo:
UU = upper_principal (PDUnit compact_bot)
lemma approx_upper_principal:
approx n·(upper_principal t) = upper_principal (approx_pd n t)
lemma approx_eq_upper_principal:
∃t∈Rep_upper_pd xs. approx n·xs = upper_principal (approx_pd n t)
lemma compact_imp_upper_principal:
compact xs ==> ∃t. xs = upper_principal t
lemma upper_principal_induct:
[| adm P; !!t. P (upper_principal t) |] ==> P xs
lemma upper_principal_induct2:
[| !!ys. adm (λxs. P xs ys); !!xs. adm (P xs);
!!t u. P (upper_principal t) (upper_principal u) |]
==> P xs ys
lemma upper_unit_Rep_compact_basis:
{Rep_compact_basis a}\<sharp> = upper_principal (PDUnit a)
lemma upper_plus_principal:
upper_principal t +\<sharp> upper_principal u = upper_principal (PDPlus t u)
lemma approx_upper_unit:
approx n·{x}\<sharp> = {approx n·x}\<sharp>
lemma approx_upper_plus:
approx n·(xs +\<sharp> ys) = approx n·xs +\<sharp> approx n·ys
lemma upper_plus_assoc:
xs +\<sharp> ys +\<sharp> zs = xs +\<sharp> (ys +\<sharp> zs)
lemma upper_plus_commute:
xs +\<sharp> ys = ys +\<sharp> xs
lemma upper_plus_absorb:
xs +\<sharp> xs = xs
lemma upper_plus_left_commute:
xs +\<sharp> (ys +\<sharp> zs) = ys +\<sharp> (xs +\<sharp> zs)
lemma upper_plus_left_absorb:
xs +\<sharp> (xs +\<sharp> ys) = xs +\<sharp> ys
lemma upper_plus_aci:
a +\<sharp> b +\<sharp> c = a +\<sharp> (b +\<sharp> c)
a +\<sharp> b = b +\<sharp> a
a +\<sharp> (b +\<sharp> c) = b +\<sharp> (a +\<sharp> c)
x +\<sharp> x = x
x +\<sharp> (x +\<sharp> y) = x +\<sharp> y
lemma upper_plus_less1:
xs +\<sharp> ys << xs
lemma upper_plus_less2:
xs +\<sharp> ys << ys
lemma upper_plus_greatest:
[| xs << ys; xs << zs |] ==> xs << ys +\<sharp> zs
lemma upper_less_plus_iff:
xs << ys +\<sharp> zs = (xs << ys ∧ xs << zs)
lemma upper_plus_less_unit_iff:
xs +\<sharp> ys << {z}\<sharp> = (xs << {z}\<sharp> ∨ ys << {z}\<sharp>)
lemma upper_unit_less_iff:
{x}\<sharp> << {y}\<sharp> = x << y
lemma upper_pd_less_simps:
{x}\<sharp> << {y}\<sharp> = x << y
xs << ys +\<sharp> zs = (xs << ys ∧ xs << zs)
xs +\<sharp> ys << {z}\<sharp> = (xs << {z}\<sharp> ∨ ys << {z}\<sharp>)
lemma upper_unit_eq_iff:
({x}\<sharp> = {y}\<sharp>) = (x = y)
lemma upper_unit_strict:
{UU}\<sharp> = UU
lemma upper_plus_strict1:
UU +\<sharp> ys = UU
lemma upper_plus_strict2:
xs +\<sharp> UU = UU
lemma upper_unit_strict_iff:
({x}\<sharp> = UU) = (x = UU)
lemma upper_plus_strict_iff:
(xs +\<sharp> ys = UU) = (xs = UU ∨ ys = UU)
lemma compact_upper_unit_iff:
compact {x}\<sharp> = compact x
lemma compact_upper_plus:
[| compact xs; compact ys |] ==> compact (xs +\<sharp> ys)
lemma upper_pd_induct1:
[| adm P; !!x. P {x}\<sharp>;
!!x ys. [| P {x}\<sharp>; P ys |] ==> P ({x}\<sharp> +\<sharp> ys) |]
==> P xs
lemma upper_pd_induct:
[| adm P; !!x. P {x}\<sharp>;
!!xs ys. [| P xs; P ys |] ==> P (xs +\<sharp> ys) |]
==> P xs
lemma ACI_upper_bind:
ab_semigroup_idem_mult (λx y. LAM f. x·f +\<sharp> y·f)
lemma upper_bind_basis_simps:
upper_bind_basis (PDUnit a) = (LAM f. f·(Rep_compact_basis a))
upper_bind_basis (PDPlus t u) =
(LAM f. upper_bind_basis t·f +\<sharp> upper_bind_basis u·f)
lemma upper_bind_basis_mono:
t ≤\<sharp> u ==> upper_bind_basis t << upper_bind_basis u
lemma upper_bind_principal:
upper_bind·(upper_principal t) = upper_bind_basis t
lemma upper_bind_unit:
upper_bind·{x}\<sharp>·f = f·x
lemma upper_bind_plus:
upper_bind·(xs +\<sharp> ys)·f = upper_bind·xs·f +\<sharp> upper_bind·ys·f
lemma upper_bind_strict:
upper_bind·UU·f = f·UU
lemma upper_map_unit:
upper_map·f·{x}\<sharp> = {f·x}\<sharp>
lemma upper_map_plus:
upper_map·f·(xs +\<sharp> ys) = upper_map·f·xs +\<sharp> upper_map·f·ys
lemma upper_join_unit:
upper_join·{xs}\<sharp> = xs
lemma upper_join_plus:
upper_join·(xss +\<sharp> yss) = upper_join·xss +\<sharp> upper_join·yss
lemma upper_map_ident:
upper_map·(LAM x. x)·xs = xs
lemma upper_map_map:
upper_map·f·(upper_map·g·xs) = upper_map·(LAM x. f·(g·x))·xs
lemma upper_join_map_unit:
upper_join·(upper_map·upper_unit·xs) = xs
lemma upper_join_map_join:
upper_join·(upper_map·upper_join·xsss) = upper_join·(upper_join·xsss)
lemma upper_join_map_map:
upper_join·(upper_map·(upper_map·f)·xss) = upper_map·f·(upper_join·xss)
lemma upper_map_approx:
upper_map·(approx n)·xs = approx n·xs