(*-------------------------------------------* | 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 = Infra: (* 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] (*********************************************************** Type Definitions 'a event : type of events a,b,... 'a trace : type of traces s,t,... ***********************************************************) datatype 'a event = Ev 'a | Tick consts Evset :: "'a event set" EvsetTick :: "'a event set" defs Evset_def : "Evset == {a. a ~= Tick}" EvsetTick_def : "EvsetTick == UNIV" (* EvsetTick seems to be useless, but it sometimes *) (* makes proofs to be readable. *) (*------------------------------------* | X-Symbols | *------------------------------------*) syntax (output) "_TickX" :: "'a event" ("Tick") syntax (xsymbols) "_TickX" :: "'a event" ("\<surd>") translations "\<surd>" == "Tick" (******************************* Evset contains all (Ev a) *******************************) lemma Un_Evset[simp] : "Ev ` X Un Evset = Evset" by (auto simp add: Evset_def) (******************************* Tick or Ev a *******************************) lemma event_Tick_or_Ev: "ALL e. e = Tick | (EX a. e = Ev a)" apply (intro allI) by (induct_tac e, auto) lemma not_Tick_to_Ev: "(e ~= Tick) = (EX a. e = Ev a)" apply (auto) apply (insert event_Tick_or_Ev) apply (drule_tac x="e" in spec) by (simp) lemma in_Ev_set : "(e : Ev ` X) = (EX a. (e = Ev a & a : X))" by (auto) lemma notin_Ev_set : "(e ~: Ev ` X) = (e = Tick | (EX a. (e = Ev a & a ~: X)))" apply (insert event_Tick_or_Ev) apply (drule_tac x="e" in spec) by (auto) (******************************* inj *******************************) lemma inj_Ev[simp]: "inj Ev" apply (simp add: inj_on_def) done (*********************************************************** Definition of traces ***********************************************************) (* "typedef" requires defined types are not empty as follows: *) typedef 'a trace = "{ss::('a event list). Tick ~: set (butlast ss)}" apply (rule_tac x ="[]" in exI) apply (simp) done declare Rep_trace [simp] (***************************************************************** directly convert from list to trace *****************************************************************) (***********************************************************) (* operators over traces *) (* *) (* memo (infixr "@t" 65) = ("_ @t _" [66,65] 65) *) (* *) (***********************************************************) consts nilt :: "'a trace" ("<>") sett :: "'a trace => 'a event set" lengtht :: "'a trace => nat" noTick :: "'a trace => bool" hdt :: "'a trace => 'a event" tlt :: "'a trace => 'a trace" lastt :: "'a trace => 'a event" butlastt :: "'a trace => 'a trace" defs nilt_def : "<> == Abs_trace []" sett_def : "sett s == set (Rep_trace s)" lengtht_def: "lengtht s == length (Rep_trace s)" noTick_def : "noTick s == (Tick ~: sett s)" hdt_def : "hdt s == hd (Rep_trace s)" tlt_def : "tlt s == Abs_trace (tl (Rep_trace s))" lastt_def : "lastt s == last (Rep_trace s)" butlastt_def : "butlastt s == Abs_trace (butlast (Rep_trace s))" syntax "@trace" :: "args => 'a trace" ("<(_)>") translations "<s>" == "Abs_trace [s]" (*** appending ***) datatype TraceChk = tr_nil | tr_noTick | tr_Tick | tr_error consts appt :: "'a trace => 'a trace => 'a trace" (infixr "^^" 65) defs appt_def : "s ^^ t == Abs_trace (Rep_trace s @ Rep_trace t)" (******** X-symbols ********) syntax (output) "_niltX" :: "'a trace" ("<>") "_apptX" :: "'a trace => 'a trace => 'a trace" (infixr "^^" 65) "_traceX" :: "args => 'a trace" ("<(_)>") syntax (xsymbols) "_niltX" :: "'a trace" ("〈〉") "_apptX" :: "'a trace => 'a trace => 'a trace" (infixr "\<frown>" 65) "_traceX" :: "args => 'a trace" ("〈(_)〉") translations "〈〉" == "<>" "〈s〉" == "<s>" "s \<frown> t" == "s ^^ t" (*********************************************************** lemmas ***********************************************************) (*************************************** trace Rep and Abs lemmas ***************************************) (*** Abs-Rep ***) lemma Abs_trace_Rep_trace_inverse_left: "t : trace ==> ((Abs_trace t = s) = (t = Rep_trace s))" by (auto simp add: Abs_trace_inverse Rep_trace_inverse) lemma Abs_trace_Rep_trace_inverse_right: "t : trace ==> ((s = Abs_trace t) = (t = Rep_trace s))" by (auto simp add: Abs_trace_inverse Rep_trace_inverse) lemmas Abs_trace_Rep_trace_inverse = Abs_trace_Rep_trace_inverse_left Abs_trace_Rep_trace_inverse_right (*** Rep-Abs ***) lemma Rep_trace_Abs_trace_inverse_left_only_if: "Rep_trace t = s ==> t = Abs_trace s" by (auto simp add: Rep_trace_inverse) lemma Rep_trace_Abs_trace_inverse_right_only_if: "s = Rep_trace t ==> t = Abs_trace s" by (auto simp add: Rep_trace_inverse) lemmas Rep_trace_Abs_trace_inverse_only_if = Rep_trace_Abs_trace_inverse_left_only_if Rep_trace_Abs_trace_inverse_right_only_if (*** Abs image ***) lemma Abs_trace_inverse_in_only_if: "[| ALL s:X. s : trace ; t : Abs_trace ` X |] ==> Rep_trace t : X" apply (simp add: image_def, erule bexE) apply (drule_tac x="x" in bspec, simp) by (simp add: Abs_trace_inverse) lemma Abs_trace_inverse_in_if: "Rep_trace t : X ==> t : Abs_trace ` X" apply (simp add: image_def) apply (rule_tac x="Rep_trace t" in bexI) by (simp_all add: Rep_trace_inverse) lemma Abs_trace_inverse_in: "[| ALL s:X. s : trace |] ==> (t : Abs_trace ` X) = (Rep_trace t : X)" apply (rule iffI) apply (simp add: Abs_trace_inverse_in_only_if) by (simp add: Abs_trace_inverse_in_if) (******************************* check in trace *******************************) lemma nil_in_trace[simp] : "[] : trace" by (simp add: trace_def) lemma event_in_trace[simp] : "[a] : trace" by (simp add: trace_def) lemma notic_in_trace[simp] : "Tick ~: set s ==> s : trace" by (simp add: trace_def notin_set_butlast) (*--------------------------* | decompo app | *--------------------------*) (*** decompo traces only if ***) lemma decompo_app_in_trace_only_if1 : "s @ t : trace ==> s : trace" apply (simp add: trace_def) apply (simp add: notin_butlast_decompo) apply (erule disjE) by (simp_all add: notin_set_butlast) lemma decompo_app_in_trace_only_if2 : "s @ t : trace ==> t : trace" apply (simp add: trace_def) apply (simp add: notin_butlast_decompo) by (auto) lemma decompo_app_in_trace_only_if : "s @ t : trace ==> (s : trace & t = []) | (Tick ~: set s & t : trace)" apply (insert list_last_nil_or_unnil) apply (drule_tac x="t" in spec) apply (erule disjE) (* t = [] *) apply (simp) (* t = sa @ [a] *) apply (elim exE) apply (rule disjI2) apply (rule conjI) apply (simp add: trace_def) apply (simp add: notin_butlast_decompo) apply (rule decompo_app_in_trace_only_if2[of s]) apply (simp) done (*** decompo traces if ***) lemma decompo_app_in_trace_if : "[| Tick ~: set s ; t : trace |] ==> s @ t : trace" by (simp add: trace_def notin_butlast_decompo) (****** decompo traces iff ******) lemma decompo_app_in_trace : "s @ t : trace = ((s : trace & t = []) | (Tick ~: set s & t : trace))" apply (rule iffI) apply (simp add: decompo_app_in_trace_only_if) apply (erule disjE) by (simp_all add: decompo_app_in_trace_if) (*** erule for decomposing "s @ t : trace" in assumption ***) lemma decompo_appt_in_traceE: "[| s @ t : trace ; [| s @ t : trace ; s : trace ; t : trace |] ==> R |] ==> R" apply (simp add: decompo_app_in_trace) by (auto) (*--------------------------* | decompo cons | *--------------------------*) (*** decompo traces if ***) lemma decompo_head_in_trace_if: "[| a ~= Tick ; t : trace |] ==> a # t : trace" apply (insert decompo_app_in_trace_if[of "[a]" t]) by (auto) lemma decompo_head_in_trace : "a # t : trace = (t = [] | (a ~= Tick & t : trace))" apply (insert decompo_app_in_trace[of "[a]"]) by (auto) lemma decompo_last_in_trace_if : "Tick ~: set s ==> s @ [a] : trace" apply (insert decompo_app_in_trace_if[of s "[a]"]) by (auto) lemma decompo_last_in_trace : "s @ [a] : trace = (Tick ~: set s)" apply (insert decompo_app_in_trace[of s "[a]"]) by (simp) (*--------------------------* | app not in | *--------------------------*) lemma app_notin_trace_left: "s ~: trace ==> t @ s ~: trace" apply (auto simp add: trace_def) apply (simp add: in_butlast_decompo) apply (case_tac "s = []") by (simp_all) lemma app_notin_trace_right: "s ~: trace ==> s @ t ~: trace" apply (auto simp add: trace_def) apply (simp add: in_butlast_decompo) apply (rule disjI1) by (rule in_set_butlast, simp) lemmas app_notin_trace = app_notin_trace_left app_notin_trace_right (******************************* Tick *******************************) lemma Tick_is_last : "Tick#s : trace ==> s = []" apply (case_tac "s = []") by (auto simp add: trace_def) (******************************* Nil *******************************) lemma one_neq_nil[simp]: "<a> ~= <>" by (simp add: nilt_def Abs_trace_inject) lemma one_neq_nil_sym[simp]: "<> ~= <a>" by (simp add: nilt_def Abs_trace_inject) (******************************* noTick *******************************) (*** noTick Ev ***) lemma noTick_Ev[simp]: "noTick <Ev a>" apply (simp add: noTick_def sett_def) by (simp add: Abs_trace_inverse) lemma noTick_EvI: "(EX a. e = Ev a) ==> noTick <e>" apply (simp add: noTick_def sett_def) by (auto simp add: Abs_trace_inverse) (*** noTick nil ***) lemma noTick_nil[simp]: "noTick <>" apply (simp add: noTick_def nilt_def sett_def) by (simp add: Abs_trace_inverse) (*** not noTick Tick ***) lemma not_noTick_Tick[simp]: "~ noTick <Tick>" apply (simp add: noTick_def sett_def) by (simp add: Abs_trace_inverse) (******************************* Event *******************************) lemma Event_eq[simp] : "(<e1> = <e2>) = (e1 = e2)" by (simp add: Abs_trace_inject) (*********************************************************** @ in trace ***********************************************************) (*---------------------------------------------* | Rep_trace s @ Rep_trace t | *---------------------------------------------*) (*--------------------------* | rep in_trace | *--------------------------*) lemma Rep_compo_head_in_trace[simp]: "(Ev a) # Rep_trace t : trace" by (simp add: decompo_head_in_trace) lemma Rep_compo_last_in_trace[simp]: "noTick t ==> Rep_trace t @ [e] : trace" apply (simp add: decompo_last_in_trace) apply (simp add: noTick_def sett_def) done lemma Rep_compo_app_in_trace[simp] : "(noTick s | t = <>) ==> Rep_trace s @ Rep_trace t : trace" apply (simp add: decompo_app_in_trace) apply (simp add: noTick_def sett_def nilt_def) apply (simp add: Abs_trace_Rep_trace_inverse) by (auto) (*** only if ***) lemma decompo_apprep_in_traceI: "Rep_trace s @ Rep_trace t : trace ==> (noTick s | t = <>)" apply (simp add: decompo_app_in_trace) apply (simp add: nilt_def noTick_def sett_def) by (auto simp add: Rep_trace_Abs_trace_inverse_only_if) (*** iff ***) lemma decompo_apprep_in_trace: "(Rep_trace s @ Rep_trace t : trace) = (noTick s | t = <>)" apply (rule iffI) apply (rule decompo_apprep_in_traceI, simp) apply (simp) done (*** not ***) lemma decompo_apprep_notin_traceI: "Rep_trace s @ Rep_trace t ~: trace ==> (~ noTick s & t ~= <>)" by (erule contrapos_np, simp) (*** erule ***) lemma decompo_apprep_in_traceE: "[| Rep_trace s @ Rep_trace t : trace ; noTick s | t = <> ==> R |] ==> R" apply (simp add: decompo_apprep_in_trace) done lemma decompo_apprep_notin_traceE: "[| Rep_trace s @ Rep_trace t ~: trace ; [| ~ noTick s ; t ~= <> |] ==> R |] ==> R" apply (simp add: decompo_apprep_in_trace) done (*-----------------------------* | lemmas for in_traces | *-----------------------------*) lemmas in_trace = decompo_head_in_trace decompo_app_in_trace lemmas Rep_in_trace = decompo_apprep_in_trace (*********************************************************** lemmas for s @t t ***********************************************************) (*-----------------------------* | Abs_trace distribution on @ | *-----------------------------*) lemma Abs_trace_app_dist: "s @ t : trace ==> Abs_trace s ^^ Abs_trace t = Abs_trace (s @ t)" apply (simp add: appt_def) apply (erule decompo_appt_in_traceE) apply (simp add: Abs_trace_inverse) done (*********************************************************** s ^^ t <==> s @rep t ***********************************************************) (*--------------------------* | append head | *--------------------------*) lemma appt_head: "<a> ^^ s = Abs_trace (a # Rep_trace s)" apply (simp add: appt_def) by (simp add: Abs_trace_inverse) (*--------------------------* | append last | *--------------------------*) lemma appt_last: "noTick t ==> t ^^ <e> = Abs_trace (Rep_trace t @ [e])" apply (simp add: appt_def) by (simp add: Abs_trace_inverse) (*********************************************************** lemmas for s ^^ t ***********************************************************) lemma appt_nil_left[simp]: "<> ^^ s = s" apply (simp add: appt_def) apply (simp add: nilt_def) by (simp add: Abs_trace_inverse Rep_trace_inverse) lemma appt_nil_right[simp]: "s ^^ <> = s" apply (simp add: appt_def) apply (simp add: nilt_def) by (simp add: Abs_trace_inverse Rep_trace_inverse) lemma event_app_not_nil_left[simp]: "<Ev a> ^^ s ~= <>" apply (simp add: appt_def) apply (simp add: Abs_trace_inverse nilt_def) apply (subgoal_tac "Ev a # Rep_trace s : trace") apply (simp add: Abs_trace_inject) apply (simp add: in_trace) done lemma event_app_not_nil_right[simp]: "noTick s ==> s ^^ <e> ~= <>" apply (simp add: appt_def) apply (simp add: Abs_trace_inverse nilt_def) apply (subgoal_tac "Rep_trace s @ [e] : trace") apply (simp add: Abs_trace_inject) apply (simp add: in_trace) apply (simp add: noTick_def sett_def) done (*********************************************************** induction for traces ***********************************************************) (*** induction ***) lemma induct_event_list: "s : trace & P <> & P <Tick> & (ALL s a. (P (Abs_trace s) --> P (<Ev a> ^^ (Abs_trace s)))) --> P (Abs_trace s)" apply (induct_tac s) (* base case *) apply (simp add: nilt_def) (* step case *) apply (intro impI) apply (simp add: in_trace) apply (insert event_Tick_or_Ev) apply (drule_tac x="a" in spec) apply (elim disjE conjE exE) apply (simp_all) apply (drule_tac x="[]" in spec) apply (fold nilt_def, simp) apply (simp add: appt_head) apply (drule_tac x="list" in spec) apply (simp add: Abs_trace_inverse) done (*** rule ***) lemma induct_trace: "[| P <> ; P <Tick> ; !! (s::'a trace) a. P s ==> P (<Ev a> ^^ s) |] ==> P (s)" apply (insert induct_event_list[of "Rep_trace s" P]) by (simp add: Rep_trace_inverse) (*------------------------------------------------------* | use this induction rule "induct_trace" as follows: | | | | lemma test_induction: "test (s::'a trace)" | | apply (induct_tac s rule: induct_trace) | | | *------------------------------------------------------*) (*** reverse induction ***) lemma rev_induct_event_list: "s : trace & P <> & (ALL s e. (P (Abs_trace s) & noTick (Abs_trace s)) --> P ((Abs_trace s) ^^ <e>)) --> P (Abs_trace s)" apply (induct_tac s rule: rev_induct) (* base case *) apply (simp add: nilt_def) (* step case *) apply (intro allI impI) apply (simp add: in_trace) apply (elim conjE) apply (drule_tac x="xs" in spec) apply (simp add: noTick_def sett_def) apply (simp add: Abs_trace_inverse) apply (subgoal_tac "noTick (Abs_trace xs)") apply (simp add: appt_last Abs_trace_inverse) apply (simp add: noTick_def sett_def) apply (simp add: Abs_trace_inverse) done (*** rule ***) lemma rev_induct_trace: "[| P <> ; !! (s::'a trace) e. [| P s ; noTick s |] ==> P (s ^^ <e>) |] ==> P (s)" apply (insert rev_induct_event_list[of "Rep_trace s" P]) by (simp add: Rep_trace_inverse) (*----------------------------------------------------------* | use this induction rule "rev_induct_trace" as follows: | | | | lemma test_induction: "test (s::'a trace)" | | apply (induct_tac s rule: rev_induct_trace) | | | *----------------------------------------------------------*) (*********************************************************** convenient lemmas ***********************************************************) (*--------------------------* | associativity of ^^ | *--------------------------*) lemma appt_assoc: "[| (noTick s | t = <>) ; (noTick t | u = <>) |] ==> (s ^^ t) ^^ u = s ^^ (t ^^ u)" apply (subgoal_tac "Rep_trace s @ Rep_trace t : trace") apply (subgoal_tac "Rep_trace t @ Rep_trace u : trace") apply (simp add: appt_def) apply (simp add: Abs_trace_inverse) apply (simp_all add: Rep_in_trace) done lemma appt_assoc_sym : "[| (noTick s | t = <>) ; (noTick t | u = <>) |] ==> s ^^ (t ^^ u) = (s ^^ t) ^^ u" by (simp add: appt_assoc) (*** nil ***) lemma appt_nil[simp]: "noTick s ==> (s ^^ t = <>) = (s = <> & t = <>)" apply (rule iffI) apply (simp_all) apply (simp add: appt_def) apply (case_tac "(Rep_trace s @ Rep_trace t) : trace") apply (simp add: nilt_def) apply (simp add: Abs_trace_inject) apply (simp add: Rep_trace_Abs_trace_inverse_only_if) apply (simp add: Rep_in_trace) done lemma appt_nil_sym[simp]: "noTick s ==> (<> = s ^^ t) = (s = <> & t = <>)" apply (auto) by (drule sym, simp)+ (*--------------------------* | length | *--------------------------*) (*** 0 ***) lemma lengtht_nil_zero[simp]: "lengtht (<>) = 0" apply (simp add: nilt_def lengtht_def) by (simp add: Abs_trace_inverse) (*** 1 ***) lemma lengtht_one_event[simp]: "lengtht (<e>) = Suc 0" apply (simp add: lengtht_def) by (simp add: Abs_trace_inverse) (*** length + 1 ***) lemma lengtht_app_event_Suc_last[simp]: "noTick s ==> lengtht (s ^^ <a>) = Suc (lengtht s)" apply (simp add: appt_def lengtht_def) apply (simp add: Abs_trace_inverse) done lemma lengtht_app_event_Suc_head[simp]: "lengtht (<Ev a> ^^ s) = Suc (lengtht s)" apply (simp add: appt_def lengtht_def) apply (simp add: Abs_trace_inverse) done (*** app length ***) lemma lengtht_app_decompo1[simp]: "noTick s | t = <> ==> lengtht (s ^^ t) = lengtht s + lengtht t" apply (simp add: appt_def lengtht_def) apply (simp add: Abs_trace_inverse) done lemma lengtht_app_decompo2[simp]: "Rep_trace s @ Rep_trace t : trace ==> lengtht (s ^^ t) = lengtht s + lengtht t" apply (simp add: Rep_in_trace) done (*---------------------------* | sett | *---------------------------*) (*** nil ***) lemma sett_nil[simp]: "sett <> = {}" apply (simp add: sett_def) by (simp add: nilt_def Abs_trace_inverse) (*** one ***) lemma sett_one[simp]: "sett <e> = {e}" apply (simp add: sett_def) by (simp add: Abs_trace_inverse) (*** appt ***) lemma sett_appt1[simp]: "noTick s | t = <> ==> sett (s ^^ t) = sett s Un sett t" apply (simp add: sett_def appt_def) apply (simp add: Abs_trace_inverse) done lemma sett_appt2[simp]: "Rep_trace s @ Rep_trace t : trace ==> sett (s ^^ t) = sett s Un sett t" by (simp add: Rep_in_trace) (*---------------------------* | decompo appt Tick | *---------------------------*) (*** only if ***) lemma decompo_appt_noTick_only_if: "[| noTick s | t = <> ; noTick (s ^^ t) |] ==> (noTick s & noTick t)" by (simp add: noTick_def) (*** if ***) lemma decompo_appt_noTick_if: "[| noTick s ; noTick t |] ==> noTick (s ^^ t)" by (simp add: noTick_def) (*** iff ***) lemma decompo_appt_noTick[simp]: "noTick s | t = <> ==> noTick (s ^^ t) = (noTick s & noTick t)" by (simp add: noTick_def) (*---------------------------* | a trace is ... or ... | *---------------------------*) (*** trace --> nil or Tick or etc ***) lemma trace_nil_or_Tick_or_Ev: "ALL t. ((t = <>) | (t = <Tick>) | (EX a s. t=<Ev a> ^^ s))" apply (intro allI) apply (induct_tac t rule: induct_trace) by (auto) (*** trace --> nil or unnil ***) lemma trace_nil_or_unnil: "ALL t. ((t = <>) | (EX a s. t=<a> ^^ s))" apply (intro allI) apply (insert trace_nil_or_Tick_or_Ev) apply (drule_tac x="t" in spec) apply (elim conjE disjE exE) apply (simp_all) apply (rule_tac x="Tick" in exI) apply (rule_tac x="<>" in exI) apply (simp) apply (rule_tac x="Ev a" in exI) apply (rule_tac x="s" in exI) by (simp) (*** trace --> nil or unnil (last) ***) lemma trace_last_nil_or_unnil: "ALL t. ((t = <>) | (EX s a. noTick s & t = s ^^ <a>))" apply (intro allI) apply (induct_tac t rule: rev_induct_trace) by (auto) (*** trace --> noTick or Tick (last) ***) lemma trace_last_noTick_or_Tick: "ALL t. (noTick t | (EX s. noTick s & t = s ^^ <Tick>))" apply (intro allI impI) apply (insert trace_last_nil_or_unnil) apply (drule_tac x="t" in spec, simp) apply (elim conjE disjE exE) apply (simp_all) apply (insert event_Tick_or_Ev) apply (drule_tac x="a" in spec) by (auto) (*---------------------------* | same head and last | *---------------------------*) (*** same head ***) lemma appt_same_head_only_if: "<Ev a> ^^ s = <Ev b> ^^ t ==> a = b & s = t" apply (simp add: appt_def) apply (simp add: Abs_trace_inverse) apply (simp add: Abs_trace_inject) apply (simp add: Rep_trace_inject) done lemma appt_same_head[simp]: "(<Ev a> ^^ s = <Ev b> ^^ t) = (a = b & s = t)" apply (rule iffI) apply (rule appt_same_head_only_if) by (simp_all) (*** same last ***) lemma appt_same_last_only_if: "[| noTick s ; noTick t ; s ^^ <a> = t ^^ <b> |] ==> s = t & a = b" apply (simp add: appt_def) apply (simp add: Abs_trace_inverse) apply (simp add: Abs_trace_inject) apply (simp add: Rep_trace_inject) done lemma appt_same_last[simp]: "[| noTick s ; noTick t |] ==> (s ^^ <a> = t ^^ <b>) = (s = t & a = b)" apply (rule iffI) apply (rule appt_same_last_only_if) by (simp_all) (*---------------------------* | appt decompo one | *---------------------------*) lemma appt_decompo_one_only_if: "[| noTick s | t = <> ; s ^^ t = <a> |] ==> (s = <a> & t = <>) | (s = <> & t = <a>)" apply (erule disjE) apply (simp_all) apply (simp add: appt_def) apply (simp add: Abs_trace_inject) apply (simp add: list_app_decompo_one) apply (simp add: Abs_trace_Rep_trace_inverse nilt_def) by (auto) lemma appt_decompo_one[simp]: "noTick s | t = <> ==> (s ^^ t = <a>) = ((s = <a> & t = <>) | (s = <> & t = <a>))" apply (rule iffI) apply (simp add: appt_decompo_one_only_if) by (auto) lemma appt_decompo_one_sym[simp]: "noTick s | t = <> ==> (<a> = s ^^ t) = ((s = <a> & t = <>) | (s = <> & t = <a>))" apply (rule iffI) apply (drule sym, simp) by (rule sym, simp) (****************************************************************** head and tail ******************************************************************) (*** tl : trace ***) lemma tlt_trace: "[| s : trace ; s ~= [] |] ==> tl s : trace" apply (simp add: trace_def) apply (insert list_nil_or_unnil) apply (drule_tac x="s" in spec) apply (erule disjE, simp) apply (elim exE, simp) by (case_tac "sa = []", simp, simp) (*** head !! ***) lemma hdt_appt[simp]: "hdt (<Ev a> ^^ s) = Ev a" apply (simp add: appt_def) apply (simp add: hdt_def) apply (simp add: Abs_trace_inverse) done (* one *) lemma hdt_one[simp]: "hdt <a> = a" apply (simp add: hdt_def) by (simp add: Abs_trace_inverse) (*** tail !! ***) lemma tlt_appt[simp]: "tlt (<Ev a> ^^ s) = s" apply (simp add: appt_def) apply (simp add: tlt_def) apply (simp add: Abs_trace_inverse) apply (simp add: Rep_trace_inverse) done (* one *) lemma tlt_one[simp]: "tlt <a> = <>" apply (simp add: tlt_def) by (simp add: Abs_trace_inverse nilt_def) (*** head + tail ***) lemma hdt_appt_tail[simp]: "s ~= <> ==> <hdt s> ^^ (tlt s) = s" apply (insert trace_nil_or_Tick_or_Ev) apply (drule_tac x="s" in spec) apply (simp) apply (erule disjE, simp) by (elim exE, simp) (****************************************************************** butlast & last ******************************************************************) (*** butlast : trace ***) lemma butlast_trace: "[| s : trace ; s ~= [] |] ==> butlast s : trace" by (simp add: trace_def notin_set_butlast) lemma butlast_trace_Rep: "s ~= <> ==> butlast (Rep_trace s) : trace" apply (insert Rep_trace[of s]) apply (case_tac "Rep_trace s ~= []") apply (simp add: trace_def) apply (simp add: notin_set_butlast) by (simp) (*** last !! ***) lemma lastt_appt[simp]: "noTick s ==> lastt (s ^^ <e>) = e" apply (simp add: appt_def) apply (simp add: lastt_def) apply (simp add: Abs_trace_inverse) done (* one *) lemma lastt_one[simp]: "lastt <a> = a" apply (simp add: lastt_def) by (simp add: Abs_trace_inverse) (*** butlast !! ***) lemma butlastt_appt[simp]: "noTick s ==> butlastt (s ^^ <e>) = s" apply (simp add: appt_def) apply (simp add: butlastt_def) apply (simp add: Abs_trace_inverse) by (simp add: Rep_trace_inverse) (* one *) lemma butlastt_one[simp]: "butlastt <a> = <>" apply (simp add: butlastt_def) by (simp add: Abs_trace_inverse nilt_def) (*** butlast + last ***) lemma butlastt_appt_lastt[simp]: "s ~= <> ==> (butlastt s) ^^ <lastt s> = s" apply (insert trace_last_nil_or_unnil) apply (drule_tac x="s" in spec) apply (simp) apply (elim conjE exE) by (simp) (****************************************************************** noTick + alpha ******************************************************************) (* Tick in *) lemma not_noTick_unnil[simp]: "~ noTick s ==> s ~= <>" by (case_tac "s ~= <>", simp_all) (* noTick butlastt *) lemma noTick_butlast: "s ~= <> ==> noTick (butlastt s)" apply (simp add: butlastt_def) apply (simp add: noTick_def sett_def) apply (simp add: butlast_trace_Rep Abs_trace_inverse) apply (insert Rep_trace[of s]) by (simp add: trace_def) (* Tick and butlastt *) lemma Tick_decompo_lm: "ALL s. ~ noTick s --> s = ((butlastt s) ^^ <Tick>)" apply (intro allI impI) apply (insert trace_last_nil_or_unnil) apply (drule_tac x="s" in spec) apply (simp) apply (elim conjE exE) by (simp add: noTick_def) lemma Tick_decompo: "~ noTick s ==> s = ((butlastt s) ^^ <Tick>)" by (simp add: Tick_decompo_lm) (****************************************************************** lengtht plus ******************************************************************) (*** lengtht zero ***) lemma lengtht_zero: "(lengtht s = 0) = (s = <>)" apply (induct_tac s rule: induct_trace) by (simp_all) (*** lengtht one ***) lemma lengtht_one: "(lengtht s = Suc 0) = (EX e. s = <e>)" apply (induct_tac s rule: induct_trace) apply (simp_all) by (simp add: lengtht_zero) (****************************************************************** convenient lemmas ******************************************************************) (*-------------------* | for Seq_compo T1 | *-------------------*) lemma appt_decompo_lm: "ALL s1 s2 t1 t2. (noTick s1 & s2 ~= <> & noTick t1 & t2 ~= <>) --> (s1 ^^ s2 = t1 ^^ t2) = ((EX u. s1 ^^ u = t1 & s2 = u ^^ t2 & noTick u) | (EX u. s1 = t1 ^^ u & u ^^ s2 = t2 & noTick u))" apply (rule allI) apply (induct_tac s1 rule: induct_trace) apply (force) apply (force) apply (intro allI impI) apply (drule_tac x="s2" in spec, simp) apply (rule iffI) (* => *) apply (insert trace_nil_or_Tick_or_Ev) apply (rotate_tac -1) apply (drule_tac x="t1" in spec) apply (erule disjE, simp) apply (erule disjE, simp) apply (elim exE, simp) (* t1 = [Ev aa]t ^^ sa *) apply (drule_tac x="sa" in spec) apply (drule_tac x="t2" in spec) apply (simp add: appt_assoc) (* <= *) apply (elim disjE conjE exE) apply (auto simp add: appt_assoc_sym) done lemma appt_decompo: "[| noTick s1 | s2 = <> ; noTick t1 | t2 = <> |] ==> (s1 ^^ s2 = t1 ^^ t2) = ((EX u. s1 ^^ u = t1 & s2 = u ^^ t2 & (noTick u | (noTick s1 & t2 = <>))) | (EX u. s1 = t1 ^^ u & u ^^ s2 = t2 & (noTick u | (noTick t1 & s2 = <>))))" apply (case_tac "s2 ~= <>") apply (case_tac "t2 ~= <>") apply (auto simp add: appt_decompo_lm) done (*-------------------* | for Seq_compo T2 | *-------------------*) lemma noTick_or_last_Tick: "ALL s. noTick s | (EX t. s = t ^^ <Tick>)" apply (rule allI) apply (induct_tac s rule: rev_induct_trace) apply (simp_all) apply (insert event_Tick_or_Ev) apply (drule_tac x="e" in spec) by (auto) (*--------------------------* | used in Alpha_parallel | *--------------------------*) (*** Tick & sett ***) lemma not_noTick_in_sett_imp: "~ (noTick s) --> (EX t. s = t ^^ <Tick> & noTick t)" apply (induct_tac s rule: induct_trace) apply (simp_all) apply (rule_tac x="<>" in exI) apply (simp) apply (intro allI impI) apply (simp) apply (elim exE) apply (simp) apply (rule_tac x="<Ev a> ^^ t" in exI) apply (simp add: appt_assoc) done lemma Tick_in_sett_imp: "Tick : sett(s) --> (EX t. s = t ^^ <Tick> & noTick t)" apply (insert not_noTick_in_sett_imp[of s]) by (simp add: noTick_def) lemma Tick_in_sett: "(Tick : sett(s)) = (EX t. s = t ^^ <Tick> & noTick t)" apply (rule iffI) apply (simp add: Tick_in_sett_imp) apply (elim conjE exE) by (simp) (*--------------------------------* | used in Inductive_parallel | *--------------------------------*) lemma sett_subset_Tick_if: "(u = <> | u = <Tick>) ==> (sett u <= {Tick})" by (auto) lemma sett_subset_Tick_only_if: "(sett u <= {Tick}) --> (u = <> | u = <Tick>)" apply (induct_tac u rule: induct_trace) by (simp_all) lemma sett_subset_Tick: "(sett u <= {Tick}) = (u = <> | u = <Tick>)" apply (rule iffI) apply (simp add: sett_subset_Tick_only_if) apply (simp add: sett_subset_Tick_if) done (*--------------------------* | lengtht [a,b,c]t | *--------------------------*) lemma lengtht_Abs_trace: "s : trace ==> lengtht (Abs_trace s) = length s" apply (simp add: lengtht_def) apply (simp add: Abs_trace_inverse) done lemma lengtht_Abs_trace_noTick: "Tick ~: set (butlast s) ==> lengtht (Abs_trace s) = length s" apply (simp add: lengtht_Abs_trace[simplified trace_def]) done (****************** to add it again ******************) declare disj_not1 [simp] end
lemma Un_Evset:
Ev ` X ∪ Evset = Evset
lemma event_Tick_or_Ev:
∀e. e = Tick ∨ (∃a. e = Ev a)
lemma not_Tick_to_Ev:
(e ≠ Tick) = (∃a. e = Ev a)
lemma in_Ev_set:
(e ∈ Ev ` X) = (∃a. e = Ev a ∧ a ∈ X)
lemma notin_Ev_set:
(e ∉ Ev ` X) = (e = Tick ∨ (∃a. e = Ev a ∧ a ∉ X))
lemma inj_Ev:
inj Ev
lemma Abs_trace_Rep_trace_inverse_left:
t ∈ trace ==> (Abs_trace t = s) = (t = Rep_trace s)
lemma Abs_trace_Rep_trace_inverse_right:
t ∈ trace ==> (s = Abs_trace t) = (t = Rep_trace s)
lemmas Abs_trace_Rep_trace_inverse:
t ∈ trace ==> (Abs_trace t = s) = (t = Rep_trace s)
t ∈ trace ==> (s = Abs_trace t) = (t = Rep_trace s)
lemmas Abs_trace_Rep_trace_inverse:
t ∈ trace ==> (Abs_trace t = s) = (t = Rep_trace s)
t ∈ trace ==> (s = Abs_trace t) = (t = Rep_trace s)
lemma Rep_trace_Abs_trace_inverse_left_only_if:
Rep_trace t = s ==> t = Abs_trace s
lemma Rep_trace_Abs_trace_inverse_right_only_if:
s = Rep_trace t ==> t = Abs_trace s
lemmas Rep_trace_Abs_trace_inverse_only_if:
Rep_trace t = s ==> t = Abs_trace s
s = Rep_trace t ==> t = Abs_trace s
lemmas Rep_trace_Abs_trace_inverse_only_if:
Rep_trace t = s ==> t = Abs_trace s
s = Rep_trace t ==> t = Abs_trace s
lemma Abs_trace_inverse_in_only_if:
[| ∀s∈X. s ∈ trace; t ∈ Abs_trace ` X |] ==> Rep_trace t ∈ X
lemma Abs_trace_inverse_in_if:
Rep_trace t ∈ X ==> t ∈ Abs_trace ` X
lemma Abs_trace_inverse_in:
∀s∈X. s ∈ trace ==> (t ∈ Abs_trace ` X) = (Rep_trace t ∈ X)
lemma nil_in_trace:
[] ∈ trace
lemma event_in_trace:
[a] ∈ trace
lemma notic_in_trace:
Tick ∉ set s ==> s ∈ trace
lemma decompo_app_in_trace_only_if1:
s @ t ∈ trace ==> s ∈ trace
lemma decompo_app_in_trace_only_if2:
s @ t ∈ trace ==> t ∈ trace
lemma decompo_app_in_trace_only_if:
s @ t ∈ trace ==> s ∈ trace ∧ t = [] ∨ Tick ∉ set s ∧ t ∈ trace
lemma decompo_app_in_trace_if:
[| Tick ∉ set s; t ∈ trace |] ==> s @ t ∈ trace
lemma decompo_app_in_trace:
(s @ t ∈ trace) = (s ∈ trace ∧ t = [] ∨ Tick ∉ set s ∧ t ∈ trace)
lemma decompo_appt_in_traceE:
[| s @ t ∈ trace; [| s @ t ∈ trace; s ∈ trace; t ∈ trace |] ==> R |] ==> R
lemma decompo_head_in_trace_if:
[| a ≠ Tick; t ∈ trace |] ==> a # t ∈ trace
lemma decompo_head_in_trace:
(a # t ∈ trace) = (t = [] ∨ a ≠ Tick ∧ t ∈ trace)
lemma decompo_last_in_trace_if:
Tick ∉ set s ==> s @ [a] ∈ trace
lemma decompo_last_in_trace:
(s @ [a] ∈ trace) = (Tick ∉ set s)
lemma app_notin_trace_left:
s ∉ trace ==> t @ s ∉ trace
lemma app_notin_trace_right:
s ∉ trace ==> s @ t ∉ trace
lemmas app_notin_trace:
s ∉ trace ==> t @ s ∉ trace
s ∉ trace ==> s @ t ∉ trace
lemmas app_notin_trace:
s ∉ trace ==> t @ s ∉ trace
s ∉ trace ==> s @ t ∉ trace
lemma Tick_is_last:
Tick # s ∈ trace ==> s = []
lemma one_neq_nil:
<a> ≠ <>
lemma one_neq_nil_sym:
<> ≠ <a>
lemma noTick_Ev:
noTick <Ev a>
lemma noTick_EvI:
∃a. e = Ev a ==> noTick <e>
lemma noTick_nil:
noTick <>
lemma not_noTick_Tick:
¬ noTick <Tick>
lemma Event_eq:
(<e1.0> = <e2.0>) = (e1.0 = e2.0)
lemma Rep_compo_head_in_trace:
Ev a # Rep_trace t ∈ trace
lemma Rep_compo_last_in_trace:
noTick t ==> Rep_trace t @ [e] ∈ trace
lemma Rep_compo_app_in_trace:
noTick s ∨ t = <> ==> Rep_trace s @ Rep_trace t ∈ trace
lemma decompo_apprep_in_traceI:
Rep_trace s @ Rep_trace t ∈ trace ==> noTick s ∨ t = <>
lemma decompo_apprep_in_trace:
(Rep_trace s @ Rep_trace t ∈ trace) = (noTick s ∨ t = <>)
lemma decompo_apprep_notin_traceI:
Rep_trace s @ Rep_trace t ∉ trace ==> ¬ noTick s ∧ t ≠ <>
lemma decompo_apprep_in_traceE:
[| Rep_trace s @ Rep_trace t ∈ trace; noTick s ∨ t = <> ==> R |] ==> R
lemma decompo_apprep_notin_traceE:
[| Rep_trace s @ Rep_trace t ∉ trace; [| ¬ noTick s; t ≠ <> |] ==> R |] ==> R
lemmas in_trace:
(a # t ∈ trace) = (t = [] ∨ a ≠ Tick ∧ t ∈ trace)
(s @ t ∈ trace) = (s ∈ trace ∧ t = [] ∨ Tick ∉ set s ∧ t ∈ trace)
lemmas in_trace:
(a # t ∈ trace) = (t = [] ∨ a ≠ Tick ∧ t ∈ trace)
(s @ t ∈ trace) = (s ∈ trace ∧ t = [] ∨ Tick ∉ set s ∧ t ∈ trace)
lemmas Rep_in_trace:
(Rep_trace s @ Rep_trace t ∈ trace) = (noTick s ∨ t = <>)
lemmas Rep_in_trace:
(Rep_trace s @ Rep_trace t ∈ trace) = (noTick s ∨ t = <>)
lemma Abs_trace_app_dist:
s @ t ∈ trace ==> Abs_trace s ^^ Abs_trace t = Abs_trace (s @ t)
lemma appt_head:
<a> ^^ s = Abs_trace (a # Rep_trace s)
lemma appt_last:
noTick t ==> t ^^ <e> = Abs_trace (Rep_trace t @ [e])
lemma appt_nil_left:
<> ^^ s = s
lemma appt_nil_right:
s ^^ <> = s
lemma event_app_not_nil_left:
<Ev a> ^^ s ≠ <>
lemma event_app_not_nil_right:
noTick s ==> s ^^ <e> ≠ <>
lemma induct_event_list:
s ∈ trace ∧ P <> ∧ P <Tick> ∧ (∀s a. P (Abs_trace s) --> P (<Ev a> ^^ Abs_trace s)) --> P (Abs_trace s)
lemma induct_trace:
[| P <>; P <Tick>; !!s a. P s ==> P (<Ev a> ^^ s) |] ==> P s
lemma rev_induct_event_list:
s ∈ trace ∧ P <> ∧ (∀s e. P (Abs_trace s) ∧ noTick (Abs_trace s) --> P (Abs_trace s ^^ <e>)) --> P (Abs_trace s)
lemma rev_induct_trace:
[| P <>; !!s e. [| P s; noTick s |] ==> P (s ^^ <e>) |] ==> P s
lemma appt_assoc:
[| noTick s ∨ t = <>; noTick t ∨ u = <> |] ==> (s ^^ t) ^^ u = s ^^ t ^^ u
lemma appt_assoc_sym:
[| noTick s ∨ t = <>; noTick t ∨ u = <> |] ==> s ^^ t ^^ u = (s ^^ t) ^^ u
lemma appt_nil:
noTick s ==> (s ^^ t = <>) = (s = <> ∧ t = <>)
lemma appt_nil_sym:
noTick s ==> (<> = s ^^ t) = (s = <> ∧ t = <>)
lemma lengtht_nil_zero:
lengtht <> = 0
lemma lengtht_one_event:
lengtht <e> = Suc 0
lemma lengtht_app_event_Suc_last:
noTick s ==> lengtht (s ^^ <a>) = Suc (lengtht s)
lemma lengtht_app_event_Suc_head:
lengtht (<Ev a> ^^ s) = Suc (lengtht s)
lemma lengtht_app_decompo1:
noTick s ∨ t = <> ==> lengtht (s ^^ t) = lengtht s + lengtht t
lemma lengtht_app_decompo2:
Rep_trace s @ Rep_trace t ∈ trace ==> lengtht (s ^^ t) = lengtht s + lengtht t
lemma sett_nil:
sett <> = {}
lemma sett_one:
sett <e> = {e}
lemma sett_appt1:
noTick s ∨ t = <> ==> sett (s ^^ t) = sett s ∪ sett t
lemma sett_appt2:
Rep_trace s @ Rep_trace t ∈ trace ==> sett (s ^^ t) = sett s ∪ sett t
lemma decompo_appt_noTick_only_if:
[| noTick s ∨ t = <>; noTick (s ^^ t) |] ==> noTick s ∧ noTick t
lemma decompo_appt_noTick_if:
[| noTick s; noTick t |] ==> noTick (s ^^ t)
lemma decompo_appt_noTick:
noTick s ∨ t = <> ==> noTick (s ^^ t) = (noTick s ∧ noTick t)
lemma trace_nil_or_Tick_or_Ev:
∀t. t = <> ∨ t = <Tick> ∨ (∃a s. t = <Ev a> ^^ s)
lemma trace_nil_or_unnil:
∀t. t = <> ∨ (∃a s. t = <a> ^^ s)
lemma trace_last_nil_or_unnil:
∀t. t = <> ∨ (∃s a. noTick s ∧ t = s ^^ <a>)
lemma trace_last_noTick_or_Tick:
∀t. noTick t ∨ (∃s. noTick s ∧ t = s ^^ <Tick>)
lemma appt_same_head_only_if:
<Ev a> ^^ s = <Ev b> ^^ t ==> a = b ∧ s = t
lemma appt_same_head:
(<Ev a> ^^ s = <Ev b> ^^ t) = (a = b ∧ s = t)
lemma appt_same_last_only_if:
[| noTick s; noTick t; s ^^ <a> = t ^^ <b> |] ==> s = t ∧ a = b
lemma appt_same_last:
[| noTick s; noTick t |] ==> (s ^^ <a> = t ^^ <b>) = (s = t ∧ a = b)
lemma appt_decompo_one_only_if:
[| noTick s ∨ t = <>; s ^^ t = <a> |] ==> s = <a> ∧ t = <> ∨ s = <> ∧ t = <a>
lemma appt_decompo_one:
noTick s ∨ t = <> ==> (s ^^ t = <a>) = (s = <a> ∧ t = <> ∨ s = <> ∧ t = <a>)
lemma appt_decompo_one_sym:
noTick s ∨ t = <> ==> (<a> = s ^^ t) = (s = <a> ∧ t = <> ∨ s = <> ∧ t = <a>)
lemma tlt_trace:
[| s ∈ trace; s ≠ [] |] ==> tl s ∈ trace
lemma hdt_appt:
hdt (<Ev a> ^^ s) = Ev a
lemma hdt_one:
hdt <a> = a
lemma tlt_appt:
tlt (<Ev a> ^^ s) = s
lemma tlt_one:
tlt <a> = <>
lemma hdt_appt_tail:
s ≠ <> ==> <hdt s> ^^ tlt s = s
lemma butlast_trace:
[| s ∈ trace; s ≠ [] |] ==> butlast s ∈ trace
lemma butlast_trace_Rep:
s ≠ <> ==> butlast (Rep_trace s) ∈ trace
lemma lastt_appt:
noTick s ==> lastt (s ^^ <e>) = e
lemma lastt_one:
lastt <a> = a
lemma butlastt_appt:
noTick s ==> butlastt (s ^^ <e>) = s
lemma butlastt_one:
butlastt <a> = <>
lemma butlastt_appt_lastt:
s ≠ <> ==> butlastt s ^^ <lastt s> = s
lemma not_noTick_unnil:
¬ noTick s ==> s ≠ <>
lemma noTick_butlast:
s ≠ <> ==> noTick (butlastt s)
lemma Tick_decompo_lm:
∀s. ¬ noTick s --> s = butlastt s ^^ <Tick>
lemma Tick_decompo:
¬ noTick s ==> s = butlastt s ^^ <Tick>
lemma lengtht_zero:
(lengtht s = 0) = (s = <>)
lemma lengtht_one:
(lengtht s = Suc 0) = (∃e. s = <e>)
lemma appt_decompo_lm:
∀s1 s2 t1 t2. noTick s1 ∧ s2 ≠ <> ∧ noTick t1 ∧ t2 ≠ <> --> (s1 ^^ s2 = t1 ^^ t2) = ((∃u. s1 ^^ u = t1 ∧ s2 = u ^^ t2 ∧ noTick u) ∨ (∃u. s1 = t1 ^^ u ∧ u ^^ s2 = t2 ∧ noTick u))
lemma appt_decompo:
[| noTick s1.0 ∨ s2.0 = <>; noTick t1.0 ∨ t2.0 = <> |] ==> (s1.0 ^^ s2.0 = t1.0 ^^ t2.0) = ((∃u. s1.0 ^^ u = t1.0 ∧ s2.0 = u ^^ t2.0 ∧ (noTick u ∨ noTick s1.0 ∧ t2.0 = <>)) ∨ (∃u. s1.0 = t1.0 ^^ u ∧ u ^^ s2.0 = t2.0 ∧ (noTick u ∨ noTick t1.0 ∧ s2.0 = <>)))
lemma noTick_or_last_Tick:
∀s. noTick s ∨ (∃t. s = t ^^ <Tick>)
lemma not_noTick_in_sett_imp:
¬ noTick s --> (∃t. s = t ^^ <Tick> ∧ noTick t)
lemma Tick_in_sett_imp:
Tick ∈ sett s --> (∃t. s = t ^^ <Tick> ∧ noTick t)
lemma Tick_in_sett:
(Tick ∈ sett s) = (∃t. s = t ^^ <Tick> ∧ noTick t)
lemma sett_subset_Tick_if:
u = <> ∨ u = <Tick> ==> sett u ⊆ {Tick}
lemma sett_subset_Tick_only_if:
sett u ⊆ {Tick} --> u = <> ∨ u = <Tick>
lemma sett_subset_Tick:
(sett u ⊆ {Tick}) = (u = <> ∨ u = <Tick>)
lemma lengtht_Abs_trace:
s ∈ trace ==> lengtht (Abs_trace s) = length s
lemma lengtht_Abs_trace_noTick:
Tick ∉ set (butlast s) ==> lengtht (Abs_trace s) = length s