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