lemma ccpo_Sup_below_iff: "Complete_Partial_Order.chain (≤) Y ==> Sup Y ≤ x ⟷ (∀y∈Y. y ≤ x)" by (meson local.ccpo_Sup_least local.ccpo_Sup_upper local.dual_order.trans)
lemma Sup_minus_bot: assumes chain: "Complete_Partial_Order.chain (≤) A" shows"⊔(A - {⊔{}}) = ⊔A"
(is"?lhs = ?rhs") proof (rule order.antisym) show"?lhs ≤ ?rhs" by (blast intro: ccpo_Sup_least chain_Diff[OF chain] ccpo_Sup_upper[OF chain]) show"?rhs ≤ ?lhs" proof (rule ccpo_Sup_least [OF chain]) show"x ∈ A ==> x ≤ ?lhs"for x by (cases "x = ⊔{}")
(blast intro: ccpo_Sup_least chain_empty ccpo_Sup_upper[OF chain_Diff[OF chain]])+ qed qed
lemma mono_lub: fixes le_b (infix‹⊑› 60) assumes chain: "Complete_Partial_Order.chain (fun_ord (≤)) Y" and mono: "∧f. f ∈ Y ==> monotone le_b (≤) f" shows"monotone (⊑) (≤) (fun_lub Sup Y)" proof(rule monotoneI) fix x y assume"x ⊑ y"
have chain'': "∧x. Complete_Partial_Order.chain (≤) ((λf. f x) ` Y)" using chain by(rule chain_imageI)(simp add: fun_ord_def) thenshow"fun_lub Sup Y x ≤ fun_lub Sup Y y"unfolding fun_lub_apply proof(rule ccpo_Sup_least) fix x' assume"x' ∈ (λf. f x) ` Y" thenobtain f where"f ∈ Y""x' = f x"by blast note‹x' = f x›also from‹f ∈ Y›‹x ⊑ y›have"f x ≤ f y"by(blast dest: mono monotoneD) alsohave"…≤⊔((λf. f y) ` Y)"using chain'' by(rule ccpo_Sup_upper)(simp add: ‹f ∈ Y›) finallyshow"x' ≤⊔((λf. f y) ` Y)" . qed qed
context fixes le_b (infix‹⊑› 60) and Y f assumes chain: "Complete_Partial_Order.chain le_b Y" and mono1: "∧y. y ∈ Y ==> monotone le_b (≤) (λx. f x y)" and mono2: "∧x a b. [ x ∈ Y; a ⊑ b; a ∈ Y; b ∈ Y ]==> f x a ≤ f x b" begin
lemma Sup_mono: assumes le: "x ⊑ y"and x: "x ∈ Y"and y: "y ∈ Y" shows"⊔(f x ` Y) ≤⊔(f y ` Y)" (is"_ ≤ ?rhs") proof(rule ccpo_Sup_least) from chain show chain': "Complete_Partial_Order.chain (≤) (f x ` Y)" when "x ∈ Y"for x by(rule chain_imageI) (insert that, auto dest: mono2)
fix x' assume"x' ∈ f x ` Y" thenobtain y' where"y' ∈ Y""x' = f x y'"by blast note this(2) alsofrom mono1[OF ‹y' ∈ Y›] le have"…≤ f y y'"by(rule monotoneD) alsohave"…≤ ?rhs"using chain'[OF y] by (auto intro!: ccpo_Sup_upper simp add: ‹y' ∈ Y›) finallyshow"x' ≤ ?rhs" . qed(rule x)
lemma diag_Sup: "⊔((λx. ⊔(f x ` Y)) ` Y) = ⊔((λx. f x x) ` Y)" (is"?lhs = ?rhs") proof(rule order.antisym) have chain1: "Complete_Partial_Order.chain (≤) ((λx. ⊔(f x ` Y)) ` Y)" using chain by(rule chain_imageI)(rule Sup_mono) have chain2: "∧y'. y' ∈ Y ==> Complete_Partial_Order.chain (≤) (f y' ` Y)"using chain by(rule chain_imageI)(auto dest: mono2) have chain3: "Complete_Partial_Order.chain (≤) ((λx. f x x) ` Y)" using chain by(rule chain_imageI)(auto intro: monotoneD[OF mono1] mono2 order.trans)
show"?rhs ≤ ?lhs"using chain3 proof(rule ccpo_Sup_least) fix y assume"y ∈ (λx. f x x) ` Y" thenobtain x where"x ∈ Y"and"y = f x x"by blast thenshow"y ≤ ?lhs" by (metis (no_types, lifting) chain1 chain2 imageI ccpo_Sup_upper order.trans) qed qed
end
lemma Sup_image_mono_le: fixes le_b (infix‹⊑› 60) and Sup_b (‹∨›) assumes ccpo: "class.ccpo Sup_b (⊑) lt_b" assumes chain: "Complete_Partial_Order.chain (⊑) Y" and mono: "∧x y. [ x ⊑ y; x ∈ Y ]==> f x ≤ f y" shows"Sup (f ` Y) ≤ f (∨Y)" proof(rule ccpo_Sup_least) show"Complete_Partial_Order.chain (≤) (f ` Y)" using chain by(rule chain_imageI)(rule mono)
fix x assume"x ∈ f ` Y" thenobtain y where"y ∈ Y"and"x = f y"by blast note this(2) alsohave"y ⊑∨Y"using ccpo chain ‹y ∈ Y›by(rule ccpo.ccpo_Sup_upper) hence"f y ≤ f (∨Y)"using‹y ∈ Y›by(rule mono) finallyshow"x ≤…" . qed
lemma swap_Sup: fixes le_b (infix‹⊑› 60) assumes Y: "Complete_Partial_Order.chain (⊑) Y" and Z: "Complete_Partial_Order.chain (fun_ord (≤)) Z" and mono: "∧f. f ∈ Z ==> monotone (⊑) (≤) f" shows"⊔((λx. ⊔(x ` Y)) ` Z) = ⊔((λx. ⊔((λf. f x) ` Z)) ` Y)"
(is"?lhs = ?rhs") proof(cases "Y = {}") case True thenshow ?thesis by (simp add: image_constant_conv cong del: SUP_cong_simp) next case False have chain1: "∧f. f ∈ Z ==> Complete_Partial_Order.chain (≤) (f ` Y)" by(rule chain_imageI[OF Y])(rule monotoneD[OF mono]) have chain2: "Complete_Partial_Order.chain (≤) ((λx. ⊔(x ` Y)) ` Z)"using Z proof(rule chain_imageI) fix f g assume"f ∈ Z""g ∈ Z" and"fun_ord (≤) f g" from chain1[OF ‹f ∈ Z›] show"⊔(f ` Y) ≤⊔(g ` Y)" proof(rule ccpo_Sup_least) fix x assume"x ∈ f ` Y" thenobtain y where"y ∈ Y""x = f y"by blast note this(2) alsohave"…≤ g y"using‹fun_ord (≤) f g›by(simp add: fun_ord_def) alsohave"…≤⊔(g ` Y)"using chain1[OF ‹g ∈ Z›] by(rule ccpo_Sup_upper)(simp add: ‹y ∈ Y›) finallyshow"x ≤⊔(g ` Y)" . qed qed have chain3: "∧x. Complete_Partial_Order.chain (≤) ((λf. f x) ` Z)" using Z by(rule chain_imageI)(simp add: fun_ord_def) have chain4: "Complete_Partial_Order.chain (≤) ((λx. ⊔((λf. f x) ` Z)) ` Y)" using Y proof(rule chain_imageI) fix f x y assume"x ⊑ y" show"⊔((λf. f x) ` Z) ≤⊔((λf. f y) ` Z)" (is"_ ≤ ?rhs") using chain3 proof(rule ccpo_Sup_least) fix x' assume"x' ∈ (λf. f x) ` Z" thenobtain f where"f ∈ Z""x' = f x"by blast thenshow"x' ≤ ?rhs" by (metis (mono_tags, lifting) ‹x ⊑ y› chain3 imageI ccpo_Sup_upper
order_trans mono monotoneD) qed qed
from chain2 have"?lhs ≤ ?rhs" proof(rule ccpo_Sup_least) fix x assume"x ∈ (λx. ⊔(x ` Y)) ` Z" thenobtain f where"f ∈ Z""x = ⊔(f ` Y)"by blast note this(2) alsohave"…≤ ?rhs"using chain1[OF ‹f ∈ Z›] proof(rule ccpo_Sup_least) fix x' assume"x' ∈ f ` Y" thenobtain y where"y ∈ Y""x' = f y"by blast thenshow"x' ≤ ?rhs" by (metis (mono_tags, lifting) ‹f ∈ Z› chain3 chain4 imageI local.ccpo_Sup_upper
order.trans) qed finallyshow"x ≤ ?rhs" . qed moreover have"?rhs ≤ ?lhs"using chain4 proof(rule ccpo_Sup_least) fix x assume"x ∈ (λx. ⊔((λf. f x) ` Z)) ` Y" thenobtain y where"y ∈ Y""x = ⊔((λf. f y) ` Z)"by blast note this(2) alsohave"…≤ ?lhs"using chain3 proof(rule ccpo_Sup_least) fix x' assume"x' ∈ (λf. f y) ` Z" thenobtain f where"f ∈ Z""x' = f y"by blast thenshow"x' ≤ ?lhs" by (metis (mono_tags, lifting) ‹y ∈ Y› ccpo_Sup_below_iff chain1 chain2 imageI
ccpo_Sup_upper) qed finallyshow"x ≤ ?lhs" . qed ultimatelyshow"?lhs = ?rhs" by (rule order.antisym) qed
lemma fixp_mono: assumes fg: "fun_ord (≤) f g" and f: "monotone (≤) (≤) f" and g: "monotone (≤) (≤) g" shows"ccpo_class.fixp f ≤ ccpo_class.fixp g" unfolding fixp_def proof(rule ccpo_Sup_least) fix x assume"x ∈ ccpo_class.iterates f" thus"x ≤⊔ccpo_class.iterates g" proofinduction case (step x) from f step.IH have"f x ≤ f (⊔ccpo_class.iterates g)"by(rule monotoneD) alsohave"…≤ g (⊔ccpo_class.iterates g)"using fg by(simp add: fun_ord_def) alsohave"… = ⊔ccpo_class.iterates g"by(fold fixp_def fixp_unfold[OF g]) simp finallyshow ?case . qed(blast intro: ccpo_Sup_least) qed(rule chain_iterates[OF f])
lemma iterates_mono: assumes f: "f ∈ ccpo.iterates (fun_lub Sup) (fun_ord (≤)) F" and mono: "∧f. monotone (⊑) (≤) f ==> monotone (⊑) (≤) (F f)" shows"monotone (⊑) (≤) f" using f by(induction rule: ccpo.iterates.induct[OF ccpo_fun, consumes 1])(blast intro: mono mono_lub)+
lemma fixp_preserves_mono: assumes mono: "∧x. monotone (fun_ord (≤)) (≤) (λf. F f x)" and mono2: "∧f. monotone (⊑) (≤) f ==> monotone (⊑) (≤) (F f)" shows"monotone (⊑) (≤) (ccpo.fixp (fun_lub Sup) (fun_ord (≤)) F)"
(is"monotone _ _ ?fixp") proof(rule monotoneI) have mono: "monotone (fun_ord (≤)) (fun_ord (≤)) F" by(rule monotoneI)(auto simp add: fun_ord_def intro: monotoneD[OF mono]) let ?iter = "ccpo.iterates (fun_lub Sup) (fun_ord (≤)) F" have chain: "∧x. Complete_Partial_Order.chain (≤) ((λf. f x) ` ?iter)" by(rule chain_imageI[OF ccpo.chain_iterates[OF ccpo_fun mono]])(simp add: fun_ord_def) fix x y assume"x ⊑ y" have"(⊔f∈?iter. f x) ≤ (⊔f∈?iter. f y)" using chain proof(rule ccpo_Sup_least) fix x' assume"x' ∈ (λf. f x) ` ?iter" thenobtain f where f: "f ∈ ?iter""x' = f x"by blast thenhave"f x ≤ f y" by (metis ‹x ⊑ y› iterates_mono mono2 monotoneD) alsohave"f y ≤⊔((λf. f y) ` ?iter)" using chain f local.ccpo_Sup_upper by auto finallyshow"x' ≤…" using f(2) by blast qed thenshow"?fixp x ≤ ?fixp y" unfolding ccpo.fixp_def[OF ccpo_fun] fun_lub_apply . qed
end
end
lemma monotone2monotone: assumes 2: "∧x. monotone ordb ordc (λy. f x y)" and t: "monotone orda ordb (λx. t x)" and 1: "∧y. monotone orda ordc (λx. f x y)" and trans: "transp ordc" shows"monotone orda ordc (λx. f x (t x))" using assms unfolding monotone_on_def by (metis UNIV_I transpE)
subsection‹Continuity›
definition cont :: "('a set ==> 'a) ==> ('a ==> 'a ==> bool) ==> ('b set ==> 'b) ==> ('b ==> 'b ==> bool) ==> ('a ==> 'b) ==> bool" where "cont luba orda lubb ordb f ⟷ (∀Y. Complete_Partial_Order.chain orda Y ⟶ Y ≠ {} ⟶ f (luba Y) = lubb (f ` Y))"
definition mcont :: "('a set ==> 'a) ==> ('a ==> 'a ==> bool) ==> ('b set ==> 'b) ==> ('b ==> 'b ==> bool) ==> ('a ==> 'b) ==> bool" where "mcont luba orda lubb ordb f ⟷ monotone orda ordb f ∧ cont luba orda lubb ordb f"
subsubsection ‹Theorem collection ‹cont_intro›\›
named_theorems cont_intro "continuity and admissibility intro rules"
ML ‹ (* apply cont_intro rules as intro and try to solve the remaining of the emerging subgoals with simp *) fun cont_intro_tac ctxt =
REPEAT_ALL_NEW (resolve_tac ctxt (rev (Named_Theorems.get ctxt 🍋‹cont_intro›)))
THEN_ALL_NEW (SOLVED' (simp_tac ctxt))
fun cont_intro_simproc ctxt ct = let fun mk_stmt t = t
|> HOLogic.mk_Trueprop
|> Thm.cterm_of ctxt
|> Goal.init fun mk_thm t = if exists_subterm Term.is_Var t then
NONE
else case SINGLE (cont_intro_tac ctxt 1) (mk_stmt t) of
SOME thm => SOME (Goal.finish ctxt thm RS @{thm Eq_TrueI})
| NONE => NONE in caseThm.term_of ct of
t as 🍋‹ccpo.admissible _ for _ _ _› => mk_thm t
| t as 🍋‹mcont _ _ for _ _ _ _ _› => mk_thm t
| t as 🍋‹monotone_on _ _ for _ _ _ _› => mk_thm t
| _ => NONE end
handle THM _ => NONE
| TYPE _ => NONE ›
simproc_setup"cont_intro"
( "ccpo.admissible lub ord P"
| "mcont lub ord lub' ord' f"
| "monotone ord ord' f"
) = ‹K cont_intro_simproc›
lemma monotone_if_fun [partial_function_mono]: "[ monotone (fun_ord orda) (fun_ord ordb) F; monotone (fun_ord orda) (fun_ord ordb) G ] ==> monotone (fun_ord orda) (fun_ord ordb) (λf n. if c n then F f n else G f n)" by(simp add: monotone_def fun_ord_def)
lemma monotone_fun_apply_fun [partial_function_mono]: "monotone (fun_ord (fun_ord ord)) (fun_ord ord) (λf n. f t (g n))" by(rule monotoneI)(simp add: fun_ord_def)
lemma monotone_fun_ord_apply: "monotone orda (fun_ord ordb) f ⟷ (∀x. monotone orda ordb (λy. f y x))" by(auto simp add: monotone_def fun_ord_def)
lemma contI [intro?]: "(∧Y. [ Complete_Partial_Order.chain orda Y; Y ≠ {} ]==> f (luba Y) = lubb (f ` Y)) ==> cont luba orda lubb ordb f" unfolding cont_def by blast
lemma contD: "[ cont luba orda lubb ordb f; Complete_Partial_Order.chain orda Y; Y ≠ {} ] ==> f (luba Y) = lubb (f ` Y)" unfolding cont_def by blast
lemma cont_id [simp, cont_intro]: "∧Sup. cont Sup ord Sup ord id" by(rule contI) simp
lemma cont_id' [simp, cont_intro]: "∧Sup. cont Sup ord Sup ord (λx. x)" by (simp add: Inf.INF_identity_eq contI)
lemma cont_applyI [cont_intro]: assumes cont: "cont luba orda lubb ordb g" shows"cont (fun_lub luba) (fun_ord orda) lubb ordb (λf. g (f x))" using assms by (simp add: cont_def chain_fun_ordD fun_lub_apply image_image)
lemma call_cont: "cont (fun_lub lub) (fun_ord ord) lub ord (λf. f t)" by(simp add: cont_def fun_lub_apply)
lemma cont_if [cont_intro]: "[ cont luba orda lubb ordb f; cont luba orda lubb ordb g ] ==> cont luba orda lubb ordb (λx. if c then f x else g x)" by(cases c) simp_all
lemma mcontI [intro?]: "[ monotone orda ordb f; cont luba orda lubb ordb f ]==> mcont luba orda lubb ordb f" by(simp add: mcont_def)
lemma mcont_mono: "mcont luba orda lubb ordb f ==> monotone orda ordb f" by(simp add: mcont_def)
lemma mcont_cont [simp]: "mcont luba orda lubb ordb f ==> cont luba orda lubb ordb f" by(simp add: mcont_def)
lemma mcont_monoD: "[ mcont luba orda lubb ordb f; orda x y ]==> ordb (f x) (f y)" by(auto simp add: mcont_def dest: monotoneD)
lemma mcont_call [cont_intro, simp]: "mcont (fun_lub lub) (fun_ord ord) lub ord (λf. f t)" by(simp add: mcont_def call_mono call_cont)
lemma mcont_id' [cont_intro, simp]: "mcont lub ord lub ord (λx. x)" by(simp add: mcont_def monotone_id')
lemma mcont_applyI: "mcont luba orda lubb ordb (λx. F x) ==> mcont (fun_lub luba) (fun_ord orda) lubb ordb (λf. F (f x))" by(simp add: mcont_def monotone_applyI cont_applyI)
lemma mcont_if [cont_intro, simp]: "[ mcont luba orda lubb ordb (λx. f x); mcont luba orda lubb ordb (λx. g x) ] ==> mcont luba orda lubb ordb (λx. if c then f x else g x)" by(simp add: mcont_def cont_if)
lemma cont_fun_lub_apply: "cont luba orda (fun_lub lubb) (fun_ord ordb) f ⟷ (∀x. cont luba orda lubb ordb (λy. f y x))" by(simp add: cont_def fun_lub_def fun_eq_iff)(auto simp add: image_def)
lemma mcont_fun_lub_apply: "mcont luba orda (fun_lub lubb) (fun_ord ordb) f ⟷ (∀x. mcont luba orda lubb ordb (λy. f y x))" by(auto simp add: monotone_fun_ord_apply cont_fun_lub_apply mcont_def)
context ccpo begin
lemma cont_const [simp, cont_intro]: "cont luba orda Sup (≤) (λx. c)" by (rule contI) (simp add: image_constant_conv cong del: SUP_cong_simp)
lemma cont_apply: assumes 2: "∧x. cont lubb ordb Sup (≤) (λy. f x y)" and t: "cont luba orda lubb ordb (λx. t x)" and 1: "∧y. cont luba orda Sup (≤) (λx. f x y)" and mono: "monotone orda ordb (λx. t x)" and mono2: "∧x. monotone ordb (≤) (λy. f x y)" and mono1: "∧y. monotone orda (≤) (λx. f x y)" shows"cont luba orda Sup (≤) (λx. f x (t x))" proof fix Y assume chain: "Complete_Partial_Order.chain orda Y"and"Y ≠ {}" moreoverfrom chain have chain': "Complete_Partial_Order.chain ordb (t ` Y)" by(rule chain_imageI)(rule monotoneD[OF mono]) ultimatelyshow"f (luba Y) (t (luba Y)) = ⊔((λx. f x (t x)) ` Y)" by(simp add: contD[OF 1] contD[OF t] contD[OF 2] image_image)
(rule diag_Sup[OF chain], auto intro: monotone2monotone[OF mono2 mono monotone_const transpI] monotoneD[OF mono1]) qed
lemma mcont2mcont': "[∧x. mcont lub' ord' Sup (≤) (λy. f x y); ∧y. mcont lub ord Sup (≤) (λx. f x y); mcont lub ord lub' ord' (λy. t y) ] ==> mcont lub ord Sup (≤) (λx. f x (t x))" unfolding mcont_def by(blast intro: transp_on_le monotone2monotone cont_apply)
lemma mcont2mcont: "[mcont lub' ord' Sup (≤) (λx. f x); mcont lub ord lub' ord' (λx. t x)] ==> mcont lub ord Sup (≤) (λx. f (t x))" by(rule mcont2mcont'[OF _ mcont_const])
context fixes ord :: "'b ==> 'b ==> bool" (infix‹⊑› 60) and lub :: "'b set ==> 'b" (‹∨›) begin
lemma cont_fun_lub_Sup: assumes chainM: "Complete_Partial_Order.chain (fun_ord (≤)) M" and mcont [rule_format]: "∀f∈M. mcont lub (⊑) Sup (≤) f" shows"cont lub (⊑) Sup (≤) (fun_lub Sup M)" proof(rule contI) fix Y assume chain: "Complete_Partial_Order.chain (⊑) Y" and Y: "Y ≠ {}" from swap_Sup[OF chain chainM mcont[THEN mcont_mono]] show"fun_lub Sup M (∨Y) = ⊔(fun_lub Sup M ` Y)" by(simp add: mcont_contD[OF mcont chain Y] fun_lub_apply cong: image_cong) qed
lemma mcont_fun_lub_Sup: "[ Complete_Partial_Order.chain (fun_ord (≤)) M; ∀f∈M. mcont lub ord Sup (≤) f ] ==> mcont lub (⊑) Sup (≤) (fun_lub Sup M)" by(simp add: mcont_def cont_fun_lub_Sup mono_lub)
lemma iterates_mcont: assumes f: "f ∈ ccpo.iterates (fun_lub Sup) (fun_ord (≤)) F" and mono: "∧f. mcont lub (⊑) Sup (≤) f ==> mcont lub (⊑) Sup (≤) (F f)" shows"mcont lub (⊑) Sup (≤) f" using f by(induction rule: ccpo.iterates.induct[OF ccpo_fun, consumes 1, case_names step Sup])(blast intro: mono mcont_fun_lub_Sup)+
lemma fixp_preserves_mcont: assumes mono: "∧x. monotone (fun_ord (≤)) (≤) (λf. F f x)" and mcont: "∧f. mcont lub (⊑) Sup (≤) f ==> mcont lub (⊑) Sup (≤) (F f)" shows"mcont lub (⊑) Sup (≤) (ccpo.fixp (fun_lub Sup) (fun_ord (≤)) F)"
(is"mcont _ _ _ _ ?fixp") unfolding mcont_def proof(intro conjI monotoneI contI) have mono: "monotone (fun_ord (≤)) (fun_ord (≤)) F" by(rule monotoneI)(auto simp add: fun_ord_def intro: monotoneD[OF mono]) let ?iter = "ccpo.iterates (fun_lub Sup) (fun_ord (≤)) F" have chain: "∧x. Complete_Partial_Order.chain (≤) ((λf. f x) ` ?iter)" by(rule chain_imageI[OF ccpo.chain_iterates[OF ccpo_fun mono]])(simp add: fun_ord_def)
show"?fixp x ≤ ?fixp y"if"x ⊑ y"for x y proof - have"(⊔f∈?iter. f x) ≤ (⊔f∈?iter. f y)" using chain proof(rule ccpo_Sup_least) fix x' assume"x' ∈ (λf. f x) ` ?iter" thenobtain f where f: "f ∈ ?iter""x' = f x"by blast thenhave"f x ≤ f y" by (metis iterates_mcont mcont mcont_monoD that) alsohave"f y ≤⊔((λf. f y) ` ?iter)" using chain f local.ccpo_Sup_upper by auto finallyshow"x' ≤…" using f(2) by blast qed thenshow ?thesis by (simp add: ccpo.fixp_def[OF ccpo_fun] fun_lub_apply) qed show"?fixp (∨Y) = ⊔(?fixp ` Y)" if chain: "Complete_Partial_Order.chain (⊑) Y"and Y: "Y ≠ {}"for Y proof - have"f (∨Y) = ⊔(f ` Y)"if"f ∈ ?iter"for f using that mcont chain Y by (rule mcont_contD[OF iterates_mcont]) moreoverhave"⊔((λf. ⊔(f ` Y)) ` ?iter) = ⊔((λx. ⊔((λf. f x) ` ?iter)) ` Y)" using chain ccpo.chain_iterates[OF ccpo_fun mono] by (rule swap_Sup)(rule mcont_mono[OF iterates_mcont[OF _ mcont]]) ultimatelyshow ?thesis unfolding ccpo.fixp_def[OF ccpo_fun] by (simp add: fun_lub_apply cong: image_cong) qed qed
end
context fixes F :: "'c ==> 'c"and U :: "'c ==> 'b ==> 'a"and C :: "('b ==> 'a) ==> 'c"and f assumes mono: "∧x. monotone (fun_ord (≤)) (≤) (λf. U (F (C f)) x)" and eq: "f ≡ C (ccpo.fixp (fun_lub Sup) (fun_ord (≤)) (λf. U (F (C f))))" and inverse: "∧f. U (C f) = f" begin
lemma fixp_preserves_mono_uc: assumes mono2: "∧f. monotone ord (≤) (U f) ==> monotone ord (≤) (U (F f))" shows"monotone ord (≤) (U f)" using fixp_preserves_mono[OF mono mono2] by(subst eq)(simp add: inverse)
lemma fixp_preserves_mcont_uc: assumes mcont: "∧f. mcont lubb ordb Sup (≤) (U f) ==> mcont lubb ordb Sup (≤) (U (F f))" shows"mcont lubb ordb Sup (≤) (U f)" using fixp_preserves_mcont[OF mono mcont] by(subst eq)(simp add: inverse)
lemma (in preorder) monotone_if_bot: fixes bot assumes mono: "∧x y. [ x ≤ y; ¬ (x ≤ bound) ]==> ord (f x) (f y)" and bot: "∧x. ¬ x ≤ bound ==> ord bot (f x)""ord bot bot" shows"monotone (≤) ord (λx. if x ≤ bound then bot else f x)" by(rule monotoneI)(auto intro: bot intro: mono order_trans)
lemma (in ccpo) mcont_if_bot: fixes bot and lub (‹∨›) and ord (infix‹⊑› 60) assumes ccpo: "class.ccpo lub (⊑) lt" and mono: "∧x y. [ x ≤ y; ¬ x ≤ bound ]==> f x ⊑ f y" and cont: "∧Y. [ Complete_Partial_Order.chain (≤) Y; Y ≠ {}; ∧x. x ∈ Y ==>¬ x ≤ bound ]==> f (⊔Y) = ∨(f ` Y)" and bot: "∧x. ¬ x ≤ bound ==> bot ⊑ f x" shows"mcont Sup (≤) lub (⊑) (λx. if x ≤ bound then bot else f x)" (is"mcont _ _ _ _ ?g") proof(intro mcontI contI) interpret c: ccpo lub "(⊑)" lt by(fact ccpo) show"monotone (≤) (⊑) ?g"by(rule monotone_if_bot)(simp_all add: mono bot)
fix Y assume chain: "Complete_Partial_Order.chain (≤) Y"and Y: "Y ≠ {}" show"?g (⊔Y) = ∨(?g ` Y)" proof(cases "Y ⊆ {x. x ≤ bound}") case True hence"⊔Y ≤ bound"using chain by(auto intro: ccpo_Sup_least) moreoverhave"Y ∩ {x. ¬ x ≤ bound} = {}"using True by auto ultimatelyshow ?thesis using True Y by (auto simp add: image_constant_conv cong del: c.SUP_cong_simp) next case False let ?Y = "Y ∩ {x. ¬ x ≤ bound}" have chain': "Complete_Partial_Order.chain (≤) ?Y" using chain by(rule chain_subset) simp
from False obtain y where ybound: "¬ y ≤ bound"and y: "y ∈ Y"by blast hence"¬⊔Y ≤ bound"by (metis ccpo_Sup_upper chain order.trans) hence"?g (⊔Y) = f (⊔Y)"by simp alsohave"⊔Y ≤⊔?Y"using chain proof(rule ccpo_Sup_least) fix x assume x: "x ∈ Y" show"x ≤⊔?Y" proof(cases "x ≤ bound") case True with chainD[OF chain x y] have"x ≤ y"using ybound by(auto intro: order_trans) thus ?thesis by(rule order_trans)(auto intro: ccpo_Sup_upper[OF chain'] simp add: y ybound) qed(auto intro: ccpo_Sup_upper[OF chain'] simp add: x) qed hence"⊔Y = ⊔?Y"by(rule order.antisym)(blast intro: ccpo_Sup_least[OF chain'] ccpo_Sup_upper[OF chain]) hence"f (⊔Y) = f (⊔?Y)"by simp alsohave"f (⊔?Y) = ∨(f ` ?Y)"using chain' by(rule cont)(insert y ybound, auto) alsohave"∨(f ` ?Y) = ∨(?g ` Y)" proof(cases "Y ∩ {x. x ≤ bound} = {}") case True hence"f ` ?Y = ?g ` Y"by auto thus ?thesis by(rule arg_cong) next case False have chain'': "Complete_Partial_Order.chain (⊑) (insert bot (f ` ?Y))" using chain by(auto intro!: chainI bot dest: chainD intro: mono) hence chain''': "Complete_Partial_Order.chain (⊑) (f ` ?Y)"by(rule chain_subset) blast have"bot ⊑∨(f ` ?Y)"using y ybound by(blast intro: c.order_trans[OF bot] c.ccpo_Sup_upper[OF chain''']) hence"∨(insert bot (f ` ?Y)) ⊑∨(f ` ?Y)"using chain'' by(auto intro: c.ccpo_Sup_least c.ccpo_Sup_upper[OF chain''']) with _ have"… = ∨(insert bot (f ` ?Y))" by(rule c.order.antisym)(blast intro: c.ccpo_Sup_least[OF chain'''] c.ccpo_Sup_upper[OF chain'']) alsohave"insert bot (f ` ?Y) = ?g ` Y"using False by auto finallyshow ?thesis . qed finallyshow ?thesis . qed qed
context partial_function_definitions begin
lemma mcont_const [cont_intro, simp]: "mcont luba orda lub leq (λx. c)" by(rule ccpo.mcont_const)(rule Partial_Function.ccpo[OF partial_function_definitions_axioms])
lemma monotone_if_bot: fixes bot assumes g: "∧x. g x = (if leq x bound then bot else f x)" and mono: "∧x y. [ leq x y; ¬ leq x bound ]==> ord (f x) (f y)" and bot: "∧x. ¬ leq x bound ==> ord bot (f x)""ord bot bot" shows"monotone leq ord g" unfolding g[abs_def] using preorder mono bot by(rule preorder.monotone_if_bot)
lemma mcont_if_bot: fixes bot assumes ccpo: "class.ccpo lub' ord (mk_less ord)" and bot: "∧x. ¬ leq x bound ==> ord bot (f x)" and g: "∧x. g x = (if leq x bound then bot else f x)" and mono: "∧x y. [ leq x y; ¬ leq x bound ]==> ord (f x) (f y)" and cont: "∧Y. [ Complete_Partial_Order.chain leq Y; Y ≠ {}; ∧x. x ∈ Y ==>¬ leq x bound ]==> f (lub Y) = lub' (f ` Y)" shows"mcont lub leq lub' ord g" unfolding g[abs_def] using ccpo mono cont bot by(rule ccpo.mcont_if_bot[OF Partial_Function.ccpo[OF partial_function_definitions_axioms]])
end
subsection‹Admissibility›
lemma admissible_subst: assumes adm: "ccpo.admissible luba orda (λx. P x)" and mcont: "mcont lubb ordb luba orda f" shows"ccpo.admissible lubb ordb (λx. P (f x))" using assms by (simp add: ccpo.admissible_def chain_imageI mcont_contD mcont_monoD)
lemma admissible_disj' [simp, cont_intro]: "[ class.ccpo lub ord (mk_less ord); ccpo.admissible lub ord P; ccpo.admissible lub ord Q ] ==> ccpo.admissible lub ord (λx. P x ∨ Q x)" by(rule ccpo.admissible_disj)
lemma admissible_imp' [cont_intro]: "[ class.ccpo lub ord (mk_less ord); ccpo.admissible lub ord (λx. ¬ P x); ccpo.admissible lub ord (λx. Q x) ] ==> ccpo.admissible lub ord (λx. P x ⟶ Q x)" unfolding imp_conv_disj by(rule ccpo.admissible_disj)
lemma admissible_imp [cont_intro]: "(Q ==> ccpo.admissible lub ord (λx. P x)) ==> ccpo.admissible lub ord (λx. Q ⟶ P x)" by(rule ccpo.admissibleI)(auto dest: ccpo.admissibleD)
lemma admissible_not_mem' [THEN admissible_subst, cont_intro, simp]: shows admissible_not_mem: "ccpo.admissible Union (⊆) (λA. x ∉ A)" by(rule ccpo.admissibleI) auto
lemma admissible_eqI: assumes f: "cont luba orda lub ord (λx. f x)" and g: "cont luba orda lub ord (λx. g x)" shows"ccpo.admissible luba orda (λx. f x = g x)" by (smt (verit, best) Sup.SUP_cong ccpo.admissible_def contD assms)
corollary admissible_eq_mcontI [cont_intro]: "[ mcont luba orda lub ord (λx. f x); mcont luba orda lub ord (λx. g x) ] ==> ccpo.admissible luba orda (λx. f x = g x)" by(rule admissible_eqI)(auto simp add: mcont_def)
lemma admissible_iff [cont_intro, simp]: "[ ccpo.admissible lub ord (λx. P x ⟶ Q x); ccpo.admissible lub ord (λx. Q x ⟶ P x) ] ==> ccpo.admissible lub ord (λx. P x ⟷ Q x)" by(subst iff_conv_conj_imp)(rule admissible_conj)
context ccpo begin
lemma admissible_leI: assumes f: "mcont luba orda Sup (≤) (λx. f x)" and g: "mcont luba orda Sup (≤) (λx. g x)" shows"ccpo.admissible luba orda (λx. f x ≤ g x)" proof(rule ccpo.admissibleI) fix A assume chain: "Complete_Partial_Order.chain orda A" and le: "∀x∈A. f x ≤ g x" and False: "A ≠ {}" have"f (luba A) = ⊔(f ` A)"by(simp add: mcont_contD[OF f] chain False) alsohave"…≤⊔(g ` A)" proof(rule ccpo_Sup_least) from chain show"Complete_Partial_Order.chain (≤) (f ` A)" by(rule chain_imageI)(rule mcont_monoD[OF f]) fix x assume"x ∈ f ` A" thenobtain y where"y ∈ A""x = f y"by blast note this(2) alsohave"f y ≤ g y"using le ‹y ∈ A›by simp alsohave"Complete_Partial_Order.chain (≤) (g ` A)" using chain by(rule chain_imageI)(rule mcont_monoD[OF g]) hence"g y ≤⊔(g ` A)"by(rule ccpo_Sup_upper)(simp add: ‹y ∈ A›) finallyshow"x ≤…" . qed alsohave"… = g (luba A)"by(simp add: mcont_contD[OF g] chain False) finallyshow"f (luba A) ≤ g (luba A)" . qed
end
lemma admissible_leI: fixes ord (infix‹⊑› 60) and lub (‹∨›) assumes"class.ccpo lub (⊑) (mk_less (⊑))" and"mcont luba orda lub (⊑) (λx. f x)" and"mcont luba orda lub (⊑) (λx. g x)" shows"ccpo.admissible luba orda (λx. f x ⊑ g x)" using assms by(rule ccpo.admissible_leI)
inductive compact :: "('a set ==> 'a) ==> ('a ==> 'a ==> bool) ==> 'a ==> bool" for lub ord x where compact: "[ ccpo.admissible lub ord (λy. ¬ ord x y); ccpo.admissible lub ord (λy. x ≠ y) ] ==> compact lub ord x"
setup‹Sign.map_naming Name_Space.parent_path›
context ccpo begin
lemma compactI: assumes"ccpo.admissible Sup (≤) (λy. ¬ x ≤ y)" shows"ccpo.compact Sup (≤) x" using assms proof(rule ccpo.compact.intros) have neq: "(λy. x ≠ y) = (λy. ¬ x ≤ y ∨¬ y ≤ x)"by(auto) show"ccpo.admissible Sup (≤) (λy. x ≠ y)" by(subst neq)(rule admissible_disj admissible_not_below assms)+ qed
lemma admissible_compact_neq' [THEN admissible_subst, cont_intro, simp]: shows admissible_compact_neq: "ccpo.compact lub ord k ==> ccpo.admissible lub ord (λx. k ≠ x)" by(simp add: ccpo.compact.simps)
lemma admissible_neq_compact' [THEN admissible_subst, cont_intro, simp]: shows admissible_neq_compact: "ccpo.compact lub ord k ==> ccpo.admissible lub ord (λx. x ≠ k)" by(subst eq_commute)(rule admissible_compact_neq)
lemma fixp_strong_induct: assumes [cont_intro]: "ccpo.admissible Sup (≤) P" and mono: "monotone (≤) (≤) f" and bot: "P (⊔{})" and step: "∧x. [ x ≤ ccpo_class.fixp f; P x ]==> P (f x)" shows"P (ccpo_class.fixp f)" proof(rule fixp_induct[where P="λx. x ≤ ccpo_class.fixp f ∧ P x", THEN conjunct2]) note [cont_intro] = admissible_leI show"ccpo.admissible Sup (≤) (λx. x ≤ ccpo_class.fixp f ∧ P x)"by simp next show"⊔{} ≤ ccpo_class.fixp f ∧ P (⊔{})" by(auto simp add: bot intro: ccpo_Sup_least chain_empty) next fix x assume"x ≤ ccpo_class.fixp f ∧ P x" thus"f x ≤ ccpo_class.fixp f ∧ P (f x)" by(subst fixp_unfold[OF mono])(auto dest: monotoneD[OF mono] intro: step) qed(rule mono)
end
context partial_function_definitions begin
lemma fixp_strong_induct_uc: fixes F :: "'c ==> 'c" and U :: "'c ==> 'b ==> 'a" and C :: "('b ==> 'a) ==> 'c" and P :: "('b ==> 'a) ==> bool" assumes mono: "∧x. mono_body (λf. U (F (C f)) x)" and eq: "f ≡ C (fixp_fun (λf. U (F (C f))))" and inverse: "∧f. U (C f) = f" and adm: "ccpo.admissible lub_fun le_fun P" and bot: "P (λ_. lub {})" and step: "∧f'. [ P (U f'); le_fun (U f') (U f) ]==> P (U (F f'))" shows"P (U f)" unfolding eq inverse apply (rule ccpo.fixp_strong_induct[OF ccpo adm]) apply (insert mono, auto simp: monotone_def fun_ord_def bot fun_lub_def)[2] apply (rule_tac f'5="C x"in step) apply (simp_all add: inverse eq) done
end
subsection‹🍋‹(=)› as order›
definition lub_singleton :: "('a set ==> 'a) ==> bool" where"lub_singleton lub ⟷ (∀a. lub {a} = a)"
definition the_Sup :: "'a set ==> 'a" where"the_Sup A = (THE a. a ∈ A)"
lemma monotone_eqI [cont_intro]: assumes"class.preorder ord (mk_less ord)" shows"monotone (=) ord f" proof - interpret preorder ord "mk_less ord"by fact show ?thesis by(simp add: monotone_def) qed
lemma cont_eqI [cont_intro]: fixes f :: "'a ==> 'b" assumes"lub_singleton lub" shows"cont the_Sup (=) lub ord f" proof(rule contI) fix Y :: "'a set" assume"Complete_Partial_Order.chain (=) Y""Y ≠ {}" thenobtain a where"Y = {a}"by(auto simp add: chain_def) thus"f (the_Sup Y) = lub (f ` Y)"using assms by(simp add: the_Sup_def lub_singleton_def) qed
lemma mcont_eqI [cont_intro, simp]: "[ class.preorder ord (mk_less ord); lub_singleton lub ] ==> mcont the_Sup (=) lub ord f" by(simp add: mcont_def cont_eqI monotone_eqI)
subsection‹ccpo for products›
definition prod_lub :: "('a set ==> 'a) ==> ('b set ==> 'b) ==> ('a × 'b) set ==> 'a × 'b" where"prod_lub Sup_a Sup_b Y = (Sup_a (fst ` Y), Sup_b (snd ` Y))"
lemma monotone_case_prod_apply_iff: "monotone orda ordb (λx. (case_prod f x) y) ⟷ monotone orda ordb (case_prod (λa b. f a b y))" by(simp add: monotone_def)
lemma monotone_case_prod_applyD: "monotone orda ordb (λx. (case_prod f x) y) ==> monotone orda ordb (case_prod (λa b. f a b y))" by(simp add: monotone_case_prod_apply_iff)
lemma monotone_case_prod_applyI: "monotone orda ordb (case_prod (λa b. f a b y)) ==> monotone orda ordb (λx. (case_prod f x) y)" by(simp add: monotone_case_prod_apply_iff)
lemma cont_case_prod_apply_iff: "cont luba orda lubb ordb (λx. (case_prod f x) y) ⟷ cont luba orda lubb ordb (case_prod (λa b. f a b y))" by(simp add: cont_def split_def)
lemma cont_case_prod_applyI: "cont luba orda lubb ordb (case_prod (λa b. f a b y)) ==> cont luba orda lubb ordb (λx. (case_prod f x) y)" by(simp add: cont_case_prod_apply_iff)
lemma cont_case_prod_applyD: "cont luba orda lubb ordb (λx. (case_prod f x) y) ==> cont luba orda lubb ordb (case_prod (λa b. f a b y))" by(simp add: cont_case_prod_apply_iff)
lemma mcont_case_prod_apply_iff [simp]: "mcont luba orda lubb ordb (λx. (case_prod f x) y) ⟷ mcont luba orda lubb ordb (case_prod (λa b. f a b y))" by(simp add: mcont_def monotone_case_prod_apply_iff cont_case_prod_apply_iff)
lemma mono2mono_inf: assumes f: "monotone ord (≤) (λx. f x)" and g: "monotone ord (≤) (λx. g x)" shows"monotone ord (≤) (λx. f x ⊓ g x)" by(auto 4 3 dest: monotoneD[OF f] monotoneD[OF g] intro: le_infI1 le_infI2 intro!: monotoneI)
lemma mcont_const [simp]: "mcont lub ord Sup (≤) (λ_. c)" by(rule ccpo.mcont_const[OF complete_lattice_ccpo])
lemma mono2mono_sup: assumes f: "monotone ord (≤) (λx. f x)" and g: "monotone ord (≤) (λx. g x)" shows"monotone ord (≤) (λx. f x ⊔ g x)" by(auto 4 3 intro!: monotoneI intro: sup.coboundedI1 sup.coboundedI2 dest: monotoneD[OF f] monotoneD[OF g])
lemma Sup_image_sup: assumes"Y ≠ {}" shows"⊔((⊔) x ` Y) = x ⊔⊔Y" proof(rule Sup_eqI) fix y assume"y ∈ (⊔) x ` Y" thenobtain z where"y = x ⊔ z"and"z ∈ Y"by blast from‹z ∈ Y›have"z ≤⊔Y"by(rule Sup_upper) with _ show"y ≤ x ⊔⊔Y"unfolding‹y = x ⊔ z›by(rule sup_mono) simp next fix y assume upper: "∧z. z ∈ (⊔) x ` Y ==> z ≤ y" show"x ⊔⊔Y ≤ y"unfolding Sup_insert[symmetric] proof(rule Sup_least) fix z assume"z ∈ insert x Y" from assms obtain z' where"z' ∈ Y"by blast let ?z = "if z ∈ Y then x ⊔ z else x ⊔ z'" have"z ≤ x ⊔ ?z"using‹z' ∈ Y›‹z ∈ insert x Y›by auto alsohave"…≤ y"by(rule upper)(auto split: if_split_asm intro: ‹z' ∈ Y›) finallyshow"z ≤ y" . qed qed
lemma mcont2mcont_sup [cont_intro, simp]: "[ mcont lub ord Sup (≤) (λx. f x); mcont lub ord Sup (≤) (λx. g x) ] ==> mcont lub ord Sup (≤) (λx. f x ⊔ g x)" by(best intro: ccpo.mcont2mcont'[OF complete_lattice_ccpo] mcont_sup1 mcont_sup2 ccpo.mcont_const[OF complete_lattice_ccpo])
lemma mcont2mcont_inf [cont_intro, simp]: "[ mcont lub ord Sup (≤) (λx. f x); mcont lub ord Sup (≤) (λx. g x) ] ==> mcont lub ord Sup (≤) (λx. f x ⊓ g x)" by(best intro: ccpo.mcont2mcont'[OF complete_lattice_ccpo] mcont_inf1 mcont_inf2 ccpo.mcont_const[OF complete_lattice_ccpo])
lemma cont_image: "cont Union (⊆) Union (⊆) ((`) f)" by (meson contI image_Union)
lemma mcont2mcont_image [THEN lfp.mcont2mcont, cont_intro, simp]: shows mcont_image: "mcont Union (⊆) Union (⊆) ((`) f)" by(blast intro: mcontI monotone_image cont_image)
context complete_lattice begin
lemma monotone_Sup [cont_intro, simp]: "monotone ord (⊆) f ==> monotone ord (≤) (λx. ⊔f x)" by(blast intro: monotoneI Sup_least Sup_upper dest: monotoneD)
lemma cont_Sup: assumes"cont lub ord Union (⊆) f" shows"cont lub ord Sup (≤) (λx. ⊔f x)" proof - have"∧Y. [Complete_Partial_Order.chain ord Y; Y ≠ {}] ==>⊔∪ (f ` Y) = (⊔x∈Y. ⊔ f x)" by (blast intro: Sup_least Sup_upper order_trans order.antisym) with assms show ?thesis by (force simp: cont_def) qed
lemma mcont_Sup: "mcont lub ord Union (⊆) f ==> mcont lub ord Sup (≤) (λx. ⊔f x)" unfolding mcont_def by(blast intro: monotone_Sup cont_Sup)
lemma monotone_SUP: "[ monotone ord (⊆) f; ∧y. monotone ord (≤) (λx. g x y) ]==> monotone ord (≤) (λx. ⊔y∈f x. g x y)" by(rule monotoneI)(blast dest: monotoneD intro: Sup_upper order_trans intro!: Sup_least)
lemma monotone_SUP2: "(∧y. y ∈ A ==> monotone ord (≤) (λx. g x y)) ==> monotone ord (≤) (λx. ⊔y∈A. g x y)" by(rule monotoneI)(blast intro: Sup_upper order_trans dest: monotoneD intro!: Sup_least)
lemma cont_SUP: assumes f: "mcont lub ord Union (⊆) f" and g: "∧y. mcont lub ord Sup (≤) (λx. g x y)" shows"cont lub ord Sup (≤) (λx. ⊔y∈f x. g x y)" proof(rule contI) fix Y assume chain: "Complete_Partial_Order.chain ord Y" and Y: "Y ≠ {}" show"⊔(g (lub Y) ` f (lub Y)) = ⊔((λx. ⊔(g x ` f x)) ` Y)" (is"?lhs = ?rhs") proof(rule order.antisym) show"?lhs ≤ ?rhs" proof(rule Sup_least) fix x assume"x ∈ g (lub Y) ` f (lub Y)" with mcont_contD[OF f chain Y] mcont_contD[OF g chain Y] obtain y z where"y ∈ Y""z ∈ f y" and x: "x = ⊔((λx. g x z) ` Y)"by auto show"x ≤ ?rhs"unfolding x proof(rule Sup_least) fix u assume"u ∈ (λx. g x z) ` Y" thenobtain y' where"u = g y' z""y' ∈ Y"by auto from chain ‹y ∈ Y›‹y' ∈ Y›have"ord y y' ∨ ord y' y"by(rule chainD) thus"u ≤ ?rhs" proof note‹u = g y' z›also assume"ord y y'" with f have"f y ⊆ f y'"by(rule mcont_monoD) with‹z ∈ f y› have"g y' z ≤⊔(g y' ` f y')"by(auto intro: Sup_upper) alsohave"…≤ ?rhs"using‹y' ∈ Y›by(auto intro: Sup_upper) finallyshow ?thesis . next note‹u = g y' z›also assume"ord y' y" with g have"g y' z ≤ g y z"by(rule mcont_monoD) alsohave"…≤⊔(g y ` f y)"using‹z ∈ f y› by(auto intro: Sup_upper) alsohave"…≤ ?rhs"using‹y ∈ Y›by(auto intro: Sup_upper) finallyshow ?thesis . qed qed qed next show"?rhs ≤ ?lhs" proof(rule Sup_least) fix x assume"x ∈ (λx. ⊔(g x ` f x)) ` Y" thenobtain y where x: "x = ⊔(g y ` f y)"and"y ∈ Y"by auto show"x ≤ ?lhs"unfolding x proof(rule Sup_least) fix u assume"u ∈ g y ` f y" thenobtain z where"u = g y z""z ∈ f y"by auto note‹u = g y z› alsohave"g y z ≤⊔((λx. g x z) ` Y)" using‹y ∈ Y›by(auto intro: Sup_upper) alsohave"… = g (lub Y) z"by(simp add: mcont_contD[OF g chain Y]) alsohave"…≤ ?lhs"using‹z ∈ f y›‹y ∈ Y› by(auto intro: Sup_upper simp add: mcont_contD[OF f chain Y]) finallyshow"u ≤ ?lhs" . qed qed qed qed
lemma mcont_SUP [cont_intro, simp]: "[ mcont lub ord Union (⊆) f; ∧y. mcont lub ord Sup (≤) (λx. g x y) ] ==> mcont lub ord Sup (≤) (λx. ⊔y∈f x. g x y)" by(blast intro: mcontI cont_SUP monotone_SUP mcont_mono)
end
lemma admissible_Ball [cont_intro, simp]: "[∧x. ccpo.admissible lub ord (λA. P A x); mcont lub ord Union (⊆) f; class.ccpo lub ord (mk_less ord) ] ==> ccpo.admissible lub ord (λA. ∀x∈f A. P A x)" unfolding Ball_def by simp
lemma admissible_Bex'[THEN admissible_subst, cont_intro, simp]: shows admissible_Bex: "ccpo.admissible Union (⊆) (λA. ∃x∈A. P x)" using ccpo.admissible_def by fastforce
subsection‹Parallel fixpoint induction›
context fixes luba :: "'a set ==> 'a" and orda :: "'a ==> 'a ==> bool" and lubb :: "'b set ==> 'b" and ordb :: "'b ==> 'b ==> bool" assumes a: "class.ccpo luba orda (mk_less orda)" and b: "class.ccpo lubb ordb (mk_less ordb)" begin
interpretation a: ccpo luba orda "mk_less orda"by(rule a) interpretation b: ccpo lubb ordb "mk_less ordb"by(rule b)
lemma ccpo_rel_prodI: "class.ccpo (prod_lub luba lubb) (rel_prod orda ordb) (mk_less (rel_prod orda ordb))"
(is"class.ccpo ?lub ?ord ?ord'") proof(intro class.ccpo.intro class.ccpo_axioms.intro) show"class.order ?ord ?ord'" by(rule order_rel_prodI) intro_locales show"∧A x. [Complete_Partial_Order.chain (rel_prod orda ordb) A; x ∈ A] ==> rel_prod orda ordb x (prod_lub luba lubb A)" by (simp add: a.ccpo_Sup_upper b.ccpo_Sup_upper chain_rel_prodD1 chain_rel_prodD2
prod_lub_def rel_prod_sel) show"∧A z. [Complete_Partial_Order.chain (rel_prod orda ordb) A; ∧x. x ∈ A ==> rel_prod orda ordb x z] ==> rel_prod orda ordb (prod_lub luba lubb A) z" by (metis (full_types) a.ccpo_Sup_below_iff b.ccpo_Sup_least chain_rel_prodD1
chain_rel_prodD2 imageE prod.sel prod_lub_def rel_prod_sel) qed
lemma mcont_fst: "mcont (prod_lub luba lubb) (rel_prod orda ordb) luba orda fst" by(auto intro!: mcontI monotoneI contI simp add: prod_lub_def)
lemma mcont2mcont_fst [cont_intro, simp]: "mcont lub ord (prod_lub luba lubb) (rel_prod orda ordb) t ==> mcont lub ord luba orda (λx. fst (t x))" by (simp add: mcont_def monotone_on_def prod_lub_def cont_def image_image rel_prod_sel)
lemma mcont2mcont_snd [cont_intro, simp]: "mcont lub ord (prod_lub luba lubb) (rel_prod orda ordb) t ==> mcont lub ord lubb ordb (λx. snd (t x))" by(auto intro!: mcontI monotoneI contI dest: mcont_monoD mcont_contD simp add: rel_prod_sel split_beta prod_lub_def image_image)
lemma monotone_Pair: "[ monotone ord orda f; monotone ord ordb g ] ==> monotone ord (rel_prod orda ordb) (λx. (f x, g x))" by(simp add: monotone_def)
lemma cont_Pair: "[ cont lub ord luba orda f; cont lub ord lubb ordb g ] ==> cont lub ord (prod_lub luba lubb) (rel_prod orda ordb) (λx. (f x, g x))" by(rule contI)(auto simp add: prod_lub_def image_image dest!: contD)
lemma mcont_Pair: "[ mcont lub ord luba orda f; mcont lub ord lubb ordb g ] ==> mcont lub ord (prod_lub luba lubb) (rel_prod orda ordb) (λx. (f x, g x))" by(rule mcontI)(simp_all add: monotone_Pair mcont_mono cont_Pair)
context partial_function_definitions begin text‹Specialised versions of @{thm [source] mcont_call} for admissibility proofs for parallel fixpoint inductions› lemmas mcont_call_fst [cont_intro] = mcont_call[THEN mcont2mcont, OF mcont_fst] lemmas mcont_call_snd [cont_intro] = mcont_call[THEN mcont2mcont, OF mcont_snd] end
lemma map_option_mono [partial_function_mono]: "mono_option B ==> mono_option (λf. map_option g (B f))" unfolding map_conv_bind_option by(rule bind_mono) simp_all
lemma compact_flat_lub [cont_intro]: "ccpo.compact (flat_lub x) (flat_ord x) y" using flat_interpretation[THEN ccpo] proof(rule ccpo.compactI[OF _ ccpo.admissibleI]) fix A assume chain: "Complete_Partial_Order.chain (flat_ord x) A" and A: "A ≠ {}" and *: "∀z∈A. ¬ flat_ord x y z" from A obtain z where"z ∈ A"by blast with * have z: "¬ flat_ord x y z" .. hence y: "x ≠ y""y ≠ z"by(auto simp add: flat_ord_def) have"y ≠ (THE z. z ∈ A - {x})"if"¬ A ⊆ {x}" proof - from that obtain z' where"z' ∈ A""z' ≠ x"by auto thenhave"(THE z. z ∈ A - {x}) = z'" by(intro the_equality)(auto dest: chainD[OF chain] simp add: flat_ord_def) moreoverhave"z' ≠ y"using‹z' ∈ A› * by(auto simp add: flat_ord_def) ultimatelyshow ?thesis by simp qed with z show"¬ flat_ord x y (flat_lub x A)" by(simp add: flat_ord_def flat_lub_def) qed
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.33 Sekunden
(vorverarbeitet am 2026-04-26)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.