lemma mkex2_unfold: "mkex2 A B =
(LAM sch exA exB.
(\<lambda>s t. case sch of
nil \<Rightarrow> nil
| x ## xs \<Rightarrow>
(case x of
UU \<Rightarrow> UU
| Def y \<Rightarrow>
(if y \<in> act A then
(if y \<in> act B then
(case HD \<cdot> exA of
UU \<Rightarrow> UU
| Def a \<Rightarrow>
(case HD \<cdot> exB of
UU \<Rightarrow> UU
| Def b \<Rightarrow>
(y, (snd a, snd b)) \<leadsto>
(mkex2 A B \<cdot> xs \<cdot> (TL \<cdot> exA) \<cdot> (TL \<cdot> exB)) (snd a) (snd b)))
else
(case HD \<cdot> exA of
UU \<Rightarrow> UU
| Def a \<Rightarrow> (y, (snd a, t)) \<leadsto> (mkex2 A B \<cdot> xs \<cdot> (TL \<cdot> exA) \<cdot> exB) (snd a) t))
else
(if y \<in> act B then
(case HD \<cdot> exB of
UU \<Rightarrow> UU
| Def b \<Rightarrow> (y, (s, snd b)) \<leadsto> (mkex2 A B \<cdot> xs \<cdot> exA \<cdot> (TL \<cdot> exB)) s (snd b))
else UU)))))" apply (rule trans) apply (rule fix_eq2) apply (simp only: mkex2_def) apply (rule beta_cfun) apply simp done
lemma mkex2_UU: "(mkex2 A B \ UU \ exA \ exB) s t = UU" apply (subst mkex2_unfold) apply simp done
lemma mkex2_nil: "(mkex2 A B \ nil \ exA \ exB) s t = nil" apply (subst mkex2_unfold) apply simp done
lemma mkex2_cons_1: "x \ act A \ x \ act B \ HD \ exA = Def a \
(mkex2 A B \<cdot> (x \<leadsto> sch) \<cdot> exA \<cdot> exB) s t =
(x, snd a,t) \<leadsto> (mkex2 A B \<cdot> sch \<cdot> (TL \<cdot> exA) \<cdot> exB) (snd a) t" apply (rule trans) apply (subst mkex2_unfold) apply (simp add: Consq_def If_and_if) apply (simp add: Consq_def) done
lemma mkex2_cons_2: "x \ act A \ x \ act B \ HD \ exB = Def b \
(mkex2 A B \<cdot> (x \<leadsto> sch) \<cdot> exA \<cdot> exB) s t =
(x, s, snd b) \<leadsto> (mkex2 A B \<cdot> sch \<cdot> exA \<cdot> (TL \<cdot> exB)) s (snd b)" apply (rule trans) apply (subst mkex2_unfold) apply (simp add: Consq_def If_and_if) apply (simp add: Consq_def) done
lemma mkex2_cons_3: "x \ act A \ x \ act B \ HD \ exA = Def a \ HD \ exB = Def b \
(mkex2 A B \<cdot> (x \<leadsto> sch) \<cdot> exA \<cdot> exB) s t =
(x, snd a,snd b) \<leadsto> (mkex2 A B \<cdot> sch \<cdot> (TL \<cdot> exA) \<cdot> (TL \<cdot> exB)) (snd a) (snd b)" apply (rule trans) apply (subst mkex2_unfold) apply (simp add: Consq_def If_and_if) apply (simp add: Consq_def) done
lemma mkex_UU: "mkex A B UU (s,exA) (t,exB) = ((s,t),UU)" by (simp add: mkex_def)
lemma mkex_nil: "mkex A B nil (s,exA) (t,exB) = ((s,t),nil)" by (simp add: mkex_def)
lemma mkex_cons_1: "x \ act A \ x \ act B \
mkex A B (x \<leadsto> sch) (s, a \<leadsto> exA) (t, exB) =
((s, t), (x, snd a, t) \<leadsto> snd (mkex A B sch (snd a, exA) (t, exB)))" apply (unfold mkex_def) apply (cut_tac exA = "a \ exA" in mkex2_cons_1) apply auto done
lemma mkex_cons_2: "x \ act A \ x \ act B \
mkex A B (x \<leadsto> sch) (s, exA) (t, b \<leadsto> exB) =
((s, t), (x, s, snd b) \<leadsto> snd (mkex A B sch (s, exA) (snd b, exB)))" apply (unfold mkex_def) apply (cut_tac exB = "b\exB" in mkex2_cons_2) apply auto done
lemma mkex_cons_3: "x \ act A \ x \ act B \
mkex A B (x \<leadsto> sch) (s, a \<leadsto> exA) (t, b \<leadsto> exB) =
((s, t), (x, snd a, snd b) \<leadsto> snd (mkex A B sch (snd a, exA) (snd b, exB)))" apply (unfold mkex_def) apply (cut_tac exB = "b\exB" and exA = "a\exA" in mkex2_cons_3) apply auto done
subsection \<open>Compositionality on schedule level\<close>
subsubsection \<open>Lemmas for \<open>\<Longrightarrow>\<close>\<close>
lemma lemma_2_1a: \<comment> \<open>\<open>tfilter ex\<close> and \<open>filter_act\<close> are commutative\<close> "filter_act \ (Filter_ex2 (asig_of A) \ xs) =
Filter (\<lambda>a. a \<in> act A) \<cdot> (filter_act \<cdot> xs)" apply (unfold filter_act_def Filter_ex2_def) apply (simp add: MapFilter o_def) done
lemma lemma_2_1b: \<comment> \<open>State-projections do not affect \<open>filter_act\<close>\<close> "filter_act \ (ProjA2 \ xs) = filter_act \ xs \
filter_act \<cdot> (ProjB2 \<cdot> xs) = filter_act \<cdot> xs" by (pair_induct xs)
text\<open>
Schedules of \<open>A \<parallel> B\<close> have only \<open>A\<close>- or \<open>B\<close>-actions.
Very similar to\<open>lemma_1_1c\<close>, but it is not checking if every action element
of an \<open>ex\<close> is in \<open>A\<close> or \<open>B\<close>, but after projecting it onto the action
schedule. Of course, this is the same proposition, but we cannot change this
one, when then rather \<open>lemma_1_1c\<close>. \<close>
lemma sch_actions_in_AorB: "\s. is_exec_frag (A \ B) (s, xs) \ Forall (\x. x \ act (A \ B)) (filter_act \ xs)" apply (pair_induct xs simp: is_exec_frag_def Forall_def sforall_def) text\<open>main case\<close> apply auto apply (simp add: trans_of_defs2 actions_asig_comp asig_of_par) done
subsubsection \<open>Lemmas for \<open>\<Longleftarrow>\<close>\<close>
text\<open>
Filtering actions out of \<open>mkex (sch, exA, exB)\<close> yields the oracle \<open>sch\<close>
structural induction. \<close>
lemma Mapfst_mkex_is_sch: "\exA exB s t.
Forall (\<lambda>x. x \<in> act (A \<parallel> B)) sch \<and>
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exA \<and>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exB \<longrightarrow>
filter_act \<cdot> (snd (mkex A B sch (s, exA) (t, exB))) = sch" apply (Seq_induct sch simp: Filter_def Forall_def sforall_def mkex_def)
text\<open>main case: splitting into 4 cases according to \<open>a \<in> A\<close>, \<open>a \<in> B\<close>\<close> apply auto
text\<open>Case \<open>y \<in> A\<close>, \<open>y \<in> B\<close>\<close> apply (Seq_case_simp exA) text\<open>Case \<open>exA = UU\<close>, Case \<open>exA = nil\<close>\<close> text\<open>
These \<open>UU\<close> and \<open>nil\<close> cases are the only places where the assumption \<open>filter A sch \<sqsubseteq> f_act exA\<close> is used! \<open>\<longrightarrow>\<close> to generate a contradiction using \<open>\<not> a \<leadsto> ss \<sqsubseteq> UU nil\<close>, usingtheorems\<open>Cons_not_less_UU\<close> and \<open>Cons_not_less_nil\<close>.\<close> apply (Seq_case_simp exB) text\<open>Case \<open>exA = a \<leadsto> x\<close>, \<open>exB = b \<leadsto> y\<close>\<close> text\<open>
Here it is important that @{method Seq_case_simp} uses no \<open>!full!_simp_tac\<close> for the cons case, as otherwise\<open>mkex_cons_3\<close> would not be rewritten
without use of \<open>rotate_tac\<close>: then tactic would not be generally
applicable.\<close> apply simp
text\<open>
Projection of \<open>mkex (sch, exA, exB)\<close> onto \<open>A\<close> stutters on \<open>A\<close>
structural induction. \<close>
lemma stutterA_mkex: "\exA exB s t.
Forall (\<lambda>x. x \<in> act (A \<parallel> B)) sch \<and>
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exA \<and>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exB \<longrightarrow>
stutter (asig_of A) (s, ProjA2 \<cdot> (snd (mkex A B sch (s, exA) (t, exB))))" by (mkex_induct sch exA exB)
lemma stutter_mkex_on_A: "Forall (\x. x \ act (A \ B)) sch \
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<sqsubseteq> filter_act \<cdot> (snd exA) \<Longrightarrow>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<sqsubseteq> filter_act \<cdot> (snd exB) \<Longrightarrow>
stutter (asig_of A) (ProjA (mkex A B sch exA exB))" apply (cut_tac stutterA_mkex) apply (simp add: stutter_def ProjA_def mkex_def) apply (erule allE)+ apply (drule mp) prefer 2 apply (assumption) apply simp done
text\<open>
Projection of \<open>mkex (sch, exA, exB)\<close> onto \<open>B\<close> stutters on \<open>B\<close>
structural induction. \<close>
lemma stutterB_mkex: "\exA exB s t.
Forall (\<lambda>x. x \<in> act (A \<parallel> B)) sch \<and>
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exA \<and>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exB \<longrightarrow>
stutter (asig_of B) (t, ProjB2 \<cdot> (snd (mkex A B sch (s, exA) (t, exB))))" by (mkex_induct sch exA exB)
lemma stutter_mkex_on_B: "Forall (\x. x \ act (A \ B)) sch \
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<sqsubseteq> filter_act \<cdot> (snd exA) \<Longrightarrow>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<sqsubseteq> filter_act \<cdot> (snd exB) \<Longrightarrow>
stutter (asig_of B) (ProjB (mkex A B sch exA exB))" apply (cut_tac stutterB_mkex) apply (simp add: stutter_def ProjB_def mkex_def) apply (erule allE)+ apply (drule mp) prefer 2 apply (assumption) apply simp done
text\<open>
Filter of \<open>mkex (sch, exA, exB)\<close> to \<open>A\<close> after projection onto \<open>A\<close> is \<open>exA\<close>, using\<open>zip \<cdot> (proj1 \<cdot> exA) \<cdot> (proj2 \<cdot> exA)\<close> instead of \<open>exA\<close>,
because of admissibility problems structural induction. \<close>
lemma filter_mkex_is_exA_tmp: "\exA exB s t.
Forall (\<lambda>x. x \<in> act (A \<parallel> B)) sch \<and>
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exA \<and>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exB \<longrightarrow>
Filter_ex2 (asig_of A) \<cdot> (ProjA2 \<cdot> (snd (mkex A B sch (s, exA) (t, exB)))) =
Zip \<cdot> (Filter (\<lambda>a. a \<in> act A) \<cdot> sch) \<cdot> (Map snd \<cdot> exA)" by (mkex_induct sch exB exA)
text\<open> \<open>filter A \<cdot> sch = proj1 \<cdot> ex \<longrightarrow> zip \<cdot> (filter A \<cdot> sch) \<cdot> (proj2 \<cdot> ex) = ex\<close> lemmafor eliminating non admissible equations in assumptions \<close>
lemma trick_against_eq_in_ass: "Filter (\a. a \ act AB) \ sch = filter_act \ ex \
ex = Zip \<cdot> (Filter (\<lambda>a. a \<in> act AB) \<cdot> sch) \<cdot> (Map snd \<cdot> ex)" apply (simp add: filter_act_def) apply (rule Zip_Map_fst_snd [symmetric]) done
text\<open>
Filter of \<open>mkex (sch, exA, exB)\<close> to \<open>A\<close> after projection onto \<open>A\<close> is \<open>exA\<close> using the above trick. \<close>
lemma filter_mkex_is_exA: "Forall (\a. a \ act (A \ B)) sch \
Filter (\<lambda>a. a \<in> act A) \<cdot> sch = filter_act \<cdot> (snd exA) \<Longrightarrow>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch = filter_act \<cdot> (snd exB) \<Longrightarrow>
Filter_ex (asig_of A) (ProjA (mkex A B sch exA exB)) = exA" apply (simp add: ProjA_def Filter_ex_def) apply (pair exA) apply (pair exB) apply (rule conjI) apply (simp (no_asm) add: mkex_def) apply (simplesubst trick_against_eq_in_ass) back apply assumption apply (simp add: filter_mkex_is_exA_tmp) done
text\<open>
Filter of \<open>mkex (sch, exA, exB)\<close> to \<open>B\<close> after projection onto \<open>B\<close> is \<open>exB\<close> using\<open>zip \<cdot> (proj1 \<cdot> exB) \<cdot> (proj2 \<cdot> exB)\<close> instead of \<open>exB\<close>
because of admissibility problems structural induction. \<close>
lemma filter_mkex_is_exB_tmp: "\exA exB s t.
Forall (\<lambda>x. x \<in> act (A \<parallel> B)) sch \<and>
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exA \<and>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exB \<longrightarrow>
Filter_ex2 (asig_of B) \<cdot> (ProjB2 \<cdot> (snd (mkex A B sch (s, exA) (t, exB)))) =
Zip \<cdot> (Filter (\<lambda>a. a \<in> act B) \<cdot> sch) \<cdot> (Map snd \<cdot> exB)" (*notice necessary change of arguments exA and exB*) by (mkex_induct sch exA exB)
text\<open>
Filter of \<open>mkex (sch, exA, exB)\<close> to \<open>A\<close> after projection onto \<open>B\<close> is \<open>exB\<close> using the above trick. \<close>
lemma filter_mkex_is_exB: "Forall (\a. a \ act (A \ B)) sch \
Filter (\<lambda>a. a \<in> act A) \<cdot> sch = filter_act \<cdot> (snd exA) \<Longrightarrow>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch = filter_act \<cdot> (snd exB) \<Longrightarrow>
Filter_ex (asig_of B) (ProjB (mkex A B sch exA exB)) = exB" apply (simp add: ProjB_def Filter_ex_def) apply (pair exA) apply (pair exB) apply (rule conjI) apply (simp add: mkex_def) apply (simplesubst trick_against_eq_in_ass) back apply assumption apply (simp add: filter_mkex_is_exB_tmp) done
lemma mkex_actions_in_AorB: \<comment> \<open>\<open>mkex\<close> has only \<open>A\<close>- or \<open>B\<close>-actions\<close> "\s t exA exB.
Forall (\<lambda>x. x \<in> act (A \<parallel> B)) sch &
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exA \<and>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<sqsubseteq> filter_act \<cdot> exB \<longrightarrow>
Forall (\<lambda>x. fst x \<in> act (A \<parallel> B)) (snd (mkex A B sch (s, exA) (t, exB)))" by (mkex_induct sch exA exB)
theorem compositionality_sch: "sch \ schedules (A \ B) \
Filter (\<lambda>a. a \<in> act A) \<cdot> sch \<in> schedules A \<and>
Filter (\<lambda>a. a \<in> act B) \<cdot> sch \<in> schedules B \<and>
Forall (\<lambda>x. x \<in> act (A \<parallel> B)) sch" apply (simp add: schedules_def has_schedule_def) apply auto text\<open>\<open>\<Longrightarrow>\<close>\<close> apply (rule_tac x = "Filter_ex (asig_of A) (ProjA ex)"in bexI) prefer 2 apply (simp add: compositionality_ex) apply (simp (no_asm) add: Filter_ex_def ProjA_def lemma_2_1a lemma_2_1b) apply (rule_tac x = "Filter_ex (asig_of B) (ProjB ex)"in bexI) prefer 2 apply (simp add: compositionality_ex) apply (simp add: Filter_ex_def ProjB_def lemma_2_1a lemma_2_1b) apply (simp add: executions_def) apply (pair ex) apply (erule conjE) apply (simp add: sch_actions_in_AorB) text\<open>\<open>\<Longleftarrow>\<close>\<close> text\<open>\<open>mkex\<close> is exactly the construction of \<open>exA\<parallel>B\<close> out of \<open>exA\<close>, \<open>exB\<close>, and the oracle\<open>sch\<close>, we need here\<close> apply (rename_tac exA exB) apply (rule_tac x = "mkex A B sch exA exB"in bexI) text\<open>\<open>mkex\<close> actions are just the oracle\<close> apply (pair exA) apply (pair exB) apply (simp add: Mapfst_mkex_is_sch) text\<open>\<open>mkex\<close> is an execution -- use compositionality on ex-level\<close> apply (simp add: compositionality_ex) apply (simp add: stutter_mkex_on_A stutter_mkex_on_B filter_mkex_is_exB filter_mkex_is_exA) apply (pair exA) apply (pair exB) apply (simp add: mkex_actions_in_AorB) done
theorem compositionality_sch_modules: "Scheds (A \ B) = par_scheds (Scheds A) (Scheds B)" apply (unfold Scheds_def par_scheds_def) apply (simp add: asig_of_par) apply (rule set_eqI) apply (simp add: compositionality_sch actions_of_par) done
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.13Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.