Up to index of Isabelle/HOL/HOL-Complex/CSP-Prover
theory Seq_compo_cms = Seq_compo + Domain_SF_prod_cms: (*-------------------------------------------*
| CSP-Prover |
| December 2004 |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory Seq_compo_cms = Seq_compo + Domain_SF_prod_cms:
(* The following simplification rules are deleted in this theory file *)
(* because they unexpectly rewrite UnionT and InterT. *)
(* disj_not1: (~ P | Q) = (P --> Q) *)
declare disj_not1 [simp del]
(* The following simplification is sometimes unexpected. *)
(* *)
(* not_None_eq: (x ~= None) = (EX y. x = Some y) *)
declare not_None_eq [simp del]
(*****************************************************************
1. [[P ;; Q]]T : non expanding
2. [[P ;; Q]]F : non expanding
3.
4.
*****************************************************************)
(*********************************************************
map Seq_compo T
*********************************************************)
(*** restT (subset) ***)
lemma Seq_compo_restT_sub:
"[| [[P]]T ev1 rest n <= [[P]]T ev2 rest n ;
[[Q]]T ev1 rest n <= [[Q]]T ev2 rest n |]
==> [[P ;; Q]]T ev1 rest n <= [[P ;; Q]]T ev2 rest n"
apply (simp add: subsetT_iff)
apply (intro allI impI)
apply (simp add: in_restT)
apply (simp add: Seq_compo_memT)
apply (elim conjE exE disjE)
(* case 1 *)
apply (rule disjI1)
apply (insert trace_last_notick_or_tick)
apply (rotate_tac -1)
apply (drule_tac x="s" in spec, simp add: not_None_T)
apply (erule disjE, simp)
apply (rule_tac x="s" in exI, simp)
apply (elim conjE exE)
apply (rule_tac x="sa" in exI, simp)
apply (drule_tac x="sa" in spec, simp)
apply (drule mp)
apply (rule memT_prefix_closed, simp_all, simp)
(* case 2 *)
apply (case_tac "~ notick s", simp add: not_None_T)
apply (insert trace_last_nil_or_unnil)
apply (rotate_tac -1)
apply (drule_tac x="ta" in spec, simp add: not_None_T)
apply (erule disjE, simp)
apply (rule disjI1) (* ta = []t *)
apply (rule_tac x="s" in exI, simp)
apply (drule_tac x="s" in spec, simp)
apply (drule mp)
apply (rule memT_prefix_closed, simp_all, simp)
apply (rule disjI2) (* ta ~= []t *)
apply (elim conjE exE, simp)
apply (simp add: appt_ass_rev del: appt_ass)
apply (drule_tac x="s @t [Tick]t" in spec)
apply (drule_tac x=" sa @t [a]t" in spec)
apply (simp)
apply (rule_tac x="s" in exI)
apply (rule_tac x="sa @t [a]t" in exI)
apply (simp add: not_None)
done
(*** restT (equal) ***)
lemma Seq_compo_restT:
"[| [[P]]T ev1 rest n = [[P]]T ev2 rest n ;
[[Q]]T ev1 rest n = [[Q]]T ev2 rest n |]
==> [[P ;; Q]]T ev1 rest n = [[P ;; Q]]T ev2 rest n"
apply (rule order_antisym)
by (simp_all add: Seq_compo_restT_sub)
(*** distT lemma ***)
lemma Seq_compo_distT:
"TTs = {([[P]]T ev1, [[P]]T ev2), ([[Q]]T ev1, [[Q]]T ev2)}
==> (EX TT. TT:TTs &
distance([[P ;; Q]]T ev1, [[P ;; Q]]T ev2)
<= distance((fst TT), (snd TT)))"
apply (rule rest_to_dist_pair)
by (auto intro: Seq_compo_restT)
(*** map_alpha T lemma ***)
lemma Seq_compo_evalT_map_alpha_lm:
"[| distance ([[P]]T ev1, [[P]]T ev2) <= alpha * distance (ev1, ev2) ;
distance ([[Q]]T ev1, [[Q]]T ev2) <= alpha * distance (ev1, ev2) |]
==> distance ([[P ;; Q]]T ev1, [[P ;; Q]]T ev2)
<= alpha * distance (ev1, ev2)"
apply (insert Seq_compo_distT
[of "{([[P]]T ev1, [[P]]T ev2), ([[Q]]T ev1, [[Q]]T ev2)}" P ev1 ev2 Q])
by (auto)
(*** Seq_compo_evalT_map_alpha ***)
lemma Seq_compo_evalT_map_alpha:
"[| map_alpha [[P]]T alpha ; map_alpha [[Q]]T alpha |]
==> map_alpha [[P ;; Q]]T alpha"
apply (simp add: map_alpha_def)
apply (intro allI)
apply (erule conjE)
apply (drule_tac x="x" in spec)
apply (drule_tac x="x" in spec)
apply (drule_tac x="y" in spec)
apply (drule_tac x="y" in spec)
by (simp add: Seq_compo_evalT_map_alpha_lm)
(*** Seq_compo_evalT_non_expanding ***)
lemma Seq_compo_evalT_non_expanding:
"[| non_expanding [[P]]T ; non_expanding [[Q]]T |]
==> non_expanding [[P ;; Q]]T"
by (simp add: non_expanding_def Seq_compo_evalT_map_alpha)
(*** Seq_compo_evalT_contraction_alpha ***)
lemma Seq_compo_evalT_contraction_alpha:
"[| contraction_alpha [[P]]T alpha; contraction_alpha [[Q]]T alpha|]
==> contraction_alpha [[P ;; Q]]T alpha"
by (simp add: contraction_alpha_def Seq_compo_evalT_map_alpha)
(*********************************************************
map Seq_compo F
*********************************************************)
(*** restF (subset) ***)
lemma Seq_compo_restF_sub:
"[| [[P]]T ev1 rest n <= [[P]]T ev2 rest n ;
[[P]]F ev1 rest n <= [[P]]F ev2 rest n ;
[[Q]]F ev1 rest n <= [[Q]]F ev2 rest n |]
==> [[P ;; Q]]F ev1 rest n <= [[P ;; Q]]F ev2 rest n"
apply (simp add: subsetT_iff subsetF_iff)
apply (intro allI impI)
apply (simp add: in_restT in_restF)
apply (simp add: Seq_compo_memF)
apply (elim conjE)
(* case 1 *)
apply (erule disjE)
apply (rotate_tac 1)
apply (drule_tac x="s" in spec)
apply (drule_tac x="insert Tick X" in spec, simp)
(* case 2 *)
apply (elim conjE exE)
apply (case_tac "~ notick sa", simp add: not_None_T)
apply (case_tac "sa @t t = None", simp add: not_None)
apply (rule disjI2)
apply (rule_tac x="sa" in exI)
apply (rule_tac x="t" in exI)
apply (simp)
(* < n *)
apply (erule disjE)
apply (simp)
(* = n *)
apply (elim conjE exE, simp)
apply (insert trace_last_nil_or_unnil)
apply (rotate_tac -1)
apply (drule_tac x="t" in spec, simp add: not_None_F)
apply (erule disjE, simp)
apply (elim conjE exE, simp)
apply (simp add: appt_ass_rev del: appt_ass)
apply (rotate_tac 2)
apply (drule_tac x="sb @t [Tick]t" in spec)
apply (drule_tac x="X" in spec, simp)
apply (force)
done
(*** restF (equal) ***)
lemma Seq_compo_restF:
"[| [[P]]T ev1 rest n = [[P]]T ev2 rest n ;
[[P]]F ev1 rest n = [[P]]F ev2 rest n ;
[[Q]]F ev1 rest n = [[Q]]F ev2 rest n |]
==> [[P ;; Q]]F ev1 rest n = [[P ;; Q]]F ev2 rest n"
apply (rule order_antisym)
by (simp_all add: Seq_compo_restF_sub)
(*** distF lemma ***)
lemma Seq_compo_distF:
"[| TTs = {([[P]]T ev1, [[P]]T ev2)} ;
FFs = {([[P]]F ev1, [[P]]F ev2), ([[Q]]F ev1, [[Q]]F ev2)} |]
==> (EX TT. TT:TTs &
distance([[P ;; Q]]F ev1, [[P ;; Q]]F ev2)
<= distance((fst TT), (snd TT))) |
(EX FF. FF:FFs &
distance([[P ;; Q]]F ev1, [[P ;; Q]]F ev2)
<= distance((fst FF), (snd FF)))"
apply (rule rest_to_dist_pair_two)
by (auto intro: Seq_compo_restF)
(*** map_alpha F lemma ***)
lemma Seq_compo_evalF_map_alpha_lm:
"[| distance ([[P]]T ev1, [[P]]T ev2) <= alpha * distance (ev1, ev2) ;
distance ([[P]]F ev1, [[P]]F ev2) <= alpha * distance (ev1, ev2) ;
distance ([[Q]]F ev1, [[Q]]F ev2) <= alpha * distance (ev1, ev2) |]
==> distance ([[P ;; Q]]F ev1, [[P ;; Q]]F ev2)
<= alpha * distance (ev1, ev2)"
apply (insert Seq_compo_distF
[of "{([[P]]T ev1, [[P]]T ev2)}" P ev1 ev2
"{([[P]]F ev1, [[P]]F ev2), ([[Q]]F ev1, [[Q]]F ev2)}" Q])
by (auto)
(*** Seq_compo_evalF_map_alpha ***)
lemma Seq_compo_evalF_map_alpha:
"[| map_alpha [[P]]T alpha ; map_alpha [[P]]F alpha ; map_alpha [[Q]]F alpha |]
==> map_alpha [[P ;; Q]]F alpha"
apply (simp add: map_alpha_def)
apply (intro allI)
apply (erule conjE)
apply (drule_tac x="x" in spec)
apply (drule_tac x="x" in spec)
apply (drule_tac x="x" in spec)
apply (drule_tac x="y" in spec)
apply (drule_tac x="y" in spec)
apply (drule_tac x="y" in spec)
by (simp add: Seq_compo_evalF_map_alpha_lm)
(*** Seq_compo_evalF_non_expanding ***)
lemma Seq_compo_evalF_non_expanding:
"[| non_expanding [[P]]T ; non_expanding [[P]]F ; non_expanding [[Q]]F |]
==> non_expanding [[P ;; Q]]F"
by (simp add: non_expanding_def Seq_compo_evalF_map_alpha)
(*** Seq_compo_evalF_contraction_alpha ***)
lemma Seq_compo_evalF_contraction_alpha:
"[| contraction_alpha [[P]]T alpha;
contraction_alpha [[P]]F alpha; contraction_alpha [[Q]]F alpha|]
==> contraction_alpha [[P ;; Q]]F alpha"
by (simp add: contraction_alpha_def Seq_compo_evalF_map_alpha)
(****************** to add them again ******************)
declare disj_not1 [simp]
declare not_None_eq [simp]
end
lemma Seq_compo_restT_sub:
[| [[P]]T ev1 rest n ≤ [[P]]T ev2 rest n; [[Q]]T ev1 rest n ≤ [[Q]]T ev2 rest n |] ==> [[P ;; Q]]T ev1 rest n ≤ [[P ;; Q]]T ev2 rest n
lemma Seq_compo_restT:
[| [[P]]T ev1 rest n = [[P]]T ev2 rest n; [[Q]]T ev1 rest n = [[Q]]T ev2 rest n |] ==> [[P ;; Q]]T ev1 rest n = [[P ;; Q]]T ev2 rest n
lemma Seq_compo_distT:
TTs = {([[P]]T ev1, [[P]]T ev2), ([[Q]]T ev1, [[Q]]T ev2)} ==> ∃TT. TT ∈ TTs ∧ distance ([[P ;; Q]]T ev1, [[P ;; Q]]T ev2) ≤ distance (fst TT, snd TT)
lemma Seq_compo_evalT_map_alpha_lm:
[| distance ([[P]]T ev1, [[P]]T ev2) ≤ alpha * distance (ev1, ev2); distance ([[Q]]T ev1, [[Q]]T ev2) ≤ alpha * distance (ev1, ev2) |] ==> distance ([[P ;; Q]]T ev1, [[P ;; Q]]T ev2) ≤ alpha * distance (ev1, ev2)
lemma Seq_compo_evalT_map_alpha:
[| map_alpha [[P]]T alpha; map_alpha [[Q]]T alpha |] ==> map_alpha [[P ;; Q]]T alpha
lemma Seq_compo_evalT_non_expanding:
[| non_expanding [[P]]T; non_expanding [[Q]]T |] ==> non_expanding [[P ;; Q]]T
lemma Seq_compo_evalT_contraction_alpha:
[| contraction_alpha [[P]]T alpha; contraction_alpha [[Q]]T alpha |] ==> contraction_alpha [[P ;; Q]]T alpha
lemma Seq_compo_restF_sub:
[| [[P]]T ev1 rest n ≤ [[P]]T ev2 rest n; [[P]]F ev1 rest n ≤ [[P]]F ev2 rest n; [[Q]]F ev1 rest n ≤ [[Q]]F ev2 rest n |] ==> [[P ;; Q]]F ev1 rest n ≤ [[P ;; Q]]F ev2 rest n
lemma Seq_compo_restF:
[| [[P]]T ev1 rest n = [[P]]T ev2 rest n; [[P]]F ev1 rest n = [[P]]F ev2 rest n; [[Q]]F ev1 rest n = [[Q]]F ev2 rest n |] ==> [[P ;; Q]]F ev1 rest n = [[P ;; Q]]F ev2 rest n
lemma Seq_compo_distF:
[| TTs = {([[P]]T ev1, [[P]]T ev2)}; FFs = {([[P]]F ev1, [[P]]F ev2), ([[Q]]F ev1, [[Q]]F ev2)} |] ==> (∃TT. TT ∈ TTs ∧ distance ([[P ;; Q]]F ev1, [[P ;; Q]]F ev2) ≤ distance (fst TT, snd TT)) ∨ (∃FF. FF ∈ FFs ∧ distance ([[P ;; Q]]F ev1, [[P ;; Q]]F ev2) ≤ distance (fst FF, snd FF))
lemma Seq_compo_evalF_map_alpha_lm:
[| distance ([[P]]T ev1, [[P]]T ev2) ≤ alpha * distance (ev1, ev2); distance ([[P]]F ev1, [[P]]F ev2) ≤ alpha * distance (ev1, ev2); distance ([[Q]]F ev1, [[Q]]F ev2) ≤ alpha * distance (ev1, ev2) |] ==> distance ([[P ;; Q]]F ev1, [[P ;; Q]]F ev2) ≤ alpha * distance (ev1, ev2)
lemma Seq_compo_evalF_map_alpha:
[| map_alpha [[P]]T alpha; map_alpha [[P]]F alpha; map_alpha [[Q]]F alpha |] ==> map_alpha [[P ;; Q]]F alpha
lemma Seq_compo_evalF_non_expanding:
[| non_expanding [[P]]T; non_expanding [[P]]F; non_expanding [[Q]]F |] ==> non_expanding [[P ;; Q]]F
lemma Seq_compo_evalF_contraction_alpha:
[| contraction_alpha [[P]]T alpha; contraction_alpha [[P]]F alpha; contraction_alpha [[Q]]F alpha |] ==> contraction_alpha [[P ;; Q]]F alpha