Up to index of Isabelle/HOL/HOL-Complex/CSP/CSP_T/CSP_F/FNF_F
theory FNF_F_sf_def(*-------------------------------------------* | CSP-Prover on Isabelle2005 | | January 2006 | | April 2006 (modified) | | March 2007 (modified) | | | | Yoshinao Isobe (AIST JAPAN) | *-------------------------------------------*) theory FNF_F_sf_def imports CSP_F 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. definition of full sequential-formed process 2. 3. *****************************************************************) (*==========================================================* | | | Definition of fsfF | | | *==========================================================*) consts fsfF_proc :: "('p,'a) proc set" inductive "fsfF_proc" intros fsfF_proc_int_nat: "[| N ~= {} ; ALL n:N. Rf n : fsfF_proc |] ==> (!nat :N .. Rf) : fsfF_proc" fsfF_proc_int_set: "[| Xs ~= {} ; ALL X:Xs. Rf X : fsfF_proc |] ==> (!set :Xs .. Rf) : fsfF_proc" fsfF_proc_ext: "[| ALL a:A. Pf a : fsfF_proc ; Q = SKIP | Q = DIV | Q = STOP |] ==> ((? :A -> Pf) [+] Q) : fsfF_proc" lemmas fsfF_proc_int = fsfF_proc_int_nat fsfF_proc_int_set (*-------------------------------------------* | sequential-formed SSKIP, SDIV, SSTOP | *-------------------------------------------*) consts SSKIP :: "('p,'a) proc" SDIV :: "('p,'a) proc" SSTOP :: "('p,'a) proc" defs SSKIP_def : "SSKIP == (? y:{} -> DIV) [+] SKIP" SDIV_def : "SDIV == (? y:{} -> DIV) [+] DIV" SSTOP_def : "SSTOP == (? y:{} -> DIV) [+] STOP" (*** small lemmas ***) (* in *) lemma fsfF_SSKIP_in[simp]: "SSKIP : fsfF_proc" apply (simp add: SSKIP_def) apply (simp add: fsfF_proc.intros) done lemma fsfF_SDIV_in[simp]: "SDIV : fsfF_proc" apply (simp add: SDIV_def) apply (simp add: fsfF_proc.intros) done lemma fsfF_SSTOP_in[simp]: "SSTOP : fsfF_proc" apply (simp add: SSTOP_def) apply (simp add: fsfF_proc.intros) done (* eqF *) lemma cspF_SSKIP_eqF: "SKIP =F SSKIP" apply (simp add: SSKIP_def) apply (rule cspF_rw_right) apply (rule cspF_Ext_choice_rule) apply (simp) done lemma cspF_SDIV_eqF: "DIV =F SDIV" apply (simp add: SDIV_def) apply (rule cspF_rw_right) apply (rule cspF_Ext_choice_rule) apply (simp) done lemma cspF_SSTOP_eqF: "STOP =F SSTOP" apply (simp add: SSTOP_def) apply (rule cspF_rw_right) apply (rule cspF_Ext_choice_rule) apply (simp) done (*----------------------------------------------------------* | iff | *----------------------------------------------------------*) (* proc *) lemma fsfF_proc_iff: "(SP : fsfF_proc) = ((EX N Rf. N ~= {} & SP = !nat :N .. Rf & (ALL n:N. Rf n : fsfF_proc)) | (EX Xs Rf. Xs ~= {} & SP = !set :Xs .. Rf & (ALL X:Xs. Rf X : fsfF_proc)) | (EX A Pf Q. SP = (? :A -> Pf) [+] Q & (ALL a:A. Pf a : fsfF_proc) & (Q = SKIP | Q = DIV | Q = STOP)))" apply (rule iffI) (* => *) apply (erule fsfF_proc.elims) apply (simp_all) (* <= *) apply (elim conjE exE disjE) apply (simp_all add: fsfF_proc.intros) done lemma fsfF_procI: "((EX N Rf. N ~= {} & SP = !nat :N .. Rf & (ALL n:N. Rf n : fsfF_proc)) | (EX Xs Rf. Xs ~= {} & SP = !set :Xs .. Rf & (ALL X:Xs. Rf X : fsfF_proc)) | (EX A Pf Q. SP = (? :A -> Pf) [+] Q & (ALL a:A. Pf a : fsfF_proc) & (Q = SKIP | Q = DIV | Q = STOP))) ==> SP : fsfF_proc" apply (simp add: fsfF_proc_iff[of SP]) done lemma fsfF_procE: "[| SP : fsfF_proc ; ((EX N Rf. N ~= {} & SP = !nat :N .. Rf & (ALL n:N. Rf n : fsfF_proc)) | (EX Xs Rf. Xs ~= {} & SP = !set :Xs .. Rf & (ALL X:Xs. Rf X : fsfF_proc)) | (EX A Pf Q. SP = (? :A -> Pf) [+] Q & (ALL a:A. Pf a : fsfF_proc) & (Q = SKIP | Q = DIV | Q = STOP))) ==> S |] ==> S" apply (simp add: fsfF_proc_iff[of SP]) done (*----------------------------------------------------------* | subexpression | *----------------------------------------------------------*) (* proc *) lemma Rf_fsfF_proc_nat: "[| !nat :N .. Rf : fsfF_proc ; n:N |] ==> Rf n : fsfF_proc" apply (erule fsfF_procE) apply (elim disjE conjE exE) apply (simp_all) done lemma Rf_fsfF_proc_set: "[| !set :Xs .. Rf : fsfF_proc ; X:Xs |] ==> Rf X : fsfF_proc" apply (erule fsfF_procE) apply (elim disjE conjE exE) apply (simp_all) done lemma Pf_fsfF_proc: "[| (? :A -> Pf) [+] Q : fsfF_proc ; a:A |] ==> Pf a : fsfF_proc" apply (erule fsfF_procE) apply (simp) done lemma Qf_range: "(? :A -> Pf) [+] Q : fsfF_proc ==> Q = SKIP | Q = DIV | Q = STOP" apply (erule fsfF_procE) apply (simp) done (*======================================================* | | | function to decompose : fsfF_decompo_int, ext | | | *======================================================*) consts fsfF_N :: "('p,'a) proc => nat set" fsfF_Xs :: "('p,'a) proc => 'a set set" fsfF_Rf_nat :: "('p,'a) proc => (nat => ('p,'a) proc)" fsfF_Rf_set :: "('p,'a) proc => ('a set => ('p,'a) proc)" fsfF_A :: "('p,'a) proc => 'a set" fsfF_Pf :: "('p,'a) proc => ('a => ('p,'a) proc)" fsfF_Q :: "('p,'a) proc => ('p,'a) proc" (* they are partial functions *) recdef fsfF_N "{}" "fsfF_N (!nat :N .. Rf) = N" recdef fsfF_Xs "{}" "fsfF_Xs (!set :Xs .. Rf) = Xs" recdef fsfF_Rf_nat "{}" "fsfF_Rf_nat (!nat :N .. Rf) = Rf" recdef fsfF_Rf_set "{}" "fsfF_Rf_set (!set :Xs .. Rf) = Rf" recdef fsfF_A "{}" "fsfF_A ((? :A -> Pf) [+] Q) = A" recdef fsfF_Pf "{}" "fsfF_Pf ((? :A -> Pf) [+] Q) = Pf" recdef fsfF_Q "{}" "fsfF_Q ((? :A -> Pf) [+] Q) = Q" (*------------------------* | decomposition | *------------------------*) lemma cspF_fsfF_proc_decompo: "P : fsfF_proc ==> ((P = (!nat : fsfF_N P .. fsfF_Rf_nat P)) | (P = (!set : fsfF_Xs P .. fsfF_Rf_set P)) | (P = (? : fsfF_A P -> fsfF_Pf P [+] fsfF_Q P)))" apply (erule fsfF_proc.elims) apply (simp_all) done (****************** to add them again ******************) declare split_if [split] declare disj_not1 [simp] end
lemmas fsfF_proc_int:
[| N ≠ {}; ∀n∈N. Rf n ∈ fsfF_proc |] ==> !nat :N .. Rf ∈ fsfF_proc
[| Xs ≠ {}; ∀X∈Xs. Rf X ∈ fsfF_proc |] ==> !set :Xs .. Rf ∈ fsfF_proc
lemmas fsfF_proc_int:
[| N ≠ {}; ∀n∈N. Rf n ∈ fsfF_proc |] ==> !nat :N .. Rf ∈ fsfF_proc
[| Xs ≠ {}; ∀X∈Xs. Rf X ∈ fsfF_proc |] ==> !set :Xs .. Rf ∈ fsfF_proc
lemma fsfF_SSKIP_in:
SSKIP ∈ fsfF_proc
lemma fsfF_SDIV_in:
SDIV ∈ fsfF_proc
lemma fsfF_SSTOP_in:
SSTOP ∈ fsfF_proc
lemma cspF_SSKIP_eqF:
SKIP =F SSKIP
lemma cspF_SDIV_eqF:
DIV =F SDIV
lemma cspF_SSTOP_eqF:
STOP =F SSTOP
lemma fsfF_proc_iff:
(SP ∈ fsfF_proc) = ((∃N Rf. N ≠ {} ∧ SP = !nat :N .. Rf ∧ (∀n∈N. Rf n ∈ fsfF_proc)) ∨ (∃Xs Rf. Xs ≠ {} ∧ SP = !set :Xs .. Rf ∧ (∀X∈Xs. Rf X ∈ fsfF_proc)) ∨ (∃A Pf Q. SP = ? :A -> Pf [+] Q ∧ (∀a∈A. Pf a ∈ fsfF_proc) ∧ (Q = SKIP ∨ Q = DIV ∨ Q = STOP)))
lemma fsfF_procI:
(∃N Rf. N ≠ {} ∧ SP = !nat :N .. Rf ∧ (∀n∈N. Rf n ∈ fsfF_proc)) ∨ (∃Xs Rf. Xs ≠ {} ∧ SP = !set :Xs .. Rf ∧ (∀X∈Xs. Rf X ∈ fsfF_proc)) ∨ (∃A Pf Q. SP = ? :A -> Pf [+] Q ∧ (∀a∈A. Pf a ∈ fsfF_proc) ∧ (Q = SKIP ∨ Q = DIV ∨ Q = STOP)) ==> SP ∈ fsfF_proc
lemma fsfF_procE:
[| SP ∈ fsfF_proc; (∃N Rf. N ≠ {} ∧ SP = !nat :N .. Rf ∧ (∀n∈N. Rf n ∈ fsfF_proc)) ∨ (∃Xs Rf. Xs ≠ {} ∧ SP = !set :Xs .. Rf ∧ (∀X∈Xs. Rf X ∈ fsfF_proc)) ∨ (∃A Pf Q. SP = ? :A -> Pf [+] Q ∧ (∀a∈A. Pf a ∈ fsfF_proc) ∧ (Q = SKIP ∨ Q = DIV ∨ Q = STOP)) ==> S |] ==> S
lemma Rf_fsfF_proc_nat:
[| !nat :N .. Rf ∈ fsfF_proc; n ∈ N |] ==> Rf n ∈ fsfF_proc
lemma Rf_fsfF_proc_set:
[| !set :Xs .. Rf ∈ fsfF_proc; X ∈ Xs |] ==> Rf X ∈ fsfF_proc
lemma Pf_fsfF_proc:
[| ? :A -> Pf [+] Q ∈ fsfF_proc; a ∈ A |] ==> Pf a ∈ fsfF_proc
lemma Qf_range:
? :A -> Pf [+] Q ∈ fsfF_proc ==> Q = SKIP ∨ Q = DIV ∨ Q = STOP
lemma cspF_fsfF_proc_decompo:
P ∈ fsfF_proc ==> P = !nat :fsfF_N P .. fsfF_Rf_nat P ∨ P = !set :fsfF_Xs P .. fsfF_Rf_set P ∨ P = ? :fsfF_A P -> fsfF_Pf P [+] fsfF_Q P