Theory CSP_T_law_alpha_par

Up to index of Isabelle/HOL/HOL-Complex/CSP/CSP_T

theory CSP_T_law_alpha_par
imports CSP_T_op_alpha_par CSP_T_law_decompo
begin

           (*-------------------------------------------*
            |        CSP-Prover on Isabelle2004         |
            |                    May 2005               |
            |                   June 2005  (modified)   |
            |              September 2005  (modified)   |
            |                                           |
            |        CSP-Prover on Isabelle2005         |
            |                October 2005  (modified)   |
            |                  April 2006  (modified)   |
            |                  March 2007  (modified)   |
            |                                           |
            |        Yoshinao Isobe (AIST JAPAN)        |
            *-------------------------------------------*)

theory CSP_T_law_alpha_par
imports CSP_T_op_alpha_par CSP_T_law_decompo
begin

(*  The following simplification rules are deleted in this theory file *)
(*  because they unexpectly rewrite UnionT and InterT.                 *)
(*                  Union (B ` A) = (UN x:A. B x)                      *)
(*                  Inter (B ` A) = (INT x:A. B x)                     *)

declare Union_image_eq [simp del]
declare Inter_image_eq [simp del]

(*****************************************************************

         1. associativity of |[X,Y]|
         2. commutativity of |[X,Y]|
         3. monotonicity of |[X,Y]|
         4. 

 *****************************************************************)

(*********************************************************
                        P |[X,Y]| Q
 *********************************************************)

(************************************
 |         SKIP and SKIP            |
 ************************************)

(*------------------*
 |      csp law     |
 *------------------*)

lemma cspT_SKIP_Alpha_parallel:
  "(SKIP |[{}, {}]| SKIP) =T[M1,M2] SKIP"
apply (simp add: cspT_semantics)
apply (rule order_antisym)

(* => *)
 apply (rule)
 apply (simp add: in_traces in_traces_Alpha_parallel)
 apply (simp add: sett_subset_Tick)

(* <= *)
 apply (rule)
 apply (simp add: in_traces in_traces_Alpha_parallel)
 apply (simp add: sett_subset_Tick)
 apply (insert rest_tr_sett_subseteq_sett[of _ "{}"])
 apply (auto)
done

(************************************
 |          associativity           |
 ************************************)

(*------------------*
 |      csp law     |
 *------------------*)

lemma cspT_Alpha_parallel_assoc:
  "(P1 |[X1, X2]| P2) |[X1 Un X2, X3]| P3 =T[M,M]
   P1 |[X1, X2 Un X3]| (P2 |[X2, X3]| P3)"
apply (simp add: cspT_semantics)
apply (rule order_antisym)

(* => *)
 apply (rule)
 apply (simp add: in_traces_Alpha_parallel)
 apply (elim conjE exE)
 apply (simp add: Un_upper1 Un_upper2 rest_tr_of_rest_tr_subset)
 apply (simp add: Un_assoc)

(* <= *)
 apply (rule)
 apply (simp add: in_traces_Alpha_parallel)
 apply (elim conjE exE)
 apply (simp add: Un_upper1 Un_upper2 rest_tr_of_rest_tr_subset)
 apply (simp add: Un_assoc)
done

lemma cspT_Alpha_parallel_assoc_sym:
  "P1 |[X1, X2 Un X3]| (P2 |[X2, X3]| P3) =T[M,M]
   (P1 |[X1, X2]| P2) |[X1 Un X2, X3]| P3"
apply (rule cspT_sym)
by (simp add: cspT_Alpha_parallel_assoc)

(************************************
 |          commutativity           |
 ************************************)

(*------------------*
 |      csp law     |
 *------------------*)

lemma cspT_Alpha_parallel_commut:
  "(P1 |[X1, X2]| P2) =T[M,M] (P2 |[X2, X1]| P1)"
apply (simp add: cspT_semantics)
apply (rule order_antisym)

(* => *)
 apply (rule)
 apply (simp add: in_traces_Alpha_parallel)
 apply (fast)

(* <= *)
 apply (rule)
 apply (simp add: in_traces_Alpha_parallel)
 apply (fast)
done

(************************************
 |          monotonicity            |
 ************************************)

(*------------------*
 |      csp law M   |
 *------------------*)

