(*-------------------------------------------*
| CSP-Prover |
| December 2004 |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory Parallel = CSP_semantics:
(* The following simplification rules are deleted in this theory file *)
(* because they unexpectly rewrite (notick | t = []t) *)
(* *)
(* 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]
(*********************************************************
DomT
*********************************************************)
(*** Parallel_domT ***)
lemma Parallel_domT :
"{u. EX s t. u : s |[X]|tr t & s :t [[P]]T ev & t :t [[Q]]T ev} : domT"
apply (simp add: domT_def HC_T1_def)
apply (rule conjI)
apply (rule_tac x="[]t" in exI, simp)
(* prefix closed *)
apply (simp add: prefix_closed_def)
apply (intro allI impI)
apply (elim conjE exE)
apply (erule par_tr_prefixE, simp)
apply (rule_tac x="s'" in exI)
apply (rule_tac x="t'" in exI)
apply (simp)
apply (rule conjI)
by (rule memT_prefix_closed, simp_all)+
(*** Parallel_memT ***)
lemma Parallel_memT:
"(u :t [[P |[X]| Q]]T ev) =
(EX s t. u : s |[X]|tr t & s :t [[P]]T ev & t :t [[Q]]T ev)"
apply (simp add: evalT_def)
by (simp add: memT_def Abs_domT_inverse Parallel_domT[simplified memT_def])
(*********************************************************
DomF
*********************************************************)
(*** Parallel_domF ***)
lemma Parallel_domF :
"{f. EX u Y Z. f = (u, Y Un Z) & Y-((Ev`X) Un {Tick})= Z-((Ev`X) Un {Tick}) &
(EX s t. u : s |[X]|tr t & (s,Y) :f [[P]]F ev & (t,Z) :f [[Q]]F ev)}: domF"
apply (simp add: domF_def HC_F2_def)
apply (intro allI impI)
apply (elim conjE exE, simp)
apply (rename_tac u Y Z Y1 Y2 s t)
apply (rule_tac x="Z Int (Y1 - (Y2 - insert Tick (Ev ` X))) Un
Z Int (Y2 - insert Tick (Ev ` X))" in exI)
apply (rule_tac x="Z Int (Y2 - (Y2 - insert Tick (Ev ` X))) Un
Z Int (Y2 - insert Tick (Ev ` X))" in exI)
(* (s,Y), Z <= Y, Y = Y1 Un Y2, Z = Z1 Un Z2 *)
apply (rule conjI, force)
apply (rule conjI, force)
apply (rule_tac x="s" in exI)
apply (rule_tac x="t" in exI)
apply (simp)
apply (rule conjI)
apply (rule memF_F2, simp, force)+
done
lemma Parallel_memF:
"(f :f [[P |[X]| Q]]F ev) =
(EX u Y Z. f = (u, Y Un Z) & Y-((Ev`X) Un {Tick})= Z-((Ev`X) Un {Tick}) &
(EX s t. u : s |[X]|tr t & (s,Y) :f [[P]]F ev & (t,Z) :f [[Q]]F ev))"
apply (simp only: evalF_def)
apply (simp only: memF_def Abs_domF_inverse Parallel_domF[simplified memF_def])
by (simp)
lemmas Parallel_mem = Parallel_memT Parallel_memF
(*********************************************************
domSF
*********************************************************)
(*** T2 ***)
lemma Parallel_T2 :
"[| ([[P]]T ev, [[P]]F ev) : domSF ; ([[Q]]T ev, [[Q]]F ev) : domSF |]
==> HC_T2 ([[P |[X]| Q]]T ev, [[P |[X]| Q]]F ev)"
apply (simp add: HC_T2_def Parallel_mem)
apply (intro allI impI)
apply (elim conjE exE)
apply (rule_tac x="sa" in exI)
apply (rule_tac x="t" in exI)
apply (simp)
apply (simp add: domSF_def HC_T2_def)
apply (elim conjE)
apply (drule_tac x="sa" in spec)
apply (drule_tac x="t" in spec)
apply (drule mp, rule_tac x="Y" in exI, simp)
apply (drule mp, rule_tac x="Z" in exI, simp)
by (simp)
(*** F3 ***)
lemma Parallel_F3_lm1: "X1 Un (X2 Un X3) - X = (X1 - X) Un (X2 - X) Un (X3 - X)"
by (auto)
lemma Parallel_F3_lm2: "[| X1 = X2 ; Y1 = Y2 |] ==> X1 Un Y1 = X2 Un Y2"
by (auto)
lemma Parallel_F3 :
"[| ([[P]]T ev, [[P]]F ev) : domSF ; ([[Q]]T ev, [[Q]]F ev) : domSF |]
==> HC_F3 ([[P |[X]| Q]]T ev, [[P |[X]| Q]]F ev)"
apply (simp add: HC_F3_def Parallel_mem)
apply (intro allI impI)
apply (elim conjE exE)
apply (rename_tac u X12 Y X1 X2 s t)
(* (u, X12) :f [[P |[X]| Q]]F ev *)
(* (s, X1) :f [[P]]F ev *)
(* (t, X2) :f [[Q]]F ev *)
(* X12 = X1 Un X2 *)
apply (rule_tac x=
"X1 Un
({a. a : Y & (a = Tick | a : Ev ` X) & s @t [a]t ~:t [[P]]T ev} Un
{a. a : Y & a ~= Tick & a ~: Ev ` X})" in exI) (* Z1 *)
apply (rule_tac x=
"X2 Un
({a. a : Y & (a = Tick | a : Ev ` X) & t @t [a]t ~:t [[Q]]T ev} Un
{a. a : Y & a ~= Tick & a ~: Ev ` X})" in exI) (* Z2 *)
apply (subgoal_tac "notick s & notick t", simp)
apply (rule conjI)
(* show X12 Un Y = X1 Un Z1 Un Z2 *)
apply (rule equalityI)
(* <= *)
apply (rule subsetI, simp)
apply (erule disjE, simp)
apply (erule disjE, simp)
apply (simp)
apply (drule_tac x="x" in spec, simp)
apply (drule_tac x="s @t [x]t" in spec)
apply (drule_tac x="t @t [x]t" in spec)
(* no sync *)
apply (case_tac "x ~= Tick & x ~: Ev ` X", simp)
(* sync *)
apply (simp add: par_tr_last)
apply (erule disjE, simp)
apply (rotate_tac -1)
apply (erule disjE, simp)
apply (simp)
(* => *)
apply (force)
apply (rule conjI)
(* show X1 Un ... = X2 Un ... *)
apply (simp add: Parallel_F3_lm1)
apply (rule Parallel_F3_lm2)
apply (rule Parallel_F3_lm2)
apply (simp)
apply (force)
apply (simp)
(* condition 2 *)
apply (rule_tac x="s" in exI)
apply (rule_tac x="t" in exI)
apply (simp)
apply (simp add: domSF_def HC_F3_def)
apply (elim conjE)
apply (drule_tac x="s" in spec)
apply (drule_tac x="t" in spec)
apply (drule_tac x="X1" in spec)
apply (drule_tac x="X2" in spec)
apply (drule_tac x="{a. a : Y & (a = Tick | a : Ev ` X) & s @t [a]t ~:t [[P]]T ev} Un
{a. a : Y & a ~= Tick & a ~: Ev ` X}" in spec)
apply (drule_tac x="{a. a : Y & (a = Tick | a : Ev ` X) & t @t [a]t ~:t [[Q]]T ev} Un
{a. a : Y & a ~= Tick & a ~: Ev ` X}" in spec)
apply (simp)
(* left *)
apply (drule mp)
apply (intro allI impI)
apply (drule_tac x="a" in spec, simp)
apply (drule_tac x="s @t [a]t" in spec)
apply (drule_tac x="t" in spec)
apply (erule disjE)
apply (simp add: par_tr_last)
apply (erule disjE, simp)
apply (simp add: HC_T2_def)
apply (drule_tac x="s" in spec)
apply (drule_tac x="t" in spec)
apply (force)
(* right *)
apply (drule mp)
apply (intro allI impI)
apply (drule_tac x="a" in spec, simp)
apply (drule_tac x="s" in spec)
apply (drule_tac x="t @t [a]t" in spec)
apply (erule disjE)
apply (simp add: par_tr_last)
apply (erule disjE)
apply (simp add: HC_T2_def)
apply (drule_tac x="s" in spec)
apply (drule_tac x="t" in spec)
apply (force)
apply (simp)
apply (simp)
(* notick s & notick t *)
apply (rule conjI)
apply (rule par_tr_notick_left, simp_all)
apply (rule par_tr_notick_right, simp_all)
done
(* T3_F4 *)
lemma Parallel_T3_F4 :
"[| ([[P]]T ev, [[P]]F ev) : domSF ; ([[Q]]T ev, [[Q]]F ev) : domSF |]
==> HC_T3_F4 ([[P |[X]| Q]]T ev, [[P |[X]| Q]]F ev)"
apply (simp add: HC_T3_F4_def Parallel_mem)
apply (intro allI impI)
apply (simp add: par_tr_last)
apply (elim conjE exE)
apply (rule conjI)
(* F4 *)
apply (rule_tac x="Evset" in exI)
apply (rule_tac x="Evset" in exI)
apply (simp)
apply (rule_tac x="s'" in exI)
apply (rule_tac x="t'" in exI)
apply (simp add: domSF_def HC_F4_def)
(* T3 *)
apply (rule allI)
apply (rule_tac x="Xa" in exI)
apply (rule_tac x="Xa" in exI)
apply (simp)
apply (rule_tac x="sa" in exI)
apply (rule_tac x="t" in exI)
apply (simp add: domSF_def HC_T3_def)
done
(*** Parallel_domSF ***)
lemma Parallel_domSF :
"[| ([[P]]T ev, [[P]]F ev) : domSF ; ([[Q]]T ev, [[Q]]F ev) : domSF |]
==> ([[P |[X]| Q]]T ev, [[P |[X]| Q]]F ev) : domSF"
apply (simp (no_asm) add: domSF_iff)
apply (simp add: Parallel_T2)
apply (simp add: Parallel_F3)
apply (simp add: Parallel_T3_F4)
done
(*********************************************************
mono
*********************************************************)
(*** T ***)
lemma Parallel_evalT_mono:
"[| [[P1]]T ev1 <= [[P2]]T ev2 ; [[Q1]]T ev1 <= [[Q2]]T ev2 |]
==> [[P1 |[X]| Q1]]T ev1 <= [[P2 |[X]| Q2]]T ev2"
apply (simp add: subsetT_iff)
apply (intro allI impI)
apply (simp add: Parallel_memT)
apply (elim conjE exE)
apply (rule_tac x="s" in exI)
apply (rule_tac x="ta" in exI)
by (simp_all)
(*** F ***)
lemma Parallel_evalF_mono:
"[| [[P1]]F ev1 <= [[P2]]F ev2 ; [[Q1]]F ev1 <= [[Q2]]F ev2 |]
==> [[P1 |[X]| Q1]]F ev1 <= [[P2 |[X]| Q2]]F ev2"
apply (simp add: subsetF_iff)
apply (intro allI impI)
apply (simp add: Parallel_memF)
apply (elim conjE exE)
apply (rule_tac x="Y" in exI)
apply (rule_tac x="Z" in exI)
apply (simp)
apply (rule_tac x="sa" in exI)
apply (rule_tac x="t" in exI)
by (simp_all)
(****************** to add it again ******************)
declare disj_not1 [simp]
declare not_None_eq [simp]
end
lemma Parallel_domT:
{u. ∃s t. u ∈ s |[X]|tr t ∧ s :t [[P]]T ev ∧ t :t [[Q]]T ev} ∈ domT
lemma Parallel_memT:
(u :t [[P |[X]| Q]]T ev) = (∃s t. u ∈ s |[X]|tr t ∧ s :t [[P]]T ev ∧ t :t [[Q]]T ev)
lemma Parallel_domF:
{(u, Y ∪ Z) |u Y Z.
Y - (Ev ` X ∪ {Tick}) = Z - (Ev ` X ∪ {Tick}) ∧
(∃s t. u ∈ s |[X]|tr t ∧ (s, Y) :f [[P]]F ev ∧ (t, Z) :f [[Q]]F ev)}
∈ domF
lemma Parallel_memF:
(f :f [[P |[X]| Q]]F ev) = (∃u Y Z. f = (u, Y ∪ Z) ∧ Y - (Ev ` X ∪ {Tick}) = Z - (Ev ` X ∪ {Tick}) ∧ (∃s t. u ∈ s |[X]|tr t ∧ (s, Y) :f [[P]]F ev ∧ (t, Z) :f [[Q]]F ev))
lemmas Parallel_mem:
(u :t [[P |[X]| Q]]T ev) = (∃s t. u ∈ s |[X]|tr t ∧ s :t [[P]]T ev ∧ t :t [[Q]]T ev)
(f :f [[P |[X]| Q]]F ev) = (∃u Y Z. f = (u, Y ∪ Z) ∧ Y - (Ev ` X ∪ {Tick}) = Z - (Ev ` X ∪ {Tick}) ∧ (∃s t. u ∈ s |[X]|tr t ∧ (s, Y) :f [[P]]F ev ∧ (t, Z) :f [[Q]]F ev))
lemma Parallel_T2:
[| ([[P]]T ev, [[P]]F ev) ∈ domSF; ([[Q]]T ev, [[Q]]F ev) ∈ domSF |] ==> HC_T2 ([[P |[X]| Q]]T ev, [[P |[X]| Q]]F ev)
lemma Parallel_F3_lm1:
X1 ∪ (X2 ∪ X3) - X = X1 - X ∪ (X2 - X) ∪ (X3 - X)
lemma Parallel_F3_lm2:
[| X1 = X2; Y1 = Y2 |] ==> X1 ∪ Y1 = X2 ∪ Y2
lemma Parallel_F3:
[| ([[P]]T ev, [[P]]F ev) ∈ domSF; ([[Q]]T ev, [[Q]]F ev) ∈ domSF |] ==> HC_F3 ([[P |[X]| Q]]T ev, [[P |[X]| Q]]F ev)
lemma Parallel_T3_F4:
[| ([[P]]T ev, [[P]]F ev) ∈ domSF; ([[Q]]T ev, [[Q]]F ev) ∈ domSF |] ==> HC_T3_F4 ([[P |[X]| Q]]T ev, [[P |[X]| Q]]F ev)
lemma Parallel_domSF:
[| ([[P]]T ev, [[P]]F ev) ∈ domSF; ([[Q]]T ev, [[Q]]F ev) ∈ domSF |] ==> ([[P |[X]| Q]]T ev, [[P |[X]| Q]]F ev) ∈ domSF
lemma Parallel_evalT_mono:
[| [[P1]]T ev1 ≤ [[P2]]T ev2; [[Q1]]T ev1 ≤ [[Q2]]T ev2 |] ==> [[P1 |[X]| Q1]]T ev1 ≤ [[P2 |[X]| Q2]]T ev2
lemma Parallel_evalF_mono:
[| [[P1]]F ev1 ≤ [[P2]]F ev2; [[Q1]]F ev1 ≤ [[Q2]]F ev2 |] ==> [[P1 |[X]| Q1]]F ev1 ≤ [[P2 |[X]| Q2]]F ev2