Up to index of Isabelle/HOL/HOL-Complex/CSP-Prover
theory CSP_law_dist = CSP_law_commut + CSP_law_decompo:(*-------------------------------------------* | CSP-Prover | | December 2004 | | Yoshinao Isobe (AIST JAPAN) | *-------------------------------------------*) theory CSP_law_dist = CSP_law_commut + CSP_law_decompo: (* The following simplification is sometimes unexpected. *) (* *) (* not_None_eq: (x ~= None) = (EX y. x = Some y) *) declare not_None_eq [simp del] (***************************************************************** distribution of internal choice over ... 1. (P1 |~| P2) [+] Q 2. Q [+] (P1 |~| P2) 3. (P1 |~| P2) |[X]| Q 4. Q |[X]| (P1 |~| P2) 5. (P1 |~| P2) -- X 6. (P1 |~| P2) [[r]] *****************************************************************) (********************************************************* dist law for Ext_choice (l) *********************************************************) lemma domSF_Ext_choice_dist_l: "[[(P1 |~| P2) [+] Q]]SF ev = [[(P1 [+] Q) |~| (P2 [+] Q)]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Ext_choice_mem Int_choice_mem, fast)+ (* domF *) apply (rule eq_iffI) apply (rule, simp add: Ext_choice_mem Int_choice_mem memF_IntF memF_UnF memT_UnT, fast)+ done (*------------------* | csp law | *------------------*) lemma csp_Ext_choice_dist_l: "LET:fp df IN (P1 |~| P2) [+] Q =F LET:fp df IN (P1 [+] Q) |~| (P2 [+] Q)" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Ext_choice_dist_l) (********************************************************* dist law for Ext_choice (r) *********************************************************) (*------------------* | csp law | *------------------*) lemma csp_Ext_choice_dist_r: "LET:fp df IN P [+] (Q1 |~| Q2) =F LET:fp df IN (P [+] Q1) |~| (P [+] Q2)" apply (rule csp_rw_left) apply (rule csp_commut) apply (rule csp_rw_left) apply (rule csp_Ext_choice_dist_l) apply (rule csp_decompo) apply (rule csp_commut)+ done (********************************************************* dist law for Parallel (l) *********************************************************) lemma domSF_Parallel_dist_l: "[[(P1 |~| P2) |[X]| Q]]SF ev = [[(P1 |[X]| Q) |~| (P2 |[X]| Q)]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Parallel_mem Int_choice_mem, fast)+ (* domF *) apply (rule eq_iffI) apply (rule, simp add: Parallel_mem Int_choice_mem) apply (elim disjE conjE exE) apply (rule disjI1) apply (rule_tac x="Y" in exI) apply (rule_tac x="Z" in exI) apply (fast) apply (rule disjI2) apply (rule_tac x="Y" in exI) apply (rule_tac x="Z" in exI) apply (fast) apply (rule, simp add: Parallel_mem Int_choice_mem) apply (elim disjE conjE exE) apply (rule_tac x="Y" in exI) apply (rule_tac x="Z" in exI) apply (fast) apply (rule_tac x="Y" in exI) apply (rule_tac x="Z" in exI) apply (fast) done (*------------------* | csp law | *------------------*) lemma csp_Parallel_dist_l: "LET:fp df IN (P1 |~| P2) |[X]| Q =F LET:fp df IN (P1 |[X]| Q) |~| (P2 |[X]| Q)" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Parallel_dist_l) (********************************************************* dist law for Parallel (r) *********************************************************) lemma csp_Parallel_dist_r: "LET:fp df IN P |[X]| (Q1 |~| Q2) =F LET:fp df IN (P |[X]| Q1) |~| (P |[X]| Q2)" apply (rule csp_rw_left) apply (rule csp_commut) apply (rule csp_rw_left) apply (rule csp_Parallel_dist_l) apply (rule csp_decompo) apply (rule csp_commut)+ done (********************************************************* dist law for Hiding *********************************************************) lemma domSF_Hiding_dist: "[[(P1 |~| P2) -- X]]SF ev = [[(P1 -- X) |~| (P2 -- X)]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Hiding_mem Int_choice_mem, fast)+ (* domF *) apply (rule eq_iffI) apply (rule, simp add: Hiding_mem Int_choice_mem, fast)+ done (*------------------* | csp law | *------------------*) lemma csp_Hiding_dist: "LET:fp df IN (P1 |~| P2) -- X =F LET:fp df IN (P1 -- X) |~| (P2 -- X)" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Hiding_dist) (********************************************************* dist law for Renaming *********************************************************) lemma domSF_Renaming_dist: "[[(P1 |~| P2) [[r]]]]SF ev = [[(P1 [[r]]) |~| (P2 [[r]])]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Renaming_mem Int_choice_mem, fast)+ (* domF *) apply (rule eq_iffI) apply (rule, simp add: Renaming_mem Int_choice_mem, fast)+ done (*------------------* | csp law | *------------------*) lemma csp_Renaming_dist: "LET:fp df IN (P1 |~| P2) [[r]] =F LET:fp df IN (P1 [[r]]) |~| (P2 [[r]])" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Renaming_dist) (********************************************************* dist law for Sequential composition *********************************************************) lemma domSF_Seq_compo_dist: "[[(P1 |~| P2) ;; Q]]SF ev = [[(P1 ;; Q) |~| (P2 ;; Q)]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Seq_compo_mem Int_choice_mem, fast)+ (* domF *) apply (rule eq_iffI) apply (rule, simp add: Seq_compo_mem Int_choice_mem, fast)+ done (*------------------* | csp law | *------------------*) lemma csp_Seq_compo_dist: "LET:fp df IN (P1 |~| P2) ;; Q =F LET:fp df IN (P1 ;; Q) |~| (P2 ;; Q)" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Seq_compo_dist) (********************************************************* dist laws *********************************************************) lemmas csp_dist = csp_Ext_choice_dist_l csp_Ext_choice_dist_r csp_Parallel_dist_l csp_Parallel_dist_r csp_Hiding_dist csp_Renaming_dist csp_Seq_compo_dist (***************************************************************** distribution of internal bind over ... 1. (! :X .. Pf) [+] Q 2. Q [+] (! :X .. Pf) 3. (! :X .. Pf) |[X]| Q 4. Q |[X]| (! :X .. Pf) 5. (! :X .. Pf) -- X 6. (! :X .. Pf) [[r]] *****************************************************************) (********************************************************* Rep_dist law for Ext_choice (l) *********************************************************) lemma domSF_Ext_choice_Rep_dist_l: "X ~= {} ==> [[(! :X .. Pf) [+] Q]]SF ev = [[! x:X .. (Pf x [+] Q)]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Ext_choice_mem Rep_int_choice_mem memF_IntF memF_UnF memT_UnT, fast)+ (* domF *) apply (rule eq_iffI) apply (rule, simp add: Ext_choice_mem Rep_int_choice_mem memF_IntF memF_UnF memT_UnT, fast)+ done (*------------------* | csp law | *------------------*) lemma csp_Ext_choice_Rep_dist_l: "X ~= {} ==> LET:fp df IN (! :X .. Pf) [+] Q =F LET:fp df IN ! x:X .. (Pf x [+] Q)" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Ext_choice_Rep_dist_l) (********************************************************* Rep_dist law for Ext_choice (r) *********************************************************) lemma csp_Ext_choice_Rep_dist_r: "X ~= {} ==> LET:fp df IN P [+] (! :X .. Qf) =F LET:fp df IN ! x:X .. (P [+] Qf x)" apply (rule csp_rw_left) apply (rule csp_commut) apply (rule csp_rw_left) apply (rule csp_Ext_choice_Rep_dist_l, simp) apply (rule csp_decompo, simp) apply (rule csp_commut) done (********************************************************* Rep_dist law for Parallel (l) *********************************************************) lemma domSF_Parallel_Rep_dist_l: "Y ~= {} ==> [[(! :Y .. Pf) |[X]| Q]]SF ev = [[! x:Y .. (Pf x |[X]| Q)]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Parallel_mem Rep_int_choice_mem) apply (elim disjE conjE exE) apply (subgoal_tac "EX a. a:Y") apply (elim exE) apply (rule disjI2) apply (rule_tac x="a" in exI) apply (simp) apply (rule_tac x="[]t" in exI) apply (rule_tac x="ta" in exI) apply (simp) apply (fast) (* *) apply (rule disjI2) apply (rule_tac x="a" in exI) apply (fast) apply (rule, simp add: Parallel_mem Rep_int_choice_mem) apply (elim disjE conjE exE) apply (rule_tac x="[]t" in exI) apply (rule_tac x="[]t" in exI) apply (simp) apply (fast) (* domF *) apply (rule eq_iffI) apply (rule, simp add: Parallel_mem Rep_int_choice_mem) apply (elim conjE exE) apply (rule_tac x="a" in exI, simp) apply (rule_tac x="Ya" in exI) apply (rule_tac x="Z" in exI) apply (fast) (* *) apply (rule, simp add: Parallel_mem Rep_int_choice_mem) apply (elim conjE exE) apply (rule_tac x="Ya" in exI) apply (rule_tac x="Z" in exI) apply (fast) done (*------------------* | csp law | *------------------*) lemma csp_Parallel_Rep_dist_l: "Y ~= {} ==> LET:fp df IN (! :Y .. Pf) |[X]| Q =F LET:fp df IN ! x:Y .. (Pf x |[X]| Q)" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Parallel_Rep_dist_l) (********************************************************* Rep_dist law for Parallel (r) *********************************************************) lemma csp_Parallel_Rep_dist_r: "Y ~= {} ==> LET:fp df IN P |[X]| (! :Y .. Qf) =F LET:fp df IN ! x:Y .. (P |[X]| Qf x)" apply (rule csp_rw_left) apply (rule csp_commut) apply (rule csp_rw_left) apply (rule csp_Parallel_Rep_dist_l, simp) apply (rule csp_decompo, simp) apply (rule csp_commut) done (********************************************************* Rep_dist law for Hiding *********************************************************) lemma domSF_Hiding_Rep_dist: "[[(! :Y .. Pf) -- X]]SF ev = [[! x:Y .. (Pf x -- X)]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Hiding_mem Rep_int_choice_mem) apply (elim disjE conjE exE, simp, fast) apply (rule, simp add: Hiding_mem Rep_int_choice_mem) apply (elim disjE conjE exE) apply (rule_tac x="[]t" in exI, simp) apply (rule_tac x="s" in exI, fast) (* domF *) apply (rule eq_iffI) apply (rule, simp add: Hiding_mem Rep_int_choice_mem, fast)+ done (*------------------* | csp law | *------------------*) lemma csp_Hiding_Rep_dist: "LET:fp df IN (! :Y .. Pf) -- X =F LET:fp df IN ! x:Y .. (Pf x -- X)" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Hiding_Rep_dist) (********************************************************* Rep_dist law for Renaming *********************************************************) lemma domSF_Renaming_Rep_dist: "[[(! :X .. Pf) [[r]]]]SF ev = [[! x:X .. (Pf x [[r]])]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Renaming_mem Rep_int_choice_mem) apply (elim disjE conjE exE, simp, fast) apply (rule, simp add: Renaming_mem Rep_int_choice_mem) apply (elim disjE conjE exE, simp, fast) (* domF *) apply (rule eq_iffI) apply (rule, simp add: Renaming_mem Rep_int_choice_mem, fast)+ done (*------------------* | csp law | *------------------*) lemma csp_Renaming_Rep_dist: "LET:fp df IN (! :X .. Pf) [[r]] =F LET:fp df IN ! x:X .. (Pf x [[r]])" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Renaming_Rep_dist) (********************************************************* Rep_dist law for Sequential composition *********************************************************) lemma domSF_Seq_compo_Rep_dist: "[[(! :X .. Pf) ;; Q]]SF ev = [[! x:X .. (Pf x ;; Q)]]SF ev" apply (simp add: proc_eqSF_decompo) apply (rule conjI) (* domT *) apply (rule eq_iffI) apply (rule, simp add: Seq_compo_mem Rep_int_choice_mem) apply (elim disjE conjE exE, simp, fast, fast) apply (rule, simp add: Seq_compo_mem Rep_int_choice_mem) apply (elim disjE conjE exE) apply (rule disjI1) apply (rule_tac x="[]t" in exI, simp, fast, fast) (* domF *) apply (rule eq_iffI) apply (rule, simp add: Seq_compo_mem Rep_int_choice_mem, fast)+ done (*------------------* | csp law | *------------------*) lemma csp_Seq_compo_Rep_dist: "LET:fp df IN (! :X .. Pf) ;; Q =F LET:fp df IN ! x:X .. (Pf x ;; Q)" apply (induct_tac fp) by (simp_all add: eqF_def domSF_Seq_compo_Rep_dist) (********************************************************* Rep_dist laws *********************************************************) lemmas csp_Rep_dist = csp_Ext_choice_Rep_dist_l csp_Ext_choice_Rep_dist_r csp_Parallel_Rep_dist_l csp_Parallel_Rep_dist_r csp_Hiding_Rep_dist csp_Renaming_Rep_dist csp_Seq_compo_Rep_dist (****************** to add them again ******************) declare not_None_eq [simp] end
lemma domSF_Ext_choice_dist_l:
[[(P1 |~| P2) [+] Q]]SF ev = [[P1 [+] Q |~| P2 [+] Q]]SF ev
lemma csp_Ext_choice_dist_l:
LET:fp df IN (P1 |~| P2) [+] Q =F LET:fp df IN P1 [+] Q |~| P2 [+] Q
lemma csp_Ext_choice_dist_r:
LET:fp df IN P [+] (Q1 |~| Q2) =F LET:fp df IN P [+] Q1 |~| P [+] Q2
lemma domSF_Parallel_dist_l:
[[(P1 |~| P2) |[X]| Q]]SF ev = [[P1 |[X]| Q |~| P2 |[X]| Q]]SF ev
lemma csp_Parallel_dist_l:
LET:fp df IN (P1 |~| P2) |[X]| Q =F LET:fp df IN P1 |[X]| Q |~| P2 |[X]| Q
lemma csp_Parallel_dist_r:
LET:fp df IN P |[X]| (Q1 |~| Q2) =F LET:fp df IN P |[X]| Q1 |~| P |[X]| Q2
lemma domSF_Hiding_dist:
[[(P1 |~| P2) -- X]]SF ev = [[P1 -- X |~| P2 -- X]]SF ev
lemma csp_Hiding_dist:
LET:fp df IN (P1 |~| P2) -- X =F LET:fp df IN P1 -- X |~| P2 -- X
lemma domSF_Renaming_dist:
[[(P1 |~| P2) [[r]]]]SF ev = [[P1 [[r]] |~| P2 [[r]]]]SF ev
lemma csp_Renaming_dist:
LET:fp df IN (P1 |~| P2) [[r]] =F LET:fp df IN P1 [[r]] |~| P2 [[r]]
lemma domSF_Seq_compo_dist:
[[(P1 |~| P2) ;; Q]]SF ev = [[P1 ;; Q |~| P2 ;; Q]]SF ev
lemma csp_Seq_compo_dist:
LET:fp df IN (P1 |~| P2) ;; Q =F LET:fp df IN P1 ;; Q |~| P2 ;; Q
lemmas csp_dist:
LET:fp df IN (P1 |~| P2) [+] Q =F LET:fp df IN P1 [+] Q |~| P2 [+] Q
LET:fp df IN P [+] (Q1 |~| Q2) =F LET:fp df IN P [+] Q1 |~| P [+] Q2
LET:fp df IN (P1 |~| P2) |[X]| Q =F LET:fp df IN P1 |[X]| Q |~| P2 |[X]| Q
LET:fp df IN P |[X]| (Q1 |~| Q2) =F LET:fp df IN P |[X]| Q1 |~| P |[X]| Q2
LET:fp df IN (P1 |~| P2) -- X =F LET:fp df IN P1 -- X |~| P2 -- X
LET:fp df IN (P1 |~| P2) [[r]] =F LET:fp df IN P1 [[r]] |~| P2 [[r]]
LET:fp df IN (P1 |~| P2) ;; Q =F LET:fp df IN P1 ;; Q |~| P2 ;; Q
lemma domSF_Ext_choice_Rep_dist_l:
X ≠ {} ==> [[(! :X .. Pf) [+] Q]]SF ev = [[! x:X .. Pf x [+] Q]]SF ev
lemma csp_Ext_choice_Rep_dist_l:
X ≠ {} ==> LET:fp df IN (! :X .. Pf) [+] Q =F LET:fp df IN ! x:X .. Pf x [+] Q
lemma csp_Ext_choice_Rep_dist_r:
X ≠ {} ==> LET:fp df IN P [+] (! :X .. Qf) =F LET:fp df IN ! x:X .. P [+] Qf x
lemma domSF_Parallel_Rep_dist_l:
Y ≠ {} ==> [[(! :Y .. Pf) |[X]| Q]]SF ev = [[! x:Y .. Pf x |[X]| Q]]SF ev
lemma csp_Parallel_Rep_dist_l:
Y ≠ {} ==> LET:fp df IN (! :Y .. Pf) |[X]| Q =F LET:fp df IN ! x:Y .. Pf x |[X]| Q
lemma csp_Parallel_Rep_dist_r:
Y ≠ {} ==> LET:fp df IN P |[X]| (! :Y .. Qf) =F LET:fp df IN ! x:Y .. P |[X]| Qf x
lemma domSF_Hiding_Rep_dist:
[[(! :Y .. Pf) -- X]]SF ev = [[! x:Y .. Pf x -- X]]SF ev
lemma csp_Hiding_Rep_dist:
LET:fp df IN (! :Y .. Pf) -- X =F LET:fp df IN ! x:Y .. Pf x -- X
lemma domSF_Renaming_Rep_dist:
[[(! :X .. Pf) [[r]]]]SF ev = [[! x:X .. Pf x [[r]]]]SF ev
lemma csp_Renaming_Rep_dist:
LET:fp df IN (! :X .. Pf) [[r]] =F LET:fp df IN ! x:X .. Pf x [[r]]
lemma domSF_Seq_compo_Rep_dist:
[[(! :X .. Pf) ;; Q]]SF ev = [[! x:X .. Pf x ;; Q]]SF ev
lemma csp_Seq_compo_Rep_dist:
LET:fp df IN (! :X .. Pf) ;; Q =F LET:fp df IN ! x:X .. Pf x ;; Q
lemmas csp_Rep_dist:
X ≠ {} ==> LET:fp df IN (! :X .. Pf) [+] Q =F LET:fp df IN ! x:X .. Pf x [+] Q
X ≠ {} ==> LET:fp df IN P [+] (! :X .. Qf) =F LET:fp df IN ! x:X .. P [+] Qf x
Y ≠ {} ==> LET:fp df IN (! :Y .. Pf) |[X]| Q =F LET:fp df IN ! x:Y .. Pf x |[X]| Q
Y ≠ {} ==> LET:fp df IN P |[X]| (! :Y .. Qf) =F LET:fp df IN ! x:Y .. P |[X]| Qf x
LET:fp df IN (! :Y .. Pf) -- X =F LET:fp df IN ! x:Y .. Pf x -- X
LET:fp df IN (! :X .. Pf) [[r]] =F LET:fp df IN ! x:X .. Pf x [[r]]
LET:fp df IN (! :X .. Pf) ;; Q =F LET:fp df IN ! x:X .. Pf x ;; Q