(*-------------------------------------------* | CSP-Prover on Isabelle2004 | | November 2004 | | July 2005 (modified) | | | | CSP-Prover on Isabelle2005 | | October 2005 (modified) | | April 2006 (modified) | | | | Yoshinao Isobe (AIST JAPAN) | *-------------------------------------------*) theory Trace_par = Prefix: (* The following simplification rules are deleted in this theory file *) (* because they unexpectly rewrite (notick | t = <>) *) (* *) (* disj_not1: (~ P | Q) = (P --> Q) *) declare disj_not1 [simp del] (***************************************************************** 1. s |[X]|list t : lists --> list set 2. s |[X]|tr t : traces --> trace set 3. 4. *****************************************************************) consts parx :: "'a set => ('a trace * 'a trace * 'a trace) set" inductive "parx X" intros parx_nil_nil: "(<>, <>, <>) : parx X" parx_Tick_Tick: "(<Tick>, <Tick>, <Tick>) : parx X" parx_Ev_nil: "[| (u, s, <>) : parx X ; a ~: X |] ==> (<Ev a> ^^ u, <Ev a> ^^ s, <>) : parx X" parx_nil_Ev: "[| (u, <>, t) : parx X ; a ~: X |] ==> (<Ev a> ^^ u, <>, <Ev a> ^^ t) : parx X" parx_Ev_sync: "[| (u, s, t) : parx X ; a : X |] ==> (<Ev a> ^^ u, <Ev a> ^^ s, <Ev a> ^^ t) : parx X" parx_Ev_left: "[| (u, s, t) : parx X ; a ~: X |] ==> (<Ev a> ^^ u, <Ev a> ^^ s, t) : parx X" parx_Ev_right: "[| (u, s, t) : parx X ; a ~: X |] ==> (<Ev a> ^^ u, s, <Ev a> ^^ t) : parx X" consts par_tr :: "'a trace => 'a set => 'a trace => 'a trace set" ("(_ |[_]|tr _)" [76,0,77] 76) defs par_tr_def : "s |[X]|tr t == {u. (u, s, t) : parx X}" lemma par_tr_defE: "[| u : s |[X]|tr t ; (u, s, t) : parx X ==> R |] ==> R" by (simp add: par_tr_def) (************************************************************* par_tr intros and elims *************************************************************) (*-------------------* | intros | *-------------------*) lemma par_tr_nil_nil: "<> : <> |[X]|tr <>" apply (simp add: par_tr_def) by (simp add: parx.intros) lemma par_tr_Tick_Tick: "<Tick> : <Tick> |[X]|tr <Tick>" apply (simp add: par_tr_def) by (simp add: parx.intros) lemma par_tr_Ev_nil: "[| u : s |[X]|tr <> ; a ~: X |] ==> <Ev a> ^^ u : (<Ev a> ^^ s) |[X]|tr <>" apply (simp add: par_tr_def) by (simp add: parx.intros) lemma par_tr_nil_Ev: "[| u : <> |[X]|tr t ; a ~: X |] ==> <Ev a> ^^ u : <> |[X]|tr (<Ev a> ^^ t)" apply (simp add: par_tr_def) by (simp add: parx.intros) lemma par_tr_Ev_sync: "[| u : s |[X]|tr t ; a : X |] ==> <Ev a> ^^ u : (<Ev a> ^^ s) |[X]|tr (<Ev a> ^^ t)" apply (simp add: par_tr_def) by (simp add: parx.intros) lemma par_tr_Ev_left: "[| u : s |[X]|tr t ; a ~: X |] ==> <Ev a> ^^ u : (<Ev a> ^^ s) |[X]|tr t" apply (simp add: par_tr_def) by (simp add: parx.intros) lemma par_tr_Ev_right: "[| u : s |[X]|tr t ; a ~: X |] ==> <Ev a> ^^ u : s |[X]|tr (<Ev a> ^^ t)" apply (simp add: par_tr_def) by (simp add: parx.intros) (*** intro rule ***) lemmas par_tr_intros = par_tr_nil_nil par_tr_Tick_Tick par_tr_Ev_nil par_tr_nil_Ev par_tr_Ev_sync par_tr_Ev_left par_tr_Ev_right (*-------------------* | elims | *-------------------*) lemma par_tr_elims_lm: "[| u : s |[X]|tr t ; (u = <> & s = <> & t = <>) --> P ; (u = <Tick> & s = <Tick> & t = <Tick>) --> P ; ALL a s' u'. (u = <Ev a> ^^ u' & s = <Ev a> ^^ s' & t = <> & u' : s' |[X]|tr <> & a ~: X) --> P; ALL a t' u'. (u = <Ev a> ^^ u' & s = <> & t = <Ev a> ^^ t' & u' : <> |[X]|tr t' & a ~: X) --> P; ALL a s' t' u'. (u = <Ev a> ^^ u' & s = <Ev a> ^^ s' & t = <Ev a> ^^ t' & u' : s' |[X]|tr t' & a : X) --> P; ALL a s' u'. (u = <Ev a> ^^ u' & s = <Ev a> ^^ s' & u' : s' |[X]|tr t & a ~: X) --> P; ALL a t' u'. (u = <Ev a> ^^ u' & t = <Ev a> ^^ t' & u' : s |[X]|tr t' & a ~: X) --> P |] ==> P" apply (simp add: par_tr_def) apply (erule parx.elims) apply (simp_all) done (*** elim rule ***) lemma par_tr_elims: "[| u : s |[X]|tr t ; [| u = <>; s = <>; t = <> |] ==> P ; [| u = <Tick>; s = <Tick>; t = <Tick> |] ==> P ; !!a s' u'. [| u = <Ev a> ^^ u'; s = <Ev a> ^^ s'; t = <> ; u' : s' |[X]|tr <>; a ~: X |] ==> P; !!a t' u'. [| u = <Ev a> ^^ u' ; s = <> ; t = <Ev a> ^^ t' ; u' : <> |[X]|tr t'; a ~: X |] ==> P; !!a s' t' u'. [| u = <Ev a> ^^ u' ; s = <Ev a> ^^ s' ; t = <Ev a> ^^ t' ; u' : s' |[X]|tr t'; a : X |] ==> P; !!a s' u'. [| u = <Ev a> ^^ u' ; s = <Ev a> ^^ s' ; u' : s' |[X]|tr t; a ~: X |] ==> P; !!a t' u'. [| u = <Ev a> ^^ u' ; t = <Ev a> ^^ t' ; u' : s |[X]|tr t'; a ~: X |] ==> P |] ==> P" apply (rule par_tr_elims_lm[of u s X t]) apply (simp_all) apply (fast) apply (fast) apply (fast) (* this takes 1 min *) apply (fast) (* this takes 1 min *) apply (fast) (* this takes 1 min *) done (************************************************************* par_tr decomposition *************************************************************) (*-------------------* | par nil | *-------------------*) (*** par_tr ***) lemma par_tr_nil_only_if: "<> : s |[X]|tr t ==> s = <> & t = <>" apply (erule par_tr_elims) by (simp_all) (*** iff ***) lemma par_tr_nil1[simp]: "(<> : s |[X]|tr t) = (s = <> & t = <>)" apply (rule iffI) apply (simp add: par_tr_nil_only_if) by (simp add: par_tr_intros) lemma par_tr_nil2[simp]: "(u : <> |[X]|tr <>) = (u = <>)" apply (rule iffI) apply (erule par_tr_elims) by (simp_all) (*-------------------* | par Tick | *-------------------*) (*** only if ***) lemma par_tr_Tick_only_if: "<Tick> : s |[X]|tr t ==> s = <Tick> & t = <Tick>" apply (erule par_tr_elims) by (simp_all) (*** iff ***) lemma par_tr_Tick1[simp]: "<Tick> : s |[X]|tr t = (s = <Tick> & t = <Tick>)" apply (rule iffI) apply (simp add: par_tr_Tick_only_if) by (simp add: par_tr_intros) lemma par_tr_Tick2[simp]: "(u : <Tick> |[X]|tr <Tick>) = (u = <Tick>)" apply (rule iffI) apply (erule par_tr_elims) by (simp_all) (*-----------------* | par Ev | *-----------------*) (*** only if ***) lemma par_tr_Ev_only_if: "<Ev a> : s |[X]|tr t ==> ((a : X & s = <Ev a> & t = <Ev a>) | (a ~: X & s = <Ev a> & t = <>) | (a ~: X & s = <> & t = <Ev a> ))" apply (erule par_tr_elims) by (simp_all) (*** if ***) lemma par_tr_Ev_if: "((a : X & s = <Ev a> & t = <Ev a>) | (a ~: X & s = <Ev a> & t = <>) | (a ~: X & s = <> & t = <Ev a> )) ==> <Ev a> : s |[X]|tr t" apply (erule disjE) apply (insert par_tr_Ev_sync[of "<>" "<>" X "<>" a], simp) apply (erule disjE) apply (insert par_tr_Ev_left[of "<>" "<>" X "<>" a], simp) apply (insert par_tr_Ev_right[of "<>" "<>" X "<>" a], simp) done lemma par_tr_Ev: "<Ev a> : s |[X]|tr t = ((a : X & s = <Ev a> & t = <Ev a>) | (a ~: X & s = <Ev a> & t = <>) | (a ~: X & s = <> & t = <Ev a> ))" apply (rule iffI) apply (simp add: par_tr_Ev_only_if) apply (simp add: par_tr_Ev_if) done (*--------------------------------------------* | par one | *--------------------------------------------*) lemma par_tr_one: "<e> : s |[X]|tr t = ((e = Tick & s = <Tick> & t = <Tick>) | (EX a. e = Ev a & ((a : X & s = <Ev a> & t = <Ev a>) | (a ~: X & s = <Ev a> & t = <>) | (a ~: X & s = <> & t = <Ev a> ))))" apply (insert event_Tick_or_Ev) apply (drule_tac x="e" in spec) apply (erule disjE) apply (simp) apply (erule exE) apply (simp add: par_tr_Ev) done (*--------------------------------------------* | par head | *--------------------------------------------*) (*** only if ***) lemma par_tr_head_only_if: "<Ev a> ^^ u : s |[X]|tr t ==> (a : X & (EX s' t'. u : s' |[X]|tr t' & s = <Ev a> ^^ s' & t = <Ev a> ^^ t')) | (a ~: X & (EX s'. u : s' |[X]|tr t & s = <Ev a> ^^ s')) | (a ~: X & (EX t'. u : s |[X]|tr t' & t = <Ev a> ^^ t'))" apply (erule par_tr_elims) by (simp_all) (*** if ***) lemma par_tr_head_if: "(a : X & (EX s' t'. u : s' |[X]|tr t' & s = <Ev a> ^^ s' & t = <Ev a> ^^ t')) | (a ~: X & (EX s'. u : s' |[X]|tr t & s = <Ev a> ^^ s')) | (a ~: X & (EX t'. u : s |[X]|tr t' & t = <Ev a> ^^ t')) ==> <Ev a> ^^ u : s |[X]|tr t" (*** sync ***) apply (erule disjE) apply (elim conjE exE) apply (simp add: par_tr_intros) (*** left ***) apply (erule disjE) apply (elim conjE exE) apply (simp add: par_tr_intros) (*** right ***) apply (elim conjE exE) apply (simp add: par_tr_intros) done (*** iff ***) lemma par_tr_head: "<Ev a> ^^ u : s |[X]|tr t = ((a : X & (EX s' t'. u : s' |[X]|tr t' & s = <Ev a> ^^ s' & t = <Ev a> ^^ t')) | (a ~: X & (EX s'. u : s' |[X]|tr t & s = <Ev a> ^^ s')) | (a ~: X & (EX t'. u : s |[X]|tr t' & t = <Ev a> ^^ t')))" apply (rule iffI) apply (simp add: par_tr_head_only_if) apply (simp add: par_tr_head_if) done (* erule *) lemma par_tr_head_ifE: "[| <Ev a> ^^ u : s |[X]|tr t ; [| (a : X & (EX s' t'. u : s' |[X]|tr t' & s = <Ev a> ^^ s' & t = <Ev a> ^^ t')) | (a ~: X & (EX s'. u : s' |[X]|tr t & s = <Ev a> ^^ s')) | (a ~: X & (EX t'. u : s |[X]|tr t' & t = <Ev a> ^^ t')) |] ==> R |] ==> R" by (simp add: par_tr_head) (* head Ev Ev *) lemma par_tr_head_Ev_Ev: "(u : (<Ev a> ^^ s) |[X]|tr (<Ev b> ^^ t)) = (EX c v. u = <Ev c> ^^ v & (c : X & v : s |[X]|tr t & a = c & b = c | c ~: X & v : s |[X]|tr (<Ev b> ^^ t) & a = c | c ~: X & v : (<Ev a> ^^ s) |[X]|tr t & b = c))" apply (rule iffI) (* => *) apply (insert trace_nil_or_Tick_or_Ev) apply (drule_tac x="u" in spec) apply (elim disjE conjE exE) apply (simp_all) apply (simp add: par_tr_head) (* => *) apply (elim conjE exE) apply (simp add: par_tr_head) done (* step *) lemma par_tr_step: "(u : s |[X]|tr t) = ((u = <> & s = <> & t = <>) | (u = <Tick> & s = <Tick> & t = <Tick>) | (EX a v. u = <Ev a> ^^ v & ((a : X & (EX s' t'. v : s' |[X]|tr t' & s = <Ev a> ^^ s' & t = <Ev a> ^^ t')) | (a ~: X & (EX s'. v : s' |[X]|tr t & s = <Ev a> ^^ s')) | (a ~: X & (EX t'. v : s |[X]|tr t' & t = <Ev a> ^^ t')))))" apply (insert trace_nil_or_Tick_or_Ev) apply (drule_tac x="u" in spec) apply (elim disjE) apply (simp_all) apply (elim exE) apply (simp add: par_tr_head) done lemma par_tr_stepI: "((u = <> & s = <> & t = <>) | (u = <Tick> & s = <Tick> & t = <Tick>) | (EX a v. u = <Ev a> ^^ v & ((a : X & (EX s' t'. v : s' |[X]|tr t' & s = <Ev a> ^^ s' & t = <Ev a> ^^ t')) | (a ~: X & (EX s'. v : s' |[X]|tr t & s = <Ev a> ^^ s')) | (a ~: X & (EX t'. v : s |[X]|tr t' & t = <Ev a> ^^ t'))))) ==> (u : s |[X]|tr t)" by (simp add: par_tr_step[THEN sym]) lemma par_tr_stepE: "[| u : s |[X]|tr t ; ((u = <> & s = <> & t = <>) | (u = <Tick> & s = <Tick> & t = <Tick>) | (EX a v. u = <Ev a> ^^ v & ((a : X & (EX s' t'. v : s' |[X]|tr t' & s = <Ev a> ^^ s' & t = <Ev a> ^^ t')) | (a ~: X & (EX s'. v : s' |[X]|tr t & s = <Ev a> ^^ s')) | (a ~: X & (EX t'. v : s |[X]|tr t' & t = <Ev a> ^^ t'))))) ==> R |] ==> R" by (simp add: par_tr_step[THEN sym]) (*--------------------------------------------* | par last | *--------------------------------------------*) (*** only if ***) lemma par_tr_last_only_if_lm: "ALL X u s t e. (u ^^ <e> : s |[X]|tr t & noTick u) --> (((e : Ev ` X | e = Tick) & (EX s' t'. u : s' |[X]|tr t' & s = s' ^^ <e> & t = t' ^^ <e> & noTick s' & noTick t')) | (e ~: Ev ` X & e ~= Tick & (EX s'. u : s' |[X]|tr t & s = s' ^^ <e> & noTick s' & noTick t)) | (e ~: Ev ` X & e ~= Tick & (EX t'. u : s |[X]|tr t' & t = t' ^^ <e> & noTick s & noTick t')))" apply (rule allI) apply (rule allI) apply (induct_tac u rule: induct_trace) (* base *) (* <> *) apply (intro allI impI) apply (simp add: par_tr_one) apply (erule disjE, simp) apply (erule exE, force) (* <Tick> *) apply (simp) (* <Ev a> ^^ ua *) apply (intro allI impI) apply (elim conjE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (elim disjE conjE exE) (* head sync *) apply (drule_tac x="s'" in spec) apply (drule_tac x="t'" in spec) apply (drule_tac x="e" in spec) apply (simp) (* last sync *) apply (erule disjE, simp) apply (elim conjE exE) apply (rule disjI1) apply (rule_tac x="<Ev a> ^^ s'a" in exI) apply (rule_tac x="<Ev a> ^^ t'a" in exI) apply (simp add: appt_assoc) (* last left *) apply (erule disjE, simp) apply (elim conjE exE) apply (rule disjI1) apply (rule_tac x="<Ev a> ^^ s'a" in exI, simp) apply (simp add: appt_assoc) (* last right *) apply (simp) apply (elim conjE exE) apply (rule disjI2) apply (rule_tac x="<Ev a> ^^ t'a" in exI, simp) apply (simp add: appt_assoc) (* head left *) apply (drule_tac x="s'" in spec) apply (drule_tac x="t" in spec) apply (drule_tac x="e" in spec) apply (simp) (* last sync *) apply (erule disjE, simp) apply (elim conjE exE) apply (rule disjI1) apply (rule_tac x="<Ev a> ^^ s'a" in exI) apply (rule_tac x="t'" in exI) apply (simp add: appt_assoc) (* last left *) apply (erule disjE, simp) apply (elim conjE exE) apply (rule disjI1) apply (rule_tac x="<Ev a> ^^ s'a" in exI, simp) apply (simp add: appt_assoc) (* last right *) apply (simp) apply (elim conjE exE) apply (rule disjI2) apply (rule_tac x="t'" in exI, simp) (* head right *) apply (drule_tac x="sa" in spec) apply (drule_tac x="t'" in spec) apply (drule_tac x="e" in spec) apply (simp) (* last sync *) apply (erule disjE, simp) apply (elim conjE exE) apply (rule disjI1) apply (rule_tac x="s'" in exI) apply (rule_tac x="<Ev a> ^^ t'a" in exI) apply (simp add: appt_assoc) (* last left *) apply (erule disjE, simp) apply (elim conjE exE) apply (rule disjI1) apply (rule_tac x="s'" in exI, simp) (* last right *) apply (simp) apply (elim conjE exE) apply (rule disjI2) apply (rule_tac x="<Ev a> ^^ t'a" in exI) apply (simp add: appt_assoc) done (*** rule ***) lemma par_tr_last_only_if: "[| u ^^ <e> : s |[X]|tr t ; noTick u |] ==> (((e : Ev ` X | e = Tick) & (EX s' t'. u : s' |[X]|tr t' & s = s' ^^ <e> & t = t' ^^ <e> & noTick s' & noTick t')) | (e ~: Ev ` X & e ~= Tick & (EX s'. u : s' |[X]|tr t & s = s' ^^ <e> & noTick s' & noTick t)) | (e ~: Ev ` X & e ~= Tick & (EX t'. u : s |[X]|tr t' & t = t' ^^ <e> & noTick s & noTick t')))" by (simp add: par_tr_last_only_if_lm) (*** if ***) lemma par_tr_last_if_lm: "ALL X u s t e. (noTick u & (((e : Ev ` X | e = Tick) & (EX s' t'. u : s' |[X]|tr t' & s = s' ^^ <e> & t = t' ^^ <e> & noTick s' & noTick t')) | (e ~: Ev ` X & e ~= Tick & (EX s'. u : s' |[X]|tr t & s = s' ^^ <e> & noTick s' & noTick t)) | (e ~: Ev ` X & e ~= Tick & (EX t'. u : s |[X]|tr t' & t = t' ^^ <e> & noTick s & noTick t')))) --> u ^^ <e> : s |[X]|tr t" apply (rule allI) apply (rule allI) apply (induct_tac u rule: induct_trace) (* base *) (* <> *) apply (intro allI impI) apply (simp add: par_tr_one) apply (elim conjE disjE) apply (force) apply (simp) apply (simp add: not_Tick_to_Ev, fast) apply (simp add: not_Tick_to_Ev, fast) (* <Tick> *) apply (simp) (* s ^^ <e> *) apply (intro allI impI) apply (simp add: par_tr_head) apply (simp add: appt_assoc) apply (elim conjE) apply (elim disjE) (* last sync *) apply (elim conjE exE) (* sync *) apply (rotate_tac 3) apply (erule disjE) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="s'a ^^ <e>" in spec) apply (drule_tac x="t'a ^^ <e>" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) (* left *) apply (rotate_tac -1) apply (erule disjE) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="s'a ^^ <e>" in spec) apply (drule_tac x="t' ^^ <e>" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) (* right *) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="s' ^^ <e>" in spec) apply (drule_tac x="t'a ^^ <e>" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) (* last left *) apply (elim conjE exE) (* sync *) apply (rotate_tac 4) apply (erule disjE) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="s'a ^^ <e>" in spec) apply (drule_tac x="t'" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) (* left *) apply (rotate_tac -1) apply (erule disjE) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="s'a ^^ <e>" in spec) apply (drule_tac x="t" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) (* right *) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="s' ^^ <e>" in spec) apply (drule_tac x="t'" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) (* last right *) apply (elim conjE exE) (* sync *) apply (rotate_tac 4) apply (erule disjE) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="s'" in spec) apply (drule_tac x="t'a ^^ <e>" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) (* left *) apply (rotate_tac -1) apply (erule disjE) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="s'" in spec) apply (drule_tac x="t' ^^ <e>" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) (* right *) apply (elim conjE exE) apply (simp add: appt_assoc) apply (simp add: par_tr_head) apply (drule_tac x="sa" in spec) apply (drule_tac x="t'a ^^ <e>" in spec) apply (drule_tac x="e" in spec) apply (simp) apply (fast) done (*** rule ***) lemma par_tr_last_if: "[| noTick u; ((e : Ev ` X | e = Tick) & (EX s' t'. u : s' |[X]|tr t' & s = s' ^^ <e> & t = t' ^^ <e> & noTick s' & noTick t')) | (e ~: Ev ` X & e ~= Tick & (EX s'. u : s' |[X]|tr t & s = s' ^^ <e> & noTick s' & noTick t)) | (e ~: Ev ` X & e ~= Tick & (EX t'. u : s |[X]|tr t' & t = t' ^^ <e> & noTick s & noTick t')) |] ==> u ^^ <e> : s |[X]|tr t" apply (insert par_tr_last_if_lm) apply (drule_tac x="X" in spec) apply (drule_tac x="u" in spec) apply (drule_tac x="s" in spec) apply (drule_tac x="t" in spec) apply (drule_tac x="e" in spec) by (simp) (*** iff ***) lemma par_tr_last: "noTick u ==> u ^^ <e> : s |[X]|tr t = (((e : Ev ` X | e = Tick) & (EX s' t'. u : s' |[X]|tr t' & s = s' ^^ <e> & t = t' ^^ <e> & noTick s' & noTick t')) | (e ~: Ev ` X & e ~= Tick & (EX s'. u : s' |[X]|tr t & s = s' ^^ <e> & noTick s' & noTick t)) | (e ~: Ev ` X & e ~= Tick & (EX t'. u : s |[X]|tr t' & t = t' ^^ <e> & noTick s & noTick t')))" apply (rule iffI) apply (simp add: par_tr_last_only_if) apply (simp add: par_tr_last_if) done (************************************************************* symmetricity *************************************************************) lemma par_tr_sym_only_if_lm: "ALL u s t. u : (s |[X]|tr t) --> u : (t |[X]|tr s)" apply (rule allI) apply (induct_tac u rule: induct_trace) apply (simp_all) apply (intro allI impI) apply (erule par_tr_elims) (* <> *) apply (simp) (* <Tick> *) apply (simp) (* Ev_nil *) apply (drule_tac x="s'" in spec) apply (drule_tac x="<>" in spec) apply (simp add: par_tr_intros) (* nil_Ev *) apply (drule_tac x="<>" in spec) apply (drule_tac x="t'" in spec) apply (simp add: par_tr_intros) (* sync *) apply (drule_tac x="s'" in spec) apply (drule_tac x="t'" in spec) apply (simp add: par_tr_intros) (* left *) apply (drule_tac x="s'" in spec) apply (drule_tac x="t" in spec) apply (simp add: par_tr_intros) (* right *) apply (drule_tac x="sa" in spec) apply (drule_tac x="t'" in spec) apply (simp add: par_tr_intros) done lemma par_tr_sym_only_if: "u : (s |[X]|tr t) ==> u : (t |[X]|tr s)" apply (insert par_tr_sym_only_if_lm[of X]) apply (drule_tac x="u" in spec) apply (drule_tac x="s" in spec) apply (drule_tac x="t" in spec) apply (simp) done lemma par_tr_sym: "s |[X]|tr t = t |[X]|tr s" apply (auto) apply (rule par_tr_sym_only_if, simp_all) apply (rule par_tr_sym_only_if, simp_all) done (************************************************************* prefix_closed *************************************************************) lemma par_tr_prefix_lm: "ALL X v u s t. prefix v u & u : s |[X]|tr t --> (EX s' t'. v : s' |[X]|tr t' & prefix s' s & prefix t' t)" apply (rule allI) apply (rule allI) apply (induct_tac v rule: induct_trace) apply (simp_all add: disj_not1) apply (simp add: prefix_Tick) apply (intro allI impI) apply (elim conjE exE) apply (simp add: par_tr_head) (* sync *) apply (erule disjE) apply (elim conjE exE) apply (drule_tac x="u'" in spec) apply (drule_tac x="s'" in spec) apply (drule_tac x="t'" in spec) apply (force) (* left *) apply (erule disjE) apply (elim conjE exE) apply (drule_tac x="u'" in spec) apply (drule_tac x="s'" in spec) apply (drule_tac x="t" in spec) apply (force) (* right *) apply (elim conjE exE) apply (drule_tac x="u'" in spec) apply (drule_tac x="sa" in spec) apply (drule_tac x="t'" in spec) apply (force) done (*** rule ***) lemma par_tr_prefix: "[| prefix v u ; u : s |[X]|tr t |] ==> (EX s' t'. v : s' |[X]|tr t' & prefix s' s & prefix t' t)" apply (insert par_tr_prefix_lm) apply (drule_tac x="X" in spec) apply (drule_tac x="v" in spec) apply (drule_tac x="u" in spec) apply (drule_tac x="s" in spec) apply (drule_tac x="t" in spec) by (simp) lemma par_tr_prefixE: "[| prefix v u ; u : s |[X]|tr t ; !! s' t'. [| v : s' |[X]|tr t' ; prefix s' s ; prefix t' t |] ==> R |] ==> R" apply (insert par_tr_prefix[of v u s X t]) by (auto) (************************************************************* parallel lemmas etc. *************************************************************) (******************************* par_tr lenght *******************************) lemma par_tr_lengtht_lm: "ALL X u s t. u : s |[X]|tr t --> lengtht s <= lengtht u & lengtht t <= lengtht u" apply (rule allI) apply (rule allI) apply (induct_tac u rule: induct_trace) apply (simp_all) apply (intro allI impI) apply (simp add: par_tr_head) (* sync *) apply (erule disjE) apply (elim conjE exE) apply (drule_tac x="s'" in spec) apply (drule_tac x="t'" in spec) apply (simp) (* left *) apply (erule disjE) apply (elim conjE exE) apply (drule_tac x="s'" in spec) apply (drule_tac x="t" in spec) apply (force) (* right *) apply (elim conjE exE) apply (drule_tac x="sa" in spec) apply (drule_tac x="t'" in spec) apply (force) done (*** rule ***) lemma par_tr_lengtht: "u : s |[X]|tr t ==> lengtht s <= lengtht u & lengtht t <= lengtht u" by (simp add: par_tr_lengtht_lm) (*** ruleE ***) lemma par_tr_lengthtE: "[| u : s |[X]|tr t ; [| lengtht s <= lengtht u ; lengtht t <= lengtht u|] ==> R |] ==> R" by (simp add: par_tr_lengtht) (************************************************** para **************************************************) lemma par_tr_nil_Ev_rev: "u : <> |[X]|tr (<Ev a> ^^ t) ==> a ~: X & (EX v. u = <Ev a> ^^ v & v : <> |[X]|tr t)" apply (erule par_tr_elims) by (simp_all add: par_tr_intros) lemma par_tr_Tick_Ev_rev: "u : <Tick> |[X]|tr (<Ev a> ^^ t) ==> a ~: X & (EX v. u = <Ev a> ^^ v & v : <Tick> |[X]|tr t)" apply (erule par_tr_elims) by (simp_all add: par_tr_intros) (************************************************** noTick **************************************************) (*-----------------* | par noTick | *-----------------*) (*** only if ***) lemma par_tr_noTick_only_if_lm: "ALL s t. ( u : s |[X]|tr t & noTick s & noTick t ) --> noTick u" apply (induct_tac u rule: induct_trace) apply (simp) apply (intro allI) apply (case_tac "s ~= <Tick>", simp) apply (case_tac "t ~= <Tick>", simp) apply (simp) apply (intro allI impI) apply (elim conjE) apply (simp add: par_tr_head) apply (elim disjE conjE exE) apply (auto) done lemma par_tr_noTick_only_if: "[| u : s |[X]|tr t ; noTick s ; noTick t |] ==> noTick u" apply (insert par_tr_noTick_only_if_lm[of u X]) apply (drule_tac x="s" in spec) apply (drule_tac x="t" in spec) by (simp) (*** if ***) lemma par_tr_noTick_if_lm: "ALL s t. ( u : s |[X]|tr t & noTick u ) --> ( noTick s & noTick t )" apply (induct_tac u rule: induct_trace) apply (simp) apply (simp) apply (intro allI impI) apply (elim conjE) apply (erule par_tr_head_ifE) apply (elim conjE exE disjE) apply (drule_tac x="s'" in spec) apply (drule_tac x="t'" in spec) apply (simp) apply (drule_tac x="s'" in spec) apply (drule_tac x="t" in spec) apply (simp) apply (drule_tac x="sa" in spec) apply (drule_tac x="t'" in spec) apply (simp) done lemma par_tr_noTick_if: "[| u : s |[X]|tr t ; noTick u |] ==> ( noTick s & noTick t )" apply (insert par_tr_noTick_if_lm[of u X]) apply (drule_tac x="s" in spec) apply (drule_tac x="t" in spec) by (simp) (*** iff ***) lemma par_tr_noTick: "u : s |[X]|tr t ==> (noTick s & noTick t) = noTick u" apply (rule iffI) apply (simp add: par_tr_noTick_only_if) apply (simp add: par_tr_noTick_if) done lemmas par_tr_noTick_compo = par_tr_noTick_only_if lemmas par_tr_noTick_decompo = par_tr_noTick_if (****** used in Alpha_parallel ******) (*** nil-Tick ***) lemma par_tr_nil_Tick[simp]: "(u : <> |[X]|tr <Tick>) = False" apply (induct_tac u rule: induct_trace) by (simp_all add: par_tr_head) lemma par_tr_Tick_nil[simp]: "(u : <Tick> |[X]|tr <>) = False" apply (induct_tac u rule: induct_trace) by (simp_all add: par_tr_head) (*** nil-Ev ***) lemma par_tr_nil_Ev_iff: "u : <> |[X]|tr (<Ev a> ^^ t) = (a ~: X & (EX v. u = <Ev a> ^^ v & v : <> |[X]|tr t))" apply (rule iffI) apply (rule par_tr_nil_Ev_rev) apply (simp) apply (elim conjE exE, simp) apply (simp add: par_tr_nil_Ev) done (*** Tcik-Ev ***) lemma par_tr_Tick_Ev_iff: "u : <Tick> |[X]|tr (<Ev a> ^^ t) = (a ~: X & (EX v. u = <Ev a> ^^ v & v : <Tick> |[X]|tr t))" apply (rule iffI) apply (rule par_tr_Tick_Ev_rev) apply (simp) apply (elim conjE exE, simp) apply (simp add: par_tr_Ev_right) done (****** nil ******) lemma par_tr_nil_left_only_if_imp: "ALL u. (u : <> |[X]|tr s) --> (u = s & Tick ~: sett u & sett u Int Ev ` X = {})" apply (induct_tac s rule: induct_trace) apply (simp_all) apply (intro allI impI) apply (simp add: par_tr_nil_Ev_iff) apply (elim conjE exE) apply (drule_tac x="v" in spec) apply (auto) done lemma par_tr_nil_left_only_if: "(u : <> |[X]|tr s) ==> u = s & Tick ~: sett u & sett u Int Ev ` X = {}" apply (insert par_tr_nil_left_only_if_imp[of X s]) apply (drule_tac x="u" in spec) apply (auto) done lemma par_tr_nil_left_if_imp: "(Tick ~: sett u & sett u Int Ev ` X = {}) --> (u : <> |[X]|tr u)" apply (induct_tac u rule: induct_trace) by (auto simp add: par_tr_head) lemma par_tr_nil_left_if: "[| Tick ~: sett u ; sett u Int Ev ` X = {} |] ==> (u : <> |[X]|tr u)" by (simp add: par_tr_nil_left_if_imp) (*** nil left ***) lemma par_tr_nil_left: "(u : <> |[X]|tr s) = (u = s & Tick ~: sett u & sett u Int Ev ` X = {})" apply (rule iffI) apply (simp add: par_tr_nil_left_only_if) apply (auto simp add: par_tr_nil_left_if) done (*** nil right ***) lemma par_tr_nil_right: "(u : s |[X]|tr <>) = (u = s & Tick ~: sett u & sett u Int Ev ` X = {})" apply (simp add: par_tr_sym) apply (simp add: par_tr_nil_left) done lemmas par_tr_nil = par_tr_nil_left par_tr_nil_right (****** Tick ******) lemma par_tr_Tick_left_only_if_imp: "ALL u. u : <Tick> |[X]|tr s --> (u = s & Tick : sett u & sett u Int Ev ` X = {})" apply (induct_tac s rule: induct_trace) apply (simp_all) apply (simp add: image_def) apply (intro allI impI) apply (simp add: par_tr_Tick_Ev_iff) apply (elim conjE exE) apply (drule_tac x="v" in spec) apply (auto) done lemma par_tr_Tick_left_only_if: "(u : <Tick> |[X]|tr s) ==> u = s & Tick : sett u & sett u Int Ev ` X = {}" apply (insert par_tr_Tick_left_only_if_imp[of X s]) apply (drule_tac x="u" in spec) apply (auto) done lemma par_tr_Tick_left_if_imp: "(Tick : sett u & sett u Int Ev ` X = {}) --> (u : <Tick> |[X]|tr u)" apply (induct_tac u rule: induct_trace) by (auto simp add: par_tr_head) lemma par_tr_Tick_left_if: "[| Tick : sett u ; sett u Int Ev ` X = {} |] ==> (u : <Tick> |[X]|tr u)" by (simp add: par_tr_Tick_left_if_imp) (*** Tick left ***) lemma par_tr_Tick_left: "(u : <Tick> |[X]|tr s) = (u = s & Tick : sett u & sett u Int Ev ` X = {})" apply (rule iffI) apply (simp add: par_tr_Tick_left_only_if) apply (auto simp add: par_tr_Tick_left_if) done (*** Tick right ***) lemma par_tr_Tick_right: "(u : s |[X]|tr <Tick>) = (u = s & Tick : sett u & sett u Int Ev ` X = {})" apply (simp add: par_tr_sym[of _ _ "<Tick>"]) apply (simp add: par_tr_Tick_left) done lemmas par_tr_Tick = par_tr_Tick_left par_tr_Tick_right (*** par sett ***) lemma par_tr_sett: "ALL s t. u : s |[X]|tr t --> sett u <= sett s Un sett t" apply (induct_tac u rule: induct_trace) apply (simp_all) apply (intro allI impI) apply (simp add: par_tr_head) apply (erule disjE) (* sync *) apply (elim conjE exE) apply (drule_tac x="s'" in spec) apply (drule_tac x="t'" in spec) apply (force) (* left *) apply (erule disjE) apply (elim conjE exE) apply (drule_tac x="s'" in spec) apply (drule_tac x="t" in spec) apply (force) (* right *) apply (elim conjE exE) apply (drule_tac x="sa" in spec) apply (drule_tac x="t'" in spec) apply (force) done (****************** to add it again ******************) declare disj_not1 [simp] end
lemma par_tr_defE:
[| u ∈ s |[X]|tr t; (u, s, t) ∈ parx X ==> R |] ==> R
lemma par_tr_nil_nil:
<> ∈ <> |[X]|tr <>
lemma par_tr_Tick_Tick:
<Tick> ∈ <Tick> |[X]|tr <Tick>
lemma par_tr_Ev_nil:
[| u ∈ s |[X]|tr <>; a ∉ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr <>
lemma par_tr_nil_Ev:
[| u ∈ <> |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ <> |[X]|tr (<Ev a> ^^ t)
lemma par_tr_Ev_sync:
[| u ∈ s |[X]|tr t; a ∈ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr (<Ev a> ^^ t)
lemma par_tr_Ev_left:
[| u ∈ s |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr t
lemma par_tr_Ev_right:
[| u ∈ s |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ s |[X]|tr (<Ev a> ^^ t)
lemmas par_tr_intros:
<> ∈ <> |[X]|tr <>
<Tick> ∈ <Tick> |[X]|tr <Tick>
[| u ∈ s |[X]|tr <>; a ∉ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr <>
[| u ∈ <> |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ <> |[X]|tr (<Ev a> ^^ t)
[| u ∈ s |[X]|tr t; a ∈ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr (<Ev a> ^^ t)
[| u ∈ s |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr t
[| u ∈ s |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ s |[X]|tr (<Ev a> ^^ t)
lemmas par_tr_intros:
<> ∈ <> |[X]|tr <>
<Tick> ∈ <Tick> |[X]|tr <Tick>
[| u ∈ s |[X]|tr <>; a ∉ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr <>
[| u ∈ <> |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ <> |[X]|tr (<Ev a> ^^ t)
[| u ∈ s |[X]|tr t; a ∈ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr (<Ev a> ^^ t)
[| u ∈ s |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ (<Ev a> ^^ s) |[X]|tr t
[| u ∈ s |[X]|tr t; a ∉ X |] ==> <Ev a> ^^ u ∈ s |[X]|tr (<Ev a> ^^ t)
lemma par_tr_elims_lm:
[| u ∈ s |[X]|tr t; u = <> ∧ s = <> ∧ t = <> --> P; u = <Tick> ∧ s = <Tick> ∧ t = <Tick> --> P; ∀a s' u'. u = <Ev a> ^^ u' ∧ s = <Ev a> ^^ s' ∧ t = <> ∧ u' ∈ s' |[X]|tr <> ∧ a ∉ X --> P; ∀a t' u'. u = <Ev a> ^^ u' ∧ s = <> ∧ t = <Ev a> ^^ t' ∧ u' ∈ <> |[X]|tr t' ∧ a ∉ X --> P; ∀a s' t' u'. u = <Ev a> ^^ u' ∧ s = <Ev a> ^^ s' ∧ t = <Ev a> ^^ t' ∧ u' ∈ s' |[X]|tr t' ∧ a ∈ X --> P; ∀a s' u'. u = <Ev a> ^^ u' ∧ s = <Ev a> ^^ s' ∧ u' ∈ s' |[X]|tr t ∧ a ∉ X --> P; ∀a t' u'. u = <Ev a> ^^ u' ∧ t = <Ev a> ^^ t' ∧ u' ∈ s |[X]|tr t' ∧ a ∉ X --> P |] ==> P
lemma par_tr_elims:
[| u ∈ s |[X]|tr t; [| u = <>; s = <>; t = <> |] ==> P; [| u = <Tick>; s = <Tick>; t = <Tick> |] ==> P; !!a s' u'. [| u = <Ev a> ^^ u'; s = <Ev a> ^^ s'; t = <>; u' ∈ s' |[X]|tr <>; a ∉ X |] ==> P; !!a t' u'. [| u = <Ev a> ^^ u'; s = <>; t = <Ev a> ^^ t'; u' ∈ <> |[X]|tr t'; a ∉ X |] ==> P; !!a s' t' u'. [| u = <Ev a> ^^ u'; s = <Ev a> ^^ s'; t = <Ev a> ^^ t'; u' ∈ s' |[X]|tr t'; a ∈ X |] ==> P; !!a s' u'. [| u = <Ev a> ^^ u'; s = <Ev a> ^^ s'; u' ∈ s' |[X]|tr t; a ∉ X |] ==> P; !!a t' u'. [| u = <Ev a> ^^ u'; t = <Ev a> ^^ t'; u' ∈ s |[X]|tr t'; a ∉ X |] ==> P |] ==> P
lemma par_tr_nil_only_if:
<> ∈ s |[X]|tr t ==> s = <> ∧ t = <>
lemma par_tr_nil1:
(<> ∈ s |[X]|tr t) = (s = <> ∧ t = <>)
lemma par_tr_nil2:
(u ∈ <> |[X]|tr <>) = (u = <>)
lemma par_tr_Tick_only_if:
<Tick> ∈ s |[X]|tr t ==> s = <Tick> ∧ t = <Tick>
lemma par_tr_Tick1:
(<Tick> ∈ s |[X]|tr t) = (s = <Tick> ∧ t = <Tick>)
lemma par_tr_Tick2:
(u ∈ <Tick> |[X]|tr <Tick>) = (u = <Tick>)
lemma par_tr_Ev_only_if:
<Ev a> ∈ s |[X]|tr t ==> a ∈ X ∧ s = <Ev a> ∧ t = <Ev a> ∨ a ∉ X ∧ s = <Ev a> ∧ t = <> ∨ a ∉ X ∧ s = <> ∧ t = <Ev a>
lemma par_tr_Ev_if:
a ∈ X ∧ s = <Ev a> ∧ t = <Ev a> ∨ a ∉ X ∧ s = <Ev a> ∧ t = <> ∨ a ∉ X ∧ s = <> ∧ t = <Ev a> ==> <Ev a> ∈ s |[X]|tr t
lemma par_tr_Ev:
(<Ev a> ∈ s |[X]|tr t) = (a ∈ X ∧ s = <Ev a> ∧ t = <Ev a> ∨ a ∉ X ∧ s = <Ev a> ∧ t = <> ∨ a ∉ X ∧ s = <> ∧ t = <Ev a>)
lemma par_tr_one:
(<e> ∈ s |[X]|tr t) = (e = Tick ∧ s = <Tick> ∧ t = <Tick> ∨ (∃a. e = Ev a ∧ (a ∈ X ∧ s = <Ev a> ∧ t = <Ev a> ∨ a ∉ X ∧ s = <Ev a> ∧ t = <> ∨ a ∉ X ∧ s = <> ∧ t = <Ev a>)))
lemma par_tr_head_only_if:
<Ev a> ^^ u ∈ s |[X]|tr t ==> a ∈ X ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = <Ev a> ^^ s' ∧ t = <Ev a> ^^ t') ∨ a ∉ X ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = <Ev a> ^^ s') ∨ a ∉ X ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = <Ev a> ^^ t')
lemma par_tr_head_if:
a ∈ X ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = <Ev a> ^^ s' ∧ t = <Ev a> ^^ t') ∨ a ∉ X ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = <Ev a> ^^ s') ∨ a ∉ X ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = <Ev a> ^^ t') ==> <Ev a> ^^ u ∈ s |[X]|tr t
lemma par_tr_head:
(<Ev a> ^^ u ∈ s |[X]|tr t) = (a ∈ X ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = <Ev a> ^^ s' ∧ t = <Ev a> ^^ t') ∨ a ∉ X ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = <Ev a> ^^ s') ∨ a ∉ X ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = <Ev a> ^^ t'))
lemma par_tr_head_ifE:
[| <Ev a> ^^ u ∈ s |[X]|tr t; a ∈ X ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = <Ev a> ^^ s' ∧ t = <Ev a> ^^ t') ∨ a ∉ X ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = <Ev a> ^^ s') ∨ a ∉ X ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = <Ev a> ^^ t') ==> R |] ==> R
lemma par_tr_head_Ev_Ev:
(u ∈ (<Ev a> ^^ s) |[X]|tr (<Ev b> ^^ t)) = (∃c v. u = <Ev c> ^^ v ∧ (c ∈ X ∧ v ∈ s |[X]|tr t ∧ a = c ∧ b = c ∨ c ∉ X ∧ v ∈ s |[X]|tr (<Ev b> ^^ t) ∧ a = c ∨ c ∉ X ∧ v ∈ (<Ev a> ^^ s) |[X]|tr t ∧ b = c))
lemma par_tr_step:
(u ∈ s |[X]|tr t) = (u = <> ∧ s = <> ∧ t = <> ∨ u = <Tick> ∧ s = <Tick> ∧ t = <Tick> ∨ (∃a v. u = <Ev a> ^^ v ∧ (a ∈ X ∧ (∃s' t'. v ∈ s' |[X]|tr t' ∧ s = <Ev a> ^^ s' ∧ t = <Ev a> ^^ t') ∨ a ∉ X ∧ (∃s'. v ∈ s' |[X]|tr t ∧ s = <Ev a> ^^ s') ∨ a ∉ X ∧ (∃t'. v ∈ s |[X]|tr t' ∧ t = <Ev a> ^^ t'))))
lemma par_tr_stepI:
u = <> ∧ s = <> ∧ t = <> ∨ u = <Tick> ∧ s = <Tick> ∧ t = <Tick> ∨ (∃a v. u = <Ev a> ^^ v ∧ (a ∈ X ∧ (∃s' t'. v ∈ s' |[X]|tr t' ∧ s = <Ev a> ^^ s' ∧ t = <Ev a> ^^ t') ∨ a ∉ X ∧ (∃s'. v ∈ s' |[X]|tr t ∧ s = <Ev a> ^^ s') ∨ a ∉ X ∧ (∃t'. v ∈ s |[X]|tr t' ∧ t = <Ev a> ^^ t'))) ==> u ∈ s |[X]|tr t
lemma par_tr_stepE:
[| u ∈ s |[X]|tr t; u = <> ∧ s = <> ∧ t = <> ∨ u = <Tick> ∧ s = <Tick> ∧ t = <Tick> ∨ (∃a v. u = <Ev a> ^^ v ∧ (a ∈ X ∧ (∃s' t'. v ∈ s' |[X]|tr t' ∧ s = <Ev a> ^^ s' ∧ t = <Ev a> ^^ t') ∨ a ∉ X ∧ (∃s'. v ∈ s' |[X]|tr t ∧ s = <Ev a> ^^ s') ∨ a ∉ X ∧ (∃t'. v ∈ s |[X]|tr t' ∧ t = <Ev a> ^^ t'))) ==> R |] ==> R
lemma par_tr_last_only_if_lm:
∀X u s t e. u ^^ <e> ∈ s |[X]|tr t ∧ noTick u --> (e ∈ Ev ` X ∨ e = Tick) ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = s' ^^ <e> ∧ t = t' ^^ <e> ∧ noTick s' ∧ noTick t') ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = s' ^^ <e> ∧ noTick s' ∧ noTick t) ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = t' ^^ <e> ∧ noTick s ∧ noTick t')
lemma par_tr_last_only_if:
[| u ^^ <e> ∈ s |[X]|tr t; noTick u |] ==> (e ∈ Ev ` X ∨ e = Tick) ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = s' ^^ <e> ∧ t = t' ^^ <e> ∧ noTick s' ∧ noTick t') ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = s' ^^ <e> ∧ noTick s' ∧ noTick t) ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = t' ^^ <e> ∧ noTick s ∧ noTick t')
lemma par_tr_last_if_lm:
∀X u s t e. noTick u ∧ ((e ∈ Ev ` X ∨ e = Tick) ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = s' ^^ <e> ∧ t = t' ^^ <e> ∧ noTick s' ∧ noTick t') ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = s' ^^ <e> ∧ noTick s' ∧ noTick t) ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = t' ^^ <e> ∧ noTick s ∧ noTick t')) --> u ^^ <e> ∈ s |[X]|tr t
lemma par_tr_last_if:
[| noTick u; (e ∈ Ev ` X ∨ e = Tick) ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = s' ^^ <e> ∧ t = t' ^^ <e> ∧ noTick s' ∧ noTick t') ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = s' ^^ <e> ∧ noTick s' ∧ noTick t) ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = t' ^^ <e> ∧ noTick s ∧ noTick t') |] ==> u ^^ <e> ∈ s |[X]|tr t
lemma par_tr_last:
noTick u ==> (u ^^ <e> ∈ s |[X]|tr t) = ((e ∈ Ev ` X ∨ e = Tick) ∧ (∃s' t'. u ∈ s' |[X]|tr t' ∧ s = s' ^^ <e> ∧ t = t' ^^ <e> ∧ noTick s' ∧ noTick t') ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃s'. u ∈ s' |[X]|tr t ∧ s = s' ^^ <e> ∧ noTick s' ∧ noTick t) ∨ e ∉ Ev ` X ∧ e ≠ Tick ∧ (∃t'. u ∈ s |[X]|tr t' ∧ t = t' ^^ <e> ∧ noTick s ∧ noTick t'))
lemma par_tr_sym_only_if_lm:
∀u s t. u ∈ s |[X]|tr t --> u ∈ t |[X]|tr s
lemma par_tr_sym_only_if:
u ∈ s |[X]|tr t ==> u ∈ t |[X]|tr s
lemma par_tr_sym:
s |[X]|tr t = t |[X]|tr s
lemma par_tr_prefix_lm:
∀X v u s t. prefix v u ∧ u ∈ s |[X]|tr t --> (∃s' t'. v ∈ s' |[X]|tr t' ∧ prefix s' s ∧ prefix t' t)
lemma par_tr_prefix:
[| prefix v u; u ∈ s |[X]|tr t |] ==> ∃s' t'. v ∈ s' |[X]|tr t' ∧ prefix s' s ∧ prefix t' t
lemma par_tr_prefixE:
[| prefix v u; u ∈ s |[X]|tr t; !!s' t'. [| v ∈ s' |[X]|tr t'; prefix s' s; prefix t' t |] ==> R |] ==> R
lemma par_tr_lengtht_lm:
∀X u s t. u ∈ s |[X]|tr t --> lengtht s ≤ lengtht u ∧ lengtht t ≤ lengtht u
lemma par_tr_lengtht:
u ∈ s |[X]|tr t ==> lengtht s ≤ lengtht u ∧ lengtht t ≤ lengtht u
lemma par_tr_lengthtE:
[| u ∈ s |[X]|tr t; [| lengtht s ≤ lengtht u; lengtht t ≤ lengtht u |] ==> R |] ==> R
lemma par_tr_nil_Ev_rev:
u ∈ <> |[X]|tr (<Ev a> ^^ t) ==> a ∉ X ∧ (∃v. u = <Ev a> ^^ v ∧ v ∈ <> |[X]|tr t)
lemma par_tr_Tick_Ev_rev:
u ∈ <Tick> |[X]|tr (<Ev a> ^^ t) ==> a ∉ X ∧ (∃v. u = <Ev a> ^^ v ∧ v ∈ <Tick> |[X]|tr t)
lemma par_tr_noTick_only_if_lm:
∀s t. u ∈ s |[X]|tr t ∧ noTick s ∧ noTick t --> noTick u
lemma par_tr_noTick_only_if:
[| u ∈ s |[X]|tr t; noTick s; noTick t |] ==> noTick u
lemma par_tr_noTick_if_lm:
∀s t. u ∈ s |[X]|tr t ∧ noTick u --> noTick s ∧ noTick t
lemma par_tr_noTick_if:
[| u ∈ s |[X]|tr t; noTick u |] ==> noTick s ∧ noTick t
lemma par_tr_noTick:
u ∈ s |[X]|tr t ==> (noTick s ∧ noTick t) = noTick u
lemmas par_tr_noTick_compo:
[| u ∈ s |[X]|tr t; noTick s; noTick t |] ==> noTick u
lemmas par_tr_noTick_compo:
[| u ∈ s |[X]|tr t; noTick s; noTick t |] ==> noTick u
lemmas par_tr_noTick_decompo:
[| u ∈ s |[X]|tr t; noTick u |] ==> noTick s ∧ noTick t
lemmas par_tr_noTick_decompo:
[| u ∈ s |[X]|tr t; noTick u |] ==> noTick s ∧ noTick t
lemma par_tr_nil_Tick:
(u ∈ <> |[X]|tr <Tick>) = False
lemma par_tr_Tick_nil:
(u ∈ <Tick> |[X]|tr <>) = False
lemma par_tr_nil_Ev_iff:
(u ∈ <> |[X]|tr (<Ev a> ^^ t)) = (a ∉ X ∧ (∃v. u = <Ev a> ^^ v ∧ v ∈ <> |[X]|tr t))
lemma par_tr_Tick_Ev_iff:
(u ∈ <Tick> |[X]|tr (<Ev a> ^^ t)) = (a ∉ X ∧ (∃v. u = <Ev a> ^^ v ∧ v ∈ <Tick> |[X]|tr t))
lemma par_tr_nil_left_only_if_imp:
∀u. u ∈ <> |[X]|tr s --> u = s ∧ Tick ∉ sett u ∧ sett u ∩ Ev ` X = {}
lemma par_tr_nil_left_only_if:
u ∈ <> |[X]|tr s ==> u = s ∧ Tick ∉ sett u ∧ sett u ∩ Ev ` X = {}
lemma par_tr_nil_left_if_imp:
Tick ∉ sett u ∧ sett u ∩ Ev ` X = {} --> u ∈ <> |[X]|tr u
lemma par_tr_nil_left_if:
[| Tick ∉ sett u; sett u ∩ Ev ` X = {} |] ==> u ∈ <> |[X]|tr u
lemma par_tr_nil_left:
(u ∈ <> |[X]|tr s) = (u = s ∧ Tick ∉ sett u ∧ sett u ∩ Ev ` X = {})
lemma par_tr_nil_right:
(u ∈ s |[X]|tr <>) = (u = s ∧ Tick ∉ sett u ∧ sett u ∩ Ev ` X = {})
lemmas par_tr_nil:
(u ∈ <> |[X]|tr s) = (u = s ∧ Tick ∉ sett u ∧ sett u ∩ Ev ` X = {})
(u ∈ s |[X]|tr <>) = (u = s ∧ Tick ∉ sett u ∧ sett u ∩ Ev ` X = {})
lemmas par_tr_nil:
(u ∈ <> |[X]|tr s) = (u = s ∧ Tick ∉ sett u ∧ sett u ∩ Ev ` X = {})
(u ∈ s |[X]|tr <>) = (u = s ∧ Tick ∉ sett u ∧ sett u ∩ Ev ` X = {})
lemma par_tr_Tick_left_only_if_imp:
∀u. u ∈ <Tick> |[X]|tr s --> u = s ∧ Tick ∈ sett u ∧ sett u ∩ Ev ` X = {}
lemma par_tr_Tick_left_only_if:
u ∈ <Tick> |[X]|tr s ==> u = s ∧ Tick ∈ sett u ∧ sett u ∩ Ev ` X = {}
lemma par_tr_Tick_left_if_imp:
Tick ∈ sett u ∧ sett u ∩ Ev ` X = {} --> u ∈ <Tick> |[X]|tr u
lemma par_tr_Tick_left_if:
[| Tick ∈ sett u; sett u ∩ Ev ` X = {} |] ==> u ∈ <Tick> |[X]|tr u
lemma par_tr_Tick_left:
(u ∈ <Tick> |[X]|tr s) = (u = s ∧ Tick ∈ sett u ∧ sett u ∩ Ev ` X = {})
lemma par_tr_Tick_right:
(u ∈ s |[X]|tr <Tick>) = (u = s ∧ Tick ∈ sett u ∧ sett u ∩ Ev ` X = {})
lemmas par_tr_Tick:
(u ∈ <Tick> |[X]|tr s) = (u = s ∧ Tick ∈ sett u ∧ sett u ∩ Ev ` X = {})
(u ∈ s |[X]|tr <Tick>) = (u = s ∧ Tick ∈ sett u ∧ sett u ∩ Ev ` X = {})
lemmas par_tr_Tick:
(u ∈ <Tick> |[X]|tr s) = (u = s ∧ Tick ∈ sett u ∧ sett u ∩ Ev ` X = {})
(u ∈ s |[X]|tr <Tick>) = (u = s ∧ Tick ∈ sett u ∧ sett u ∩ Ev ` X = {})
lemma par_tr_sett:
∀s t. u ∈ s |[X]|tr t --> sett u ⊆ sett s ∪ sett t