(*-------------------------------------------* | CSP-Prover on Isabelle2004 | | December 2004 | | | | CSP-Prover on Isabelle2005 | | October 2005 (modified) | | | | Yoshinao Isobe (AIST JAPAN) | *-------------------------------------------*) theory CPO_pair = CPO: (***************************************************************** 1. Pairs of CPO are also CPO. 2. 3. 4. *****************************************************************) (* Take care the following rules automatically applied *) (* *) (* split_paired_Ex: (EX x. P x) = (EX a b. P (a, b)) *) (* split_paired_All: (ALL x. P x) = (ALL a b. P (a, b)) *) (********************************************************** def: pair of bot **********************************************************) instance * :: (bot, bot) bot0 by (intro_classes) defs (overloaded) pair_Bot_def : "Bot == (Bot, Bot)" (************************************************************ Pairuct bot ==> bot ************************************************************) (*** pair Bot ***) lemma pair_Bot: "ALL (x::('x::bot * 'y::bot)). Bot <= x" apply (simp add: order_pair_def) by (auto simp add: pair_Bot_def bottom_bot) (***************************** Pair bot => bot *****************************) instance * :: (bot, bot) bot apply (intro_classes) by (simp add: pair_Bot) (************************************************************ Pair CPO ==> CPO ************************************************************) (*** pair directed decompo ***) declare split_paired_Ex [simp del] declare split_paired_All [simp del] lemma pair_directed_decompo_fst: "directed (Xc::('x::cpo * 'y::cpo) set) ==> directed (fst ` Xc)" apply (simp add: directed_def) apply (intro allI impI) apply (simp add: in_image_set) apply (elim conjE exE) apply (drule_tac x="ya" in spec) apply (drule_tac x="yb" in spec) apply (simp) apply (elim conjE exE) apply (rule_tac x="fst z" in exI) by (auto simp add: order_pair_def) lemma pair_directed_decompo_snd: "directed (Xc::('x::cpo * 'y::cpo) set) ==> directed (snd ` Xc)" apply (simp add: directed_def) apply (intro allI impI) apply (simp add: in_image_set) apply (elim conjE exE) apply (drule_tac x="ya" in spec) apply (drule_tac x="yb" in spec) apply (simp) apply (elim conjE exE) apply (rule_tac x="snd z" in exI) by (auto simp add: order_pair_def) declare split_paired_Ex [simp] declare split_paired_All [simp] (*** pair cpo lemma ***) lemma pair_cpo_lm: "directed (Xc::('x::cpo * 'y::cpo) set) ==> Xc hasLUB" apply (simp add: hasLUB_def) apply (rule_tac x="LUB (fst ` Xc)" in exI) apply (rule_tac x="LUB (snd ` Xc)" in exI) apply (simp add: pair_LUB_decompo) apply (insert pair_directed_decompo_fst[of Xc]) apply (insert pair_directed_decompo_snd[of Xc]) apply (simp) apply (insert complete_cpo_lm) apply (drule_tac x="fst ` Xc" in spec) apply (insert complete_cpo_lm) apply (drule_tac x="snd ` Xc" in spec) by (simp add: isLUB_to_LUB) (***************************** Pair CPO => CPO *****************************) instance * :: (cpo,cpo) cpo apply (intro_classes) by (simp add: pair_cpo_lm del: split_paired_Ex) (************************************************************ Pairuct CPO_BOT ==> CPO_BOT ************************************************************) instance * :: (cpo_bot,cpo_bot) cpo_bot by (intro_classes) (************************************************************ fst continuity ************************************************************) lemma fst_continuous: "continuous fst" apply (simp add: continuous_iff) apply (intro allI impI) apply (insert complete_cpo_lm) apply (drule_tac x="X" in spec) apply (simp add: hasLUB_def) apply (elim exE) apply (rule_tac x="a" in exI) apply (simp add: pair_LUB_decompo) apply (rule_tac x="b" in exI) by (simp) lemma snd_continuous: "continuous snd" apply (simp add: continuous_iff) apply (intro allI impI) apply (insert complete_cpo_lm) apply (drule_tac x="X" in spec) apply (simp add: hasLUB_def) apply (elim exE) apply (rule_tac x="a" in exI) apply (rule_tac x="b" in exI) by (simp add: pair_LUB_decompo) (************************************************************ Pair continuity ************************************************************) lemma pair_continuous_only_if: "continuous h ==> (continuous (fst o h) & continuous (snd o h))" by (simp add: fst_continuous snd_continuous compo_continuous) lemma pair_continuous_if: "[| continuous (fst o h) ; continuous (snd o h) |] ==> continuous h" apply (simp add: continuous_iff) apply (insert complete_cpo_lm) apply (intro allI impI) apply (drule_tac x="X" in spec) apply (simp) apply (erule exE) apply (rule_tac x="x" in exI) apply (simp) apply (simp add: pair_LUB_decompo) apply (erule conjE) apply (drule_tac x="X" in spec) apply (drule_tac x="X" in spec) apply (simp) apply (elim exE) apply (simp add: image_compose) apply (subgoal_tac "x = xa", simp) by (simp add: LUB_unique) lemma pair_continuous: "continuous h = (continuous (fst o h) & continuous (snd o h))" apply (rule iffI) apply (simp add: pair_continuous_only_if) apply (simp add: pair_continuous_if) done end
lemma pair_Bot:
∀x. Bot ≤ x
lemma pair_directed_decompo_fst:
directed Xc ==> directed (fst ` Xc)
lemma pair_directed_decompo_snd:
directed Xc ==> directed (snd ` Xc)
lemma pair_cpo_lm:
directed Xc ==> Xc hasLUB
lemma fst_continuous:
continuous fst
lemma snd_continuous:
continuous snd
lemma pair_continuous_only_if:
continuous h ==> continuous (fst o h) ∧ continuous (snd o h)
lemma pair_continuous_if:
[| continuous (fst o h); continuous (snd o h) |] ==> continuous h
lemma pair_continuous:
continuous h = (continuous (fst o h) ∧ continuous (snd o h))