Up to index of Isabelle/HOL/HOL-Complex/CSP/CSP_T/CSP_F/FNF_F
theory FNF_F_sf (*-------------------------------------------*
| CSP-Prover on Isabelle2005 |
| February 2006 |
| March 2007 (modified) |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory FNF_F_sf
imports FNF_F_sf_hide FNF_F_sf_par
FNF_F_sf_ren FNF_F_sf_seq
FNF_F_sf_rest
begin
(*****************************************************************
1. full sequentialisation
2.
3.
*****************************************************************)
(*****************************************************************
small transformation
*****************************************************************)
consts
fsfF_Act_prefix ::
"'a => ('p,'a) proc => ('p,'a) proc" ("(1_ /->seq _)" [150,80] 80)
fsfF_Ext_pre_choice ::
"'a set => ('a => ('p,'a) proc) => ('p,'a) proc" ("(1? :_ /->seq _)" [900,80] 80)
defs
fsfF_Act_prefix_def :
"a ->seq P == (? y:{a} -> P) [+] STOP"
fsfF_Ext_pre_choice_def :
"? :A ->seq Pf == (? :A -> Pf) [+] STOP"
syntax
"@fsfF_Ext_pre_choice" :: "pttrn => 'a set => ('p,'a) proc
=> ('p,'a) proc" ("(1? _:_ /->seq _)" [900,900,80] 80)
translations
"? a:A ->seq P" == "? :A ->seq (%a. P)"
(* a -> P *)
lemma fsfF_Act_prefix_in:
"P : fsfF_proc ==> a ->seq P : fsfF_proc"
by (simp add: fsfF_Act_prefix_def fsfF_proc.intros)
lemma cspF_fsfF_Act_prefix_eqF:
"a -> P =F a ->seq P"
apply (simp add: fsfF_Act_prefix_def)
apply (rule cspF_rw_right)
apply (rule cspF_Ext_choice_unit)
apply (rule cspF_Act_prefix_step)
done
(* ? :A -> Pf *)
lemma fsfF_Ext_pre_choice_in:
"ALL a. Pf a : fsfF_proc ==> ? :A ->seq Pf : fsfF_proc"
by (simp add: fsfF_Ext_pre_choice_def fsfF_proc.intros)
lemma cspF_fsfF_Ext_pre_choice_eqF:
"? :A -> Pf =F ? :A ->seq Pf"
apply (simp add: fsfF_Ext_pre_choice_def)
apply (rule cspF_rw_right)
apply (rule cspF_Ext_choice_unit)
apply (rule cspF_reflex)
done
(* IF b THEN P ELSE Q *)
lemma fsfF_IF_in:
"[| P : fsfF_proc ; Q : fsfF_proc |]
==> (if b then P else Q) : fsfF_proc"
by (auto)
lemmas cspF_fsfF_IF_eqF = cspF_IF_split
(*===============================================================*
| |
| definition of a function for full sequentialization |
| (no process name) |
| |
*===============================================================*)
consts
prefsfF :: "('p,'a) proc => ('p,'a) proc"
primrec
"prefsfF(STOP) = SSTOP"
"prefsfF(SKIP) = SSKIP"
"prefsfF(DIV) = SDIV"
"prefsfF(a -> P) = a ->seq (prefsfF P)"
"prefsfF(? :A -> Pf) = ? a:A ->seq (prefsfF (Pf a))"
"prefsfF(P [+] Q) = (prefsfF P) [+]seq (prefsfF Q)"
"prefsfF(P |~| Q) = (prefsfF P) |~|seq (prefsfF Q)"
"prefsfF(!nat :N .. Pf) = !nat n:N ..seq prefsfF (Pf n)"
"prefsfF(!set :Xs .. Pf) = !set X:Xs ..seq prefsfF (Pf X)"
"prefsfF(IF b THEN P ELSE Q) = (if b then prefsfF(P) else prefsfF(Q))"
"prefsfF(P |[X]| Q) = (prefsfF P) |[X]|seq (prefsfF Q)"
"prefsfF(P -- X) = (prefsfF P) --seq X"
"prefsfF(P [[r]]) = (prefsfF P) [[r]]seq"
"prefsfF(P ;; Q) = (prefsfF P) ;;seq (prefsfF Q)"
"prefsfF(P |. n) = (prefsfF P) |.seq n"
"prefsfF($p) = $p"
(*===============================================================*
--- prefsfF P is fullly sequentialized ---
*===============================================================*)
lemma prefsfF_in_lm:
"noPN P --> prefsfF P : fsfF_proc"
apply (induct_tac P)
apply (simp_all)
apply (simp add: fsfF_Act_prefix_in)
apply (simp add: fsfF_Ext_pre_choice_in)
apply (simp add: fsfF_Ext_choice_in)
apply (simp add: fsfF_Int_choice_in)
apply (simp add: fsfF_Rep_int_choice_nat_in)
apply (simp add: fsfF_Rep_int_choice_set_in)
apply (simp add: fsfF_Parallel_in)
apply (simp add: fsfF_Hiding_in)
apply (simp add: fsfF_Renaming_in)
apply (simp add: fsfF_Seq_compo_in)
apply (simp add: fsfF_Depth_rest_in)
done
lemma prefsfF_in:
"noPN P ==> prefsfF P : fsfF_proc"
by (simp add: prefsfF_in_lm)
(*===============================================================*
--- prefsfF P is equal to P based on F ---
*===============================================================*)
lemma cspF_prefsfF_eqF_lm:
"noPN P --> P =F prefsfF P"
apply (induct_tac P)
apply (simp add: cspF_SSTOP_eqF)
apply (simp add: cspF_SSKIP_eqF)
apply (simp add: cspF_SDIV_eqF)
(* Act_prefix *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (simp add: cspF_fsfF_Act_prefix_eqF)
(* Ext_pre_choice *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp)
apply (erule rev_all1E)
apply (drule_tac x="a" in spec)+
apply (simp_all)
apply (simp add: cspF_fsfF_Ext_pre_choice_eqF)
(* Ext_choice *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (simp add: cspF_fsfF_Ext_choice_eqF)
(* Int_choice *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (simp add: cspF_fsfF_Int_choice_eqF)
(* Rep_int_choice nat *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp)
apply (erule rev_all1E)
apply (drule_tac x="n" in spec)+
apply (simp_all)
apply (simp add: cspF_fsfF_Rep_int_choice_eqF)
(* Rep_int_choice set *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp)
apply (erule rev_all1E)
apply (drule_tac x="X" in spec)+
apply (simp_all)
apply (simp add: cspF_fsfF_Rep_int_choice_eqF)
(* IF *)
apply (intro conjI impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (rule cspF_IF)
apply (rule cspF_rw_left)
apply (rule cspF_IF)
apply (simp_all)
(* Parallel *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (simp add: cspF_fsfF_Parallel_eqF)
(* Hiding *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (simp add: cspF_fsfF_Hiding_eqF)
(* Renaming *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (simp add: cspF_fsfF_Renaming_eqF)
(* Seq_compo *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (simp add: cspF_fsfF_Seq_compo_eqF)
(* Depth_rest *)
apply (intro impI)
apply (rule cspF_rw_left)
apply (rule cspF_decompo)
apply (simp_all)
apply (simp add: cspF_fsfF_Depth_rest_eqF)
done
lemma cspF_prefsfF_eqF:
"noPN P ==> P =F prefsfF P"
by (simp add: cspF_prefsfF_eqF_lm)
(*===============================================================*
| |
| definition of a function for full sequentialization |
| |
*===============================================================*)
consts
fsfF :: "('p,'a) proc => ('p,'a) proc"
defs
fsfF_def : "fsfF == (%P. prefsfF(rmPN(P)))"
(*===============================================================*
theorem --- fsfF P is fullly sequentialized ---
*===============================================================*)
theorem fsfF_in:
"fsfF P : fsfF_proc"
apply (simp add: fsfF_def)
apply (rule prefsfF_in)
apply (simp add: noPN_rmPN)
done
(*===============================================================*
theorem --- fsfF P is equal to P based on F ---
*===============================================================*)
lemma cspF_fsfF_eqF:
"FPmode = CPOmode | FPmode = MIXmode ==> P =F fsfF P"
apply (simp add: fsfF_def)
apply (rule cspF_rw_right)
apply (rule cspF_prefsfF_eqF[THEN cspF_sym])
apply (simp add: noPN_rmPN)
apply (rule cspF_rmPN_eqF)
apply (force)
done
end
lemma fsfF_Act_prefix_in:
P ∈ fsfF_proc ==> a ->seq P ∈ fsfF_proc
lemma cspF_fsfF_Act_prefix_eqF:
a -> P =F a ->seq P
lemma fsfF_Ext_pre_choice_in:
∀a. Pf a ∈ fsfF_proc ==> ? :A ->seq Pf ∈ fsfF_proc
lemma cspF_fsfF_Ext_pre_choice_eqF:
? :A -> Pf =F ? :A ->seq Pf
lemma fsfF_IF_in:
[| P ∈ fsfF_proc; Q ∈ fsfF_proc |] ==> (if b then P else Q) ∈ fsfF_proc
lemmas cspF_fsfF_IF_eqF:
IF b THEN P ELSE Q =F[M,M] (if b then P else Q)
lemmas cspF_fsfF_IF_eqF:
IF b THEN P ELSE Q =F[M,M] (if b then P else Q)
lemma prefsfF_in_lm:
noPN P --> prefsfF P ∈ fsfF_proc
lemma prefsfF_in:
noPN P ==> prefsfF P ∈ fsfF_proc
lemma cspF_prefsfF_eqF_lm:
noPN P --> P =F prefsfF P
lemma cspF_prefsfF_eqF:
noPN P ==> P =F prefsfF P
theorem fsfF_in:
fsfF P ∈ fsfF_proc
lemma cspF_fsfF_eqF:
FPmode = CPOmode ∨ FPmode = MIXmode ==> P =F fsfF P