Up to index of Isabelle/HOL/HOL-Complex/CSP-Prover
theory Domain_F_cms = Domain_F + RS:(*-------------------------------------------* | CSP-Prover | | December 2004 | | Yoshinao Isobe (AIST JAPAN) | *-------------------------------------------*) theory Domain_F_cms = Domain_F + RS: (***************************************************************** 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 domF :: (type) ms0 by (intro_classes) consts restFset :: "'a domF => nat => 'a failure set" ("_ restFset _" [55,56] 55) LimitFset:: "'a domF infinite_seq => 'a failure set" LimitF :: "'a domF infinite_seq => 'a domF" ("LimitF") defs restFset_def : "F restFset n == {(s, X) |s X. (s, X) :f F & (lengtht s < n | lengtht s = n & (EX s'. s = s' @t [Tick]t))}" LimitFset_def : "LimitFset Fs == {(s, X) |s X. ((s, X) :f Fs (Suc (lengtht s)) | (s, X) :f Fs (lengtht s) & (EX s'. s = s' @t [Tick]t))}" LimitF_def : "LimitF Fs == Abs_domF (LimitFset Fs)" defs (overloaded) restF_def : "F rest n == Abs_domF (F restFset n)" (********************************************************* Lemmas (Restriction in Dom_F) *********************************************************) (*** restFset_def in domF ***) lemma restFset_in[simp] : "F restFset n : domF" apply (simp add: restFset_def) apply (simp add: domF_def HC_F2_def) apply (intro allI impI) apply (elim conjE) apply (rule memF_F2) by (simp_all) (********************************************************* rest on domF *********************************************************) lemma in_restF: "(s, X) :f F rest n = ((s, X) :f F & (lengtht s < n | lengtht s = n & (EX s'. s = s' @t [Tick]t)))" apply (simp add: memF_def restF_def) apply (simp add: Abs_domF_inverse) apply (simp add: memF_def restFset_def) done lemma restF_eq_iff: "(F rest n = E rest m) = (ALL s X. ((s, X) :f F & (lengtht s < n | lengtht s = n & (EX s'. s = s' @t [Tick]t))) = ((s, X) :f E & (lengtht s < m | lengtht s = m & (EX s'. s = s' @t [Tick]t))))" apply (simp add: restF_def Abs_domF_inject) apply (simp add: restFset_def) by (auto) (*** F rest = E rest --> F = E ***) lemma rest_domF_eq: "[| (s, X) :f F ; F restFset Suc (lengtht s) = E restFset Suc (lengtht s) |] ==> (s, X) :f E" by (auto simp add: restFset_def) (********************************************************* DomF --> RS *********************************************************) (******************************* zero_eq_rs_domF *******************************) (*** (contra) restFset 0 ***) lemma contra_zero_domF: "(F::'a domF) restFset n ~= {} ==> 0 < n" apply (simp add: restFset_def) apply (elim conjE exE) apply (erule disjE) apply (simp) apply (elim conjE exE) by (simp add: not_None_F) (*** restFset 0 ***) lemma zero_domF: "(F::'a domF) restFset 0 = {}" apply (insert contra_zero_domF[of F 0]) apply (case_tac "F restFset 0 = {}") by (simp_all) (*** zero_eq_rs_domF ***) lemma zero_eq_rs_domF: "(F::'a domF) rest 0 = E rest 0" apply (simp add: restF_def Abs_domF_inject) by (simp add: zero_domF) (******************************* min_rs_domF *******************************) lemma min_rs_domF: "((F::'a domF) rest m) rest n = F rest (min m n)" apply (simp add: restF_eq_iff) apply (simp add: in_restF) apply (intro allI) apply (rule iffI) apply (elim conjE exE disjE) apply (simp_all add: min_is) apply (rule_tac x="s'" in exI, simp)+ apply (elim conjE exE disjE) apply (simp_all) apply (case_tac "m < n") apply (simp add: min_is) apply (rule_tac x="s'" in exI, simp) apply (case_tac "m = n") apply (simp add: min_is) apply (rule_tac x="s'" in exI, simp) apply (case_tac "n < m") apply (simp add: min_is) apply (rule_tac x="s'" in exI, simp) by (force) (******************************* diff_rs_domF *******************************) (*** contra <= ***) lemma contra_diff_rs_domF_left: "(ALL n. (F::'a domF) rest n = E rest n) ==> F <= E" apply (simp add: restF_eq_iff) apply (rule subsetFI) apply (drule_tac x="Suc (lengtht s)" in spec) apply (drule_tac x="s" in spec) apply (drule_tac x="X" in spec) by (simp) (*** contra = ***) lemma contra_diff_rs_domF: "(ALL n. (F::'a domF) rest n = E rest n) ==> F = E" apply (rule order_antisym) by (simp_all add: contra_diff_rs_domF_left) (*** diff_rs_domF ***) lemma diff_rs_domF: "(F::'a domF) ~= E ==> (EX (n::nat). F rest n ~= E rest n)" apply (erule contrapos_np) apply (rule contra_diff_rs_domF) by (simp) (*************************************************************** domF ==> RS ***************************************************************) instance domF :: (type) rs apply (intro_classes) apply (simp add: zero_eq_rs_domF) apply (simp add: min_rs_domF) apply (simp add: diff_rs_domF) done (************************************************************ domF ==> MS ************************************************************) instance domF :: (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. domF ==> MS & RS ************************************************************) instance domF :: (type) ms_rs by (intro_classes) (*********************************************************** lemmas (Limit) ***********************************************************) (*** normal_seq lemma ***) lemma normal_seq_domF_less: "[| normal (Fs::'a domF infinite_seq) ; lengtht s < n |] ==> ((s,X) :f Fs (Suc (lengtht s))) = ((s,X) :f Fs n)" apply (simp add: normal_def) apply (drule_tac x="Suc (lengtht s)" in spec) apply (drule_tac x="n" in spec) apply (simp add: distance_rs_less_1[THEN sym]) apply (simp add: min_is) apply (simp add: restF_eq_iff) apply (drule_tac x="s" in spec) apply (drule_tac x="X" in spec) by (simp) lemma normal_seq_domF_less_only_if: "[| normal (Fs::'a domF infinite_seq) ; lengtht s < n ; (s,X) :f Fs (Suc (lengtht s)) |] ==> ((s,X) :f Fs n)" by (simp add: normal_seq_domF_less) (*** normal_seq lemma (Tick)***) lemma normal_seq_domF_Tick: "[| normal (Fs::'a domF infinite_seq) ; lengtht (s' @t [Tick]t) <= n |] ==> ((s' @t [Tick]t,X) :f Fs (lengtht (s' @t [Tick]t))) = ((s' @t [Tick]t,X) :f Fs n)" apply (simp add: normal_def) apply (drule_tac x="lengtht (s' @t [Tick]t)" in spec) apply (drule_tac x="n" in spec) apply (simp add: distance_rs_less_1[THEN sym]) apply (simp add: min_is) apply (simp add: restF_eq_iff) apply (drule_tac x="s' @t [Tick]t" in spec) apply (drule_tac x="X" in spec) by (simp) lemma normal_seq_domF_Tick_only_if: "[| normal (Fs::'a domF infinite_seq) ; lengtht (s' @t [Tick]t) <= n ; (s' @t [Tick]t,X) :f Fs (lengtht (s' @t [Tick]t)) |] ==> ((s' @t [Tick]t,X) :f Fs n)" by (simp add: normal_seq_domF_Tick) lemma normal_seq_domF_Tick_only_ifE: "[| (s' @t [Tick]t,X) :f Fs n ; normal (Fs::'a domF infinite_seq) ; lengtht (s' @t [Tick]t) <= n ; (s' @t [Tick]t,X) :f Fs (lengtht (s' @t [Tick]t)) ==> R |] ==> R" by (simp add: normal_seq_domF_Tick) (*** LimitFset_def in domF ***) lemma LimitFset_in[simp]: "LimitFset (Fs::'a domF infinite_seq) : domF" apply (simp add: LimitFset_def) apply (simp add: domF_def HC_F2_def) apply (intro allI impI) apply (erule conjE) apply (erule disjE) apply (rule disjI1) apply (rule memF_F2) apply (simp_all) apply (elim conjE exE) apply (rule disjI2) apply (rule memF_F2) apply (simp_all) done (*** LimitF_memF ***) lemma LimitF_memF: "((s, X) :f LimitF Fs) = ((s, X) :f Fs (Suc (lengtht s)) | (s, X) :f Fs (lengtht s) & (EX s'. s = s' @t [Tick]t))" apply (simp add: LimitF_def memF_def) apply (simp add: Abs_domF_inverse) apply (simp add: LimitFset_def memF_def) done (*** LimitF lemma ***) lemma LimitF_Limit_lm: "normal (Fs::'a domF infinite_seq) ==> (ALL n. (LimitF Fs) rest n = (Fs n) rest n)" apply (simp add: restF_eq_iff) apply (intro allI) apply (simp add: LimitF_memF) apply (rule iffI) (* => *) apply (elim conjE disjE) apply (simp_all add: normal_seq_domF_less) apply (elim conjE exE) apply (simp) apply (erule normal_seq_domF_Tick_only_ifE) apply (simp_all) apply (elim conjE exE) apply (simp) apply (rule normal_seq_domF_Tick_only_if) apply (simp_all) (* <= *) apply (elim conjE disjE) apply (simp add: normal_seq_domF_less) apply (simp) done (*** (normal) Fs converges to (LimitF Fs) ***) lemma LimitF_Limit: "normal (Fs::'a domF infinite_seq) ==> Fs convergeTo (LimitF Fs)" by (simp add: LimitF_Limit_lm rest_Limit) (*** (cauchy) Fs converges to (LimitF NF Fs) ***) lemma cauchy_LimitF_Limit: "cauchy (Fs::'a domF infinite_seq) ==> Fs convergeTo (LimitF (NF Fs))" apply (simp add: normal_form_seq_same_Limit) apply (simp add: LimitF_Limit normal_form_seq_normal) done (************************************ DomF --> Complete Metric Space ************************************) lemma domF_cms: "cauchy (Fs::'a domF infinite_seq) ==> (EX F. Fs convergeTo F)" apply (rule_tac x="LimitF (NF Fs)" in exI) by (simp add: cauchy_LimitF_Limit) (************************************************************ domF ==> CMS and RS ************************************************************) instance domF :: (type) cms apply (intro_classes) by (simp add: domF_cms) instance domF :: (type) cms_rs by (intro_classes) (*** (normal) Limit Fs = LimitF Fs ***) lemma LimitF_Limit_eq: "normal (Fs::'a domF infinite_seq) ==> Limit Fs = LimitF Fs" apply (insert unique_convergence[of Fs "Limit Fs" "LimitF Fs"]) by (simp add: LimitF_Limit Limit_is normal_cauchy) (*----------------------------------------------------------* | | | Fixed point induction for refinement | | | *----------------------------------------------------------*) consts RefF :: "'a domF => 'a domF => bool" RevF :: "'a domF => 'a domF => bool" defs RefF_def : "RefF E == (%F. (E <= F))" RevF_def : "RevF E == (%F. (F <= E))" (************************************************************ continuity lemma for refinement ************************************************************) lemma continuous_rs_RefF: "continuous_rs (RefF E)" apply (simp add: continuous_rs_def) apply (intro allI impI) apply (simp add: RefF_def) apply (simp add: subsetF_iff) apply (elim conjE exE) apply (rule_tac x="Suc (lengtht s)" in exI) apply (intro allI impI) apply (rule_tac x="s" in exI) apply (rule_tac x="X" in exI) apply (simp add: restF_eq_iff) apply (drule_tac x="s" in spec) apply (drule_tac x="X" in spec) by (simp) (************************************************************ continuity lemma for (Reverse) refinement ************************************************************) lemma continuous_rs_RevF: "continuous_rs (RevF E)" apply (simp add: continuous_rs_def) apply (intro allI impI) apply (simp add: RevF_def) apply (simp add: subsetF_iff) apply (elim conjE exE) apply (rule_tac x="Suc (lengtht s)" in exI) apply (intro allI impI) apply (rule_tac x="s" in exI) apply (rule_tac x="X" in exI) apply (simp add: restF_eq_iff) apply (drule_tac x="s" in spec) apply (drule_tac x="X" in spec) by (simp) (****************** to add them again ******************) declare Union_image_eq [simp] declare Inter_image_eq [simp] declare not_None_eq [simp] end
lemma restFset_in:
F restFset n ∈ domF
lemma in_restF:
((s, X) :f F rest n) = ((s, X) :f F ∧ (lengtht s < n ∨ lengtht s = n ∧ (∃s'. s = s' @t [Tick]t)))
lemma restF_eq_iff:
(F rest n = E rest m) = (∀s X. ((s, X) :f F ∧ (lengtht s < n ∨ lengtht s = n ∧ (∃s'. s = s' @t [Tick]t))) = ((s, X) :f E ∧ (lengtht s < m ∨ lengtht s = m ∧ (∃s'. s = s' @t [Tick]t))))
lemma rest_domF_eq:
[| (s, X) :f F; F restFset Suc (lengtht s) = E restFset Suc (lengtht s) |] ==> (s, X) :f E
lemma contra_zero_domF:
F restFset n ≠ {} ==> 0 < n
lemma zero_domF:
F restFset 0 = {}
lemma zero_eq_rs_domF:
F rest 0 = E rest 0
lemma min_rs_domF:
F rest m rest n = F rest min m n
lemma contra_diff_rs_domF_left:
∀n. F rest n = E rest n ==> F ≤ E
lemma contra_diff_rs_domF:
∀n. F rest n = E rest n ==> F = E
lemma diff_rs_domF:
F ≠ E ==> ∃n. F rest n ≠ E rest n
lemma normal_seq_domF_less:
[| normal Fs; lengtht s < n |] ==> ((s, X) :f Fs (Suc (lengtht s))) = ((s, X) :f Fs n)
lemma normal_seq_domF_less_only_if:
[| normal Fs; lengtht s < n; (s, X) :f Fs (Suc (lengtht s)) |] ==> (s, X) :f Fs n
lemma normal_seq_domF_Tick:
[| normal Fs; lengtht (s' @t [Tick]t) ≤ n |] ==> ((s' @t [Tick]t, X) :f Fs (lengtht (s' @t [Tick]t))) = ((s' @t [Tick]t, X) :f Fs n)
lemma normal_seq_domF_Tick_only_if:
[| normal Fs; lengtht (s' @t [Tick]t) ≤ n; (s' @t [Tick]t, X) :f Fs (lengtht (s' @t [Tick]t)) |] ==> (s' @t [Tick]t, X) :f Fs n
lemma normal_seq_domF_Tick_only_ifE:
[| (s' @t [Tick]t, X) :f Fs n; normal Fs; lengtht (s' @t [Tick]t) ≤ n; (s' @t [Tick]t, X) :f Fs (lengtht (s' @t [Tick]t)) ==> R |] ==> R
lemma LimitFset_in:
LimitFset Fs ∈ domF
lemma LimitF_memF:
((s, X) :f LimitF Fs) = ((s, X) :f Fs (Suc (lengtht s)) ∨ (s, X) :f Fs (lengtht s) ∧ (∃s'. s = s' @t [Tick]t))
lemma LimitF_Limit_lm:
normal Fs ==> ∀n. LimitF Fs rest n = Fs n rest n
lemma LimitF_Limit:
normal Fs ==> Fs convergeTo LimitF Fs
lemma cauchy_LimitF_Limit:
cauchy Fs ==> Fs convergeTo LimitF (NF Fs)
lemma domF_cms:
cauchy Fs ==> ∃F. Fs convergeTo F
lemma LimitF_Limit_eq:
normal Fs ==> Limit Fs = LimitF Fs
lemma continuous_rs_RefF:
continuous_rs (RefF E)
lemma continuous_rs_RevF:
continuous_rs (RevF E)