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