(*-------------------------------------------* | 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