Up to index of Isabelle/HOL/HOL-Complex/CSP-Prover
theory CSP_law_ref = CSP_law_commut + CSP_law_decompo:           (*-------------------------------------------*
            |                CSP-Prover                 |
            |               December 2004               |
            |        Yoshinao Isobe (AIST JAPAN)        |
            *-------------------------------------------*)
theory CSP_law_ref = 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]
(*****************************************************************
         1. rules for refinement
 *****************************************************************)
(*-------------------------------------------------------*
 |              decompose Internal choice                |
 *-------------------------------------------------------*)
(*** or <= ***)                                         (* unsafe *)
lemma domSF_Int_choice_left1:
  "[[Q]]SF ev1 <= [[P1]]SF ev2
   ==> [[Q]]SF ev1 <= [[P1 |~| P2]]SF ev2"
apply (simp add: proc_subsetSF_decompo)
apply (rule)
by (rule, simp add: Int_choice_mem, force)+
(*------------------*
 |      csp law     |
 *------------------*)
lemma csp_Int_choice_left1:
  "LET:fp1 df IN P1 <=F LET:fp2 df IN Q
   ==> LET:fp1 df IN P1 |~| P2 <=F LET:fp2 df IN Q"
apply (insert fp_type_is[of fp1])
apply (insert fp_type_is[of fp2])
apply (elim disjE)
by (simp_all add: refF_def domSF_Int_choice_left1)
lemma csp_Int_choice_left2:
  "LET:fp1 df IN P2 <=F LET:fp2 df IN Q
   ==> LET:fp1 df IN P1 |~| P2 <=F LET:fp2 df IN Q"
apply (rule csp_rw_left)
apply (rule csp_commut)
by (simp add: csp_Int_choice_left1)
(*** <= and ***)                                          (* safe *)
lemma domSF_Int_choice_right1:
  "[| [[Q1]]SF ev1 <= [[P]]SF ev2 ; [[Q2]]SF ev1 <= [[P]]SF ev2 |]
   ==> [[Q1 |~| Q2]]SF ev1 <= [[P]]SF ev2"
apply (simp add: proc_subsetSF_decompo)
apply (rule)
by (rule, simp add: Int_choice_mem, force)+
(*------------------*
 |      csp law     |
 *------------------*)
lemma csp_Int_choice_right:
  "[| LET:fp1 df IN P <=F LET:fp2 df IN Q1 ;
      LET:fp1 df IN P <=F LET:fp2 df IN Q2 |]
      ==> LET:fp1 df IN P <=F LET:fp2 df IN Q1 |~| Q2"
apply (insert fp_type_is[of fp1])
apply (insert fp_type_is[of fp2])
apply (elim disjE)
by (simp_all add: refF_def domSF_Int_choice_right1)
(*-------------------------------------------------------*
 |        decompose Replicated internal choice           |
 *-------------------------------------------------------*)
(*** EX <= ***)                                           (* unsafe *)
lemma domSF_Rep_int_choice_left:
  "(EX a. a:X & [[Q]]SF ev1 <= [[Pf a]]SF ev2)
   ==> [[Q]]SF ev1 <= [[! :X .. Pf]]SF ev2"
apply (simp add: proc_subsetSF_decompo)
apply (rule)
by (rule, simp add: Rep_int_choice_mem, force)+
(*------------------*
 |      csp law     |
 *------------------*)
lemma csp_Rep_int_choice_left:
  "(EX a. a:X & LET:fp1 df IN Pf a <=F LET:fp2 df IN Q)
      ==> LET:fp1 df IN ! :X .. Pf <=F LET:fp2 df IN Q"
apply (insert fp_type_is[of fp1])
apply (insert fp_type_is[of fp2])
apply (elim disjE)
by (simp_all add: refF_def domSF_Rep_int_choice_left)
lemma csp_Rep_int_choice_left_x:
  "[| x:X ; LET:fp1 df IN Pf x <=F LET:fp2 df IN Q |]
  ==> LET:fp1 df IN ! :X .. Pf <=F LET:fp2 df IN Q"
apply (rule csp_Rep_int_choice_left)
by (fast)
(*** <= ALL ***)                                         (* safe *)
lemma domSF_Rep_int_choice_right:
  "[| !!a. a:X ==> [[Qf a]]SF ev1 <= [[P]]SF ev2 |]
        ==> [[! :X .. Qf]]SF ev1 <= [[P]]SF ev2"
