Up to index of Isabelle/HOL/HOL-Complex/CSP/CSP_T/CSP_F/FNF_F
theory FNF_F_sf_int (*-------------------------------------------*
| CSP-Prover on Isabelle2005 |
| January 2006 |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory FNF_F_sf_int = FNF_F_sf_def:
(* 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 Rep_int_choice
2. full sequentialization for Int_choice
3.
*****************************************************************)
(*============================================================*
| |
| Rep_int_choice |
| |
*============================================================*)
consts
fsfF_Rep_int_choice ::
"'a selector set => ('a selector => 'a proc) => 'a proc"
defs
fsfF_Rep_int_choice_def :
"fsfF_Rep_int_choice C SPf == if (C = {}) then SDIV else !! :C .. SPf"
syntax
"_fsfF_Rep_int_choice" ::
"'a selector set => ('a selector => 'a proc) => 'a proc"
("(1!! :_ ..seq /_)" [900,68] 68)
"@fsfF_Rep_int_choice"::
"pttrn => ('a selector) set => 'a proc => 'a proc"
("(1!! _:_ ..seq /_)" [900,900,68] 68)
translations
"!! :C ..seq SPf" == "fsfF_Rep_int_choice C SPf"
"!! c:C ..seq SP" == "!! :C ..seq (%c. SP)"
(*** for convenience ***)
consts
fsfF_Rep_int_choice_fun :: "('b => ('a selector))
=> 'b set => ('b => 'a proc) => 'a proc"
("(1!!<_> :_ ..seq /_)" [0,900,68] 68)
defs
fsfF_Rep_int_choice_fun_def :
"!!<f> :X ..seq Pf == !! :(f ` X) ..seq (%x. (Pf ((inv f) x)))"
syntax
"@fsfF_Rep_int_choice_fun"::
"('b => ('a selector)) => pttrn => 'b set => 'a proc => 'a proc"
("(1!!<_> _:_ ..seq /_)" [0,900,900,68] 68)
translations
"!!<f> x:X ..seq P" == "!!<f> :X ..seq (%x. P)"
syntax
"@fsfF_Rep_int_choice_fun_set" :: "('a set) set => ('a set => 'a proc) => 'a proc"
("(1!set :_ ..seq /_)" [900,68] 68)
"@fsfF_Rep_int_choice_fun_nat" :: "nat set => (nat => 'a proc) => 'a proc"
("(1!nat :_ ..seq /_)" [900,68] 68)
translations
"!set :Xs ..seq Pf" == "!!<sel_set> :Xs ..seq Pf"
"!nat :N ..seq Pf" == "!!<sel_nat> :N ..seq Pf"
syntax
"@fsfF_Rep_int_choice_set" ::
"pttrn => ('a set) set => ('a set => 'a proc) => 'a proc"
("(1!set _:_ ..seq /_)" [900,900,68] 68)
"@fsfF_Rep_int_choice_nat" ::
"pttrn => nat set => (nat => 'a proc) => 'a proc"
("(1!nat _:_ ..seq /_)" [900,900,68] 68)
translations
"!set X:Xs ..seq P" == "!set :Xs ..seq (%X. P)"
"!nat n:N ..seq P" == "!nat :N ..seq (%n. P)"
(* com *)
consts
fsfF_Rep_int_choice_com :: "'a set => ('a => 'a proc) => 'a proc"
("(1! :_ ..seq /_)" [900,68] 68)
defs
fsfF_Rep_int_choice_com_def:
"! :A ..seq Pf == !set X:{{a} |a. a : A} ..seq Pf (contents(X))"
syntax
"@fsfF_Rep_int_choice_com" ::
"pttrn => 'a set => ('a => 'a proc) => 'a proc"
("(1! _:_ ..seq /_)" [900,900,68] 68)
translations
"! x:X ..seq P" == "! :X ..seq (%x. P)"
(*------------------------------------------------------------*
| in fsfF_proc |
*------------------------------------------------------------*)
lemma fsfF_Rep_int_choice_in:
"ALL c:C. SPf c : fsfF_proc ==> !! :C ..seq SPf : fsfF_proc"
apply (simp add: fsfF_Rep_int_choice_def)
apply (simp split: split_if)
apply (intro impI)
apply (rule fsfF_procI)
apply (simp)
done
(*------------------------------------------------------------*
| syntactical transformation to fsfF |
*------------------------------------------------------------*)
lemma cspF_fsfF_Rep_int_choice_eqF:
"!! :C .. SPf =F !! :C ..seq SPf"
apply (simp add: fsfF_Rep_int_choice_def)
apply (case_tac "C={}")
apply (tactic {* cspF_hsf_tac 1 *})
apply (rule cspF_SDIV_eqF)
done
(* =F also can be manually proven without using tactics. *)
(* we give the proof to show which laws are applied. *)
lemma "!! :C .. SPf =F !! :C ..seq SPf"
apply (simp add: fsfF_Rep_int_choice_def)
apply (case_tac "C={}")
apply (simp)
apply (rule cspF_rw_left)
apply (rule cspF_Rep_int_choice0_DIV)
apply (rule cspF_SDIV_eqF)
(* C~={} *)
apply (simp)
done
lemmas cspF_fsfF_Rep_int_choice_eqF_sym = cspF_fsfF_Rep_int_choice_eqF[THEN cspF_sym]
(*============================================================*
| |
| convenient expressions |
| |
*============================================================*)
(*------------------------------------*
| in |
*------------------------------------*)
lemma fsfF_Rep_int_choice_fun_in:
"[| inj f ; ALL x:X. SPf x : fsfF_proc |] ==>
!!<f> :X ..seq SPf : fsfF_proc"
apply (insert fsfF_Rep_int_choice_in[of "(f ` X)" "(%x. SPf (inv f x))"])
apply (simp add: fsfF_Rep_int_choice_fun_def)
done
lemma fsfF_Rep_int_choice_com_in:
"ALL x:X. SPf x : fsfF_proc ==>
! :X ..seq SPf : fsfF_proc"
apply (simp add: fsfF_Rep_int_choice_com_def)
apply (rule fsfF_Rep_int_choice_fun_in)
apply (auto)
done
lemma fsfF_Rep_int_choice_set_in:
"ALL X:Xs. SPf X : fsfF_proc ==>
!set :Xs ..seq SPf : fsfF_proc"
by (simp add: fsfF_Rep_int_choice_fun_in)
lemma fsfF_Rep_int_choice_nat_in:
"ALL n:N. SPf n : fsfF_proc ==>
!nat :N ..seq SPf : fsfF_proc"
by (simp add: fsfF_Rep_int_choice_fun_in)
(*------------------------------------*
| eqF |
*------------------------------------*)
lemma cspF_fsfF_Rep_int_choice_fun_eqF:
"inj f ==>
!!<f> :X .. SPf =F !!<f> :X ..seq SPf"
apply (insert cspF_fsfF_Rep_int_choice_eqF[of "(f ` X)" "(%x. SPf (inv f x))"])
apply (simp add: Rep_int_choice_fun_def)
apply (simp add: fsfF_Rep_int_choice_fun_def)
done
lemma cspF_fsfF_Rep_int_choice_com_eqF:
"! :X .. SPf =F ! :X ..seq SPf"
apply (simp add: fsfF_Rep_int_choice_com_def)
apply (simp add: Rep_int_choice_com_def)
apply (simp add: cspF_fsfF_Rep_int_choice_fun_eqF)
done
lemma cspF_fsfF_Rep_int_choice_set_eqF:
"!set :Xs .. SPf =F !set :Xs ..seq SPf"
by (simp add: cspF_fsfF_Rep_int_choice_fun_eqF)
lemma cspF_fsfF_Rep_int_choice_nat_eqF:
"!nat :N .. SPf =F !nat :N ..seq SPf"
by (simp add: cspF_fsfF_Rep_int_choice_fun_eqF)
(*============================================================*
| |
| Int_choice |
| |
*============================================================*)
consts
fsfF_Int_choice ::
"'a proc => 'a proc => 'a proc" ("(1_ /|~|seq _)" [64,65] 64)
defs
fsfF_Int_choice_def :
"P |~|seq Q ==
!! :{sel_nat 0, sel_nat (Suc 0)} ..
(%x. if (x = sel_nat 0) then P else Q)"
(*------------------------------------------------------------*
| in fsfF_proc |
*------------------------------------------------------------*)
lemma fsfF_Int_choice_in:
"[| P : fsfF_proc ; Q : fsfF_proc |] ==>
P |~|seq Q : fsfF_proc"
apply (simp add: fsfF_Int_choice_def)
apply (rule fsfF_proc_int)
apply (auto)
done
(*------------------------------------------------------------*
| syntactical transformation to fsfF |
*------------------------------------------------------------*)
lemma cspF_fsfF_Int_choice_eqF:
"P |~| Q =F P |~|seq Q"
apply (simp add: fsfF_Int_choice_def)
apply (rule cspF_rw_left)
apply (rule cspF_Int_choice_to_Rep)
apply (simp add: Rep_int_choice_fun_def)
apply (rule cspF_decompo)
apply (simp)
apply (rule cspF_rw_left)
apply (rule cspF_IF_split)
apply (auto)
done
(****************** to add them again ******************)
declare split_if [split]
declare disj_not1 [simp]
end
lemma fsfF_Rep_int_choice_in:
∀c∈C. SPf c ∈ fsfF_proc ==> !! :C ..seq SPf ∈ fsfF_proc
lemma cspF_fsfF_Rep_int_choice_eqF:
!! :C .. SPf =F !! :C ..seq SPf
lemma
!! :C .. SPf =F !! :C ..seq SPf
lemmas cspF_fsfF_Rep_int_choice_eqF_sym:
!! :C1 ..seq SPf1 =F !! :C1 .. SPf1
lemmas cspF_fsfF_Rep_int_choice_eqF_sym:
!! :C1 ..seq SPf1 =F !! :C1 .. SPf1
lemma fsfF_Rep_int_choice_fun_in:
[| inj f; ∀x∈X. SPf x ∈ fsfF_proc |] ==> !!<f> :X ..seq SPf ∈ fsfF_proc
lemma fsfF_Rep_int_choice_com_in:
∀x∈X. SPf x ∈ fsfF_proc ==> ! :X ..seq SPf ∈ fsfF_proc
lemma fsfF_Rep_int_choice_set_in:
∀X∈Xs. SPf X ∈ fsfF_proc ==> !set :Xs ..seq SPf ∈ fsfF_proc
lemma fsfF_Rep_int_choice_nat_in:
∀n∈N. SPf n ∈ fsfF_proc ==> !nat :N ..seq SPf ∈ fsfF_proc
lemma cspF_fsfF_Rep_int_choice_fun_eqF:
inj f ==> !!<f> :X .. SPf =F !!<f> :X ..seq SPf
lemma cspF_fsfF_Rep_int_choice_com_eqF:
! :X .. SPf =F ! :X ..seq SPf
lemma cspF_fsfF_Rep_int_choice_set_eqF:
!set :Xs .. SPf =F !set :Xs ..seq SPf
lemma cspF_fsfF_Rep_int_choice_nat_eqF:
!nat :N .. SPf =F !nat :N ..seq SPf
lemma fsfF_Int_choice_in:
[| P ∈ fsfF_proc; Q ∈ fsfF_proc |] ==> P |~|seq Q ∈ fsfF_proc
lemma cspF_fsfF_Int_choice_eqF:
P |~| Q =F P |~|seq Q