lemma cspT_Alpha_parallel_mono:
  "[| X1 = X2 ; Y1 = Y2 ;
      P1 <=T[M1,M2] Q1 ; 
      P2 <=T[M1,M2] Q2 |]
           ==> P1 |[X1,Y1]| P2 <=T[M1,M2] Q1 |[X2,Y2]| Q2"
apply (simp add: Alpha_parallel_def)
apply (simp add: cspT_Parallel_mono)
done

lemma cspT_Alpha_parallel_cong:
  "[| X1 = X2 ; Y1 = Y2 ;
      P1 =T[M1,M2] Q1 ; 
      P2 =T[M1,M2] Q2 |]
           ==> P1 |[X1,Y1]| P2 =T[M1,M2] Q1 |[X2,Y2]| Q2"
by (simp add: cspT_eq_ref_iff cspT_Alpha_parallel_mono)

lemmas cspT_decompo_Alpha_parallel = cspT_Alpha_parallel_mono
                                     cspT_Alpha_parallel_cong

(****************** to add them again ******************)

declare Union_image_eq [simp]
declare Inter_image_eq [simp]

end


lemma cspT_SKIP_Alpha_parallel:

  SKIP |[{},{}]| SKIP =T[M1.0,M2.0] SKIP

lemma cspT_Alpha_parallel_assoc:

  P1.0 |[X1.0,X2.0]| P2.0 |[X1.0X2.0,X3.0]| P3.0 =T[M,M] 
  P1.0 |[X1.0,X2.0X3.0]| (P2.0 |[X2.0,X3.0]| P3.0)

lemma cspT_Alpha_parallel_assoc_sym:

  P1.0 |[X1.0,X2.0X3.0]| (P2.0 |[X2.0,X3.0]| P3.0) =T[M,M] 
  P1.0 |[X1.0,X2.0]| P2.0 |[X1.0X2.0,X3.0]| P3.0

lemma cspT_Alpha_parallel_commut:

  P1.0 |[X1.0,X2.0]| P2.0 =T[M,M] P2.0 |[X2.0,X1.0]| P1.0

lemma cspT_Alpha_parallel_mono:

  [| X1.0 = X2.0; Y1.0 = Y2.0; P1.0 <=T[M1.0,M2.0] Q1.0;
     P2.0 <=T[M1.0,M2.0] Q2.0 |]
  ==> P1.0 |[X1.0,Y1.0]| P2.0 <=T[M1.0,M2.0] Q1.0 |[X2.0,Y2.0]| Q2.0

lemma cspT_Alpha_parallel_cong:

  [| X1.0 = X2.0; Y1.0 = Y2.0; P1.0 =T[M1.0,M2.0] Q1.0; P2.0 =T[M1.0,M2.0] Q2.0 |]
  ==> P1.0 |[X1.0,Y1.0]| P2.0 =T[M1.0,M2.0] Q1.0 |[X2.0,Y2.0]| Q2.0

lemmas cspT_decompo_Alpha_parallel:

  [| X1.0 = X2.0; Y1.0 = Y2.0; P1.0 <=T[M1.0,M2.0] Q1.0;
     P2.0 <=T[M1.0,M2.0] Q2.0 |]
  ==> P1.0 |[X1.0,Y1.0]| P2.0 <=T[M1.0,M2.0] Q1.0 |[X2.0,Y2.0]| Q2.0
  [| X1.0 = X2.0; Y1.0 = Y2.0; P1.0 =T[M1.0,M2.0] Q1.0; P2.0 =T[M1.0,M2.0] Q2.0 |]
  ==> P1.0 |[X1.0,Y1.0]| P2.0 =T[M1.0,M2.0] Q1.0 |[X2.0,Y2.0]| Q2.0

lemmas cspT_decompo_Alpha_parallel:

  [| X1.0 = X2.0; Y1.0 = Y2.0; P1.0 <=T[M1.0,M2.0] Q1.0;
     P2.0 <=T[M1.0,M2.0] Q2.0 |]
  ==> P1.0 |[X1.0,Y1.0]| P2.0 <=T[M1.0,M2.0] Q1.0 |[X2.0,Y2.0]| Q2.0
  [| X1.0 = X2.0; Y1.0 = Y2.0; P1.0 =T[M1.0,M2.0] Q1.0; P2.0 =T[M1.0,M2.0] Q2.0 |]
  ==> P1.0 |[X1.0,Y1.0]| P2.0 =T[M1.0,M2.0] Q1.0 |[X2.0,Y2.0]| Q2.0