apply (simp add: proc_subsetSF_decompo)
apply (rule)
by (rule, simp add: Rep_int_choice_mem, force)+
(*------------------*
 |      csp law     |
 *------------------*)
lemma csp_Rep_int_choice_right:
  "[| !!a. a:X ==> LET:fp1 df IN P <=F LET:fp2 df IN Qf a |]
               ==> LET:fp1 df IN P <=F LET:fp2 df IN ! :X .. Qf"
apply (insert fp_type_is[of fp1])
apply (insert fp_type_is[of fp2])
apply (elim disjE)
by (simp_all add: refF_def domSF_Rep_int_choice_right)
(*-------------------------------------------------------*
 |             decomposition with subset                 |
 *-------------------------------------------------------*)
(*** Rep_int_choice ***)                                        (* unsafe *)
lemma domSF_Rep_int_choice_subset:
  "[|  Y <= X  ; !!a. a:Y ==> [[Qf a]]SF ev1 <= [[Pf a]]SF ev2 |]
                    ==> [[! :Y .. Qf]]SF ev1 <= [[! :X .. Pf]]SF ev2"
apply (simp add: proc_subsetSF_decompo)
apply (rule)
by (rule, simp add: Rep_int_choice_mem, force)+
(*------------------*
 |      csp law     |
 *------------------*)
lemma csp_Rep_int_choice_subset:
  "[|  Y <= X  ; !!a. a:Y ==> LET:fp1 df IN Pf a <=F LET:fp2 df IN Qf a |]
                    ==> LET:fp1 df IN ! :X .. Pf <=F LET:fp2 df IN ! :Y .. Qf"
apply (insert fp_type_is[of fp1])
apply (insert fp_type_is[of fp2])
apply (elim disjE)
by (simp_all add: refF_def domSF_Rep_int_choice_subset)
(*** ! x:X .. and ? -> ***)
lemma domSF_Int_Ext_pre_choice_subset:
  "[| Y ~={} ; Y <= X ; !!a. a:Y ==> [[Qf a]]SF ev1 <= [[Pf a]]SF ev2 |]
        ==> [[? :Y -> Qf]]SF ev1 <= [[! x:X .. (x -> Pf x)]]SF ev2"
apply (simp add: proc_subsetSF_decompo)
apply (rule)
 apply (rule)
 apply (simp add: Rep_int_choice_mem Ext_pre_choice_mem Act_prefix_mem)
 apply (elim disjE conjE exE, simp)
 apply (rule disjI2)
 apply (rule_tac x="a" in exI)
 apply (rule)
 apply (rule disjI2)
 apply (rule_tac x="s" in exI)
 apply (simp)
 apply (force)
 apply (fast)
 apply (rule)
 apply (simp add: Rep_int_choice_mem Ext_pre_choice_mem Act_prefix_mem)
 apply (elim disjE conjE exE, simp)
  apply (subgoal_tac "EX a. a:Y")
  apply (elim exE)
  apply (rule_tac x="a" in exI)
  apply (case_tac "Ev a ~: Xa", simp)
  apply (fast)
  apply (fast)
  apply (fast)
 apply (rule_tac x="a" in exI)
 apply (rule)
 apply (rule disjI2)
 apply (rule_tac x="sa" in exI)
 apply (simp)
 apply (force)
 apply (fast)
done
(*------------------*
 |      csp law     |
 *------------------*)
lemma csp_Int_Ext_pre_choice_subset:
  "[| Y ~={} ; Y <= X ; !!a. a:Y ==> LET:fp1 df IN Pf a <=F LET:fp2 df IN Qf a |]
        ==> LET:fp1 df IN ! x:X .. (x -> Pf x) <=F
            LET:fp2 df IN ? :Y -> Qf"
apply (insert fp_type_is[of fp1])
apply (insert fp_type_is[of fp2])
apply (elim disjE)
by (simp_all add: refF_def domSF_Int_Ext_pre_choice_subset)
lemmas csp_decompo_subset = csp_Rep_int_choice_subset
                            csp_Int_Ext_pre_choice_subset
(*-------------------------------------------------------*
 |               decompose external choice               |
 *-------------------------------------------------------*)
