(*-------------------------------------------* | CSP-Prover on Isabelle2004 | | December 2004 | | | | CSP-Prover on Isabelle2005 | | October 2005 (modified) | | | | Yoshinao Isobe (AIST JAPAN) | *-------------------------------------------*) theory RS_prod imports RS begin (***************************************************************** 1. Productions of RS are also RS. 2. 3. 4. *****************************************************************) (********************************************************** def: prod of restriction space **********************************************************) instance fun :: (type,rs) ms0 by (intro_classes) defs (overloaded) prod_restriction_def : "(xp::('i => 'a::rs)) .|. n == (%i. ((xp i) .|. n))" consts prod_Limit :: "(('i => 'a::ms_rs) infinite_seq) => ('i => 'a::ms_rs)" defs prod_Limit_def :"prod_Limit xps == (%i. Limit ((proj_fun i) o xps))" (************************************************************ Basics ************************************************************) lemma rest_to_prod_rest: "(ALL i. ((xp::('i => 'a::rs)) i) .|. n = (yp i) .|. n) ==> xp .|. n = yp .|. n" by (simp add: prod_restriction_def) (************************************************************ Product RS ==> RS ************************************************************) (*** prod_zero_eq_rs ***) lemma prod_zero_eq_rs: "(xp::('i => 'a::rs)) .|. 0 = yp .|. 0" apply (simp add: prod_restriction_def) by (simp add: expand_fun_eq) (*** prod_min_rs ***) lemma prod_min_rs: "((xp::('i => 'a::rs)) .|. m) .|. n = xp .|. (min m n)" apply (simp add: prod_restriction_def) apply (simp add: expand_fun_eq) by (simp add: min_rs) (*** prod_diff_rs ***) lemma prod_diff_rs: "((xp::('i => 'a::rs)) ~= yp) ==> (EX n. xp .|. n ~= yp .|. n)" apply (simp add: prod_restriction_def) apply (simp add: expand_fun_eq) apply (erule exE) apply (insert diff_rs) apply (drule_tac x="xp x" in spec) apply (drule_tac x="yp x" in spec) by (auto) (***************************** Prod RS => RS *****************************) instance fun :: (type,rs) rs apply (intro_classes) apply (simp add: prod_zero_eq_rs) apply (simp add: prod_min_rs) apply (simp add: prod_diff_rs) done (************************************************************ Product RS ==> MS ************************************************************) instance fun :: (type,rs) ms apply (intro_classes) apply (simp) apply (simp add: diagonal_rs) apply (simp add: symmetry_rs) apply (simp add: triangle_inequality_rs) done (************************************************************ i.e. Product RS ==> MS & RS ************************************************************) instance fun :: (type,rs) ms_rs apply (intro_classes) done (************************************************************ distance ************************************************************) lemma prod_distance_nat_le: "xp i ~= yp i ==> distance_nat ((xp::('i => 'a::rs)), yp) <= distance_nat (xp i, yp i)" apply (case_tac "xp = yp", simp) apply (simp add: distance_nat_le_1[THEN sym]) apply (insert distance_nat_is[of xp yp], simp) apply (simp add: isMAX_def) apply (simp add: distance_nat_set_def) apply (simp add: prod_restriction_def) by (simp add: expand_fun_eq) lemma prod_distance_rs_le: "distance (xp i, yp i) <= distance ((xp::('i => 'a::rs)), yp)" apply (case_tac "xp i = yp i", simp) apply (case_tac "xp = yp", simp) apply (simp add: distance_iff) apply (rule power_decreasing, simp_all) by (simp add: prod_distance_nat_le) (*** prod_distance (Upper Bound) ***) lemma prod_distance_UB: "distance((xp::('i => 'a::rs)), yp) isUB {u. EX i. u = distance (xp i, yp i)}" apply (simp add: isUB_def) apply (intro allI impI) apply (erule exE) by (simp add: prod_distance_rs_le) (*** prod_distance (Least) ***) lemma prod_distance_least: "ALL i. distance (xp i, yp i) <= u ==> distance((xp::('i => 'a::rs)), yp) <= u" apply (case_tac "xp = yp") apply (simp) (* to use a contradiction *) apply (case_tac "distance (xp, yp) <= u", simp) apply (simp add: linorder_not_le) apply (insert rest_to_prod_rest[of xp "Suc (distance_nat (xp, yp))" yp]) apply (subgoal_tac "ALL i. xp i .|. Suc (distance_nat (xp, yp)) = yp i .|. Suc (distance_nat (xp, yp))") (* ...1 *) apply (simp add: distance_nat_less_1) apply (rule allI) apply (case_tac "xp i = yp i", simp) apply (drule_tac x="i" in spec) apply (simp add: distance_iff) apply (simp add: distance_nat_less_1) apply (rule rev_power_decreasing_strict[of "1/2"]) apply (simp_all) done (*** prod_distance (Least Upper Bound) ***) lemma prod_distance: "distance((xp::('i => 'a::rs)), yp) isLUB {u. EX i. u = distance (xp i, yp i)}" apply (simp add: isLUB_def) apply (simp add: prod_distance_UB) apply (intro allI impI) apply (rule prod_distance_least) apply (simp add: isUB_def) apply (rule allI) apply (drule_tac x="distance (xp i, yp i)" in spec) apply (auto) done lemma ALL_prod_distance: "ALL xp yp. distance((xp::('i => 'a::rs)), yp) isLUB {u. EX i. u = distance (xp i, yp i)}" by (simp add: prod_distance) (************************************************************* product maps *************************************************************) (*** proj_fun ***) lemma proj_non_expand: "non_expanding (proj_fun i)" apply (simp add: non_expanding_def) apply (simp add: map_alpha_def) apply (simp add: proj_fun_def) apply (simp add: prod_distance_rs_le) done (*---------------------* | non_expanding | *---------------------*) (* only_if *) lemma prod_non_expand_only_if: "non_expanding (fp::('a::ms_rs => ('i => 'b::ms_rs))) ==> ALL i. non_expanding ((proj_fun i) o fp)" by (simp add: compo_non_expand proj_non_expand) (* if *) lemma prod_non_expand_if: "ALL i. non_expanding ((proj_fun i) o fp) ==> non_expanding (fp::('a::ms_rs => ('i => 'b::ms_rs)))" apply (simp add: non_expanding_def map_alpha_def) apply (intro allI) apply (insert ALL_prod_distance) apply (drule_tac x="fp x" in spec) apply (drule_tac x="fp y" in spec) apply (simp add: isLUB_def) apply (erule conjE) apply (drule_tac x="distance (x, y)" in spec) apply (drule mp) apply (simp add: isUB_def) apply (intro allI impI) apply (erule exE) apply (drule_tac x="i" in spec) apply (drule_tac x="x" in spec) apply (drule_tac x="y" in spec) apply (simp add: proj_fun_def) by (simp) (* iff *) lemma prod_non_expand: "non_expanding (fp::('a::ms_rs => ('i => 'b::ms_rs))) = (ALL i. non_expanding ((proj_fun i) o fp))" apply (rule iffI) apply (simp add: prod_non_expand_only_if) apply (simp add: prod_non_expand_if) done (*---------------------* | alpha_contraction | *---------------------*) (* only_if *) lemma prod_contra_alpha_only_if: "contraction_alpha (fp::('a::ms_rs => ('i => 'b::ms_rs))) alpha ==> ALL i. contraction_alpha ((proj_fun i) o fp) alpha" by (simp add: compo_non_expand_contra_alpha proj_non_expand) (* if *) lemma prod_contra_alpha_if: "ALL i. contraction_alpha ((proj_fun i) o fp) alpha ==> contraction_alpha (fp::('a::ms_rs => ('i => 'b::ms_rs))) alpha" apply (simp add: contraction_alpha_def map_alpha_def) apply (intro allI) apply (insert ALL_prod_distance) apply (drule_tac x="fp x" in spec) apply (drule_tac x="fp y" in spec) apply (simp add: isLUB_def) apply (elim conjE) apply (drule_tac x="alpha * distance (x, y)" in spec) apply (drule mp) apply (simp add: isUB_def) apply (intro allI impI) apply (erule exE) apply (drule_tac x="i" in spec) apply (drule_tac x="x" in spec) apply (drule_tac x="y" in spec) apply (simp add: proj_fun_def) by (simp) (* iff *) lemma prod_contra_alpha: "contraction_alpha (fp::('a::ms_rs => ('i => 'b::ms_rs))) alpha = (ALL i. contraction_alpha ((proj_fun i) o fp) alpha)" apply (rule iffI) apply (simp add: prod_contra_alpha_only_if) apply (simp add: prod_contra_alpha_if) done (************************************************************ Lemmas (limit) ************************************************************) (*** cauchy ***) lemma prod_cauchy_seq: "cauchy (xps::(('i => 'b::ms_rs) infinite_seq)) ==> cauchy ((proj_fun i) o xps)" apply (simp add: cauchy_def) apply (intro allI impI) apply (drule_tac x="delta" in spec) apply (simp) apply (erule exE) apply (rule_tac x="n" in exI) apply (intro allI impI) apply (rename_tac delta N n m) apply (drule_tac x="n" in spec) apply (drule_tac x="m" in spec) apply (simp add: proj_fun_def) apply (insert ALL_prod_distance) apply (drule_tac x="xps n" in spec) apply (drule_tac x="xps m" in spec) apply (simp add: isLUB_def) apply (simp add: isUB_def) apply (erule conjE)+ apply (drule_tac x="distance ((xps n) i, (xps m) i)" in spec) apply (drule mp) apply (rule_tac x="i" in exI) by (simp_all) (*** normal ***) lemma prod_normal_seq: "normal (xps::(('i => 'b::ms_rs) infinite_seq)) ==> normal ((proj_fun i) o xps)" apply (simp add: normal_def) apply (intro allI) apply (drule_tac x="n" in spec) apply (drule_tac x="m" in spec) apply (simp add: proj_fun_def) apply (insert ALL_prod_distance) apply (drule_tac x="xps n" in spec) apply (drule_tac x="xps m" in spec) apply (simp add: isLUB_def) apply (simp add: isUB_def) apply (erule conjE)+ apply (drule_tac x="distance ((xps n) i, (xps m) i)" in spec) apply (drule mp) apply (rule_tac x="i" in exI) by (simp_all) lemma prod_normal_seq_only_if: "ALL i. normal ((proj_fun i) o xps) ==> normal (xps::(('i => 'b::ms_rs) infinite_seq))" apply (simp add: normal_def) apply (intro allI) apply (rule prod_distance_least) apply (intro allI) apply (drule_tac x="i" in spec) apply (drule_tac x="n" in spec) apply (drule_tac x="m" in spec) apply (simp add: proj_fun_def) done (* iff *) lemma prod_normal_seq_iff: "normal (xps::(('i => 'b::ms_rs) infinite_seq)) = (ALL i. normal ((proj_fun i) o xps))" apply (rule) apply (simp add: prod_normal_seq) apply (simp add: prod_normal_seq_only_if) done (*-----------------------* | product of limits | *-----------------------*) (*** limit (single <-- prod) ***) lemma prod_convergeTo_only_if: "(xps::(('i => 'b::ms_rs) infinite_seq)) convergeTo yp ==> ALL i. ((proj_fun i) o xps) convergeTo (yp i)" apply (simp add: convergeTo_def) apply (intro allI impI) apply (drule_tac x="eps" in spec) apply (simp) apply (erule exE) apply (rule_tac x="n" in exI) apply (intro allI impI) apply (rename_tac i eps N n) apply (drule_tac x="n" in spec) apply (simp add: proj_fun_def) apply (insert ALL_prod_distance) apply (drule_tac x="yp" in spec) apply (drule_tac x="xps n" in spec) apply (simp add: isLUB_def isUB_def) apply (erule conjE)+ apply (drule_tac x="distance (yp i, (xps n) i)" in spec) apply (drule mp) apply (rule_tac x="i" in exI) by (simp_all) (*** limit (single --> prod) (note: ms_rs) ***) lemma prod_convergeTo_if: "[| normal xps ; ALL i. ((proj_fun i) o xps) convergeTo (yp i) |] ==> (xps::(('i => 'b::ms_rs) infinite_seq)) convergeTo yp" apply (simp (no_asm) add: convergeTo_def) apply (intro allI impI) apply (subgoal_tac "EX n. ((1::real)/2) ^ n < eps") (* ...1 *) apply (erule exE) apply (rename_tac eps M) apply (rule_tac x="Suc M" in exI) apply (intro allI impI) apply (insert ALL_prod_distance) apply (drule_tac x="yp" in spec) apply (drule_tac x="xps m" in spec) apply (simp add: isLUB_def) apply (erule conjE)+ apply (drule_tac x="(1 / 2) ^ M" in spec) apply (drule mp) (* mp *) apply (simp add: isUB_def) apply (intro allI impI) apply (erule exE) apply (simp) apply (drule_tac x="i" in spec) apply (subgoal_tac "EX n. M <= n & m = Suc n") (* ...2 *) apply (erule exE) apply (simp) apply (subgoal_tac "distance((proj_fun i o xps) (Suc n), yp i) < (1/2)^n") (* ...3 *) apply (simp add: proj_fun_def) apply (subgoal_tac "((1::real) / 2) ^ n <= (1 / 2) ^ M") (* ...4 *) apply (simp add: symmetry_ms) (* 4 *) apply (simp add: power_decreasing) (* 3 *) apply (rule normal_Limit) apply (simp add: prod_normal_seq del: o_apply) apply (simp del: o_apply) (* 2 *) apply (insert nat_zero_or_Suc) apply (drule_tac x="m" in spec) apply (erule disjE, simp) apply (erule exE) apply (rule_tac x="ma" in exI) apply (simp) (* mp *) apply (simp) (* 1 *) by (simp add: pow_convergence) (*** iff ***) lemma prod_convergeTo: "normal xps ==> (xps::(('i => 'b::ms_rs) infinite_seq)) convergeTo yp = (ALL i. ((proj_fun i) o xps) convergeTo (yp i))" apply (rule iffI) apply (simp add: prod_convergeTo_only_if) apply (simp add: prod_convergeTo_if) done (***************************************** limit (cms and normal --> limit) *****************************************) lemma prod_cms_normal_Limit: "normal (xps::(('i => 'b::cms_rs) infinite_seq)) ==> xps convergeTo prod_Limit xps" apply (simp add: prod_convergeTo prod_Limit_def) by (simp add: prod_normal_seq normal_cauchy Limit_is) (***************************************** limit (cms and cauchy --> limit) *****************************************) lemma prod_cms_cauchy_Limit: "cauchy (xps::(('i => 'b::cms_rs) infinite_seq)) ==> xps convergeTo prod_Limit (NF xps)" by (simp add: prod_cms_normal_Limit normal_form_seq_normal normal_form_seq_same_Limit) (***************************************** Product Complete Metric Space (RS) *****************************************) lemma prod_cms_rs: "cauchy (xps::(('i => 'b::cms_rs) infinite_seq)) ==> (EX yp. xps convergeTo yp)" apply (rule_tac x="prod_Limit (NF xps)" in exI) by (simp add: prod_cms_cauchy_Limit) (************************************************************ Product RS ==> CMS and RS ************************************************************) instance fun :: (type,cms_rs) cms apply (intro_classes) by (simp add: prod_cms_rs) instance fun :: (type,cms_rs) cms_rs by (intro_classes) (************************************************************ prod_variable ************************************************************) lemma non_expanding_prod_variable: "non_expanding (%f. f pn)" apply (simp add: non_expanding_def map_alpha_def) apply (simp add: prod_distance_rs_le) done (************************************************************ Banach theorem for production ************************************************************) theorem Banach_thm_prod: "[| normal (%n. (f^n) x0) ; contraction (f::(('i => 'a::cms_rs) => ('i => 'a))) |] ==> f hasUFP & (ALL i. (%n. (f^n) x0 i) convergeTo (UFP f) i)" apply (insert Banach_thm[of f x0]) apply (simp) apply (erule conjE) apply (rule allI) apply (simp add: prod_convergeTo) apply (drule_tac x="i" in spec) apply (simp add: proj_fun_def) apply (simp add: comp_def) done (*----------------------------------------------------------* | | | Continuity on Metric space | | | *----------------------------------------------------------*) lemma prod_continuous_rs: "(ALL i. continuous_rs (R i)) ==> continuous_rs (%xp. (ALL i. (R i) (xp i)))" apply (simp add: continuous_rs_def) apply (intro allI impI) apply (erule exE) apply (drule_tac x="i" in spec) apply (drule_tac x="x i" in spec) apply (simp) apply (erule exE) apply (rule_tac x="n" in exI) apply (intro allI impI) apply (drule_tac x="y i" in spec) apply (rule_tac x="i" in exI) apply (simp add: prod_restriction_def) apply (simp add: expand_fun_eq) done (*----------------------------------------------------------* | | | !!! order and restriction space !!! | | | *----------------------------------------------------------*) instance fun :: (type,rs_order) rs_order0 by (intro_classes) instance fun :: (type,rs_order) rs_order apply (intro_classes) apply (simp add: order_prod_def prod_restriction_def) apply (intro allI) apply (rule iffI) apply (intro allI) apply (erule exchange_forall_orderE) apply (drule_tac x="xa" in spec) apply (simp add: rs_order_iff) apply (intro allI) apply (drule_tac x="xa" in spec) apply (insert rs_order_iff) apply (drule_tac x="x xa" in spec) apply (drule_tac x="y xa" in spec) apply (fast) done instance fun :: (type,ms_rs_order) ms_rs_order by (intro_classes) (*** cms rs order ***) instance fun :: (type,cms_rs_order) cms_rs_order by (intro_classes) end
lemma rest_to_prod_rest:
∀i. xp i .|. n = yp i .|. n ==> xp .|. n = yp .|. n
lemma prod_zero_eq_rs:
xp .|. 0 = yp .|. 0
lemma prod_min_rs:
xp .|. m .|. n = xp .|. min m n
lemma prod_diff_rs:
xp ≠ yp ==> ∃n. xp .|. n ≠ yp .|. n
lemma prod_distance_nat_le:
xp i ≠ yp i ==> distance_nat (xp, yp) ≤ distance_nat (xp i, yp i)
lemma prod_distance_rs_le:
distance (xp i, yp i) ≤ distance (xp, yp)
lemma prod_distance_UB:
distance (xp, yp) isUB {u. ∃i. u = distance (xp i, yp i)}
lemma prod_distance_least:
∀i. distance (xp i, yp i) ≤ u ==> distance (xp, yp) ≤ u
lemma prod_distance:
distance (xp, yp) isLUB {u. ∃i. u = distance (xp i, yp i)}
lemma ALL_prod_distance:
∀xp yp. distance (xp, yp) isLUB {u. ∃i. u = distance (xp i, yp i)}
lemma proj_non_expand:
non_expanding (proj_fun i)
lemma prod_non_expand_only_if:
non_expanding fp ==> ∀i. non_expanding (proj_fun i o fp)
lemma prod_non_expand_if:
∀i. non_expanding (proj_fun i o fp) ==> non_expanding fp
lemma prod_non_expand:
non_expanding fp = (∀i. non_expanding (proj_fun i o fp))
lemma prod_contra_alpha_only_if:
contraction_alpha fp alpha ==> ∀i. contraction_alpha (proj_fun i o fp) alpha
lemma prod_contra_alpha_if:
∀i. contraction_alpha (proj_fun i o fp) alpha ==> contraction_alpha fp alpha
lemma prod_contra_alpha:
contraction_alpha fp alpha = (∀i. contraction_alpha (proj_fun i o fp) alpha)
lemma prod_cauchy_seq:
cauchy xps ==> cauchy (proj_fun i o xps)
lemma prod_normal_seq:
normal xps ==> normal (proj_fun i o xps)
lemma prod_normal_seq_only_if:
∀i. normal (proj_fun i o xps) ==> normal xps
lemma prod_normal_seq_iff:
normal xps = (∀i. normal (proj_fun i o xps))
lemma prod_convergeTo_only_if:
xps convergeTo yp ==> ∀i. proj_fun i o xps convergeTo yp i
lemma prod_convergeTo_if:
[| normal xps; ∀i. proj_fun i o xps convergeTo yp i |] ==> xps convergeTo yp
lemma prod_convergeTo:
normal xps ==> xps convergeTo yp = (∀i. proj_fun i o xps convergeTo yp i)
lemma prod_cms_normal_Limit:
normal xps ==> xps convergeTo prod_Limit xps
lemma prod_cms_cauchy_Limit:
cauchy xps ==> xps convergeTo prod_Limit (NF xps)
lemma prod_cms_rs:
cauchy xps ==> ∃yp. xps convergeTo yp
lemma non_expanding_prod_variable:
non_expanding (%f. f pn)
theorem Banach_thm_prod:
[| normal (%n. (f ^ n) x0.0); contraction f |] ==> f hasUFP ∧ (∀i. (%n. (f ^ n) x0.0 i) convergeTo UFP f i)
lemma prod_continuous_rs:
∀i. continuous_rs (R i) ==> continuous_rs (%xp. ∀i. R i (xp i))