Up to index of Isabelle/HOL/HOL-Complex/CSP-Prover
theory Domain_SF_cms = Domain_SF + Domain_T_cms + Domain_F_cms + RS_pair: (*-------------------------------------------*
| CSP-Prover |
| December 2004 |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory Domain_SF_cms = Domain_SF + Domain_T_cms + Domain_F_cms + RS_pair:
(*****************************************************************
1.
2.
3.
4.
*****************************************************************)
(* The following simplification rules are deleted in this theory file *)
(* because they unexpectly rewrite UnionT and InterT. *)
(* Union (B ` A) = (UN x:A. B x) *)
(* Inter (B ` A) = (INT x:A. B x) *)
declare Union_image_eq [simp del]
declare Inter_image_eq [simp del]
(* The following simplification is sometimes unexpected. *)
(* *)
(* not_None_eq: (x ~= None) = (EX y. x = Some y) *)
declare not_None_eq [simp del]
(*********************************************************
Restriction in Dom_F
*********************************************************)
instance domSF :: (type) ms0
by (intro_classes)
consts
restSFpair :: "'a domSF => nat => 'a domTF" ("_ restSFpair _" [55,56] 55)
LimitSFpair :: "'a domSF infinite_seq => 'a domTF"
LimitSF :: "'a domSF infinite_seq => 'a domSF" ("LimitSF")
defs
restSFpair_def :
"SF restSFpair n == (Rep_domSF SF) rest n"
LimitSFpair_def :
"LimitSFpair SFs == pair_Limit (Rep_domSF o SFs)"
LimitSF_def :
"LimitSF SFs == Abs_domSF (LimitSFpair SFs)"
defs (overloaded)
restSF_def : "SF rest n == Abs_domSF (SF restSFpair n)"
(*********************************************************
Lemmas (Restriction in Dom_SF)
*********************************************************)
(*** restSFpair (T2) ***)
lemma restSFpair_T2: "HC_T2 (SF restSFpair n)"
apply (simp add: HC_T2_def restSFpair_def)
apply (intro allI impI)
apply (simp add: pair_restriction_def)
apply (simp add: in_restT)
apply (simp add: in_restF)
by (auto simp add: domTF_T2)
(*** restSFpair (F2) ***)
lemma restSFpair_F3: "HC_F3 (SF restSFpair n)"
apply (simp add: HC_F3_def restSFpair_def)
apply (intro allI impI)
apply (simp add: pair_restriction_def)
apply (simp add: in_restT)
apply (simp add: in_restF)
by (auto simp add: domTF_F3)
(*** restSFpair (T3_F4) ***)
lemma restSFpair_T3_F4: "HC_T3_F4 (SF restSFpair n)"
apply (simp add: HC_T3_F4_def restSFpair_def)
apply (intro allI impI)
apply (simp add: pair_restriction_def)
apply (simp add: in_restT)
apply (simp add: in_restF)
apply (elim conjE)
by (auto simp add: domTF_T3 domTF_F4)
(*** restSFpair in domSF ***)
lemma restSFpair_in[simp]: "SF restSFpair n : domSF"
apply (simp add: domSF_iff)
apply (simp add: restSFpair_T2)
apply (simp add: restSFpair_F3)
apply (simp add: restSFpair_T3_F4)
done
(*********************************************************
Dom_SF --> RS
*********************************************************)
(*** restSF --> restTF ***)
lemma Rep_restSF:
"((SF::'a domSF) rest n = SE rest m) =
((Rep_domSF SF) rest n = (Rep_domSF SE) rest m)"
apply (simp add: restSF_def)
apply (simp add: Abs_domSF_inject)
apply (simp add: restSFpair_def)
done
(*** zero_eq_rs_domSF ***)
lemma zero_eq_rs_domSF: "(SF::'a domSF) rest 0 = SE rest 0"
by (simp add: Rep_restSF)
(*** min_rs_domSF ***)
lemma min_rs_domSF:
"((SF::'a domSF) rest m) rest n = SF rest (min m n)"
apply (simp add: Rep_restSF)
apply (simp add: restSF_def)
apply (simp add: Abs_domSF_inverse)
apply (simp add: restSFpair_def)
apply (simp add: min_rs)
done
(*** diff_rs_domSF ***)
lemma diff_rs_domSF:
"(SF::'a domSF) ~= SE ==> (EX (n::nat). SF rest n ~= SE rest n)"
apply (simp add: Rep_restSF)
apply (simp add: Rep_domSF_inject[THEN sym])
apply (simp add: diff_rs)
done
(***************************************************************
domSF ==> RS
***************************************************************)
instance domSF :: (type) rs
apply (intro_classes)
apply (simp add: zero_eq_rs_domSF)
apply (simp add: min_rs_domSF)
apply (simp add: diff_rs_domSF)
done
(************************************************************
domSF ==> MS
************************************************************)
instance domSF :: (type) 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. domSF ==> MS & RS
************************************************************)
instance domSF :: (type) ms_rs
by (intro_classes)
(***********************************************************
lemmas (distance)
***********************************************************)
(*** distance ***)
lemma distance_Rep_domSF:
"distance((SF::'a domSF), SE) = distance(Rep_domSF SF, Rep_domSF SE)"
by (simp add: Rep_restSF rest_distance_eq)
lemma distance_Abs_domSF:
"[| (T1, F1) : domSF ; (T2, F2) : domSF |]
==> distance (Abs_domSF (T1, F1), Abs_domSF (T2, F2))
= distance ((T1, F1), T2, F2)"
by (simp add: distance_Rep_domSF Abs_domSF_inverse)
(*** normal ***)
lemma normal_domSF:
"normal (SFs::'a domSF infinite_seq) = normal (Rep_domSF o SFs)"
by (simp add: normal_def distance_Rep_domSF)
lemma normal_domSF_only_if:
"normal (SFs::'a domSF infinite_seq) ==> normal (Rep_domSF o SFs)"
by (simp add: normal_domSF)
(* T and F *)
lemma normal_of_domSF:
"normal (SFs::'a domSF infinite_seq)
==> (normal (fstSF o SFs) & normal (sndSF o SFs))"
apply (simp add: normal_domSF)
apply (simp add: fstSF_def sndSF_def)
apply (simp add: o_assoc[THEN sym])
apply (simp add: pair_normal_seq)
done
(*** cauchy ***)
lemma cauchy_domSF:
"cauchy (SFs::'a domSF infinite_seq) = cauchy (Rep_domSF o SFs)"
by (simp add: cauchy_def distance_Rep_domSF)
lemma cauchy_domSF_only_if:
"cauchy (SFs::'a domSF infinite_seq) ==> cauchy (Rep_domSF o SFs)"
by (simp add: cauchy_domSF)
(* T and F *)
lemma cauchy_of_domSF:
"cauchy (SFs::'a domSF infinite_seq)
==> (cauchy (fstSF o SFs) & cauchy (sndSF o SFs))"
apply (simp add: cauchy_domSF)
apply (simp add: fstSF_def sndSF_def)
apply (simp add: o_assoc[THEN sym])
apply (simp add: pair_cauchy_seq)
done
(***********************************************************
lemmas (Limit)
***********************************************************)
(*** convergeTo domSF ***)
lemma convergeTo_domSF:
"[| (Rep_domSF o SFs) convergeTo TF ; TF : domSF |]
==> SFs convergeTo Abs_domSF TF"
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 (drule_tac x="m" in spec)
apply (simp add: distance_Rep_domSF)
apply (simp add: Abs_domSF_inverse)
done
(*** LimitSFpair ***)
lemma LimitSFpair_iff:
"normal (Rep_domSF o SFs)
==> pair_Limit (Rep_domSF o SFs)
= (LimitT (fstSF o SFs) , LimitF (sndSF o SFs))"
apply (simp add: pair_Limit_def)
apply (simp add: fstSF_def sndSF_def)
apply (simp add: o_assoc[THEN sym])
apply (simp add: pair_normal_seq LimitT_Limit_eq LimitF_Limit_eq)
done
(*******************************
LimitSFpair in domF
*******************************)
(*** F4 ***)
lemma LimitSFpair_F4:
"normal SFs ==> HC_F4 (LimitT (fstSF o SFs) , LimitF (sndSF o SFs))"
apply (simp add: HC_F4_def)
apply (intro allI impI)
apply (simp add: normal_of_domSF LimitT_memT)
apply (simp add: normal_of_domSF LimitF_memF)
apply (subgoal_tac "(Rep_domSF (SFs (lengtht (s @t [Tick]t)))) : domSF")
apply (simp add: domSF_def HC_F4_def)
apply (elim conjE)
apply (drule_tac x="s" in spec)
apply (simp add: fstSF_def sndSF_def)
by (simp)
(*** T3 ***)
lemma LimitSFpair_T3:
"normal SFs ==> HC_T3 (LimitT (fstSF o SFs) , LimitF (sndSF o SFs))"
apply (simp add: HC_T3_def)
apply (intro allI impI)
apply (simp add: normal_of_domSF LimitT_memT)
apply (simp add: normal_of_domSF LimitF_memF)
apply (subgoal_tac "(Rep_domSF (SFs (lengtht (s @t [Tick]t)))) : domSF")
apply (simp add: domSF_def HC_T3_def)
apply (elim conjE)
apply (drule_tac x="s" in spec)
apply (simp add: fstSF_def sndSF_def)
by (simp)
(*** F3 ***)
lemma LimitSFpair_F3:
"normal SFs ==> HC_F3 (LimitT (fstSF o SFs) , LimitF (sndSF o SFs))"
apply (simp add: HC_F3_def)
apply (intro allI impI)
apply (simp add: normal_of_domSF LimitT_memT)
apply (simp add: normal_of_domSF LimitF_memF)
apply (elim conjE disjE)
apply (subgoal_tac "(Rep_domSF (SFs (Suc (lengtht s)))) : domSF")
apply (simp add: domSF_def HC_F3_def)
apply (elim conjE)
apply (drule_tac x="s" in spec)
apply (drule_tac x="X" in spec)
apply (drule_tac x="Y" in spec)
apply (simp add: fstSF_def sndSF_def)
apply (simp)
apply (erule exE)
apply (simp)
done
(*** T2 ***)
lemma LimitSFpair_T2:
"normal SFs ==> HC_T2 (LimitT (fstSF o SFs) , LimitF (sndSF o SFs))"
apply (simp add: HC_T2_def)
apply (intro allI impI)
apply (simp add: normal_of_domSF LimitT_memT)
apply (simp add: normal_of_domSF LimitF_memF)
apply (elim exE disjE)
apply (subgoal_tac "(Rep_domSF (SFs (Suc (lengtht s)))) : domSF")
apply (simp add: domSF_def HC_T2_def)
apply (elim conjE)
apply (drule_tac x="s" in spec)
apply (simp add: fstSF_def sndSF_def)
apply (drule mp)
apply (rule_tac x="X" in exI, simp)
apply (rule normal_seq_domT_if)
apply (subgoal_tac "(%u. fst (Rep_domSF (SFs u))) = (fstSF o SFs )")
apply (simp add: normal_of_domSF)
apply (simp add: expand_fun_eq fstSF_def)
apply (simp_all)
(* *)
apply (elim conjE exE)
apply (subgoal_tac "(Rep_domSF (SFs (lengtht s))) : domSF")
apply (simp add: domSF_def HC_T2_def)
apply (elim conjE)
apply (drule_tac x="s" in spec)
apply (simp add: fstSF_def sndSF_def)
apply (drule mp)
apply (rule_tac x="X" in exI, simp)
apply (simp_all)
done
(*** LimitSFpari_in ***)
lemma LimitSFpair_in:
"normal SFs ==> LimitSFpair SFs : domSF"
apply (simp add: LimitSFpair_def)
apply (simp add: LimitSFpair_iff normal_domSF_only_if)
apply (simp add: domSF_def)
apply (simp add: LimitSFpair_F4)
apply (simp add: LimitSFpair_T3)
apply (simp add: LimitSFpair_F3)
apply (simp add: LimitSFpair_T2)
done
(*** (normal) SFs converges to (LimitSF SFs) ***)
lemma LimitSF_Limit: "normal SFs ==> SFs convergeTo (LimitSF SFs)"
apply (simp add: LimitSF_def)
apply (rule convergeTo_domSF)
apply (simp add: LimitSFpair_def)
apply (simp add: pair_cms_cauchy_Limit normal_cauchy normal_domSF)
by (simp add: LimitSFpair_in)
(*** (cauchy) Fs converges to (LimitSF NF SFs) ***)
lemma cauchy_LimitSF_Limit:
"cauchy SFs ==> SFs convergeTo (LimitSF (NF SFs))"
by (simp add: LimitSF_Limit normal_form_seq_same_Limit normal_form_seq_normal)
(**************************************
Dom_SF --> Complete Metric Space
**************************************)
lemma domSF_cms:
"cauchy (SFs::'a domSF infinite_seq) ==> (EX SF. SFs convergeTo SF)"
apply (rule_tac x="LimitSF (NF SFs)" in exI)
by (simp add: cauchy_LimitSF_Limit)
(************************************************************
domSF ==> CMS and RS
************************************************************)
instance domSF :: (type) cms
apply (intro_classes)
by (simp add: domSF_cms)
instance domSF :: (type) cms_rs
by (intro_classes)
(*** (normal) Limit SFs = LimitSF SFs ***)
lemma LimitSF_Limit_eq:
"normal (SFs::'a domSF infinite_seq) ==> Limit SFs = LimitSF SFs"
apply (rule unique_convergence[of SFs])
by (simp_all add: LimitSF_Limit Limit_is normal_cauchy)
(*----------------------------------------------------------*
| |
| Fixed point induction for refinement |
| |
*----------------------------------------------------------*)
consts
RefSF :: "'a domSF => 'a domSF => bool"
RevSF :: "'a domSF => 'a domSF => bool"
defs
RefSF_def : "RefSF SE == (%SF. (SE <= SF))"
RevSF_def : "RevSF SE == (%SF. (SF <= SE))"
(************************************************************
continuity lemma
************************************************************)
(*** (f o Rep_domSF) ***)
lemma continuous_rs_compo:
"continuous_rs f ==> continuous_rs (f o Rep_domSF)"
apply (simp add: continuous_rs_def)
apply (intro allI impI)
apply (drule_tac x="fst (Rep_domSF x)" in spec)
apply (drule_tac x="snd (Rep_domSF x)" in spec)
apply (simp)
apply (erule exE)
apply (rule_tac x="n" in exI)
apply (intro allI impI)
apply (drule_tac x="fst (Rep_domSF y)" in spec)
apply (drule_tac x="snd (Rep_domSF y)" in spec)
apply (drule mp)
apply (simp add: Rep_restSF)
by (simp)
(*** RefSF iff ***)
lemma RefSF_iff:
"RefSF SE = (%SF. RefT (fstSF SE) (fstSF SF) & RefF (sndSF SE) (sndSF SF))"
apply (simp add: RefSF_def)
apply (simp add: expand_fun_eq)
apply (rule allI)
apply (simp add: RefT_def RefF_def)
apply (simp add: subsetSF_decompo)
done
(*** RevSF iff ***)
lemma RevSF_iff:
"RevSF SE = (%SF. RevT (fstSF SE) (fstSF SF) & RevF (sndSF SE) (sndSF SF))"
apply (simp add: RevSF_def)
apply (simp add: expand_fun_eq)
apply (rule allI)
apply (simp add: RevT_def RevF_def)
apply (simp add: subsetSF_decompo)
done
lemma continuous_rs_domSF:
"[| continuous_rs R1 ; continuous_rs R2 |]
==> continuous_rs (%SF. R1 (fstSF SF) & R2 (sndSF SF))"
apply (simp add: fstSF_def sndSF_def)
apply (subgoal_tac
"(%SF. R1 (fst (Rep_domSF SF)) & R2 (snd (Rep_domSF SF)))
= (%TF. R1 (fst TF) & R2 (snd TF)) o Rep_domSF")
apply (simp)
apply (rule continuous_rs_compo)
apply (rule pair_continuous_rs, simp_all)
apply (simp add: expand_fun_eq)
done
(************************************************************
continuity lemma for refinement
************************************************************)
lemma continuous_rs_RefSF: "continuous_rs (RefSF SE)"
apply (simp add: RefSF_iff)
by (simp add: continuous_rs_domSF continuous_rs_RefT continuous_rs_RefF)
(************************************************************
continuity lemma for (Reverse) refinement
************************************************************)
lemma continuous_rs_RevSF: "continuous_rs (RevSF SE)"
apply (simp add: RevSF_iff)
by (simp add: continuous_rs_domSF continuous_rs_RevT continuous_rs_RevF)
end
lemma restSFpair_T2:
HC_T2 (SF restSFpair n)
lemma restSFpair_F3:
HC_F3 (SF restSFpair n)
lemma restSFpair_T3_F4:
HC_T3_F4 (SF restSFpair n)
lemma restSFpair_in:
SF restSFpair n ∈ domSF
lemma Rep_restSF:
(SF rest n = SE rest m) = (Rep_domSF SF rest n = Rep_domSF SE rest m)
lemma zero_eq_rs_domSF:
SF rest 0 = SE rest 0
lemma min_rs_domSF:
SF rest m rest n = SF rest min m n
lemma diff_rs_domSF:
SF ≠ SE ==> ∃n. SF rest n ≠ SE rest n
lemma distance_Rep_domSF:
distance (SF, SE) = distance (Rep_domSF SF, Rep_domSF SE)
lemma distance_Abs_domSF:
[| (T1, F1) ∈ domSF; (T2, F2) ∈ domSF |] ==> distance (Abs_domSF (T1, F1), Abs_domSF (T2, F2)) = distance ((T1, F1), T2, F2)
lemma normal_domSF:
normal SFs = normal (Rep_domSF ˆ SFs)
lemma normal_domSF_only_if:
normal SFs ==> normal (Rep_domSF ˆ SFs)
lemma normal_of_domSF:
normal SFs ==> normal (fstSF ˆ SFs) ∧ normal (sndSF ˆ SFs)
lemma cauchy_domSF:
cauchy SFs = cauchy (Rep_domSF ˆ SFs)
lemma cauchy_domSF_only_if:
cauchy SFs ==> cauchy (Rep_domSF ˆ SFs)
lemma cauchy_of_domSF:
cauchy SFs ==> cauchy (fstSF ˆ SFs) ∧ cauchy (sndSF ˆ SFs)
lemma convergeTo_domSF:
[| Rep_domSF ˆ SFs convergeTo TF; TF ∈ domSF |] ==> SFs convergeTo Abs_domSF TF
lemma LimitSFpair_iff:
normal (Rep_domSF ˆ SFs) ==> pair_Limit (Rep_domSF ˆ SFs) = (LimitT (fstSF ˆ SFs), LimitF (sndSF ˆ SFs))
lemma LimitSFpair_F4:
normal SFs ==> HC_F4 (LimitT (fstSF ˆ SFs), LimitF (sndSF ˆ SFs))
lemma LimitSFpair_T3:
normal SFs ==> HC_T3 (LimitT (fstSF ˆ SFs), LimitF (sndSF ˆ SFs))
lemma LimitSFpair_F3:
normal SFs ==> HC_F3 (LimitT (fstSF ˆ SFs), LimitF (sndSF ˆ SFs))
lemma LimitSFpair_T2:
normal SFs ==> HC_T2 (LimitT (fstSF ˆ SFs), LimitF (sndSF ˆ SFs))
lemma LimitSFpair_in:
normal SFs ==> LimitSFpair SFs ∈ domSF
lemma LimitSF_Limit:
normal SFs ==> SFs convergeTo LimitSF SFs
lemma cauchy_LimitSF_Limit:
cauchy SFs ==> SFs convergeTo LimitSF (NF SFs)
lemma domSF_cms:
cauchy SFs ==> ∃SF. SFs convergeTo SF
lemma LimitSF_Limit_eq:
normal SFs ==> Limit SFs = LimitSF SFs
lemma continuous_rs_compo:
continuous_rs f ==> continuous_rs (f ˆ Rep_domSF)
lemma RefSF_iff:
RefSF SE = (%SF. RefT (fstSF SE) (fstSF SF) ∧ RefF (sndSF SE) (sndSF SF))
lemma RevSF_iff:
RevSF SE = (%SF. RevT (fstSF SE) (fstSF SF) ∧ RevF (sndSF SE) (sndSF SF))
lemma continuous_rs_domSF:
[| continuous_rs R1; continuous_rs R2 |] ==> continuous_rs (%SF. R1 (fstSF SF) ∧ R2 (sndSF SF))
lemma continuous_rs_RefSF:
continuous_rs (RefSF SE)
lemma continuous_rs_RevSF:
continuous_rs (RevSF SE)