Up to index of Isabelle/HOL/HOL-Complex/CSP/CSP_T/CSP_F/FNF_F
theory FNF_F_sf_ext (*-------------------------------------------*
| CSP-Prover on Isabelle2005 |
| January 2006 |
| March 2007 (modified) |
| August 2007 (modified) |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory FNF_F_sf_ext
imports FNF_F_sf_induct
begin
(* 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 rules are deleted in this theory file *)
(* P (if Q then x else y) = ((Q --> P x) & (~ Q --> P y)) *)
declare split_if [split del]
(*****************************************************************
1. full sequentialization for Ext_choice
2. full sequentialization for Timeout
2.
3.
*****************************************************************)
(*============================================================*
| |
| Ext_choice |
| |
*============================================================*)
consts
Pfun_Ext_choice :: "('p,'a) proc => ('p,'a) proc => ('p,'a) proc"
SP_step_Ext_choice ::
"('a set => ('a => ('p,'a) proc) => ('p,'a) proc =>
'a set => ('a => ('p,'a) proc) => ('p,'a) proc =>
('a => ('p,'a) proc) => ('a => ('p,'a) proc) => ('a => ('p,'a) proc)
=> ('p,'a) proc)"
fsfF_Ext_choice :: "('p,'a) proc => ('p,'a) proc => ('p,'a) proc"
("(1_ /[+]seq _)" [72,73] 72)
defs
Pfun_Ext_choice_def :
"Pfun_Ext_choice == (%P1 P2. P1 [+] P2)"
SP_step_Ext_choice_def :
"SP_step_Ext_choice == (%A1 Pf1 Q1 A2 Pf2 Q2 SPf SPf1 SPf2.
(? a:(A1 Un A2)
-> (if (a : A1 & a : A2)
then (Pf1 a) |~|seq (Pf2 a)
else if (a : A1)
then (Pf1 a) else (Pf2 a)))
[+] (if (Q1 = STOP) then Q2
else if (Q2 = STOP) then Q1
else (if (Q1 = SKIP | Q2 = SKIP) then SKIP else DIV)))"
defs
fsfF_Ext_choice_def :
"P1 [+]seq P2 ==
(fsfF_induct2 Pfun_Ext_choice SP_step_Ext_choice P1 P2)"
(*------------------------------------------------------------*
| in fsfF_proc |
*------------------------------------------------------------*)
lemma fsfF_Ext_choice_in:
"[| P1 : fsfF_proc ; P2 : fsfF_proc |]
==> P1 [+]seq P2 : fsfF_proc"
apply (simp add: fsfF_Ext_choice_def)
apply (rule fsfF_induct2_in)
apply (simp_all)
apply (simp_all add: SP_step_Ext_choice_def)
apply (rule fsfF_proc_ext)
apply (intro ballI)
apply (simp split: split_if)
apply (intro impI conjI)
apply (rule fsfF_Int_choice_in)
apply (simp_all)
apply (simp split: split_if)
apply (auto)
done
(*------------------------------------------------------------*
| syntactical transformation to fsfF |
*------------------------------------------------------------*)
lemma cspF_fsfF_Ext_choice_eqF:
"P1 [+] P2 =F P1 [+]seq P2"
apply (simp add: fsfF_Ext_choice_def)
apply (rule cspF_rw_right)
apply (rule cspF_fsfF_induct2_eqF[THEN cspF_sym])
apply (simp_all add: Pfun_Ext_choice_def)
apply (rule cspF_Dist_nonempty, simp)
apply (rule cspF_Dist_nonempty, simp)
apply (simp add: SP_step_Ext_choice_def)
(* commut and assoc *)
apply (rule cspF_rw_left)
apply (subgoal_tac
"? :A1 -> Pf1 [+] Q1 [+] (? :A2 -> Pf2 [+] Q2)
=F (? :A1 -> Pf1 [+] ? :A2 -> Pf2) [+] (Q1 [+] Q2)") (* sub1 *)
apply (simp)
(* sub1 *)
apply (rule cspF_rw_left)
apply (rule cspF_assoc)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (rule cspF_assoc_sym)
apply (rule cspF_reflex)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (rule cspF_decompo)
apply (rule cspF_reflex)
apply (rule cspF_commut)
apply (rule cspF_reflex)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (rule cspF_assoc)
apply (rule cspF_reflex)
apply (rule cspF_rw_left)
apply (rule cspF_assoc_sym)
apply (rule cspF_reflex)
apply (rule cspF_decompo)
(* expand *)
apply (rule cspF_rw_left)
apply (rule cspF_step)
apply (rule cspF_decompo)
apply (simp)
(* if *)
apply (rule cspF_rw_right)
apply (rule cspF_IF_split[THEN cspF_sym])
apply (rule cspF_decompo)
apply (simp)
apply (simp add: cspF_fsfF_Int_choice_eqF)
apply (rule cspF_rw_right)
apply (rule cspF_IF_split[THEN cspF_sym])
apply (rule cspF_decompo)
apply (simp_all)
(* SKIP [+] DIV *)
apply (simp split: split_if)
apply (intro conjI impI)
apply (simp_all)
apply (rule cspF_rw_left)
apply (rule cspF_SKIP_or_DIV)
apply (simp_all)
apply (rule cspF_rw_left)
apply (rule cspF_SKIP_or_DIV)
apply (simp_all)
(* congruence *)
apply (simp add: SP_step_Ext_choice_def)
done
(*--------------------------------------------------*
| |
| The equality "cspF_fsfF_Ext_choice_eqF" can be |
| proven by using tactics as follows: |
| |
*--------------------------------------------------*)
(*
lemma "P1 [+] P2 =F P1 [+]seq P2"
apply (simp add: fsfF_Ext_choice_def)
apply (rule cspF_rw_right)
apply (rule cspF_fsfF_induct2_eqF[THEN cspF_sym])
apply (simp_all add: Pfun_Ext_choice_def)
apply (tactic {* cspF_dist_tac 1 *})
apply (tactic {* cspF_dist_tac 1 *})
apply (simp add: SP_step_Ext_choice_def)
apply (elim disjE)
apply (simp_all)
apply ((tactic {* cspF_hsf_tac 1 *})+,
(rule cspF_decompo), (rule), (simp),
(simp split: split_if),
(intro conjI allI impI),
(tactic {* cspF_simp_tac 1 *})+,
(rule cspF_fsfF_Int_choice_eqF),
(tactic {* cspF_simp_tac 1 *}),
(tactic {* cspF_simp_tac 1 *}))+
apply (simp add: SP_step_Ext_choice_def)
done
*)
(*============================================================*
| |
| Timeout |
| |
*============================================================*)
consts
fsfF_Timeout ::
"('p,'a) proc => ('p,'a) proc => ('p,'a) proc" ("(1_ /[>seq _)" [73,74] 73)
defs
fsfF_Timeout_def :
"P1 [>seq P2 == (P1 |~|seq SSTOP) [+]seq P2"
(*------------------------------------*
| in |
*------------------------------------*)
lemma fsfF_Timeout_in:
"[| P1 : fsfF_proc ; P2 : fsfF_proc |] ==> P1 [>seq P2 : fsfF_proc"
apply (simp add: fsfF_Timeout_def)
apply (rule fsfF_Ext_choice_in)
apply (rule fsfF_Int_choice_in)
apply (simp_all)
done
(*------------------------------------*
| eqF |
*------------------------------------*)
lemma cspF_fsfF_Timeout_eqF:
"(P1 [> P2) =F (P1 [>seq P2)"
apply (simp add: fsfF_Timeout_def)
apply (rule cspF_rw_right)
apply (rule cspF_fsfF_Ext_choice_eqF[THEN cspF_sym])
apply (rule cspF_decompo)
apply (rule cspF_rw_right)
apply (rule cspF_fsfF_Int_choice_eqF[THEN cspF_sym])
apply (rule cspF_decompo)
apply (rule cspF_reflex)
apply (rule cspF_SSTOP_eqF)
apply (rule cspF_reflex)
done
(****************** to add them again ******************)
declare split_if [split]
declare disj_not1 [simp]
end
lemma fsfF_Ext_choice_in:
[| P1.0 ∈ fsfF_proc; P2.0 ∈ fsfF_proc |] ==> P1.0 [+]seq P2.0 ∈ fsfF_proc
lemma cspF_fsfF_Ext_choice_eqF:
P1.0 [+] P2.0 =F P1.0 [+]seq P2.0
lemma fsfF_Timeout_in:
[| P1.0 ∈ fsfF_proc; P2.0 ∈ fsfF_proc |] ==> P1.0 [>seq P2.0 ∈ fsfF_proc
lemma cspF_fsfF_Timeout_eqF:
P1.0 [> P2.0 =F P1.0 [>seq P2.0