lemma domSF_Ext_choice_right:
  "[| [[Q1]]SF ev1 <= [[P]]SF ev2 ; [[Q2]]SF ev1 <= [[P]]SF ev2 |]
      ==> [[Q1 [+] Q2]]SF ev1 <= [[P]]SF ev2"
apply (simp add: proc_subsetSF_decompo)
apply (rule)
 apply (rule)
 apply (simp add: Ext_choice_mem)
 apply (force)
 apply (rule)
 apply (simp add: Ext_choice_mem)
 apply (simp add: memF_IntF memF_UnF memT_UnT)
 apply (elim disjE conjE exE, simp)
 apply (force, force, force)
 apply (simp)
 apply (subgoal_tac "([]t, X) :f [[Q1]]F ev1")
 apply (force)
 apply (rule domSF_F2_F4[of "[[Q1]]T ev1" "[[Q1]]F ev1"])
 apply (simp_all)
 apply (subgoal_tac "([]t, X) :f [[Q2]]F ev1")
 apply (force)
 apply (rule domSF_F2_F4[of "[[Q2]]T ev1" "[[Q2]]F ev1"])
 apply (simp_all)
done
(*------------------*
 |      csp law     |
 *------------------*)
lemma csp_Ext_choice_right:
  "[| LET:fp1 df IN P <=F LET:fp2 df IN Q1 ;
      LET:fp1 df IN P <=F LET:fp2 df IN Q2 |]
      ==> LET:fp1 df IN P <=F LET:fp2 df IN Q1 [+] Q2"
apply (insert fp_type_is[of fp1])
apply (insert fp_type_is[of fp2])
apply (elim disjE)
by (simp_all add: refF_def domSF_Ext_choice_right)
(*-------------------------------------------------------*
 |              Int_choice_Ext_choice                    |
 *-------------------------------------------------------*)
lemma domSF_Int_choice_Ext_choice:
  "[[P1 [+] P2]]SF ev <= [[P1 |~| P2]]SF ev"
apply (simp add: proc_subsetSF_decompo)
apply (rule)
 apply (rule)
 apply (simp add: Ext_choice_mem Int_choice_mem)
 apply (rule)
 apply (simp add: Ext_choice_mem Int_choice_mem)
 apply (simp add: memF_IntF memF_UnF memT_UnT)
 apply (elim disjE conjE exE)
  apply (simp_all)
  apply (rule disjI1)
  apply (rule domSF_F2_F4)
  apply (simp_all)
  apply (rule disjI2)
  apply (rule domSF_F2_F4)
  apply (simp_all)
done
(*------------------*
 |      csp law     |
 *------------------*)
lemma csp_Int_choice_Ext_choice:
  "LET:fp df IN P1 |~| P2 <=F LET:fp df IN P1 [+] P2"
apply (induct_tac fp)
by (simp_all add: refF_def domSF_Int_choice_Ext_choice)
lemma csp_Int_choice_left3:
  "LET:fp df IN P1 [+] P2 <=F LET:fp df IN Q
   ==> LET:fp df IN P1 |~| P2 <=F LET:fp df IN Q"
apply (rule csp_trans)
apply (rule csp_Int_choice_Ext_choice)
by (simp)
end
lemma domSF_Int_choice_left1:
[[Q]]SF ev1 ≤ [[P1]]SF ev2 ==> [[Q]]SF ev1 ≤ [[P1 |~| P2]]SF ev2
lemma csp_Int_choice_left1:
LET:fp1 df IN P1 <=F LET:fp2 df IN Q ==> LET:fp1 df IN P1 |~| P2 <=F LET:fp2 df IN Q
lemma csp_Int_choice_left2:
LET:fp1 df IN P2 <=F LET:fp2 df IN Q ==> LET:fp1 df IN P1 |~| P2 <=F LET:fp2 df IN Q
lemma domSF_Int_choice_right1:
[| [[Q1]]SF ev1 ≤ [[P]]SF ev2; [[Q2]]SF ev1 ≤ [[P]]SF ev2 |] ==> [[Q1 |~| Q2]]SF ev1 ≤ [[P]]SF ev2
lemma csp_Int_choice_right:
  [| 
     LET:fp1 df IN P <=F 
     LET:fp2 df IN Q1;
     
     LET:fp1 df IN P <=F 
     LET:fp2 df IN Q2 |]
  ==> 
      LET:fp1 df IN P <=F 
      LET:fp2 df IN Q1 |~| Q2
