(*-------------------------------------------*
            |                CSP-Prover                 |
            |               November 2004               |
            |        Yoshinao Isobe (AIST JAPAN)        |
            *-------------------------------------------*)
theory Trace_seq = Prefix:
(*  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]
(*****************************************************************
         1. 
         2. 
         3. 
         4. 
 *****************************************************************)
consts
  rmtick:: "'a trace => 'a trace"
defs
  rmtick_def : 
    "rmtick s == if (notick s | s = None) then s else butlastt s"
(***********************************************************
                        None
 ***********************************************************)
(*------------------*
 |     not None     |
 *------------------*)
lemma rmtick_not_None_only_if: "rmtick s ~= None ==> s ~= None"
apply (simp add: rmtick_def)
apply (erule contrapos_nn)
by (simp)
lemma rmtick_not_None_if: "s ~= None ==> rmtick s ~= None"
apply (simp add: rmtick_def)
by (simp add: batlastt_not_None)
lemma rmtick_not_None[simp]: "(rmtick s ~= None) = (s ~= None)"
apply (rule iffI)
apply (rule rmtick_not_None_only_if, simp)
by (simp add: rmtick_not_None_if)
lemma rmtick_not_None_sym[simp]: "(None ~= rmtick s) = (s ~= None)"
apply (insert rmtick_not_None[of s])
apply (drule sym)
by (auto simp del: rmtick_not_None)
(*------------------*
 |        None      |
 *------------------*)
lemma rmtick_None[simp]: "(rmtick s = None) = (s = None)"
apply (rule iffI)
apply (case_tac "s = None", simp)
apply (simp add: rmtick_not_None_if)
by (simp add: rmtick_def)
lemma rmtick_None_sym[simp]: "(None = rmtick s) = (s = None)"
apply (rule iffI)
apply (case_tac "s = None", simp)
apply (drule sym)
apply (simp add: rmtick_not_None_if)
by (simp add: rmtick_def)
lemma rmtick_None1[simp]: "(rmtick None = None)"
by (simp)
(***********************************************************
                  nil and tick
 ***********************************************************)
(*** notick s --> rmtick s ***)
lemma rmtick_nochange[simp]: "notick s ==> rmtick s = s"
by (simp add: rmtick_def)
(*** rmtick []t ***)
lemma rmtick_nil[simp]: "rmtick []t = []t"
by (simp add: rmtick_def)
(*** rmtick [Tick]t ***)
lemma rmtick_tick[simp]: "rmtick [Tick]t = []t"
by (simp add: rmtick_def)
(*** notick rmtick s ***)
lemma notick_rmtick[simp]: "s ~= None ==> notick (rmtick s)"
apply (case_tac "notick s")
apply (simp_all add: rmtick_def)
apply (simp add: notick_butlast)
done
(***********************************************************
                           appt
 ***********************************************************)
(*-------------------------*
 |       rmtick last       |
 *-------------------------*)
lemma rmtick_last_tick[simp]:
  "notick s ==> rmtick (s @t [Tick]t) = s"
apply (simp add: rmtick_def)
by (simp add: appt_not_None)
(*** notick butlast ***)
lemma rmtick_butlastt: 
  "~ notick s ==> rmtick s = butlastt s"
by (simp add: rmtick_def)
(*-------------------------*
 |   rmtick distribution   |
 *-------------------------*)
lemma rmtick_appt_dist[simp]:
  "notick s ==> rmtick (s @t t) = s @t (rmtick t)"
apply (case_tac "t = None", simp)
apply (insert trace_last_nil_or_unnil)
apply (drule_tac x="t" in spec, simp)
apply (erule disjE, simp)
apply (elim conjE exE, simp)
apply (insert event_tick_or_Ev)
apply (drule_tac x="a" in spec)
apply (erule disjE)   (* Tick *)
apply (simp add: add: appt_ass_rev del: appt_ass)
apply (erule exE)     (* Ev *)
apply (simp add: add: appt_ass_rev del: appt_ass)
done
(***********************************************************
                        prefix
 ***********************************************************)
(*** rmtick prefix ***)
(* only if *)
lemma rmtick_prefix_only_if:
  "prefix s (rmtick t) ==> (t = None) | (EX u. prefix u t & s = rmtick u)"
