Up to index of Isabelle/HOL/HOL-Complex/CSP/CSP_T/CSP_F
theory CSP_F_semantics (*-------------------------------------------*
| CSP-Prover on Isabelle2004 |
| December 2004 |
| August 2005 (modified) |
| |
| CSP-Prover on Isabelle2005 |
| October 2005 (modified) |
| April 2006 (modified) |
| March 2007 (modified) |
| August 2007 (modified) |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory CSP_F_semantics
imports CSP_T_semantics Domain_F_cms
begin
(*****************************************************************
1. semantic clause
2.
3.
4.
*****************************************************************)
(*********************************************************
semantic clause
*********************************************************)
consts
failures :: "('p,'a) proc => ('p => 'a domF) => 'a setF"
primrec
"failures(STOP) = (%M. {f. EX X. f = (<>, X) }f)"
"failures(SKIP) = (%M. {f. (EX X. f = (<>, X) & X <= Evset) |
(EX X. f = (<Tick>, X)) }f)"
"failures(DIV) = (%M. {}f)"
"failures(a -> P) = (%M. {f. (EX X. f = (<>,X) & Ev a ~: X) |
(EX s X. f = (<Ev a> ^^ s, X) & (s,X) :f failures(P) M ) }f)"
"failures(? :X -> Pf) = (%M. {f. (EX Y. f = (<>,Y) & Ev`X Int Y = {}) |
(EX a s Y. f = (<Ev a> ^^ s, Y) &
(s,Y) :f failures(Pf a) M & a : X) }f)"
"failures(P [+] Q) = (%M. {f.
(EX X. f = (<>,X) & f :f failures(P) M IntF failures(Q) M) |
(EX s X. f = (s,X) & f :f failures(P) M UnF failures(Q) M & s ~= <>) |
(EX X. f = (<>,X) & <Tick> :t traces(P) (fstF o M) UnT
traces(Q) (fstF o M) & X <= Evset) }f)"
"failures(P |~| Q) = (%M. failures(P) M UnF failures(Q) M)"
"failures(!! :C .. Pf) = (%M. {f. EX c: sumset C. f :f failures(Pf c) M}f)"
"failures(IF b THEN P ELSE Q) = (%M. if b then failures(P) M else failures(Q) M)"
"failures(P |[X]| Q) = (%M. {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 failures(P) M & (t,Z) :f failures(Q) M) }f)"
"failures(P -- X) = (%M. {f.
EX s Y. f = (s --tr X, Y) & (s,(Ev`X) Un Y) :f failures(P) M}f)"
"failures(P [[r]]) = (%M. {f.
EX s t X. f = (t,X) & s [[r]]* t & (s, [[r]]inv X) :f failures(P) M }f)"
"failures(P ;; Q) = (%M. {f.
(EX t X. f = (t,X) & (t, X Un {Tick}) :f failures(P) M & noTick t) |
(EX s t X. f = (s ^^ t,X) & s ^^ <Tick> :t traces(P) (fstF o M) &
(t, X) :f failures(Q) M & noTick s) }f)"
"failures(P |. n) = (%M. failures(P) M .|. n)"
"failures($p) = (%M. sndF (M p))"
declare failures.simps [simp del]
(*** for dealing with both !nat and !set ***)
lemma failures_inv_inj[simp]:
"inj g ==> (EX c. (EX n. c = g n & n : N) & f :f failures (Pf (inv g c)) x)
= (EX z:N. f :f failures (Pf z) x)"
by (auto)
lemma Rep_int_choice_failures_nat:
"failures(!nat :N .. Pf) = (%M. {f. EX n:N. f :f failures(Pf n) M}f)"
apply (simp add: Rep_int_choice_ss_def)
apply (simp add: failures.simps)
done
lemma Rep_int_choice_failures_set:
"failures(!set :Xs .. Pf) = (%M. {f. EX X:Xs. f :f failures(Pf X) M}f)"
apply (simp add: Rep_int_choice_ss_def)
apply (simp add: failures.simps)
done
lemma Rep_int_choice_failures_com_lm:
"(EX z. (EX a. z = {a} & a : X) & f :f failures (Pf (contents z)) M)
= (EX a:X. f :f failures (Pf a) M)"
apply (auto)
apply (rule_tac x="{a}" in exI)
apply (auto)
done
lemma Rep_int_choice_failures_com:
"failures(! :X .. Pf) = (%M. {f. EX a:X. f :f failures(Pf a) M}f)"
apply (simp add: Rep_int_choice_com_def)
apply (simp add: Rep_int_choice_failures_set)
apply (simp add: Rep_int_choice_failures_com_lm)
done
lemma Rep_int_choice_failures_f:
"inj g ==> failures(!<g> :X .. Pf) =
(%M. {f. EX a:X. f :f failures(Pf a) M}f)"
apply (simp add: Rep_int_choice_f_def)
apply (simp add: Rep_int_choice_failures_com)
done
lemmas Rep_int_choice_failures =
Rep_int_choice_failures_nat
Rep_int_choice_failures_set
Rep_int_choice_failures_com
Rep_int_choice_failures_f
lemmas failures_def = failures.simps Rep_int_choice_failures
(*********************************************************
semantics
*********************************************************)
consts
semFf :: "('p,'a) proc => ('p => 'a domF) => 'a domF" ("[[_]]Ff")
semFfun :: "('p => ('p,'a) proc) => ('p => 'a domF) => ('p => 'a domF)"
("[[_]]Ffun")
defs
semFf_def : "[[P]]Ff == (%M. (traces(P) (fstF o M) ,, failures(P) M))"
semFfun_def: "[[Pf]]Ffun == (%M. %p. [[Pf p]]Ff M)"
syntax (output)
"_semFf" :: "('p,'a) proc => ('p => 'a domF) => 'a domF" ("[[_]]Ff")
"_semFfun" :: "('p => ('p,'a) proc) => ('p => 'a domF) => ('p => 'a domF)"
("[[_]]Ffun")
syntax (xsymbols)
"_semFf" :: "('p,'a) proc => ('p => 'a domF) => 'a domF"
("[|_|]Ff")
"_semFfun" :: "('p => ('p,'a) proc) => ('p => 'a domF) => ('p => 'a domF)"
("[|_|]Ffun")
translations
"[|P|]Ff" == "[[P]]Ff"
"[|P|]Ffun" == "[[P]]Ffun"
(*** relation ***)
lemma semFf_semFfun:
"(%p. [[Pf p]]Ff M) = [[Pf]]Ffun M"
by (simp add: semFfun_def semFf_def)
(*------------------------------------------------------------------*
M such that [[p]]Ff M = [[PNfun(p)]]Ff M
such M is the fixed point of the function [[PNfun(p)]]Ffun
*------------------------------------------------------------------*)
consts
semFfix :: "('p => ('p,'a) proc) => ('p => 'a domF)" ("[[_]]Ffix")
defs
semFfix_def :
"[[Pf]]Ffix == (if (FPmode = CMSmode) then (UFP ([[Pf]]Ffun))
else (LFP ([[Pf]]Ffun)))"
syntax (output)
"_semFfix" :: "('p => ('p,'a) proc) => ('p => 'a domF)" ("[[_]]Ffix")
syntax (xsymbols)
"_semFfix" :: "('p => ('p,'a) proc) => ('p => 'a domF)"
("[|_|]Ffix")
translations
"[|Pf|]Ffix" == "[[Pf]]Ffix"
consts
MF :: "('p => 'a domF)"
defs
MF_def : "MF == [[PNfun]]Ffix"
(*** semantics ***)
consts
semF :: "('p,'a) proc => 'a domF" ("[[_]]F")
defs
semF_def : "[[P]]F == [[P]]Ff MF"
syntax (output)
"_semF" :: "('p,'a) proc => 'a domF" ("[[_]]F")
syntax (xsymbols)
"_semF" :: "('p,'a) proc => 'a domF"
("[|_|]F")
translations
"[|P|]F" == "[[P]]F"
(*********************************************************
relations over processes
*********************************************************)
consts
refF :: "('p,'a) proc => ('p => 'a domF) =>
('q => 'a domF) => ('q,'a) proc => bool"
("(0_ /<=F[_,_] /_)" [51,0,0,50] 50)
eqF :: "('p,'a) proc => ('p => 'a domF) =>
('q => 'a domF) => ('q,'a) proc => bool"
("(0_ /=F[_,_] /_)" [51,0,0,50] 50)
defs
refF_def : "P1 <=F[M1,M2] P2 == [[P2]]Ff M2 <= [[P1]]Ff M1"
eqF_def : "P1 =F[M1,M2] P2 == [[P1]]Ff M1 = [[P2]]Ff M2"
(*------------------------------------*
| X-Symbols |
*------------------------------------*)
syntax (output)
"_refFMX" :: "('p,'a) proc => ('p => 'a domF) =>
('q => 'a domF) => ('q,'a) proc => bool"
("(0_ /<=F[_,_] /_)" [51,0,0,50] 50)
syntax (xsymbols)
"_refFMX" :: "('p,'a) proc => ('p => 'a domF) =>
('q => 'a domF) => ('q,'a) proc => bool"
("(0_ /\<sqsubseteq>F[_,_] /_)" [51,0,0,50] 50)
translations
"P \<sqsubseteq>F[M1,M2] Q" == "P <=F[M1,M2] Q"
(*********************************************************
relations over processes (fixed point)
*********************************************************)
syntax
"_refFfix" :: "('p,'a) proc => ('q,'a) proc => bool"
("(0_ /<=F /_)" [51,50] 50)
"_eqFfix" :: "('p,'a) proc => ('q,'a) proc => bool"
("(0_ /=F /_)" [51,50] 50)
translations
"P1 <=F P2" == "P1 <=F[MF,MF] P2"
"P1 =F P2" == "P1 =F[MF,MF] P2"
(* =F and <=F *)
lemma refF_semF: "(P1 <=F P2) = ([[P2]]F <= [[P1]]F)"
apply (simp add: refF_def)
apply (simp add: semF_def)
done
lemma eqF_semF: "(P1 =F P2) = ([[P1]]F = [[P2]]F)"
apply (simp add: eqF_def)
apply (simp add: semF_def)
done
(*------------------------------------*
| X-Symbols |
*------------------------------------*)
syntax (output)
"_refFX" :: "('p,'a) proc => ('p,'a) proc => bool"
("(0_ /<=F /_)" [51,50] 50)
syntax (xsymbols)
"_refFX" :: "('p,'a) proc => ('p,'a) proc => bool"
("(0_ /\<sqsubseteq>F /_)" [51,50] 50)
translations
"P \<sqsubseteq>F Q" == "P <=F Q"
(*------------------*
| csp law |
*------------------*)
(*** eq and ref ***)
lemma cspF_eq_ref_iff:
"(P1 =F[M1,M2] P2) = (P1 <=F[M1,M2] P2 & P2 <=F[M2,M1] P1)"
by (auto simp add: refF_def eqF_def)
lemma cspF_eq_ref:
"P1 =F[M1,M2] P2 ==> P1 <=F[M1,M2] P2"
by (simp add: cspF_eq_ref_iff)
lemma cspF_ref_eq:
"[| P1 <=F[M1,M2] P2 ; P2 <=F[M2,M1] P1 |] ==> P1 =F[M1,M2] P2"
by (simp add: cspF_eq_ref_iff)
(*** reflexivity ***)
lemma cspF_reflex_eq_P[simp]: "P =F[M,M] P"
by (simp add: eqF_def)
lemma cspF_reflex_eq_STOP[simp]: "STOP =F[M1,M2] STOP"
by (simp add: eqF_def semFf_def traces_def failures_def)
lemma cspF_reflex_eq_SKIP[simp]: "SKIP =F[M1,M2] SKIP"
by (simp add: eqF_def semFf_def traces_def failures_def)
lemma cspF_reflex_eq_DIV[simp]: "DIV =F[M1,M2] DIV"
by (simp add: eqF_def semFf_def traces_def failures_def)
lemmas cspF_reflex_eq = cspF_reflex_eq_P
cspF_reflex_eq_STOP
cspF_reflex_eq_SKIP
cspF_reflex_eq_DIV
lemma cspF_reflex_ref_P[simp]: "P <=F[M,M] P"
by (simp add: refF_def)
lemma cspF_reflex_ref_STOP[simp]: "STOP <=F[M1,M2] STOP"
by (simp add: refF_def semFf_def traces_def failures_def)
lemma cspF_reflex_ref_SKIP[simp]: "SKIP <=F[M1,M2] SKIP"
by (simp add: refF_def semFf_def traces_def failures_def)
lemma cspF_reflex_ref_DIV[simp]: "DIV <=F[M1,M2] DIV"
by (simp add: refF_def semFf_def traces_def failures_def)
lemmas cspF_reflex_ref = cspF_reflex_ref_P
cspF_reflex_ref_STOP
cspF_reflex_ref_SKIP
cspF_reflex_ref_DIV
lemmas cspF_reflex = cspF_reflex_eq cspF_reflex_ref
(*** symmetry ***)
lemma cspF_sym: "P1 =F[M1,M2] P2 ==> P2 =F[M2,M1] P1"
by (simp add: eqF_def)
lemma cspF_symE:
"[| P1 =F[M1,M2] P2 ; P2 =F[M2,M1] P1 ==> Z |] ==> Z"
by (simp add: eqF_def)
(*** transitivity ***)
lemma cspF_trans_left_eq:
"[| P1 =F[M1,M2] P2 ; P2 =F[M2,M3] P3 |] ==> P1 =F[M1,M3] P3"
by (simp add: eqF_def)
lemma cspF_trans_left_ref:
"[| P1 <=F[M1,M2] P2 ; P2 <=F[M2,M3] P3 |] ==> P1 <=F[M1,M3] P3"
by (simp add: refF_def)
lemmas cspF_trans_left = cspF_trans_left_eq cspF_trans_left_ref
lemmas cspF_trans = cspF_trans_left
lemma cspF_trans_right_eq:
"[| P2 =F[M2,M3] P3 ; P1 =F[M1,M2] P2 |] ==> P1 =F[M1,M3] P3"
by (simp add: eqF_def)
lemma cspF_trans_right_ref:
"[| P2 <=F[M2,M3] P3 ; P1 <=F[M1,M2] P2 |] ==> P1 <=F[M1,M3] P3"
by (simp add: refF_def)
lemmas cspF_trans_rught = cspF_trans_right_eq cspF_trans_right_ref
(*** rewrite (eq) ***)
lemma cspF_rw_left_eq_MF:
"[| P1 =F P2 ; P2 =F P3 |] ==> P1 =F P3"
by (simp add: eqF_def)
lemma cspF_rw_left_eq:
"[| P1 =F[M1,M1] P2 ; P2 =F[M1,M3] P3 |] ==> P1 =F[M1,M3] P3"
by (simp add: eqF_def)
lemma cspF_rw_left_ref_MF:
"[| P1 =F P2 ; P2 <=F P3 |] ==> P1 <=F P3"
by (simp add: refF_def eqF_def)
lemma cspF_rw_left_ref:
"[| P1 =F[M1,M1] P2 ; P2 <=F[M1,M3] P3 |] ==> P1 <=F[M1,M3] P3"
by (simp add: refF_def eqF_def)
lemmas cspF_rw_left =
cspF_rw_left_eq_MF cspF_rw_left_ref_MF
cspF_rw_left_eq cspF_rw_left_ref
lemma cspF_rw_right_eq:
"[| P3 =F[M3,M3] P2 ; P1 =F[M1,M3] P2 |] ==> P1 =F[M1,M3] P3"
by (simp add: eqF_def)
lemma cspF_rw_right_eq_MF:
"[| P3 =F P2 ; P1 =F P2 |] ==> P1 =F P3"
by (simp add: eqF_def)
lemma cspF_rw_right_ref:
"[| P3 =F[M3,M3] P2 ; P1 <=F[M1,M3] P2 |] ==> P1 <=F[M1,M3] P3"
by (simp add: refF_def eqF_def)
lemma cspF_rw_right_ref_MF:
"[| P3 =F P2 ; P1 <=F P2 |] ==> P1 <=F P3"
by (simp add: refF_def eqF_def)
lemmas cspF_rw_right =
cspF_rw_right_eq_MF cspF_rw_right_ref_MF
cspF_rw_right_eq cspF_rw_right_ref
(*** rewrite (ref) ***)
lemma cspF_tr_left_eq:
"[| P1 =F[M1,M1] P2 ; P2 =F[M1,M3] P3 |] ==> P1 =F[M1,M3] P3"
by (simp add: eqF_def)
lemma cspF_tr_left_ref:
"[| P1 <=F[M1,M1] P2 ; P2 <=F[M1,M3] P3 |] ==> P1 <=F[M1,M3] P3"
by (simp add: refF_def eqF_def)
lemmas cspF_tr_left = cspF_tr_left_eq cspF_tr_left_ref
lemma cspF_tr_right_eq:
"[| P2 =F[M3,M3] P3 ; P1 =F[M1,M3] P2 |] ==> P1 =F[M1,M3] P3"
by (simp add: eqF_def)
lemma cspF_tr_right_ref:
"[| P2 <=F[M3,M3] P3 ; P1 <=F[M1,M3] P2 |] ==> P1 <=F[M1,M3] P3"
by (simp add: refF_def eqF_def)
lemmas cspF_tr_right = cspF_tr_right_eq cspF_tr_right_ref
(*-----------------------------------------*
| noPN |
*-----------------------------------------*)
lemma failures_noPN_Constant_lm:
"noPN P --> (EX F. failures P = (%M. F))"
apply (induct_tac P)
apply (simp add: failures_def, force)
apply (simp add: failures_def, force)
apply (simp add: failures_def, force)
apply (simp add: failures_def, force)
(* Ext_pre_choice *)
apply (intro impI)
apply (simp)
apply (subgoal_tac "ALL x. EX F. failures (fun x) = (%M. F)")
apply (simp add: choice_ALL_EX)
apply (erule exE)
apply (simp add: failures_def)
apply (force)
apply (simp)
(* Ext_choice *)
apply (intro impI)
apply (simp)
apply (elim exE)
apply (simp add: failures_def)
apply (subgoal_tac "ALL P. noPN P --> (EX T. traces P = (%M. T))")
apply (frule_tac x="proc1" in spec)
apply (drule_tac x="proc2" in spec)
apply (simp)
apply (elim exE)
apply (simp)
apply (force)
apply (simp add: traces_noPN_Constant)
apply (simp add: failures_def, force)
(* Rep_int_choice_nat *)
apply (intro impI)
apply (simp)
apply (subgoal_tac "ALL x. EX F. failures (fun x) = (%M. F)")
apply (simp add: choice_ALL_EX)
apply (erule exE)
apply (simp add: failures_def)
apply (force)
apply (simp)
(* IF *)
apply (simp add: failures_def)
apply (case_tac "bool")
apply (simp)
apply (simp)
apply (simp add: failures_def, force)
apply (simp add: failures_def, force)
apply (simp add: failures_def, force)
(* Seq_comp *)
apply (intro impI)
apply (simp)
apply (elim exE)
apply (simp add: failures_def)
apply (subgoal_tac "ALL P. noPN P --> (EX T. traces P = (%M. T))")
apply (drule_tac x="proc1" in spec)
apply (simp)
apply (elim exE)
apply (simp)
apply (force)
apply (simp add: traces_noPN_Constant)
apply (simp add: failures_def, force)
apply (simp add: failures_def)
done
lemma failures_noPN_Constant:
"noPN P ==> (EX F. failures P = (%M. F))"
apply (simp add: failures_noPN_Constant_lm)
done
end
lemma failures_inv_inj:
inj g ==> (∃c. (∃n. c = g n ∧ n ∈ N) ∧ f :f failures (Pf (inv g c)) x) = (∃z∈N. f :f failures (Pf z) x)
lemma Rep_int_choice_failures_nat:
failures (!nat :N .. Pf) = (%M. {f. ∃n∈N. f :f failures (Pf n) M}f)
lemma Rep_int_choice_failures_set:
failures (!set :Xs .. Pf) = (%M. {f. ∃X∈Xs. f :f failures (Pf X) M}f)
lemma Rep_int_choice_failures_com_lm:
(∃z. (∃a. z = {a} ∧ a ∈ X) ∧ f :f failures (Pf (contents z)) M) = (∃a∈X. f :f failures (Pf a) M)
lemma Rep_int_choice_failures_com:
failures (! :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
lemma Rep_int_choice_failures_f:
inj g ==> failures (!<g> :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
lemmas Rep_int_choice_failures:
failures (!nat :N .. Pf) = (%M. {f. ∃n∈N. f :f failures (Pf n) M}f)
failures (!set :Xs .. Pf) = (%M. {f. ∃X∈Xs. f :f failures (Pf X) M}f)
failures (! :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
inj g ==> failures (!<g> :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
lemmas Rep_int_choice_failures:
failures (!nat :N .. Pf) = (%M. {f. ∃n∈N. f :f failures (Pf n) M}f)
failures (!set :Xs .. Pf) = (%M. {f. ∃X∈Xs. f :f failures (Pf X) M}f)
failures (! :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
inj g ==> failures (!<g> :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
lemmas failures_def:
failures STOP = (%M. {f. ∃X. f = (<>, X)}f)
failures SKIP = (%M. {f. (∃X. f = (<>, X) ∧ X ⊆ Evset) ∨ (∃X. f = (<Tick>, X))}f)
failures DIV = (%M. {}f)
failures (a -> P) = (%M. {f. (∃X. f = (<>, X) ∧ Ev a ∉ X) ∨ (∃s X. f = (<Ev a> ^^ s, X) ∧ (s, X) :f failures P M)}f)
failures (? :X -> Pf) = (%M. {f. (∃Y. f = (<>, Y) ∧ Ev ` X ∩ Y = {}) ∨ (∃a s Y. f = (<Ev a> ^^ s, Y) ∧ (s, Y) :f failures (Pf a) M ∧ a ∈ X)}f)
failures (P [+] Q) = (%M. {f. (∃X. f = (<>, X) ∧ f :f failures P M IntF failures Q M) ∨ (∃s X. f = (s, X) ∧ f :f failures P M UnF failures Q M ∧ s ≠ <>) ∨ (∃X. f = (<>, X) ∧ <Tick> :t traces P (fstF o M) UnT traces Q (fstF o M) ∧ X ⊆ Evset)}f)
failures (P |~| Q) = (%M. failures P M UnF failures Q M)
failures (!! :C .. Pf) = (%M. {f. ∃c∈sumset C. f :f failures (Pf c) M}f)
failures (IF b THEN P ELSE Q) = (%M. if b then failures P M else failures Q M)
failures (P |[X]| Q) = (%M. Abs_setF {(u, Y ∪ Z) |u Y Z. Y - (Ev ` X ∪ {Tick}) = Z - (Ev ` X ∪ {Tick}) ∧ (∃s t. u ∈ s |[X]|tr t ∧ (s, Y) :f failures P M ∧ (t, Z) :f failures Q M)})
failures (P -- X) = (%M. Abs_setF {(s --tr X, Y) |s Y. (s, Ev ` X ∪ Y) :f failures P M})
failures (P [[r]]) = (%M. {f. ∃s t X. f = (t, X) ∧ s [[r]]* t ∧ (s, [[r]]inv X) :f failures P M}f)
failures (P ;; Q) = (%M. {f. (∃t X. f = (t, X) ∧ (t, X ∪ {Tick}) :f failures P M ∧ noTick t) ∨ (∃s t X. f = (s ^^ t, X) ∧ s ^^ <Tick> :t traces P (fstF o M) ∧ (t, X) :f failures Q M ∧ noTick s)}f)
failures (P |. n) = (%M. failures P M .|. n)
failures ($p) = (%M. sndF (M p))
failures (!nat :N .. Pf) = (%M. {f. ∃n∈N. f :f failures (Pf n) M}f)
failures (!set :Xs .. Pf) = (%M. {f. ∃X∈Xs. f :f failures (Pf X) M}f)
failures (! :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
inj g ==> failures (!<g> :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
lemmas failures_def:
failures STOP = (%M. {f. ∃X. f = (<>, X)}f)
failures SKIP = (%M. {f. (∃X. f = (<>, X) ∧ X ⊆ Evset) ∨ (∃X. f = (<Tick>, X))}f)
failures DIV = (%M. {}f)
failures (a -> P) = (%M. {f. (∃X. f = (<>, X) ∧ Ev a ∉ X) ∨ (∃s X. f = (<Ev a> ^^ s, X) ∧ (s, X) :f failures P M)}f)
failures (? :X -> Pf) = (%M. {f. (∃Y. f = (<>, Y) ∧ Ev ` X ∩ Y = {}) ∨ (∃a s Y. f = (<Ev a> ^^ s, Y) ∧ (s, Y) :f failures (Pf a) M ∧ a ∈ X)}f)
failures (P [+] Q) = (%M. {f. (∃X. f = (<>, X) ∧ f :f failures P M IntF failures Q M) ∨ (∃s X. f = (s, X) ∧ f :f failures P M UnF failures Q M ∧ s ≠ <>) ∨ (∃X. f = (<>, X) ∧ <Tick> :t traces P (fstF o M) UnT traces Q (fstF o M) ∧ X ⊆ Evset)}f)
failures (P |~| Q) = (%M. failures P M UnF failures Q M)
failures (!! :C .. Pf) = (%M. {f. ∃c∈sumset C. f :f failures (Pf c) M}f)
failures (IF b THEN P ELSE Q) = (%M. if b then failures P M else failures Q M)
failures (P |[X]| Q) = (%M. Abs_setF {(u, Y ∪ Z) |u Y Z. Y - (Ev ` X ∪ {Tick}) = Z - (Ev ` X ∪ {Tick}) ∧ (∃s t. u ∈ s |[X]|tr t ∧ (s, Y) :f failures P M ∧ (t, Z) :f failures Q M)})
failures (P -- X) = (%M. Abs_setF {(s --tr X, Y) |s Y. (s, Ev ` X ∪ Y) :f failures P M})
failures (P [[r]]) = (%M. {f. ∃s t X. f = (t, X) ∧ s [[r]]* t ∧ (s, [[r]]inv X) :f failures P M}f)
failures (P ;; Q) = (%M. {f. (∃t X. f = (t, X) ∧ (t, X ∪ {Tick}) :f failures P M ∧ noTick t) ∨ (∃s t X. f = (s ^^ t, X) ∧ s ^^ <Tick> :t traces P (fstF o M) ∧ (t, X) :f failures Q M ∧ noTick s)}f)
failures (P |. n) = (%M. failures P M .|. n)
failures ($p) = (%M. sndF (M p))
failures (!nat :N .. Pf) = (%M. {f. ∃n∈N. f :f failures (Pf n) M}f)
failures (!set :Xs .. Pf) = (%M. {f. ∃X∈Xs. f :f failures (Pf X) M}f)
failures (! :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
inj g ==> failures (!<g> :X .. Pf) = (%M. {f. ∃a∈X. f :f failures (Pf a) M}f)
lemma semFf_semFfun:
(%p. [[Pf p]]Ff M) = [[Pf]]Ffun M
lemma refF_semF:
(P1.0 <=F P2.0) = ([[P2.0]]F ≤ [[P1.0]]F)
lemma eqF_semF:
(P1.0 =F P2.0) = ([[P1.0]]F = [[P2.0]]F)
lemma cspF_eq_ref_iff:
(P1.0 =F[M1.0,M2.0] P2.0) = (P1.0 <=F[M1.0,M2.0] P2.0 ∧ P2.0 <=F[M2.0,M1.0] P1.0)
lemma cspF_eq_ref:
P1.0 =F[M1.0,M2.0] P2.0 ==> P1.0 <=F[M1.0,M2.0] P2.0
lemma cspF_ref_eq:
[| P1.0 <=F[M1.0,M2.0] P2.0; P2.0 <=F[M2.0,M1.0] P1.0 |] ==> P1.0 =F[M1.0,M2.0] P2.0
lemma cspF_reflex_eq_P:
P =F[M,M] P
lemma cspF_reflex_eq_STOP:
STOP =F[M1.0,M2.0] STOP
lemma cspF_reflex_eq_SKIP:
SKIP =F[M1.0,M2.0] SKIP
lemma cspF_reflex_eq_DIV:
DIV =F[M1.0,M2.0] DIV
lemmas cspF_reflex_eq:
P =F[M,M] P
STOP =F[M1.0,M2.0] STOP
SKIP =F[M1.0,M2.0] SKIP
DIV =F[M1.0,M2.0] DIV
lemmas cspF_reflex_eq:
P =F[M,M] P
STOP =F[M1.0,M2.0] STOP
SKIP =F[M1.0,M2.0] SKIP
DIV =F[M1.0,M2.0] DIV
lemma cspF_reflex_ref_P:
P <=F[M,M] P
lemma cspF_reflex_ref_STOP:
STOP <=F[M1.0,M2.0] STOP
lemma cspF_reflex_ref_SKIP:
SKIP <=F[M1.0,M2.0] SKIP
lemma cspF_reflex_ref_DIV:
DIV <=F[M1.0,M2.0] DIV
lemmas cspF_reflex_ref:
P <=F[M,M] P
STOP <=F[M1.0,M2.0] STOP
SKIP <=F[M1.0,M2.0] SKIP
DIV <=F[M1.0,M2.0] DIV
lemmas cspF_reflex_ref:
P <=F[M,M] P
STOP <=F[M1.0,M2.0] STOP
SKIP <=F[M1.0,M2.0] SKIP
DIV <=F[M1.0,M2.0] DIV
lemmas cspF_reflex:
P =F[M,M] P
STOP =F[M1.0,M2.0] STOP
SKIP =F[M1.0,M2.0] SKIP
DIV =F[M1.0,M2.0] DIV
P <=F[M,M] P
STOP <=F[M1.0,M2.0] STOP
SKIP <=F[M1.0,M2.0] SKIP
DIV <=F[M1.0,M2.0] DIV
lemmas cspF_reflex:
P =F[M,M] P
STOP =F[M1.0,M2.0] STOP
SKIP =F[M1.0,M2.0] SKIP
DIV =F[M1.0,M2.0] DIV
P <=F[M,M] P
STOP <=F[M1.0,M2.0] STOP
SKIP <=F[M1.0,M2.0] SKIP
DIV <=F[M1.0,M2.0] DIV
lemma cspF_sym:
P1.0 =F[M1.0,M2.0] P2.0 ==> P2.0 =F[M2.0,M1.0] P1.0
lemma cspF_symE:
[| P1.0 =F[M1.0,M2.0] P2.0; P2.0 =F[M2.0,M1.0] P1.0 ==> Z |] ==> Z
lemma cspF_trans_left_eq:
[| P1.0 =F[M1.0,M2.0] P2.0; P2.0 =F[M2.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
lemma cspF_trans_left_ref:
[| P1.0 <=F[M1.0,M2.0] P2.0; P2.0 <=F[M2.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_trans_left:
[| P1.0 =F[M1.0,M2.0] P2.0; P2.0 =F[M2.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P1.0 <=F[M1.0,M2.0] P2.0; P2.0 <=F[M2.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_trans_left:
[| P1.0 =F[M1.0,M2.0] P2.0; P2.0 =F[M2.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P1.0 <=F[M1.0,M2.0] P2.0; P2.0 <=F[M2.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_trans:
[| P1.0 =F[M1.0,M2.0] P2.0; P2.0 =F[M2.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P1.0 <=F[M1.0,M2.0] P2.0; P2.0 <=F[M2.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_trans:
[| P1.0 =F[M1.0,M2.0] P2.0; P2.0 =F[M2.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P1.0 <=F[M1.0,M2.0] P2.0; P2.0 <=F[M2.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemma cspF_trans_right_eq:
[| P2.0 =F[M2.0,M3.0] P3.0; P1.0 =F[M1.0,M2.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
lemma cspF_trans_right_ref:
[| P2.0 <=F[M2.0,M3.0] P3.0; P1.0 <=F[M1.0,M2.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_trans_rught:
[| P2.0 =F[M2.0,M3.0] P3.0; P1.0 =F[M1.0,M2.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P2.0 <=F[M2.0,M3.0] P3.0; P1.0 <=F[M1.0,M2.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_trans_rught:
[| P2.0 =F[M2.0,M3.0] P3.0; P1.0 =F[M1.0,M2.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P2.0 <=F[M2.0,M3.0] P3.0; P1.0 <=F[M1.0,M2.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemma cspF_rw_left_eq_MF:
[| P1.0 =F P2.0; P2.0 =F P3.0 |] ==> P1.0 =F P3.0
lemma cspF_rw_left_eq:
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 =F[M1.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
lemma cspF_rw_left_ref_MF:
[| P1.0 =F P2.0; P2.0 <=F P3.0 |] ==> P1.0 <=F P3.0
lemma cspF_rw_left_ref:
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 <=F[M1.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_rw_left:
[| P1.0 =F P2.0; P2.0 =F P3.0 |] ==> P1.0 =F P3.0
[| P1.0 =F P2.0; P2.0 <=F P3.0 |] ==> P1.0 <=F P3.0
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 =F[M1.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 <=F[M1.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_rw_left:
[| P1.0 =F P2.0; P2.0 =F P3.0 |] ==> P1.0 =F P3.0
[| P1.0 =F P2.0; P2.0 <=F P3.0 |] ==> P1.0 <=F P3.0
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 =F[M1.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 <=F[M1.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemma cspF_rw_right_eq:
[| P3.0 =F[M3.0,M3.0] P2.0; P1.0 =F[M1.0,M3.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
lemma cspF_rw_right_eq_MF:
[| P3.0 =F P2.0; P1.0 =F P2.0 |] ==> P1.0 =F P3.0
lemma cspF_rw_right_ref:
[| P3.0 =F[M3.0,M3.0] P2.0; P1.0 <=F[M1.0,M3.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemma cspF_rw_right_ref_MF:
[| P3.0 =F P2.0; P1.0 <=F P2.0 |] ==> P1.0 <=F P3.0
lemmas cspF_rw_right:
[| P3.0 =F P2.0; P1.0 =F P2.0 |] ==> P1.0 =F P3.0
[| P3.0 =F P2.0; P1.0 <=F P2.0 |] ==> P1.0 <=F P3.0
[| P3.0 =F[M3.0,M3.0] P2.0; P1.0 =F[M1.0,M3.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P3.0 =F[M3.0,M3.0] P2.0; P1.0 <=F[M1.0,M3.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_rw_right:
[| P3.0 =F P2.0; P1.0 =F P2.0 |] ==> P1.0 =F P3.0
[| P3.0 =F P2.0; P1.0 <=F P2.0 |] ==> P1.0 <=F P3.0
[| P3.0 =F[M3.0,M3.0] P2.0; P1.0 =F[M1.0,M3.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P3.0 =F[M3.0,M3.0] P2.0; P1.0 <=F[M1.0,M3.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemma cspF_tr_left_eq:
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 =F[M1.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
lemma cspF_tr_left_ref:
[| P1.0 <=F[M1.0,M1.0] P2.0; P2.0 <=F[M1.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_tr_left:
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 =F[M1.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P1.0 <=F[M1.0,M1.0] P2.0; P2.0 <=F[M1.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_tr_left:
[| P1.0 =F[M1.0,M1.0] P2.0; P2.0 =F[M1.0,M3.0] P3.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P1.0 <=F[M1.0,M1.0] P2.0; P2.0 <=F[M1.0,M3.0] P3.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemma cspF_tr_right_eq:
[| P2.0 =F[M3.0,M3.0] P3.0; P1.0 =F[M1.0,M3.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
lemma cspF_tr_right_ref:
[| P2.0 <=F[M3.0,M3.0] P3.0; P1.0 <=F[M1.0,M3.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_tr_right:
[| P2.0 =F[M3.0,M3.0] P3.0; P1.0 =F[M1.0,M3.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P2.0 <=F[M3.0,M3.0] P3.0; P1.0 <=F[M1.0,M3.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemmas cspF_tr_right:
[| P2.0 =F[M3.0,M3.0] P3.0; P1.0 =F[M1.0,M3.0] P2.0 |] ==> P1.0 =F[M1.0,M3.0] P3.0
[| P2.0 <=F[M3.0,M3.0] P3.0; P1.0 <=F[M1.0,M3.0] P2.0 |] ==> P1.0 <=F[M1.0,M3.0] P3.0
lemma failures_noPN_Constant_lm:
noPN P --> (∃F. failures P = (%M. F))
lemma failures_noPN_Constant:
noPN P ==> ∃F. failures P = (%M. F)