lemma domSF_Rep_int_choice_left:
∃a. a ∈ X ∧ [[Q]]SF ev1 ≤ [[Pf a]]SF ev2 ==> [[Q]]SF ev1 ≤ [[! :X .. Pf]]SF ev2
lemma csp_Rep_int_choice_left:
∃a. a ∈ X ∧ LET:fp1 df IN Pf a <=F LET:fp2 df IN Q ==> LET:fp1 df IN ! :X .. Pf <=F LET:fp2 df IN Q
lemma csp_Rep_int_choice_left_x:
[| x ∈ X; LET:fp1 df IN Pf x <=F LET:fp2 df IN Q |] ==> LET:fp1 df IN ! :X .. Pf <=F LET:fp2 df IN Q
lemma domSF_Rep_int_choice_right:
(!!a. a ∈ X ==> [[Qf a]]SF ev1 ≤ [[P]]SF ev2) ==> [[! :X .. Qf]]SF ev1 ≤ [[P]]SF ev2
lemma csp_Rep_int_choice_right:
(!!a. a ∈ X ==> LET:fp1 df IN P <=F LET:fp2 df IN Qf a) ==> LET:fp1 df IN P <=F LET:fp2 df IN ! :X .. Qf
lemma domSF_Rep_int_choice_subset:
[| Y ⊆ X; !!a. a ∈ Y ==> [[Qf a]]SF ev1 ≤ [[Pf a]]SF ev2 |] ==> [[! :Y .. Qf]]SF ev1 ≤ [[! :X .. Pf]]SF ev2
lemma csp_Rep_int_choice_subset:
[| Y ⊆ X; !!a. a ∈ Y ==> LET:fp1 df IN Pf a <=F LET:fp2 df IN Qf a |] ==> LET:fp1 df IN ! :X .. Pf <=F LET:fp2 df IN ! :Y .. Qf
lemma domSF_Int_Ext_pre_choice_subset:
[| Y ≠ {}; Y ⊆ X; !!a. a ∈ Y ==> [[Qf a]]SF ev1 ≤ [[Pf a]]SF ev2 |] ==> [[? :Y -> Qf]]SF ev1 ≤ [[! x:X .. x -> Pf x]]SF ev2
lemma csp_Int_Ext_pre_choice_subset:
[| Y ≠ {}; Y ⊆ X; !!a. a ∈ Y ==> LET:fp1 df IN Pf a <=F LET:fp2 df IN Qf a |] ==> LET:fp1 df IN ! x:X .. x -> Pf x <=F LET:fp2 df IN ? :Y -> Qf
lemmas csp_decompo_subset:
[| Y ⊆ X; !!a. a ∈ Y ==> LET:fp1 df IN Pf a <=F LET:fp2 df IN Qf a |] ==> LET:fp1 df IN ! :X .. Pf <=F LET:fp2 df IN ! :Y .. Qf
[| Y ≠ {}; Y ⊆ X; !!a. a ∈ Y ==> LET:fp1 df IN Pf a <=F LET:fp2 df IN Qf a |] ==> LET:fp1 df IN ! x:X .. x -> Pf x <=F LET:fp2 df IN ? :Y -> Qf
lemma domSF_Ext_choice_right:
[| [[Q1]]SF ev1 ≤ [[P]]SF ev2; [[Q2]]SF ev1 ≤ [[P]]SF ev2 |] ==> [[Q1 [+] Q2]]SF ev1 ≤ [[P]]SF ev2
lemma csp_Ext_choice_right:
  [| 
     LET:fp1 df IN P <=F 
     LET:fp2 df IN Q1;
     
     LET:fp1 df IN P <=F 
     LET:fp2 df IN Q2 |]
  ==> 
      LET:fp1 df IN P <=F 
      LET:fp2 df IN Q1 [+] Q2
lemma domSF_Int_choice_Ext_choice:
[[P1 [+] P2]]SF ev ≤ [[P1 |~| P2]]SF ev
lemma csp_Int_choice_Ext_choice:
LET:fp df IN P1 |~| P2 <=F LET:fp df IN P1 [+] P2
lemma csp_Int_choice_left3:
LET:fp df IN P1 [+] P2 <=F LET:fp df IN Q ==> LET:fp df IN P1 |~| P2 <=F LET:fp df IN Q