apply (case_tac "t = None", simp)
apply (insert trace_last_nil_or_unnil)
apply (drule_tac x="t" in spec, simp)
apply (erule disjE, simp)
apply (elim conjE exE, simp)
apply (insert event_tick_or_Ev)
apply (drule_tac x="a" in spec)
 apply (erule disjE)    (* Tick *)
 apply (rule_tac x="s" in exI)
 apply (simp add: prefix_notick)
 apply (erule exE)      (* Ev *)
 apply (simp)
  apply (erule disjE)    (* same length *)
  apply (rule_tac x="sa @t [Ev aa]t" in exI, simp)
  apply (rule_tac x="s" in exI)
  apply (simp add: prefix_notick)
done
(* if *)
lemma rmtick_prefix_if:
  "(t = None) | (EX u. prefix u t & s = rmtick u) ==> prefix s (rmtick t)"
apply (case_tac "t = None", simp, simp)
apply (elim conjE exE)
apply (simp)
apply (insert trace_last_nil_or_unnil)
apply (drule_tac x="t" in spec, simp)
apply (erule disjE, simp)
apply (elim conjE exE)
apply (simp)
 apply (erule disjE, simp)
 apply (case_tac "~ notick u")
 apply (simp add: prefix_notick)
 apply (insert event_tick_or_Ev)
 apply (drule_tac x="a" in spec)
  apply (erule disjE)    (* Tick *)
  apply (simp)
  apply (elim exE)       (* Ev *)
  apply (simp)
done
(* iff *)
lemma rmtick_prefix:
  "prefix s (rmtick t) = ((t = None) | (EX u. prefix u t & s = rmtick u))"
apply (rule iffI)
apply (simp add: rmtick_prefix_only_if)
apply (simp add: rmtick_prefix_if)
done
(*--------------*
 |   reverse    |
 *--------------*)
lemma rmtick_prefix_rev: "prefix s t ==> prefix (rmtick s) t"
apply (simp add: rmtick_def)
apply (intro impI)
apply (simp add: prefix_def)
apply (elim conjE exE)
apply (case_tac "t = None")
apply (rule_tac x="None" in exI, simp)
apply (simp add: decompo_appt_not_None)
apply (rule_tac x="[Tick]t" in exI)
by (simp add: tick_decompo)
lemma rmtick_prefix_rev_simp[simp]: "prefix (rmtick s) s"
by (simp add: rmtick_prefix_rev)
(****************** to add it again ******************)
declare disj_not1 [simp] 
declare not_None_eq [simp] 
end
lemma rmtick_not_None_only_if:
rmtick s ≠ None ==> s ≠ None
lemma rmtick_not_None_if:
s ≠ None ==> rmtick s ≠ None
lemma rmtick_not_None:
(rmtick s ≠ None) = (s ≠ None)
lemma rmtick_not_None_sym:
(None ≠ rmtick s) = (s ≠ None)
lemma rmtick_None:
(rmtick s = None) = (s = None)
lemma rmtick_None_sym:
(None = rmtick s) = (s = None)
lemma rmtick_None1:
rmtick None = None
lemma rmtick_nochange:
notick s ==> rmtick s = s
lemma rmtick_nil:
rmtick []t = []t
lemma rmtick_tick:
rmtick [Tick]t = []t
lemma notick_rmtick:
s ≠ None ==> notick (rmtick s)
lemma rmtick_last_tick:
notick s ==> rmtick (s @t [Tick]t) = s
lemma rmtick_butlastt:
¬ notick s ==> rmtick s = butlastt s
lemma rmtick_appt_dist:
notick s ==> rmtick (s @t t) = s @t rmtick t
lemma rmtick_prefix_only_if:
prefix s (rmtick t) ==> t = None ∨ (∃u. prefix u t ∧ s = rmtick u)
lemma rmtick_prefix_if:
t = None ∨ (∃u. prefix u t ∧ s = rmtick u) ==> prefix s (rmtick t)
lemma rmtick_prefix:
prefix s (rmtick t) = (t = None ∨ (∃u. prefix u t ∧ s = rmtick u))
lemma rmtick_prefix_rev:
prefix s t ==> prefix (rmtick s) t
lemma rmtick_prefix_rev_simp:
prefix (rmtick s) s