(*-------------------------------------------* | CSP-Prover | | November 2004 | | Yoshinao Isobe (AIST JAPAN) | *-------------------------------------------*) theory Prefix = Trace: (* 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] (*********************************************************) consts prefix :: "'a trace => 'a trace => bool" prefix_closed :: "('a trace set) => bool" defs prefix_def : "prefix s t == (EX u. t = s @t u)" prefix_closed_def : "prefix_closed T == ALL s t. ((t : T & prefix s t) --> s : T)" (*********************************************************** lemmas (prefix) ***********************************************************) lemma prefix_closed_iff: "[| t : T ; prefix s t ; prefix_closed T |] ==> s : T" apply (unfold prefix_closed_def[of T]) apply (drule_tac x="s" in spec) apply (drule_tac x="t" in spec) by (simp) (*** Prefix itself ***) lemma prefix_itself[simp]: "prefix s s" apply (simp add: prefix_def) apply (rule_tac x="[]t" in exI) by (simp) (*** Prefix appt ***) lemma prefix_appt_simp[simp]: "prefix s (s @t t)" apply (simp add: prefix_def) apply (rule_tac x="t" in exI) by (simp) lemma prefix_appt: "prefix s t ==> prefix s (t @t u)" apply (simp add: prefix_def) apply (erule exE) apply (simp) apply (rule_tac x="ua @t u" in exI) by (simp) (*** []t is a prefix of any trace ***) lemma nil_is_prefix[simp]: "prefix []t s" by (simp add: prefix_def) (*** the prefix of []t is []t ***) lemma prefix_of_nil[simp]: "prefix s []t = (s = []t)" by (simp add: prefix_def) (*** prefix of [a]t ***) lemma prefix_of_one[simp]: "prefix s [a]t = (s = []t | s = [a]t)" by (auto simp add: prefix_def) (*** not None ***) lemma prefix_not_None : "[| t ~= None ; prefix s t |] ==> s ~= None" apply (simp add: prefix_def) apply (erule exE) by (simp add: decompo_appt_None) (*** None ***) lemma prefix_None1[simp] : "prefix None t = (t = None)" by (simp add: prefix_def) lemma prefix_None2[simp] : "prefix s None" apply (simp add: prefix_def) by (rule_tac x="None" in exI, simp) (*** length of prefix ***) lemma length_of_prefix: "[| t ~= None ; prefix s t |] ==> lengtht s <= lengtht t" apply (case_tac "s ~= None") apply (simp add: prefix_def) apply (erule exE) apply (simp) by (simp) (*** prefix closed & prefix ***) lemma prefix_closed_prop: "[| prefix_closed T ; t : T ; prefix s t |] ==> s : T" apply (unfold prefix_closed_def) by (blast) (*********************************************************** convenient lemmas ***********************************************************) (*** prefix a#v u ***) lemma prefix_same_head_only_if: "prefix ([a]t @t v) u ==> (EX u'. u = [a]t @t u' & prefix v u')" apply (simp add: prefix_def) apply (erule exE) apply (rule_tac x="v @t ua" in exI, simp) by (rule_tac x="ua" in exI, simp) lemma prefix_same_head_if: "(EX u'. u = [a]t @t u' & prefix v u') ==> prefix ([a]t @t v) u" apply (simp add: prefix_def) apply (elim conjE exE) apply (rule_tac x="ua" in exI) by (simp) lemma prefix_same_head[simp]: "prefix ([a]t @t v) u = (EX u'. u = [a]t @t u' & prefix v u')" apply (rule iffI) apply (simp add: prefix_same_head_only_if) apply (simp add: prefix_same_head_if) done (*** prefix v a#u ***) lemma prefix_same_head_inv_only_if: "prefix v ([Ev a]t @t u) ==> u = None | v = []t | (EX v'. v = [Ev a]t @t v' & prefix v' u)" apply (case_tac "u = None", simp) apply (simp add: prefix_def) apply (erule exE) apply (case_tac "v = None", simp) apply (insert trace_nil_or_Tick_or_Ev) apply (drule_tac x="v" in spec, simp) apply (erule disjE, simp) apply (erule disjE, simp) apply (elim exE) apply (simp) by (rule_tac x="ua" in exI, simp) lemma prefix_same_head_inv_if: "[| u = None | v = []t | (EX v'. v = [Ev a]t @t v' & prefix v' u) |] ==> prefix v ([Ev a]t @t u)" apply (erule disjE) apply (simp) apply (erule disjE, simp) apply (elim conjE exE) by (auto simp add: prefix_def) lemma prefix_same_head_inv[simp]: "prefix v ([Ev a]t @t u) = (u = None | v = []t | (EX v'. v = [Ev a]t @t v' & prefix v' u))" apply (rule iffI) apply (simp add: prefix_same_head_inv_only_if) apply (simp add: prefix_same_head_inv_if) done (*** prefix v u#a ***) (* only if *) lemma prefix_last_inv_only_if: "prefix v (u @t [e]t) ==> (~ notick u | v = u @t [e]t | prefix v u)" apply (case_tac "~ notick u", simp) apply (simp add: prefix_def) apply (erule exE) apply (case_tac "v @t ua = None") apply (simp add: decompo_appt_None) apply (simp add: decompo_appt_not_None) apply (elim conjE) apply (insert trace_last_nil_or_unnil) apply (drule_tac x="ua" in spec, simp) apply (case_tac "ua ~= []t", simp) apply (elim conjE exE) apply (rule disjI2) apply (simp add: appt_ass_rev del: appt_ass) apply (rule_tac x="s" in exI, simp) by (simp) (* if *) lemma prefix_last_inv_if: "(~ notick u | v = u @t [e]t | prefix v u) ==> prefix v (u @t [e]t)" apply (erule disjE) apply (simp add: prefix_def) apply (rule_tac x="None" in exI, simp) apply (erule disjE, simp) by (auto simp add: prefix_def) lemma prefix_last_inv[simp]: "prefix v (u @t [e]t) = (~ notick u | v = u @t [e]t | prefix v u)" apply (rule iffI) apply (simp add: prefix_last_inv_only_if) apply (simp add: prefix_last_inv_if) done (*-------------------------* | sett | *-------------------------*) lemma prefix_subsett: "[| prefix s t ; t ~= None |] ==> sett s <= sett t" apply (simp add: prefix_def) apply (erule exE) by (auto) lemma prefix_notick: "[| prefix s t ; notick t |] ==> notick s" apply (case_tac "t = None", simp) apply (simp add: notick_def) apply (insert prefix_not_None[of t s], simp) apply (simp add: prefix_def) apply (erule exE) by (simp) (****************** to add it again ******************) declare disj_not1 [simp] declare not_None_eq [simp] end
lemma prefix_closed_iff:
[| t ∈ T; prefix s t; prefix_closed T |] ==> s ∈ T
lemma prefix_itself:
prefix s s
lemma prefix_appt_simp:
prefix s (s @t t)
lemma prefix_appt:
prefix s t ==> prefix s (t @t u)
lemma nil_is_prefix:
prefix []t s
lemma prefix_of_nil:
prefix s []t = (s = []t)
lemma prefix_of_one:
prefix s [a]t = (s = []t ∨ s = [a]t)
lemma prefix_not_None:
[| t ≠ None; prefix s t |] ==> s ≠ None
lemma prefix_None1:
prefix None t = (t = None)
lemma prefix_None2:
prefix s None
lemma length_of_prefix:
[| t ≠ None; prefix s t |] ==> lengtht s ≤ lengtht t
lemma prefix_closed_prop:
[| prefix_closed T; t ∈ T; prefix s t |] ==> s ∈ T
lemma prefix_same_head_only_if:
prefix ([a]t @t v) u ==> ∃u'. u = [a]t @t u' ∧ prefix v u'
lemma prefix_same_head_if:
∃u'. u = [a]t @t u' ∧ prefix v u' ==> prefix ([a]t @t v) u
lemma prefix_same_head:
prefix ([a]t @t v) u = (∃u'. u = [a]t @t u' ∧ prefix v u')
lemma prefix_same_head_inv_only_if:
prefix v ([Ev a]t @t u) ==> u = None ∨ v = []t ∨ (∃v'. v = [Ev a]t @t v' ∧ prefix v' u)
lemma prefix_same_head_inv_if:
u = None ∨ v = []t ∨ (∃v'. v = [Ev a]t @t v' ∧ prefix v' u) ==> prefix v ([Ev a]t @t u)
lemma prefix_same_head_inv:
prefix v ([Ev a]t @t u) = (u = None ∨ v = []t ∨ (∃v'. v = [Ev a]t @t v' ∧ prefix v' u))
lemma prefix_last_inv_only_if:
prefix v (u @t [e]t) ==> ¬ notick u ∨ v = u @t [e]t ∨ prefix v u
lemma prefix_last_inv_if:
¬ notick u ∨ v = u @t [e]t ∨ prefix v u ==> prefix v (u @t [e]t)
lemma prefix_last_inv:
prefix v (u @t [e]t) = (¬ notick u ∨ v = u @t [e]t ∨ prefix v u)
lemma prefix_subsett:
[| prefix s t; t ≠ None |] ==> sett s ⊆ sett t
lemma prefix_notick:
[| prefix s t; notick t |] ==> notick s