(*-------------------------------------------*
| CSP-Prover |
| November 2004 |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory Trace = Infra:
(* The following simplification rules are deleted in this theory file *)
(* because they unexpectly rewrite (notick | t = []t) *)
(* *)
(* disj_not1: (~ P | Q) = (P --> Q) *)
declare disj_not1 [simp del]
(* The following simplification is sometimes unexpected. *)
(* *)
(* not_None_eq: (x ~= None) = (EX y. x = Some y) *)
declare not_None_eq [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: "inj Ev"
apply (simp add: inj_on_def)
done
(***********************************************************
Definition of traces
***********************************************************)
(* "typedef" requires defined types are not empty as follows: *)
typedef 'a Some_trace = "{ss::('a event list). Tick ~: set (butlast ss)}"
apply (rule_tac x ="[]" in exI)
apply (simp)
done
declare Rep_Some_trace [simp]
types 'a trace = "'a Some_trace option"
(*****************************************************************
directly convert from list to trace
*****************************************************************)
consts
Abs_trace :: "'a event list => 'a trace"
Rep_trace :: "'a trace => 'a event list"
defs
Abs_trace_def :
"Abs_trace s == if s : Some_trace then Some (Abs_Some_trace s) else None"
Rep_trace_def :
"Rep_trace s == Rep_Some_trace (the s)"
(***********************************************************)
(* operators over traces *)
(* *)
(* memo (infixr "@t" 65) = ("_ @t _" [66,65] 65) *)
(* *)
(***********************************************************)
consts
nilt :: "'a trace" ("[]t")
sett :: "'a trace => 'a event set"
lengtht :: "'a trace => nat"
notick :: "'a trace => bool"
apprep :: "'a trace => 'a trace => 'a event list" (infixr "@rep" 65)
appt :: "'a trace => 'a trace => 'a trace" (infixr "@t" 65)
hdt :: "'a trace => 'a event"
tlt :: "'a trace => 'a trace"
lastt :: "'a trace => 'a event"
butlastt :: "'a trace => 'a trace"
defs
nilt_def : "[]t == Abs_trace []"
sett_def : "sett s == if (s = None) then {} else set (Rep_trace s)"
lengtht_def: "lengtht s == if (s = None) then 0 else length (Rep_trace s)"
notick_def : "notick s == (s ~= None) & (Tick ~: sett s)"
apprep_def : "s @rep t == Rep_trace s @ Rep_trace t"
appt_def : "s @t t == if (s = None | t = None) then None
else Abs_trace (s @rep t)"
hdt_def : "hdt s == hd (Rep_trace s)"
tlt_def : "tlt s == if s = None then None
else Abs_trace (tl (Rep_trace s))"
lastt_def : "lastt s == last (Rep_trace s)"
butlastt_def : "butlastt s == if s = None then None
else Abs_trace (butlast (Rep_trace s))"
syntax
"@trace" :: "args => 'a trace" ("[(_)]t")
translations
"[s]t" == "Abs_trace [s]"
(***********************************************************
option
***********************************************************)
lemma trace_None_or_Some_or_None: "ALL s. s = None | (EX ss. s = Some ss)"
by (auto)
(***********************************************************
lemmas
***********************************************************)
(***************************************
trace Rep and Abs lemmas
***************************************)
lemma Abs_trace_None:
"s ~: Some_trace ==> Abs_trace s = None"
by (simp add: Abs_trace_def)
lemma Abs_trace_Some:
"s : Some_trace ==> Abs_trace s = Some (Abs_Some_trace s)"
by (simp add: Abs_trace_def)
lemma Abs_trace_None_notin_Some_trace:
"(Abs_trace s = None) = (s ~: Some_trace)"
by (auto simp add: Abs_trace_def)
lemma Abs_trace_not_None_in_Some_trace:
"(Abs_trace s ~= None) = (s : Some_trace)"
by (auto simp add: Abs_trace_def)
(*** basic ***)
lemma Rep_trace[simp]: "Rep_trace t : Some_trace"
by (simp add: Rep_trace_def)
lemma Abs_trace_inverse:
"t : Some_trace ==> Rep_trace (Abs_trace t) = t"
apply (simp add: Abs_trace_def Rep_trace_def)
by (simp add: Abs_Some_trace_inverse)
lemma Rep_trace_inverse:
"t ~= None ==> Abs_trace (Rep_trace t) = t"
apply (simp add: Abs_trace_def Rep_trace_def)
by (auto simp add: Rep_Some_trace_inverse)
lemma Abs_trace_inject:
"[| s : Some_trace ; t : Some_trace |]
==> (Abs_trace s = Abs_trace t) = (s = t)"
apply (simp add: Abs_trace_def)
by (simp add: Abs_Some_trace_inject)
lemma Rep_trace_inject:
"[| s ~= None ; t ~= None |]
==> (Rep_trace s = Rep_trace t) = (s = t)"
apply (simp add: Rep_trace_def)
by (auto simp add: Rep_Some_trace_inject)
(*** Abs-Rep ***)
lemma Abs_trace_Rep_trace_inverse_Some_left:
"[| t : Some_trace ; Abs_trace t = Some s |] ==> t = Rep_trace (Some s)"
apply (simp add: Abs_trace_def Rep_trace_def)
by (auto simp add: Abs_Some_trace_inverse Rep_Some_trace_inverse)
lemma Abs_trace_Rep_trace_inverse_Some_right:
"[| t : Some_trace ; Some s = Abs_trace t |] ==> t = Rep_trace (Some s)"
apply (simp add: Abs_trace_def Rep_trace_def)
by (auto simp add: Abs_Some_trace_inverse Rep_Some_trace_inverse)
lemmas Abs_trace_Rep_trace_inverse_Some =
Abs_trace_Rep_trace_inverse_Some_left Abs_trace_Rep_trace_inverse_Some_right
lemma Abs_trace_Rep_trace_inverse_left:
"[| t : Some_trace ; s ~= None |] ==> ((Abs_trace t = s) = (t = Rep_trace s))"
by (auto simp add: Abs_trace_Rep_trace_inverse_Some Rep_trace_inverse)
lemma Abs_trace_Rep_trace_inverse_right:
"[| t : Some_trace ; s ~= None |] ==> ((s = Abs_trace t) = (t = Rep_trace s))"
by (auto simp add: Abs_trace_Rep_trace_inverse_Some
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:
"[| t ~= None ; Rep_trace t = s |] ==> t = Abs_trace s"
by (auto simp add: Rep_trace_inverse)
lemma Rep_trace_Abs_trace_inverse_right_only_if:
"[| t ~= None ; 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 : Some_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:
"[| t ~= None ; 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 : Some_trace ; t ~= None |]
==> (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 Some_trace
*******************************)
lemma nil_in_Some_trace[simp] : "[] : Some_trace"
by (simp add: Some_trace_def)
lemma tick_in_Some_trace[simp] : "[Tick]:Some_trace"
by (simp add: Some_trace_def)
lemma event_in_Some_trace[simp] : "[a] : Some_trace"
by (simp add: Some_trace_def)
lemma notic_in_Some_trace[simp] : "Tick ~: set s ==> s : Some_trace"
by (simp add: Some_trace_def notin_set_butlast)
(*--------------------------*
| decompo app |
*--------------------------*)
(*** decompo traces only if ***)
lemma decompo_app_in_Some_trace_only_if1 : "s @ t : Some_trace ==> s : Some_trace"
apply (simp add: Some_trace_def)
apply (simp add: notin_butlast_decompo)
apply (erule disjE)
by (simp_all add: notin_set_butlast)
lemma decompo_app_in_Some_trace_only_if2 : "s @ t : Some_trace ==> t : Some_trace"
apply (simp add: Some_trace_def)
apply (simp add: notin_butlast_decompo)
by (auto)
lemma decompo_app_in_Some_trace_only_if :
"s @ t : Some_trace ==> (s : Some_trace & t = []) | (Tick ~: set s & t : Some_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: Some_trace_def)
apply (simp add: notin_butlast_decompo)
apply (rule decompo_app_in_Some_trace_only_if2[of s])
apply (simp)
done
(*** decompo Some_traces if ***)
lemma decompo_app_in_Some_trace_if :
"[| Tick ~: set s ; t : Some_trace |] ==> s @ t : Some_trace"
by (simp add: Some_trace_def notin_butlast_decompo)
(****** decompo Some_traces iff ******)
lemma decompo_app_in_Some_trace :
"s @ t : Some_trace = ((s : Some_trace & t = []) | (Tick ~: set s & t : Some_trace))"
apply (rule iffI)
apply (simp add: decompo_app_in_Some_trace_only_if)
apply (erule disjE)
by (simp_all add: decompo_app_in_Some_trace_if)
(*--------------------------*
| decompo cons |
*--------------------------*)
(*** decompo Some_traces if ***)
lemma decompo_head_in_Some_trace_if:
"[| a ~= Tick ; t : Some_trace |] ==> a # t : Some_trace"
apply (insert decompo_app_in_Some_trace_if[of "[a]" t])
by (auto)
lemma decompo_head_in_Some_trace :
"a # t : Some_trace = (t = [] | (a ~= Tick & t : Some_trace))"
apply (insert decompo_app_in_Some_trace[of "[a]"])
by (auto)
lemma decompo_last_in_Some_trace_if :
"Tick ~: set s ==> s @ [a] : Some_trace"
apply (insert decompo_app_in_Some_trace_if[of s "[a]"])
by (auto)
lemma decompo_last_in_Some_trace :
"s @ [a] : Some_trace = (Tick ~: set s)"
apply (insert decompo_app_in_Some_trace[of s "[a]"])
by (simp)
(*--------------------------*
| app not in |
*--------------------------*)
lemma app_None_notin_Some_trace_left:
"s ~: Some_trace ==> t @ s ~: Some_trace"
apply (auto simp add: Some_trace_def)
apply (simp add: in_butlast_decompo)
apply (case_tac "s = []")
by (simp_all)
lemma app_None_notin_Some_trace_right:
"s ~: Some_trace ==> s @ t ~: Some_trace"
apply (auto simp add: Some_trace_def)
apply (simp add: in_butlast_decompo)
apply (rule disjI1)
by (rule in_set_butlast, simp)
lemmas app_None_notin_Some_trace =
app_None_notin_Some_trace_left app_None_notin_Some_trace_right
(*******************************
Tick
*******************************)
lemma Tick_is_last : "Tick#s : Some_trace ==> s = []"
apply (case_tac "s = []")
by (auto simp add: Some_trace_def)
(*******************************
not None
*******************************)
lemma nil_not_None1[simp]: "[]t ~= None"
by (simp add: nilt_def Abs_trace_def)
lemma nil_not_None2[simp]: "None ~= []t"
by (simp add: nilt_def Abs_trace_def)
lemma event_not_None1[simp]: "[a]t ~= None"
by (simp add: Abs_trace_def)
lemma event_not_None2[simp]: "None ~= [a]t"
by (simp add: Abs_trace_def)
lemma list_not_None1[simp]: "t : Some_trace ==> Abs_trace t ~= None"
by (simp add: Abs_trace_def)
lemma list_not_None2[simp]: "t : Some_trace ==> None ~= Abs_trace t"
by (simp add: Abs_trace_def)
(*******************************
Nil
*******************************)
lemma one_neq_nil[simp]: "[a]t ~= []t"
by (simp add: nilt_def Abs_trace_inject)
lemma one_neq_nil_sym[simp]: "[]t ~= [a]t"
by (simp add: nilt_def Abs_trace_inject)
(*******************************
notick
*******************************)
(*** notick Ev ***)
lemma notick_Ev[simp]: "notick [Ev a]t"
apply (simp add: notick_def sett_def)
by (simp add: Abs_trace_inverse)
lemma notick_EvI: "(EX a. e = Ev a) ==> notick [e]t"
apply (simp add: notick_def sett_def)
by (auto simp add: Abs_trace_inverse)
(*** notick nil ***)
lemma notick_nil[simp]: "notick []t"
apply (simp add: notick_def nilt_def sett_def)
by (simp add: Abs_trace_inverse)
(*** notick not None ***)
lemma notick_not_None[simp]: "~ notick None"
by (simp_all add: notick_def)
(*** notick not None ***)
lemma if_notick_not_None: "notick t ==> t ~= None"
by (simp_all add: notick_def)
(*** not notick Tick ***)
lemma not_notick_Tick[simp]: "~ notick [Tick]t"
apply (simp_all add: notick_def)
by (simp add: sett_def Abs_trace_inverse)
(*******************************
Event
*******************************)
lemma Event_eq[simp] : "([e1]t = [e2]t) = (e1 = e2)"
by (simp add: Abs_trace_inject)
(***********************************************************
@rep in trace
***********************************************************)
(*-----------------------------*
| s @rep t |
*-----------------------------*)
(*** only if ***)
lemma decompo_apprep_in_Some_trace_only_if:
"[| s ~= None ; t ~= None ; (s @rep t) : Some_trace |] ==> (notick s | t = []t)"
apply (simp add: apprep_def decompo_app_in_Some_trace)
apply (simp add: nilt_def notick_def sett_def)
by (auto simp add: Rep_trace_Abs_trace_inverse_only_if)
(*** if ***)
lemma decompo_apprep_in_Some_trace_if:
"(notick s | t = []t) ==> s @rep t : Some_trace"
apply (simp add: apprep_def decompo_app_in_Some_trace nilt_def)
apply (auto simp add: Abs_trace_inverse)
by (auto simp add: notick_def sett_def)
(*** iff ***)
lemma decompo_apprep_in_Some_trace:
"[| s ~= None ; t ~= None |]
==> ((s @rep t) : Some_trace) = (notick s | t = []t)"
apply (rule iffI)
apply (simp add: decompo_apprep_in_Some_trace_only_if)
by (simp add: decompo_apprep_in_Some_trace_if)
(*** rule ***)
lemma decompo_apprep_in_Some_traceI:
"s @rep t : Some_trace ==> (s = None | t = None | notick s | t = []t)"
apply (case_tac "s ~= None & t ~= None")
by (auto simp add: decompo_apprep_in_Some_trace_only_if)
lemma decompo_apprep_notin_Some_traceI:
"s @rep t ~: Some_trace ==> (~ notick s & t ~= []t)"
apply (erule contrapos_np)
by (simp add: decompo_apprep_in_Some_trace_if)
(*** erule ***)
lemma decompo_apprep_in_Some_traceE:
"[| s @rep t : Some_trace ;
s = None | t = None | notick s | t = []t ==> R |] ==> R"
by (simp add: decompo_apprep_in_Some_traceI)
lemma decompo_apprep_notin_Some_traceE:
"[| s @rep t ~: Some_trace ;
[| ~ notick s ; t ~= []t |] ==> R |] ==> R"
by (simp add: decompo_apprep_notin_Some_traceI)
(***********************************************************
lemmas for s @t t
***********************************************************)
(*-----------------------------*
| Abs_trace distribution on @ |
*-----------------------------*)
lemma Abs_trace_app_dist[simp]:
"Abs_trace s @t Abs_trace t = Abs_trace (s @ t)"
apply (simp add: appt_def)
apply (rule conjI)
apply (simp add: Abs_trace_None_notin_Some_trace)
apply (simp add: Abs_trace_None app_None_notin_Some_trace)
apply (rule conjI)
apply (simp add: Abs_trace_None_notin_Some_trace)
apply (simp add: Abs_trace_None app_None_notin_Some_trace)
apply (intro impI)
apply (elim conjE exE)
apply (simp add: apprep_def)
apply (case_tac "s : Some_trace")
apply (case_tac "t : Some_trace")
apply (simp add: Abs_trace_inverse)
by (simp_all add: not_None_eq Abs_trace_None)
(* test *)
(* lemma "[a,b]t @t [c,d,e]t = [a,b,c,d,e]t" by simp *)
(***********************************************************
s @t t <==> s @rep t
***********************************************************)
(*--------------------------*
| def or undef |
*--------------------------*)
lemma appt_apprep_defined:
"[| notick s | t = []t ; s ~= None ; t ~= None |]
==> s @t t = Some (Abs_Some_trace (s @rep t))"
apply (simp add: appt_def Abs_trace_def)
by (simp add: decompo_apprep_in_Some_trace)
(*--------------------------*
| decompo cons |
*--------------------------*)
lemma appt_apprep_cons:
"s ~= None ==> [a]t @t s = Abs_trace (a # Rep_trace s)"
apply (simp add: appt_def apprep_def)
by (simp add: Abs_trace_inverse)
(*--------------------------*
| decompo last |
*--------------------------*)
lemma appt_apprep_last:
"notick t ==> t @t [e]t = Abs_trace (Rep_trace t @ [e])"
apply (simp add: appt_def apprep_def if_notick_not_None)
by (simp add: Abs_trace_inverse)
lemma appt_Some_last:
"notick s ==> s @t [a]t = Some (Abs_Some_trace (Rep_trace s @ [a]))"
apply (simp add: appt_apprep_last)
apply (simp add: notick_def sett_def)
by (auto simp add: Abs_trace_def decompo_last_in_Some_trace_if)
lemma appt_None_last:
"~ notick s ==> s @t [a]t = None"
apply (simp add: appt_def)
apply (intro impI)
apply (case_tac "s @rep [a]t ~: Some_trace")
apply (simp add: Abs_trace_None)
by (simp add: decompo_apprep_in_Some_trace)
lemma appt_None_last_contrapos:
"s @t [a]t ~= None ==> notick s"
apply (erule contrapos_np)
by (simp add: appt_None_last)
(***********************************************************
lemmas for s @t t
***********************************************************)
lemma appt_nil_left[simp]: "[]t @t s = s"
apply (case_tac "s ~= None")
apply (simp add: appt_def apprep_def)
apply (simp add: nilt_def)
apply (simp add: Abs_trace_inverse Rep_trace_inverse)
by (simp add: appt_def)
lemma appt_nil_right[simp]: "s @t []t = s"
apply (case_tac "s ~= None")
apply (simp add: appt_def apprep_def)
apply (simp add: nilt_def)
apply (simp add: Abs_trace_inverse Rep_trace_inverse)
by (simp add: appt_def)
lemma event_app_not_nil_left[simp]: "[e]t @t s ~= []t"
apply (simp add: appt_def)
apply (case_tac "[e]t @rep s : Some_trace")
apply (simp add: nilt_def)
apply (simp add: Abs_trace_inject)
apply (simp add: apprep_def Abs_trace_inverse)
by (simp add: Abs_trace_None)
lemma event_app_not_nil_right[simp]: "s @t [e]t ~= []t"
apply (simp add: appt_def)
apply (case_tac "s @rep [e]t : Some_trace")
apply (simp add: nilt_def)
apply (simp add: Abs_trace_inject)
apply (simp add: apprep_def Abs_trace_inverse)
by (simp add: Abs_trace_None)
(***********************************************************
induction for traces
***********************************************************)
(*** induction ***)
lemma induct_event_list:
"s : Some_trace &
P []t & P [Tick]t &
(ALL s a. (P (Abs_trace s) & Abs_trace s ~= None) --> P ([Ev a]t @t (Abs_trace s)))
--> P (Abs_trace s)"
apply (simp only: Abs_trace_not_None_in_Some_trace)
apply (induct_tac s)
(* base case *)
apply (simp add: nilt_def)
(* step case *)
apply (intro impI)
apply (simp add: decompo_head_in_Some_trace)
apply (insert event_tick_or_Ev)
apply (drule_tac x="a" in spec)
by (auto)
(*** rule ***)
lemma induct_trace:
"[| P None ; P []t ; P [Tick]t ;
!! (s::'a trace) a. [| P s ; s ~= None |] ==> P ([Ev a]t @t s) |]
==> P (s)"
apply (insert induct_event_list[of "Rep_trace s" P])
apply (case_tac "s = None")
by (simp_all add: Rep_trace_inverse del: Abs_trace_app_dist)
(*------------------------------------------------------*
| 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_lm1:
"notick (Abs_trace s) = (Tick ~: set s & s : Some_trace)"
apply (simp add: notick_def sett_def)
apply (simp only: Abs_trace_not_None_in_Some_trace)
by (auto simp add: Abs_trace_inverse)
lemma rev_induct_event_list:
"s : Some_trace &
P []t &
(ALL s e. (P (Abs_trace s) & notick (Abs_trace s))
--> P ((Abs_trace s) @t [e]t))
--> P (Abs_trace s)"
apply (simp only: rev_induct_event_list_lm1)
apply (induct_tac s rule: rev_induct)
(* base case *)
apply (simp add: nilt_def)
(* step case *)
by (simp add: decompo_last_in_Some_trace)
(*** rule ***)
lemma rev_induct_trace:
"[| P None ; P []t ;
!! (s::'a trace) e. [| P s ; notick s |] ==> P (s @t [e]t) |]
==> P (s)"
apply (insert rev_induct_event_list[of "Rep_trace s" P])
apply (case_tac "s = None")
by (simp_all add: Rep_trace_inverse del: Abs_trace_app_dist)
(*----------------------------------------------------------*
| 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
***********************************************************)
lemma appt_ass_lm1 : "(s @ t) @ u ~: S ==> s @ (t @ u) ~: S"
by (simp)
(*--------------------------*
| associativity of @t |
*--------------------------*)
lemma appt_ass[simp] : "(s @t t) @t u = s @t (t @t u)"
apply (simp add: appt_def)
apply (auto)
(* None = ... *)
apply (rule sym)
apply (simp add: Abs_trace_None_notin_Some_trace)
apply (rotate_tac 1, drule sym)
apply (simp add: apprep_def)
apply (case_tac "(Rep_trace (Some yb) @ Rep_trace (Some y)) : Some_trace")
apply (simp add: Abs_trace_inverse)
apply (rule appt_ass_lm1)
apply (rule app_None_notin_Some_trace_right)
apply (simp)
(* not case *)
apply (simp add: Abs_trace_None)
(* ... = None *)
apply (simp add: Abs_trace_None_notin_Some_trace)
apply (drule sym)
apply (simp add: apprep_def)
apply (case_tac "(Rep_trace (Some ya) @ Rep_trace (Some yc)) : Some_trace")
apply (simp add: Abs_trace_inverse)
apply (rule app_None_notin_Some_trace_left)
apply (simp)
(* not case *)
apply (simp add: Abs_trace_None)
(* ... = ... *)
apply (drule sym)
apply (drule sym)
apply (simp add: apprep_def)
apply (case_tac "(Rep_trace (Some ya) @ Rep_trace (Some yc)) : Some_trace")
apply (case_tac "(Rep_trace (Some yc) @ Rep_trace (Some y)) : Some_trace")
apply (simp_all add: Abs_trace_inverse Abs_trace_None)
done
lemma appt_ass_rev : "s @t (t @t u) = (s @t t) @t u"
by (simp)
(*** nil ***)
lemma appt_nil[simp]: "(s @t t = []t) = (s = []t & t = []t)"
apply (rule iffI)
apply (simp_all)
apply (simp add: appt_def)
apply (case_tac "s = None | t = None")
apply (simp_all)
apply (case_tac "s @rep t : Some_trace")
apply (simp add: nilt_def)
apply (simp add: Abs_trace_inject)
apply (simp add: apprep_def)
apply (simp add: Rep_trace_Abs_trace_inverse_only_if)
apply (simp add: Abs_trace_None)
done
lemma appt_nil_sym[simp]: "([]t = s @t t) = (s = []t & t = []t)"
apply (auto)
by (drule sym, simp)+
(*---------------------------*
| decompo appt not None |
*---------------------------*)
(*** only if ***)
lemma decompo_appt_not_None_rep_only_if:
"s @t t ~= None ==> (s ~= None & t ~= None & s @rep t : Some_trace)"
apply (simp add: appt_def)
apply (case_tac "s = None | t = None")
apply (simp)
apply (case_tac "s @rep t : Some_trace")
by (simp_all add: Abs_trace_None)
(*** if ***)
lemma decompo_appt_not_None_rep_if:
"(s ~= None & t ~= None & s @rep t : Some_trace) ==> s @t t ~= None"
by (simp add: appt_def Abs_trace_def)
(*** iff ***)
lemma decompo_appt_not_None_rep:
"(s @t t ~= None) = (s ~= None & t ~= None & s @rep t : Some_trace)"
apply (rule iffI)
apply (rule decompo_appt_not_None_rep_only_if, simp)
by (simp add: decompo_appt_not_None_rep_if)
(*** notick or nil ***)
(*** only if ***)
lemma decompo_appt_not_None_only_if:
"s @t t ~= None ==> (s ~= None & t ~= None & (notick s | t = []t))"
apply (insert decompo_appt_not_None_rep_only_if[of s t])
by (auto simp add: decompo_apprep_in_Some_trace)
(*** if ***)
lemma decompo_appt_not_None_if:
"(s ~= None & t ~= None & (notick s | t = []t)) ==> s @t t ~= None"
apply (insert decompo_appt_not_None_rep_if[of s t])
by (auto simp add: decompo_apprep_in_Some_trace)
(*** iff ***)
lemma decompo_appt_not_None1:
"(s @t t ~= None) = (s ~= None & t ~= None & (notick s | t = []t))"
apply (rule iffI)
apply (rule decompo_appt_not_None_only_if, simp)
by (simp add: decompo_appt_not_None_if)
lemma decompo_appt_not_None2:
"(None ~= s @t t) = (s ~= None & t ~= None & (notick s | t = []t))"
apply (insert decompo_appt_not_None1[of s t])
apply (drule sym)
by (auto)
lemmas decompo_appt_not_None = decompo_appt_not_None1 decompo_appt_not_None2
(*---------------------------*
| decompo appt None |
*---------------------------*)
lemma decompo_appt_None1:
"(s @t t = None) = (s = None | t = None | (~ notick s & t ~= []t))"
apply (rule iffI)
apply (erule contrapos_pp)
apply (simp add: decompo_appt_not_None)
apply (erule contrapos_pp)
apply (simp add: decompo_appt_not_None)
done
lemma decompo_appt_None2:
"(None = s @t t) = (s = None | t = None | (~ notick s & t ~= []t))"
apply (insert decompo_appt_None1[of s t])
apply (drule sym)
by (auto)
lemmas decompo_appt_None = decompo_appt_None1 decompo_appt_None2
(*---------------------------*
| appt None |
*---------------------------*)
(*** appt None ***)
lemma appt_None_left[simp]: "None @t s = None"
by (simp add: appt_def Abs_trace_def)
lemma appt_None_right[simp]: "s @t None = None"
by (simp add: appt_def Abs_trace_def)
lemma appt_None_Ev[simp]: "([Ev a]t @t s = None) = (s = None)"
by (simp add: appt_def decompo_apprep_in_Some_trace_if)
lemma appt_None_Ev_sym[simp]: "(None = [Ev a]t @t s) = (s = None)"
by (simp add: appt_def decompo_apprep_in_Some_trace_if)
(*---------------------------*
| appt None or not |
*---------------------------*)
lemma appt_last_not_None_left: "notick s ==> s @t [e]t ~= None"
by (simp add: appt_Some_last)
lemma appt_last_not_None_right: "notick s ==> None ~= s @t [e]t"
by (simp add: appt_Some_last)
lemmas appt_last_not_None = appt_last_not_None_left appt_last_not_None_right
lemma appt_last_None[simp]: "~ notick s ==> s @t [e]t = None"
by (simp add: decompo_appt_None)
lemma appt_notick_None: "[| notick s ; t ~= None |] ==> s @t t ~= None"
apply (simp add: appt_def)
apply (case_tac "s ~= None", simp)
apply (simp add: decompo_apprep_in_Some_trace_if Abs_trace_inverse)
by (simp)
lemma appt_head_not_None: "s ~= None ==> [Ev a]t @t s ~= None"
by (simp add: appt_def decompo_apprep_in_Some_trace_if)
lemmas appt_not_None = appt_last_not_None appt_notick_None appt_head_not_None
(*--------------------------*
| length |
*--------------------------*)
(*** 0 ***)
lemma lengtht_nil_zero[simp]: "lengtht ([]t) = 0"
apply (simp add: nilt_def lengtht_def)
by (simp add: Abs_trace_inverse)
lemma lengtht_None_zero[simp]: "lengtht (None) = 0"
by (simp add: lengtht_def)
(*** 1 ***)
lemma lengtht_one_event[simp]: "lengtht ([e]t) = 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 @t [a]t) = Suc (lengtht s)"
apply (simp add: appt_def lengtht_def)
apply (simp add: Abs_trace_inverse decompo_apprep_in_Some_trace_if)
apply (simp add: apprep_def)
apply (simp add: Abs_trace_inverse)
by (simp add: notick_def)
lemma lengtht_app_event_Suc_head[simp]:
"[| s ~= None ; s ~= []t |] ==> lengtht ([Ev a]t @t s) = Suc (lengtht s)"
apply (simp add: appt_def lengtht_def)
apply (simp add: Abs_trace_inverse decompo_apprep_in_Some_trace_if)
apply (simp add: apprep_def)
by (simp add: Abs_trace_inverse)
(*** app length ***)
lemma lengtht_app_decompo1[simp]:
"[| s ~= None ; t ~= None ; notick s |]
==> lengtht (s @t t) = lengtht s + lengtht t"
apply (simp add: appt_def lengtht_def)
apply (simp add: Abs_trace_inverse decompo_apprep_in_Some_trace_if)
by (simp add: apprep_def)
lemma lengtht_app_decompo2[simp]:
"s @t t ~= None
==> lengtht (s @t t) = lengtht s + lengtht t"
apply (case_tac "t = []t", simp)
by (simp add: decompo_appt_not_None)
(*---------------------------*
| sett |
*---------------------------*)
(*** None ***)
lemma sett_None[simp]: "sett None = {}"
by (simp add: sett_def)
(*** nil ***)
lemma sett_nil[simp]: "sett []t = {}"
apply (simp add: sett_def)
by (simp add: nilt_def Abs_trace_inverse)
(*** one ***)
lemma sett_one[simp]: "sett [e]t = {e}"
apply (simp add: sett_def)
by (simp add: Abs_trace_inverse)
(*** appt ***)
lemma sett_appt[simp]:
"s @t t ~= None ==> sett (s @t t) = sett s Un sett t"
apply (simp add: decompo_appt_not_None_rep)
apply (simp add: sett_def appt_def)
apply (simp add: Abs_trace_inverse)
by (simp add: apprep_def)
(*---------------------------*
| decompo appt Tick |
*---------------------------*)
(*** only if ***)
lemma decompo_appt_notick_only_if:
"notick (s @t t) ==> (notick s & notick t)"
apply (simp add: notick_def)
apply (elim conjE)
by (simp add: decompo_appt_not_None_rep)
(*** if ***)
lemma decompo_appt_notick_if:
"[| notick s ; notick t |] ==> notick (s @t t)"
apply (simp add: notick_def)
apply (elim conjE)
apply (case_tac "s @rep t : Some_trace")
apply (simp add: decompo_appt_not_None_rep)
apply (erule decompo_apprep_notin_Some_traceE)
apply (simp add: notick_def)
done
(*** iff ***)
lemma decompo_appt_notick[simp]:
"notick (s @t t) = (notick s & notick t)"
apply (rule iffI)
apply (rule decompo_appt_notick_only_if, simp)
by (simp add: decompo_appt_notick_if)
(*---------------------------*
| a trace is ... or ... |
*---------------------------*)
(*** trace --> nil or Tick or etc ***)
lemma trace_nil_or_Tick_or_Ev:
"ALL t. t ~= None --> ((t = []t) | (t = [Tick]t) | (EX a s. t=[Ev a]t @t 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 ~= None --> ((t = []t) | (EX a s. t=[a]t @t s))"
apply (intro allI)
apply (insert trace_nil_or_Tick_or_Ev)
apply (drule_tac x="t" in spec)
apply (intro impI, simp)
apply (erule disjE, simp)
apply (erule disjE)
apply (rule disjI2)
apply (rule_tac x="Tick" in exI)
apply (rule_tac x="[]t" in exI)
apply (simp)
apply (rule disjI2)
apply (elim exE)
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 ~= None --> ((t = []t) | (EX s a. notick s & t = s @t [a]t))"
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. t ~= None --> (notick t | (EX s. notick s & t = s @t [Tick]t))"
apply (intro allI impI)
apply (insert trace_last_nil_or_unnil)
apply (drule_tac x="t" in spec, simp)
apply (erule disjE, simp)
apply (elim conjE exE)
apply (insert event_tick_or_Ev)
apply (drule_tac x="a" in spec)
apply (erule disjE, simp) (* Tick *)
apply (rule_tac x="s" in exI, simp)
apply (elim exE, simp)
done
(*---------------------------*
| head must be last |
*---------------------------*)
lemma appt_Tick_nil_only_if: "[Tick]t @t s ~= None ==> s = []t"
apply (simp add: appt_def)
apply (case_tac "s = None", simp, simp)
apply (case_tac "[Tick]t @rep s ~: Some_trace")
apply (simp add: Abs_trace_None)
apply (case_tac "s = []t", simp)
by (simp add: decompo_apprep_in_Some_trace)
lemma appt_Tick_nil[simp]: "([Tick]t @t s ~= None) = (s = []t)"
apply (rule iffI)
by (simp_all add: appt_Tick_nil_only_if)
lemma appt_Tick_nil_contrapos[simp]: "([Tick]t @t s = None) = (s ~= []t)"
apply (rule iffI)
apply (case_tac "s ~= []t", simp, simp)
by (case_tac "[Tick]t @t s = None", simp, simp)
lemma appt_unnil_Tick_None: "s ~= []t ==> [Tick]t @t s = None"
by (simp)
lemma appt_Tick_unnil: "s ~= []t ==> [Tick]t @t s = None"
by (simp)
(*---------------------------*
| same head and last |
*---------------------------*)
(*** same head ***)
lemma appt_same_head_only_if:
"[| (s ~= None | t ~= None) ; [Ev a]t @t s = [Ev b]t @t t |]
==> a = b & s = t"
apply (case_tac "s ~= None & t ~= None")
apply (simp add: appt_apprep_cons)
apply (simp add: Abs_trace_inject decompo_head_in_Some_trace_if)
apply (simp add: Rep_trace_inject)
apply (erule disjE)
apply (case_tac "t = None", simp, simp)
apply (case_tac "s = None", simp, simp)
done
lemma appt_same_head[simp]:
"(s ~= None | t ~= None)
==> ([Ev a]t @t s = [Ev b]t @t 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 @t [a]t = t @t [b]t |]
==> s = t & a = b"
apply (case_tac "notick s & notick t")
apply (simp add: appt_apprep_last)
apply (simp add: notick_def sett_def)
apply (elim conjE)
apply (simp add: Abs_trace_inject decompo_last_in_Some_trace_if)
apply (simp add: Rep_trace_inject)
by (auto simp: appt_Some_last appt_None_last)
lemma appt_same_last[simp]:
"(notick s | notick t) ==> (s @t [a]t = t @t [b]t) = (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:
"s @t t = [a]t ==> (s = [a]t & t = []t) | (s = []t & t = [a]t)"
apply (simp add: appt_def)
apply (case_tac "s = None | t = None", simp)
apply (case_tac "s @rep t ~: Some_trace", simp add: Abs_trace_None)
apply (simp add: Abs_trace_inject)
apply (simp add: apprep_def list_app_decompo_one)
by (auto simp add: Abs_trace_Rep_trace_inverse nilt_def)
lemma appt_decompo_one[simp]:
"(s @t t = [a]t) = ((s = [a]t & t = []t) | (s = []t & t = [a]t))"
apply (rule iffI)
apply (simp add: appt_decompo_one_only_if)
by (auto)
lemma appt_decompo_one_sym[simp]:
"([a]t = s @t t) = ((s = [a]t & t = []t) | (s = []t & t = [a]t))"
apply (rule iffI)
apply (drule sym, simp)
by (rule sym, simp)
(*---------------------------*
| same_head + Tick |
*---------------------------*)
lemma appt_same_head_Tick_left:
"t ~= None
==> ([e]t @t s = [Ev a]t @t t) = (e = Ev a & s = t)"
apply (insert event_tick_or_Ev)
apply (drule_tac x="e" in spec)
apply (erule disjE)
apply (simp)
apply (case_tac "[Tick]t @t s ~= [Ev a]t @t t", simp)
apply (simp)
apply (case_tac "s = []t", simp)
apply (simp add: appt_Tick_unnil)
apply (erule exE)
by (simp)
lemma appt_same_head_Tick_right:
"t ~= None
==> ([Ev a]t @t t = [e]t @t s) = (e = Ev a & s = t)"
apply (insert appt_same_head_Tick_left[of t e s a])
apply (simp)
apply (drule sym)
apply (rule iffI)
by (simp_all)
lemmas appt_same_head_Tick[simp]
= appt_same_head_Tick_left appt_same_head_Tick_right
(******************************************************************
head and tail
******************************************************************)
(*** tl : Some_trace ***)
lemma tlt_Some_trace:
"[| s : Some_trace ; s ~= [] |] ==> tl s : Some_trace"
apply (simp add: Some_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)
(*** tlt None ***)
lemma tlt_not_None:
"[| s ~= None ; s ~= []t |] ==> tlt s ~= None"
apply (simp add: tlt_def)
apply (insert tlt_Some_trace[of "Rep_trace s"])
apply (simp add: nilt_def)
apply (case_tac "Rep_trace s = []")
apply (simp add: Rep_trace_Abs_trace_inverse_only_if)
by (simp)
lemma tlt_not_None_contrapos:
"[| tlt s = None ; s ~= []t |] ==> s = None"
apply (erule contrapos_pp)
by (simp add: tlt_not_None)
lemma tlt_None[simp]: "tlt None = None"
by (simp add: tlt_def)
(*** head !! ***)
lemma hdt_appt[simp]: "s ~= None ==> hdt ([Ev a]t @t s) = Ev a"
apply (simp add: appt_def)
apply (simp add: hdt_def)
apply (simp add: decompo_apprep_in_Some_trace_if Abs_trace_inverse)
apply (simp add: apprep_def)
by (simp add: Abs_trace_inverse)
(* one *)
lemma hdt_one[simp]: "hdt [a]t = a"
apply (simp add: hdt_def)
by (simp add: Abs_trace_inverse)
(*** tail !! ***)
lemma tlt_appt[simp]: "tlt ([Ev a]t @t s) = s"
apply (simp add: appt_def)
apply (simp add: tlt_def)
apply (simp add: decompo_apprep_in_Some_trace_if Abs_trace_inverse)
apply (simp add: apprep_def)
by (simp add: Abs_trace_inverse Rep_trace_inverse)
(* one *)
lemma tlt_one[simp]: "tlt [a]t = []t"
apply (simp add: tlt_def)
by (simp add: Abs_trace_inverse nilt_def)
(*** head + tail ***)
lemma hdt_appt_tail[simp]: "s ~= []t ==> [hdt s]t @t (tlt s) = s"
apply (case_tac "s = None", simp)
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 : Some_trace ***)
lemma butlast_Some_trace:
"[| s : Some_trace ; s ~= [] |] ==> butlast s : Some_trace"
by (simp add: Some_trace_def notin_set_butlast)
lemma butlast_Some_trace_Rep:
"s ~= []t ==> butlast (Rep_trace s) : Some_trace"
apply (insert Rep_trace[of s])
apply (case_tac "Rep_trace s ~= []")
apply (simp add: Some_trace_def)
apply (simp add: notin_set_butlast)
by (simp)
(*** tlt None ***)
lemma batlastt_not_None:
"[| s ~= None ; s ~= []t |] ==> butlastt s ~= None"
apply (simp add: butlastt_def)
apply (simp add: nilt_def)
apply (case_tac "butlast (Rep_trace s) : Some_trace")
apply (simp add: Abs_trace_def)
apply (insert Rep_trace[of s])
apply (simp add: Some_trace_def notin_set_butlast)
done
lemma batlastt_not_None_contrapos:
"[| butlastt s = None ; s ~= []t |] ==> s = None"
apply (erule contrapos_pp)
by (simp add: batlastt_not_None)
lemma batlastt_None[simp]: "butlastt None = None"
by (simp add: butlastt_def)
(*** last !! ***)
lemma lastt_appt[simp]: "notick s ==> lastt (s @t [e]t) = e"
apply (simp add: appt_def)
apply (simp add: lastt_def if_notick_not_None)
apply (simp add: decompo_apprep_in_Some_trace_if Abs_trace_inverse)
by (simp add: apprep_def Abs_trace_inverse)
(* one *)
lemma lastt_one[simp]: "lastt [a]t = a"
apply (simp add: lastt_def)
by (simp add: Abs_trace_inverse)
(*** butlast !! ***)
lemma butlastt_appt[simp]: "notick s ==> butlastt (s @t [e]t) = s"
apply (simp add: appt_def)
apply (simp add: butlastt_def decompo_apprep_in_Some_trace_if)
apply (simp add: Abs_trace_inverse decompo_apprep_in_Some_trace_if)
apply (simp add: apprep_def Abs_trace_inverse)
by (simp add: Rep_trace_inverse)
(* one *)
lemma butlastt_one[simp]: "butlastt [a]t = []t"
apply (simp add: butlastt_def)
by (simp add: Abs_trace_inverse nilt_def)
(*** butlast + last ***)
lemma butlastt_appt_lastt[simp]: "s ~= []t ==> (butlastt s) @t [lastt s]t = s"
apply (case_tac "s = None", simp)
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 ~= []t"
by (case_tac "s ~= []t", simp_all)
(* notick butlastt *)
lemma notick_butlast: "[| s ~= None ; s ~= []t |] ==> notick (butlastt s)"
apply (simp add: butlastt_def)
apply (simp add: notick_def sett_def)
apply (simp add: butlast_Some_trace_Rep Abs_trace_inverse)
apply (insert Rep_trace[of s])
by (simp add: Some_trace_def)
(* tick and butlastt *)
lemma tick_decompo: "ALL s. ~ notick s --> s = ((butlastt s) @t [Tick]t)"
apply (intro allI impI)
apply (case_tac "s = None", simp)
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)
(******************************************************************
lengtht plus
******************************************************************)
(*** lengtht zero ***)
lemma lengtht_zero: "(lengtht s = 0) = (s = []t | s = None)"
apply (induct_tac s rule: induct_trace)
by (simp_all)
(*** lengtht one ***)
lemma lengtht_one: "(lengtht s = Suc 0) = (EX e. s = [e]t)"
apply (induct_tac s rule: induct_trace)
apply (simp_all)
by (simp add: lengtht_zero)
(******************************************************************
not None
******************************************************************)
lemmas not_None = if_notick_not_None appt_not_None
tlt_not_None batlastt_not_None
(******************************************************************
in Some_trace
******************************************************************)
lemmas in_Some_trace = decompo_apprep_in_Some_trace_if
decompo_app_in_Some_trace_if
decompo_head_in_Some_trace_if
decompo_last_in_Some_trace_if
tlt_Some_trace
butlast_Some_trace
(******************************************************************
convenient lemmas
******************************************************************)
(*-------------------*
| for Seq_compo T1 |
*-------------------*)
lemma appt_decompo_lm:
"ALL s1 s2 t1 t2.
s1 @t s2 ~= None
--> (s1 @t s2 = t1 @t t2)
= ((EX u. s1 @t u = t1 & s2 = u @t t2) |
(EX u. s1 = t1 @t u & u @t s2 = t2))"
apply (rule allI)
apply (induct_tac s1 rule: induct_trace)
apply (simp_all)
apply (force)
apply (force)
apply (intro allI impI)
apply (drule_tac x="s2" in spec, simp)
apply (rule iffI)
(* => *)
apply (case_tac "t1 = None", simp)
apply (insert trace_nil_or_Tick_or_Ev)
apply (drule_tac x="t1" in spec, simp)
apply (erule disjE, simp)
apply (erule disjE, simp)
apply (elim exE, simp) (* t1 = [Ev aa]t @t sa *)
apply (drule_tac x="sa" in spec)
apply (drule_tac x="t2" in spec)
apply (simp)
apply (erule disjE, simp)
apply (elim conjE exE)
apply (rule disjI2)
apply (rule_tac x="u" in exI)
apply (fast)
(* <= *)
apply (elim disjE conjE exE)
apply (simp del: appt_ass add: appt_ass_rev)
apply (simp del: appt_ass add: appt_ass_rev)
apply (simp)
done
lemma appt_decompo:
"s1 @t s2 ~= None
==> (s1 @t s2 = t1 @t t2)
= ((EX u. s1 @t u = t1 & s2 = u @t t2) |
(EX u. s1 = t1 @t u & u @t s2 = t2))"
by (simp add: appt_decompo_lm)
(*-------------------*
| for Seq_compo T2 |
*-------------------*)
lemma notick_or_last_Tick:
"ALL s. s ~= None --> notick s | (EX t. s = t @t [Tick]t)"
apply (rule allI)
apply (induct_tac s rule: rev_induct_trace)
apply (simp_all)
apply (intro impI)
apply (insert event_tick_or_Ev)
apply (drule_tac x="e" in spec)
by (auto)
(****************** to add it again ******************)
declare disj_not1 [simp]
declare not_None_eq [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 trace_None_or_Some_or_None:
∀s. s = None ∨ (∃ss. s = Some ss)
lemma Abs_trace_None:
s ∉ Some_trace ==> Abs_trace s = None
lemma Abs_trace_Some:
s ∈ Some_trace ==> Abs_trace s = Some (Abs_Some_trace s)
lemma Abs_trace_None_notin_Some_trace:
(Abs_trace s = None) = (s ∉ Some_trace)
lemma Abs_trace_not_None_in_Some_trace:
(Abs_trace s ≠ None) = (s ∈ Some_trace)
lemma Rep_trace:
Rep_trace t ∈ Some_trace
lemma Abs_trace_inverse:
t ∈ Some_trace ==> Rep_trace (Abs_trace t) = t
lemma Rep_trace_inverse:
t ≠ None ==> Abs_trace (Rep_trace t) = t
lemma Abs_trace_inject:
[| s ∈ Some_trace; t ∈ Some_trace |] ==> (Abs_trace s = Abs_trace t) = (s = t)
lemma Rep_trace_inject:
[| s ≠ None; t ≠ None |] ==> (Rep_trace s = Rep_trace t) = (s = t)
lemma Abs_trace_Rep_trace_inverse_Some_left:
[| t ∈ Some_trace; Abs_trace t = Some s |] ==> t = Rep_trace (Some s)
lemma Abs_trace_Rep_trace_inverse_Some_right:
[| t ∈ Some_trace; Some s = Abs_trace t |] ==> t = Rep_trace (Some s)
lemmas Abs_trace_Rep_trace_inverse_Some:
[| t ∈ Some_trace; Abs_trace t = Some s |] ==> t = Rep_trace (Some s)
[| t ∈ Some_trace; Some s = Abs_trace t |] ==> t = Rep_trace (Some s)
lemma Abs_trace_Rep_trace_inverse_left:
[| t ∈ Some_trace; s ≠ None |] ==> (Abs_trace t = s) = (t = Rep_trace s)
lemma Abs_trace_Rep_trace_inverse_right:
[| t ∈ Some_trace; s ≠ None |] ==> (s = Abs_trace t) = (t = Rep_trace s)
lemmas Abs_trace_Rep_trace_inverse:
[| t ∈ Some_trace; s ≠ None |] ==> (Abs_trace t = s) = (t = Rep_trace s)
[| t ∈ Some_trace; s ≠ None |] ==> (s = Abs_trace t) = (t = Rep_trace s)
lemma Rep_trace_Abs_trace_inverse_left_only_if:
[| t ≠ None; Rep_trace t = s |] ==> t = Abs_trace s
lemma Rep_trace_Abs_trace_inverse_right_only_if:
[| t ≠ None; s = Rep_trace t |] ==> t = Abs_trace s
lemmas Rep_trace_Abs_trace_inverse_only_if:
[| t ≠ None; Rep_trace t = s |] ==> t = Abs_trace s
[| t ≠ None; s = Rep_trace t |] ==> t = Abs_trace s
lemma Abs_trace_inverse_in_only_if:
[| ∀s∈X. s ∈ Some_trace; t ∈ Abs_trace ` X |] ==> Rep_trace t ∈ X
lemma Abs_trace_inverse_in_if:
[| t ≠ None; Rep_trace t ∈ X |] ==> t ∈ Abs_trace ` X
lemma Abs_trace_inverse_in:
[| ∀s∈X. s ∈ Some_trace; t ≠ None |] ==> (t ∈ Abs_trace ` X) = (Rep_trace t ∈ X)
lemma nil_in_Some_trace:
[] ∈ Some_trace
lemma tick_in_Some_trace:
[Tick] ∈ Some_trace
lemma event_in_Some_trace:
[a] ∈ Some_trace
lemma notic_in_Some_trace:
Tick ∉ set s ==> s ∈ Some_trace
lemma decompo_app_in_Some_trace_only_if1:
s @ t ∈ Some_trace ==> s ∈ Some_trace
lemma decompo_app_in_Some_trace_only_if2:
s @ t ∈ Some_trace ==> t ∈ Some_trace
lemma decompo_app_in_Some_trace_only_if:
s @ t ∈ Some_trace ==> s ∈ Some_trace ∧ t = [] ∨ Tick ∉ set s ∧ t ∈ Some_trace
lemma decompo_app_in_Some_trace_if:
[| Tick ∉ set s; t ∈ Some_trace |] ==> s @ t ∈ Some_trace
lemma decompo_app_in_Some_trace:
(s @ t ∈ Some_trace) = (s ∈ Some_trace ∧ t = [] ∨ Tick ∉ set s ∧ t ∈ Some_trace)
lemma decompo_head_in_Some_trace_if:
[| a ≠ Tick; t ∈ Some_trace |] ==> a # t ∈ Some_trace
lemma decompo_head_in_Some_trace:
(a # t ∈ Some_trace) = (t = [] ∨ a ≠ Tick ∧ t ∈ Some_trace)
lemma decompo_last_in_Some_trace_if:
Tick ∉ set s ==> s @ [a] ∈ Some_trace
lemma decompo_last_in_Some_trace:
(s @ [a] ∈ Some_trace) = (Tick ∉ set s)
lemma app_None_notin_Some_trace_left:
s ∉ Some_trace ==> t @ s ∉ Some_trace
lemma app_None_notin_Some_trace_right:
s ∉ Some_trace ==> s @ t ∉ Some_trace
lemmas app_None_notin_Some_trace:
s ∉ Some_trace ==> t @ s ∉ Some_trace
s ∉ Some_trace ==> s @ t ∉ Some_trace
lemma Tick_is_last:
Tick # s ∈ Some_trace ==> s = []
lemma nil_not_None1:
[]t ≠ None
lemma nil_not_None2:
None ≠ []t
lemma event_not_None1:
[a]t ≠ None
lemma event_not_None2:
None ≠ [a]t
lemma list_not_None1:
t ∈ Some_trace ==> Abs_trace t ≠ None
lemma list_not_None2:
t ∈ Some_trace ==> None ≠ Abs_trace t
lemma one_neq_nil:
[a]t ≠ []t
lemma one_neq_nil_sym:
[]t ≠ [a]t
lemma notick_Ev:
notick [Ev a]t
lemma notick_EvI:
∃a. e = Ev a ==> notick [e]t
lemma notick_nil:
notick []t
lemma notick_not_None:
¬ notick None
lemma if_notick_not_None:
notick t ==> t ≠ None
lemma not_notick_Tick:
¬ notick [Tick]t
lemma Event_eq:
([e1]t = [e2]t) = (e1 = e2)
lemma decompo_apprep_in_Some_trace_only_if:
[| s ≠ None; t ≠ None; s @rep t ∈ Some_trace |] ==> notick s ∨ t = []t
lemma decompo_apprep_in_Some_trace_if:
notick s ∨ t = []t ==> s @rep t ∈ Some_trace
lemma decompo_apprep_in_Some_trace:
[| s ≠ None; t ≠ None |] ==> (s @rep t ∈ Some_trace) = (notick s ∨ t = []t)
lemma decompo_apprep_in_Some_traceI:
s @rep t ∈ Some_trace ==> s = None ∨ t = None ∨ notick s ∨ t = []t
lemma decompo_apprep_notin_Some_traceI:
s @rep t ∉ Some_trace ==> ¬ notick s ∧ t ≠ []t
lemma decompo_apprep_in_Some_traceE:
[| s @rep t ∈ Some_trace; s = None ∨ t = None ∨ notick s ∨ t = []t ==> R |] ==> R
lemma decompo_apprep_notin_Some_traceE:
[| s @rep t ∉ Some_trace; [| ¬ notick s; t ≠ []t |] ==> R |] ==> R
lemma Abs_trace_app_dist:
Abs_trace s @t Abs_trace t = Abs_trace (s @ t)
lemma appt_apprep_defined:
[| notick s ∨ t = []t; s ≠ None; t ≠ None |] ==> s @t t = Some (Abs_Some_trace (s @rep t))
lemma appt_apprep_cons:
s ≠ None ==> [a]t @t s = Abs_trace (a # Rep_trace s)
lemma appt_apprep_last:
notick t ==> t @t [e]t = Abs_trace (Rep_trace t @ [e])
lemma appt_Some_last:
notick s ==> s @t [a]t = Some (Abs_Some_trace (Rep_trace s @ [a]))
lemma appt_None_last:
¬ notick s ==> s @t [a]t = None
lemma appt_None_last_contrapos:
s @t [a]t ≠ None ==> notick s
lemma appt_nil_left:
[]t @t s = s
lemma appt_nil_right:
s @t []t = s
lemma event_app_not_nil_left:
[e]t @t s ≠ []t
lemma event_app_not_nil_right:
s @t [e]t ≠ []t
lemma induct_event_list:
s ∈ Some_trace ∧ P []t ∧ P [Tick]t ∧ (∀s a. P (Abs_trace s) ∧ Abs_trace s ≠ None --> P ([Ev a]t @t Abs_trace s)) --> P (Abs_trace s)
lemma induct_trace:
[| P None; P []t; P [Tick]t; !!s a. [| P s; s ≠ None |] ==> P ([Ev a]t @t s) |] ==> P s
lemma rev_induct_event_list_lm1:
notick (Abs_trace s) = (Tick ∉ set s ∧ s ∈ Some_trace)
lemma rev_induct_event_list:
s ∈ Some_trace ∧ P []t ∧ (∀s e. P (Abs_trace s) ∧ notick (Abs_trace s) --> P (Abs_trace s @t [e]t)) --> P (Abs_trace s)
lemma rev_induct_trace:
[| P None; P []t; !!s e. [| P s; notick s |] ==> P (s @t [e]t) |] ==> P s
lemma appt_ass_lm1:
(s @ t) @ u ∉ S ==> s @ t @ u ∉ S
lemma appt_ass:
(s @t t) @t u = s @t t @t u
lemma appt_ass_rev:
s @t t @t u = (s @t t) @t u
lemma appt_nil:
(s @t t = []t) = (s = []t ∧ t = []t)
lemma appt_nil_sym:
([]t = s @t t) = (s = []t ∧ t = []t)
lemma decompo_appt_not_None_rep_only_if:
s @t t ≠ None ==> s ≠ None ∧ t ≠ None ∧ s @rep t ∈ Some_trace
lemma decompo_appt_not_None_rep_if:
s ≠ None ∧ t ≠ None ∧ s @rep t ∈ Some_trace ==> s @t t ≠ None
lemma decompo_appt_not_None_rep:
(s @t t ≠ None) = (s ≠ None ∧ t ≠ None ∧ s @rep t ∈ Some_trace)
lemma decompo_appt_not_None_only_if:
s @t t ≠ None ==> s ≠ None ∧ t ≠ None ∧ (notick s ∨ t = []t)
lemma decompo_appt_not_None_if:
s ≠ None ∧ t ≠ None ∧ (notick s ∨ t = []t) ==> s @t t ≠ None
lemma decompo_appt_not_None1:
(s @t t ≠ None) = (s ≠ None ∧ t ≠ None ∧ (notick s ∨ t = []t))
lemma decompo_appt_not_None2:
(None ≠ s @t t) = (s ≠ None ∧ t ≠ None ∧ (notick s ∨ t = []t))
lemmas decompo_appt_not_None:
(s @t t ≠ None) = (s ≠ None ∧ t ≠ None ∧ (notick s ∨ t = []t))
(None ≠ s @t t) = (s ≠ None ∧ t ≠ None ∧ (notick s ∨ t = []t))
lemma decompo_appt_None1:
(s @t t = None) = (s = None ∨ t = None ∨ ¬ notick s ∧ t ≠ []t)
lemma decompo_appt_None2:
(None = s @t t) = (s = None ∨ t = None ∨ ¬ notick s ∧ t ≠ []t)
lemmas decompo_appt_None:
(s @t t = None) = (s = None ∨ t = None ∨ ¬ notick s ∧ t ≠ []t)
(None = s @t t) = (s = None ∨ t = None ∨ ¬ notick s ∧ t ≠ []t)
lemma appt_None_left:
None @t s = None
lemma appt_None_right:
s @t None = None
lemma appt_None_Ev:
([Ev a]t @t s = None) = (s = None)
lemma appt_None_Ev_sym:
(None = [Ev a]t @t s) = (s = None)
lemma appt_last_not_None_left:
notick s ==> s @t [e]t ≠ None
lemma appt_last_not_None_right:
notick s ==> None ≠ s @t [e]t
lemmas appt_last_not_None:
notick s ==> s @t [e]t ≠ None
notick s ==> None ≠ s @t [e]t
lemma appt_last_None:
¬ notick s ==> s @t [e]t = None
lemma appt_notick_None:
[| notick s; t ≠ None |] ==> s @t t ≠ None
lemma appt_head_not_None:
s ≠ None ==> [Ev a]t @t s ≠ None
lemmas appt_not_None:
notick s ==> s @t [e]t ≠ None
notick s ==> None ≠ s @t [e]t
[| notick s; t ≠ None |] ==> s @t t ≠ None
s ≠ None ==> [Ev a]t @t s ≠ None
lemma lengtht_nil_zero:
lengtht []t = 0
lemma lengtht_None_zero:
lengtht None = 0
lemma lengtht_one_event:
lengtht [e]t = Suc 0
lemma lengtht_app_event_Suc_last:
notick s ==> lengtht (s @t [a]t) = Suc (lengtht s)
lemma lengtht_app_event_Suc_head:
[| s ≠ None; s ≠ []t |] ==> lengtht ([Ev a]t @t s) = Suc (lengtht s)
lemma lengtht_app_decompo1:
[| s ≠ None; t ≠ None; notick s |] ==> lengtht (s @t t) = lengtht s + lengtht t
lemma lengtht_app_decompo2:
s @t t ≠ None ==> lengtht (s @t t) = lengtht s + lengtht t
lemma sett_None:
sett None = {}
lemma sett_nil:
sett []t = {}
lemma sett_one:
sett [e]t = {e}
lemma sett_appt:
s @t t ≠ None ==> sett (s @t t) = sett s ∪ sett t
lemma decompo_appt_notick_only_if:
notick (s @t t) ==> notick s ∧ notick t
lemma decompo_appt_notick_if:
[| notick s; notick t |] ==> notick (s @t t)
lemma decompo_appt_notick:
notick (s @t t) = (notick s ∧ notick t)
lemma trace_nil_or_Tick_or_Ev:
∀t. t ≠ None --> t = []t ∨ t = [Tick]t ∨ (∃a s. t = [Ev a]t @t s)
lemma trace_nil_or_unnil:
∀t. t ≠ None --> t = []t ∨ (∃a s. t = [a]t @t s)
lemma trace_last_nil_or_unnil:
∀t. t ≠ None --> t = []t ∨ (∃s a. notick s ∧ t = s @t [a]t)
lemma trace_last_notick_or_tick:
∀t. t ≠ None --> notick t ∨ (∃s. notick s ∧ t = s @t [Tick]t)
lemma appt_Tick_nil_only_if:
[Tick]t @t s ≠ None ==> s = []t
lemma appt_Tick_nil:
([Tick]t @t s ≠ None) = (s = []t)
lemma appt_Tick_nil_contrapos:
([Tick]t @t s = None) = (s ≠ []t)
lemma appt_unnil_Tick_None:
s ≠ []t ==> [Tick]t @t s = None
lemma appt_Tick_unnil:
s ≠ []t ==> [Tick]t @t s = None
lemma appt_same_head_only_if:
[| s ≠ None ∨ t ≠ None; [Ev a]t @t s = [Ev b]t @t t |] ==> a = b ∧ s = t
lemma appt_same_head:
s ≠ None ∨ t ≠ None ==> ([Ev a]t @t s = [Ev b]t @t t) = (a = b ∧ s = t)
lemma appt_same_last_only_if:
[| notick s ∨ notick t; s @t [a]t = t @t [b]t |] ==> s = t ∧ a = b
lemma appt_same_last:
notick s ∨ notick t ==> (s @t [a]t = t @t [b]t) = (s = t ∧ a = b)
lemma appt_decompo_one_only_if:
s @t t = [a]t ==> s = [a]t ∧ t = []t ∨ s = []t ∧ t = [a]t
lemma appt_decompo_one:
(s @t t = [a]t) = (s = [a]t ∧ t = []t ∨ s = []t ∧ t = [a]t)
lemma appt_decompo_one_sym:
([a]t = s @t t) = (s = [a]t ∧ t = []t ∨ s = []t ∧ t = [a]t)
lemma appt_same_head_Tick_left:
t ≠ None ==> ([e]t @t s = [Ev a]t @t t) = (e = Ev a ∧ s = t)
lemma appt_same_head_Tick_right:
t ≠ None ==> ([Ev a]t @t t = [e]t @t s) = (e = Ev a ∧ s = t)
lemmas appt_same_head_Tick:
t ≠ None ==> ([e]t @t s = [Ev a]t @t t) = (e = Ev a ∧ s = t)
t ≠ None ==> ([Ev a]t @t t = [e]t @t s) = (e = Ev a ∧ s = t)
lemma tlt_Some_trace:
[| s ∈ Some_trace; s ≠ [] |] ==> tl s ∈ Some_trace
lemma tlt_not_None:
[| s ≠ None; s ≠ []t |] ==> tlt s ≠ None
lemma tlt_not_None_contrapos:
[| tlt s = None; s ≠ []t |] ==> s = None
lemma tlt_None:
tlt None = None
lemma hdt_appt:
s ≠ None ==> hdt ([Ev a]t @t s) = Ev a
lemma hdt_one:
hdt [a]t = a
lemma tlt_appt:
tlt ([Ev a]t @t s) = s
lemma tlt_one:
tlt [a]t = []t
lemma hdt_appt_tail:
s ≠ []t ==> [hdt s]t @t tlt s = s
lemma butlast_Some_trace:
[| s ∈ Some_trace; s ≠ [] |] ==> butlast s ∈ Some_trace
lemma butlast_Some_trace_Rep:
s ≠ []t ==> butlast (Rep_trace s) ∈ Some_trace
lemma batlastt_not_None:
[| s ≠ None; s ≠ []t |] ==> butlastt s ≠ None
lemma batlastt_not_None_contrapos:
[| butlastt s = None; s ≠ []t |] ==> s = None
lemma batlastt_None:
butlastt None = None
lemma lastt_appt:
notick s ==> lastt (s @t [e]t) = e
lemma lastt_one:
lastt [a]t = a
lemma butlastt_appt:
notick s ==> butlastt (s @t [e]t) = s
lemma butlastt_one:
butlastt [a]t = []t
lemma butlastt_appt_lastt:
s ≠ []t ==> butlastt s @t [lastt s]t = s
lemma not_notick_unnil:
¬ notick s ==> s ≠ []t
lemma notick_butlast:
[| s ≠ None; s ≠ []t |] ==> notick (butlastt s)
lemma tick_decompo:
∀s. ¬ notick s --> s = butlastt s @t [Tick]t
lemma lengtht_zero:
(lengtht s = 0) = (s = []t ∨ s = None)
lemma lengtht_one:
(lengtht s = Suc 0) = (∃e. s = [e]t)
lemmas not_None:
notick t ==> t ≠ None
notick s ==> s @t [e]t ≠ None
notick s ==> None ≠ s @t [e]t
[| notick s; t ≠ None |] ==> s @t t ≠ None
s ≠ None ==> [Ev a]t @t s ≠ None
[| s ≠ None; s ≠ []t |] ==> tlt s ≠ None
[| s ≠ None; s ≠ []t |] ==> butlastt s ≠ None
lemmas in_Some_trace:
notick s ∨ t = []t ==> s @rep t ∈ Some_trace
[| Tick ∉ set s; t ∈ Some_trace |] ==> s @ t ∈ Some_trace
[| a ≠ Tick; t ∈ Some_trace |] ==> a # t ∈ Some_trace
Tick ∉ set s ==> s @ [a] ∈ Some_trace
[| s ∈ Some_trace; s ≠ [] |] ==> tl s ∈ Some_trace
[| s ∈ Some_trace; s ≠ [] |] ==> butlast s ∈ Some_trace
lemma appt_decompo_lm:
∀s1 s2 t1 t2. s1 @t s2 ≠ None --> (s1 @t s2 = t1 @t t2) = ((∃u. s1 @t u = t1 ∧ s2 = u @t t2) ∨ (∃u. s1 = t1 @t u ∧ u @t s2 = t2))
lemma appt_decompo:
s1 @t s2 ≠ None ==> (s1 @t s2 = t1 @t t2) = ((∃u. s1 @t u = t1 ∧ s2 = u @t t2) ∨ (∃u. s1 = t1 @t u ∧ u @t s2 = t2))
lemma notick_or_last_Tick:
∀s. s ≠ None --> notick s ∨ (∃t. s = t @t [Tick]t)