Theory Trace_ren

Up to index of Isabelle/HOL/HOL-Complex/CSP-Prover

theory Trace_ren = Prefix:

           (*-------------------------------------------*
            |                CSP-Prover                 |
            |               November 2004               |
            |        Yoshinao Isobe (AIST JAPAN)        |
            *-------------------------------------------*)

theory Trace_ren = 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. 

 *****************************************************************)

(*************************************************************
               functions used for defining [[ ]]
 *************************************************************)

consts
  renx :: "('a * 'b) set => (nat * 'a trace * 'b trace) set"

inductive "renx r"
intros
renx_nil: 
  "(0, []t, []t) : renx r"

renx_Tick: 
  "(0, [Tick]t, [Tick]t) : renx r"

renx_Ev: 
  "[| (n, s, t) : renx r ; (a, b) : r ; s ~= None |]
   ==> (Suc n, [Ev a]t @t s, [Ev b]t @t t) : renx r"

consts
  ren_tr :: "'a trace => ('a * 'b) set => 'b trace => bool"
                                    ("(_ [[_]]tr _)" [1000,0,1000] 1000)

defs
  ren_tr_def : "s [[r]]tr t == (EX n. (n, s, t) : renx r)"

consts
  ren_inv :: "('a * 'b) set => 'b event set => 'a event set"
                                    ("([[_]]inv _)" [0,1000] 1000)

defs
  ren_inv_def: 
   "[[r]]inv X == 
      {ea. EX eb : X. ea = Tick & eb = Tick |
                      (EX a b. (a,b):r & ea = Ev a & eb = Ev b)}"

(*************************************************************
                       renx None
 *************************************************************)

lemma renx_not_None_lm: 
  "ALL r n s t. (n, s, t) : renx r
       --> (s ~= None & t ~= None)"
apply (rule allI)
apply (rule allI)
apply (induct_tac n)
apply (intro allI impI)
apply (erule renx.elims)
apply (simp_all)

(* step case *)
apply (intro allI impI)
apply (erule renx.elims)
by (simp_all)

(*** rule ***)

lemma renx_not_None:
  "(n, s, t) : renx r ==> (s ~= None & t ~= None)"
by (simp add: renx_not_None_lm)

(*************************************************************
                 ren_tr intros and elims
 *************************************************************)

(*-------------------*
 |      intros       |
 *-------------------*)

lemma ren_tr_nil[simp]:
  "[]t [[r]]tr []t"
apply (simp add: ren_tr_def)
apply (rule_tac x="0" in exI)
by (simp add: renx.intros)

lemma ren_tr_Tick[simp]: 
  "[Tick]t [[r]]tr [Tick]t"
apply (simp add: ren_tr_def)
apply (rule_tac x="0" in exI)
by (simp add: renx.intros)

lemma ren_tr_Ev: 
  "[| s [[r]]tr t ; (a, b) : r ; s ~= None |]
   ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)"
apply (simp add: ren_tr_def)
apply (erule exE)
apply (rule_tac x="Suc n" in exI)
by (simp add: renx.intros)

(*** intro rule ***)

lemmas ren_tr_intros = ren_tr_Ev

(*-------------------*
 |       elims       |
 *-------------------*)

lemma ren_tr_elims_lm:
 "[| s [[r]]tr t ;
     (s = []t & t = []t) --> P ;
     (s = [Tick]t & t = [Tick]t) --> P ;
     ALL a b s' t'.
        (s' [[r]]tr t' & s = [Ev a]t @t s' & t = [Ev b]t @t t' & 
         (a, b) : r & s' ~= None)
        --> P |]
  ==> P"
apply (simp add: ren_tr_def)
apply (erule exE)
apply (erule renx.elims)
apply (simp_all)

apply (drule mp)
apply (rule_tac x="b" in exI)
apply (rule_tac x="ta" in exI)
apply (simp)
apply (rule_tac x="na" in exI)
by (simp_all)

(*** elim rule ***)

lemma ren_tr_elims:
 "[| s [[r]]tr t ;
     [| s = []t; t = []t |] ==> P ;
     [| s = [Tick]t; t = [Tick]t |] ==> P ;
     !!a b s' t'.
        [| s' [[r]]tr t' ; s = [Ev a]t @t s' ; t = [Ev b]t @t t' ;
            (a, b) : r ; s' ~= None |]
        ==> P |]
  ==> P"
apply (rule ren_tr_elims_lm[of s r t])
by (auto)

(*************************************************************
                      ren_tr None
 *************************************************************)

(*** ren_tr ***)

lemma ren_tr_not_None_lm: 
  "ALL r s t. s [[r]]tr t --> (s ~= None & t ~= None)"
apply (simp add: ren_tr_def)
apply (intro allI impI)
apply (erule exE)
by (simp add: renx_not_None)

(*** rule ***)

lemma ren_tr_not_None:
  "s [[r]]tr t ==> (s ~= None & t ~= None)"
by (simp add: ren_tr_not_None_lm)

(*** None False ***)

lemma ren_tr_None_False1[simp]: 
  "~ None [[r]]tr t"
apply (insert ren_tr_not_None[of "None" r t])
by (auto)

lemma ren_tr_None_False2[simp]: 
  "~ s [[r]]tr None"
apply (insert ren_tr_not_None[of s r "None"])
by (auto)

(*************************************************************
                 ren_tr decomposition
 *************************************************************)

(*-------------------*
 |     ren nil       |
 *-------------------*)

lemma ren_tr_nil1[simp]: "([]t [[r]]tr s) = (s = []t)"
apply (rule iffI)
by (erule ren_tr_elims, simp_all)

lemma ren_tr_nil2[simp]: "(s [[r]]tr []t) = (s = []t)"
apply (rule iffI)
by (erule ren_tr_elims, simp_all)

(*-------------------*
 |     ren Tick      |
 *-------------------*)

lemma ren_tr_Tick1[simp]: "([Tick]t [[r]]tr s) = (s = [Tick]t)"
apply (rule iffI)
by (erule ren_tr_elims, simp_all)

lemma ren_tr_Tick2[simp]: "(s [[r]]tr [Tick]t) = (s = [Tick]t)"
apply (rule iffI)
by (erule ren_tr_elims, simp_all)

(*-------------------*
 |     ren Ev        |
 *-------------------*)

(*** left ***)

(* only if *)

lemma ren_tr_Ev_decompo_left_only_if: 
  "([Ev a]t @t s) [[r]]tr u 
    ==> (EX b t. u = [Ev b]t @t t & (a, b) : r & s [[r]]tr t)"
apply (case_tac "u = None", simp)
 apply (insert trace_nil_or_Tick_or_Ev)
 apply (drule_tac x="u" in spec, simp)

 apply (erule disjE, simp)   (* []t --> contradict *)
 apply (erule disjE, simp)   (* [Tick]t --> contradict *)

 apply (erule ren_tr_elims)
by (simp_all)

(* if *)

lemma ren_tr_Ev_decompo_left_if: 
  "[| (a, b) : r ; s [[r]]tr t |]
    ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)"
apply (rule ren_tr_intros)
apply (simp_all)
apply (case_tac "s = None", simp)
by (simp)

(* iff *)

lemma ren_tr_Ev_decompo_left: 
  "([Ev a]t @t s) [[r]]tr u
      = (EX b t. u = [Ev b]t @t t & (a, b) : r & s [[r]]tr t)"
apply (rule iffI)
apply (simp add: ren_tr_Ev_decompo_left_only_if)
apply (elim exE)
apply (simp add: ren_tr_Ev_decompo_left_if)
done

(*** right ***)

(* only if *)

lemma ren_tr_Ev_decompo_right_only_if: 
  "u [[r]]tr ([Ev b]t @t t)
    ==> (EX a s. u = [Ev a]t @t s & (a, b) : r & s [[r]]tr t)"
apply (case_tac "u = None", simp)
 apply (insert trace_nil_or_Tick_or_Ev)
 apply (drule_tac x="u" in spec, simp)

 apply (erule disjE, simp)   (* []t --> contradict *)
 apply (erule disjE, simp)   (* [Tick]t --> contradict *)

 apply (erule ren_tr_elims)
 apply (simp_all)
by (case_tac "t' ~= None", simp, simp)

(* if *)

lemma ren_tr_Ev_decompo_right_if: 
  "[| (a, b) : r ; s [[r]]tr t |]
    ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)"
apply (rule ren_tr_intros)
apply (simp_all)
apply (case_tac "s ~= None", simp)
by (simp)

(* iff *)

lemma ren_tr_Ev_decompo_right: 
  "u [[r]]tr ([Ev b]t @t t)
     = (EX a s. u = [Ev a]t @t s & (a, b) : r & s [[r]]tr t)"
apply (rule iffI)
apply (simp add: ren_tr_Ev_decompo_right_only_if)
apply (elim exE)
apply (simp add: ren_tr_Ev_decompo_right_if)
done

lemmas ren_tr_Ev_decompo = ren_tr_Ev_decompo_left ren_tr_Ev_decompo_right

(*-------------------*
 |     ren one       |
 *-------------------*)

lemma ren_tr_one[simp]: 
  "(a, b) : r ==> [Ev a]t [[r]]tr [Ev b]t"
apply (insert ren_tr_Ev[of "[]t" r "[]t" a b])
by (simp)

(*** left ***)

lemma ren_tr_one_decompo_left_only_if: 
  "[Ev a]t [[r]]tr t ==> (EX b. t = [Ev b]t & (a, b) : r)"
apply (insert ren_tr_Ev_decompo_left[of a "[]t" r t])
by (simp)

lemma ren_tr_one_decompo_left: 
  "[Ev a]t [[r]]tr t = (EX b. t = [Ev b]t & (a, b) : r)"
apply (rule iffI)
apply (simp add: ren_tr_one_decompo_left_only_if)
by (auto)

(*** right ***)

lemma ren_tr_one_decompo_right_only_if: 
  "s [[r]]tr [Ev b]t ==> (EX a. s = [Ev a]t & (a, b) : r)"
apply (insert ren_tr_Ev_decompo_right[of s r b "[]t"])
by (simp)

lemma ren_tr_one_decompo_right: 
  "s [[r]]tr [Ev b]t = (EX a. s = [Ev a]t & (a, b) : r)"
apply (rule iffI)
apply (simp add: ren_tr_one_decompo_right_only_if)
by (auto)

lemmas ren_tr_one_decompo = ren_tr_one_decompo_left ren_tr_one_decompo_right

(*************************************************************
                   ren_tr notick
 *************************************************************)

(*** left ***)

lemma ren_tr_notick_left_lm: "ALL r s t. (s [[r]]tr t & notick s) --> notick t"
apply (rule allI)
apply (rule allI)
apply (induct_tac s rule: induct_trace)
apply (simp_all)

apply (intro allI impI)
apply (simp add: ren_tr_Ev_decompo)
apply (elim conjE exE)
by (simp)

(*** rule ***)

lemma ren_tr_notick_left: "[| s [[r]]tr t ; notick s |] ==> notick t"
apply (insert ren_tr_notick_left_lm)
apply (drule_tac x="r" in spec)
apply (drule_tac x="s" in spec)
apply (drule_tac x="t" in spec)
by (simp)

(*** right ***)

lemma ren_tr_notick_right_lm: "ALL r s t. (s [[r]]tr t & notick t) --> notick s"
apply (rule allI)
apply (rule allI)
apply (induct_tac s rule: induct_trace)
apply (simp_all)
apply (simp add: disj_not1)

apply (intro allI impI)
apply (simp add: ren_tr_Ev_decompo)
apply (elim conjE exE)
apply (drule mp)
apply (rule_tac x="ta" in exI)
by (simp_all)

(*** rule ***)

lemma ren_tr_notick_right: "[| s [[r]]tr t ; notick t |] ==> notick s"
apply (insert ren_tr_notick_right_lm)
apply (drule_tac x="r" in spec)
apply (drule_tac x="s" in spec)
apply (drule_tac x="t" in spec)
by (simp)

(*************************************************************
                 ren_tr appending
 *************************************************************)

(*** notick not None ***)

lemma ren_tr_appt_notick_not_None:
  "ALL r s1 s2 t1 t2.
     (s1 [[r]]tr t1 & s2 [[r]]tr t2 & (s1 @t s2 ~= None | t1 @t t2 ~= None))
       --> (s1 @t s2) [[r]]tr (t1 @t t2)"
apply (rule allI)
apply (rule allI)
apply (induct_tac s1 rule: induct_trace)
 apply (simp_all)

 apply (intro allI impI)
 apply (elim conjE)
 apply (erule ren_tr_elims)
 apply (simp_all)

 apply (intro allI impI)
 apply (simp add: ren_tr_Ev_decompo)
 apply (elim conjE exE, simp)

 apply (drule_tac x="s2" in spec)
 apply (drule_tac x="t" in spec)
 apply (drule_tac x="t2" in spec)
 apply (simp)

 apply (rule_tac x="b" in exI)
 apply (rule_tac x="t @t t2" in exI)
 apply (simp)
done

(*** rule ***)

lemma ren_tr_appt:
  "[| s1 [[r]]tr t1 ; s2 [[r]]tr t2 ; s1 @t s2 ~= None | t1 @t t2 ~= None |]
     ==> (s1 @t s2) [[r]]tr (t1 @t t2)"
apply (case_tac "s2 = None", simp)
by (simp add: ren_tr_appt_notick_not_None)

(*--------------------*
 |   [Ev a]t @t ...   |
 *--------------------*)

lemma ren_tr_appt_Ev:
  "[| (a, b) : r ; s [[r]]tr t |]
     ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)"
apply (insert ren_tr_appt[of "[Ev a]t" r "[Ev b]t" s t])
apply (case_tac "[Ev a]t @t s = None")
by (simp_all)

(*-------------------*
 |     decompo       |
 *-------------------*)

(*** left ***)

(* only if *)

lemma ren_tr_appt_decompo_left_only_if_lm: 
  "ALL r s1 s2 t. (s1 @t s2) [[r]]tr t 
    --> (EX t1 t2. t = t1 @t t2 & s1 [[r]]tr t1 & s2 [[r]]tr t2)"
apply (rule allI)
apply (rule allI)
apply (induct_tac s1 rule: induct_trace)
apply (simp_all)

(* [Tick]t *)
apply (intro allI impI)
apply (case_tac "[Tick]t @t s2 = None", simp, simp) (* contradict *)

(* [Ev a] @t ... *)
apply (intro allI impI)
apply (simp add: ren_tr_Ev_decompo_left)
apply (elim conjE exE)
apply (drule_tac x="s2" in spec)
apply (drule_tac x="ta" in spec)
apply (simp)
apply (elim conjE exE)
apply (rule_tac x="[Ev b]t @t t1" in exI)
apply (rule_tac x="t2" in exI)
apply (simp)
apply (rule_tac x="b" in exI)
apply (rule_tac x="t1" in exI)
by (simp)

(* rule *)

lemma ren_tr_appt_decompo_left_only_if: 
  "(s1 @t s2) [[r]]tr t
    ==> (EX t1 t2. t = t1 @t t2 & s1 [[r]]tr t1 & s2 [[r]]tr t2)"
by (simp add: ren_tr_appt_decompo_left_only_if_lm)

(* iff *)

lemma ren_tr_appt_decompo_left:
  "t ~= None 
   ==> (s1 @t s2) [[r]]tr t
      = (EX t1 t2. t = t1 @t t2 & s1 [[r]]tr t1 & s2 [[r]]tr t2)"
apply (rule iffI)
apply (simp add: ren_tr_appt_decompo_left_only_if)
apply (elim conjE exE)
by (simp add: ren_tr_appt)

(*** right ***)

(* only if *)

lemma ren_tr_appt_decompo_right_only_if_lm: 
  "ALL r t1 t2 s. s [[r]]tr (t1 @t t2)
    --> (EX s1 s2. s = s1 @t s2 & s1 [[r]]tr t1 & s2 [[r]]tr t2)"
apply (rule allI)
apply (rule allI)
apply (induct_tac t1 rule: induct_trace)
apply (simp_all)

(* [Tick]t *)
apply (intro allI impI)
apply (case_tac "[Tick]t @t t2 = None", simp, simp) (* contradict *)

(* [Ev a] @t ... *)
apply (intro allI impI)
apply (simp add: ren_tr_Ev_decompo_right)
apply (elim conjE exE)
apply (drule_tac x="t2" in spec)
apply (drule_tac x="sb" in spec)
apply (simp)
apply (elim conjE exE)
apply (rule_tac x="[Ev aa]t @t s1" in exI)
apply (rule_tac x="s2" in exI)
apply (simp)
apply (rule_tac x="aa" in exI)
apply (rule_tac x="s1" in exI)
by (simp)

(* rule *)

lemma ren_tr_appt_decompo_right_only_if: 
  "s [[r]]tr (t1 @t t2) 
    ==> (EX s1 s2. s = s1 @t s2 & s1 [[r]]tr t1 & s2 [[r]]tr t2)"
by (simp add: ren_tr_appt_decompo_right_only_if_lm)

(* iff *)

lemma ren_tr_appt_decompo_right:
  "s ~= None
    ==> s [[r]]tr (t1 @t t2)
      = (EX s1 s2. s = s1 @t s2 & s1 [[r]]tr t1 & s2 [[r]]tr t2)"
apply (rule iffI)
apply (simp add: ren_tr_appt_decompo_right_only_if)
apply (elim conjE exE)
by (simp add: ren_tr_appt)

lemmas ren_tr_appt_decompo
     = ren_tr_appt_decompo_left ren_tr_appt_decompo_right

(*--------------------*
 |   [Ev a]t @t ...   |
 *--------------------*)

lemma ren_tr_head_decompo[simp]: 
  "([Ev a]t @t s) [[r]]tr ([Ev b]t @t t) = ((a, b) : r & s [[r]]tr t)"
apply (insert ren_tr_appt_decompo_right[of "[Ev a]t @t s" r "[Ev b]t" t])
apply (rule iffI)

apply (case_tac "s = None", simp, simp)
apply (simp add: ren_tr_one_decompo)
apply (elim conjE exE, simp)

by (simp add: ren_tr_appt_Ev)

(*--------------------*
 |    ... @t [e]t     |
 *--------------------*)

lemma ren_tr_last_decompo_Ev[simp]: 
  "(notick s | notick t)
    ==> (s @t [Ev a]t) [[r]]tr (t @t [Ev b]t) = (s [[r]]tr t & (a,b) : r)"
apply (insert ren_tr_appt_decompo_right[of "(s @t [Ev a]t)" r t "[Ev b]t"])
apply (case_tac "s @t [Ev a]t ~= None", simp)

 apply (rule iffI)

  (* => *)
  apply (elim conjE exE)
  apply (simp add: ren_tr_one_decompo)
  apply (elim conjE exE)
  apply (simp)
  apply (case_tac "notick s1", simp, simp)

  (* <= *)
  apply (rule_tac x="s" in exI)
  apply (rule_tac x="[Ev a]t" in exI)
  apply (simp)

(* s @t [Ev a]t = None *)
by (auto simp add: ren_tr_notick_right not_None)

lemma ren_tr_last_decompo_Tick[simp]: 
  "(notick s | notick t)
    ==> (s @t [Tick]t) [[r]]tr (t @t [Tick]t) = (s [[r]]tr t)"
apply (insert ren_tr_appt_decompo_right[of "(s @t [Tick]t)" r t "[Tick]t"])
apply (case_tac "notick s")
by (auto simp add: ren_tr_notick_right not_None)

(*************************************************************
                 ren_tr lengtht
 *************************************************************)

(*** ren same length ***)

lemma ren_tr_lengtht:
  "ALL r s t. s [[r]]tr t --> lengtht s = lengtht t"
apply (rule allI)
apply (rule allI)
apply (induct_tac s rule: induct_trace)

 apply (simp_all)
 apply (intro allI impI)
 apply (erule ren_tr_elims)
 apply (simp_all)
 apply (drule_tac x="t'" in spec)
by (simp add: ren_tr_not_None)

(*************************************************************
                    ren_tr prefix
 *************************************************************)

lemma ren_tr_prefix_lm:
  "ALL r u v s. prefix v u & s [[r]]tr u
     --> (EX t. prefix t s & t [[r]]tr v)"
apply (rule allI)
apply (rule allI)
apply (induct_tac u rule: induct_trace)
apply (simp_all)

(* [Ev a]t @t ... *)
apply (intro allI impI)
apply (elim conjE)
apply (erule disjE, simp)

apply (simp add: ren_tr_Ev_decompo)
apply (elim conjE exE, simp)

apply (drule_tac x="v'" in spec)
apply (drule_tac x="sb" in spec, simp)
apply (elim conjE exE)

apply (rule_tac x="[Ev aa]t @t t" in exI, simp)
apply (rule disjI2)
apply (rule_tac x="t" in exI, simp)
done

(*** rule ***)

lemma ren_tr_prefix:
  "[| prefix v u ; s [[r]]tr u |] ==> (EX t. prefix t s & t [[r]]tr v)"
apply (insert ren_tr_prefix_lm)
apply (drule_tac x="r" in spec)
apply (drule_tac x="u" in spec)
apply (drule_tac x="v" in spec)
apply (drule_tac x="s" in spec)
by (simp)

(*** erule ***)

lemma ren_tr_prefixE:
  "[| prefix v u ; s [[r]]tr u ;
      !! t. [| prefix t s ; t [[r]]tr v |] ==> R 
   |] ==> R"
apply (insert ren_tr_prefix[of v u s r])
by (auto)

(*************************************************************
                       inverse R
 *************************************************************)

lemma ren_inv_sub_Evset[simp]: "[[r]]inv Evset <= Evset"
by (auto simp add: ren_inv_def Evset_def)

lemma ren_inv_sub:
  "X <= Y ==> [[r]]inv X <= [[r]]inv Y"
by (auto simp add: ren_inv_def)

lemma ren_inv_Un[simp]:
  "[[r]]inv(X Un Y) = [[r]]inv X Un [[r]]inv Y"
by (auto simp add: ren_inv_def)

(*** [[r]]inv preserves "no Tick" ***)

lemma ren_inv_no_Tick[simp]: "([[r]]inv X <= Evset) = (X <= Evset)"
by (auto simp add: ren_inv_def Evset_def)

(****************** to add it again ******************)

declare disj_not1 [simp] 
declare not_None_eq [simp] 

end



lemma renx_not_None_lm:

r n s t. (n, s, t) ∈ renx r --> s ≠ None ∧ t ≠ None

lemma renx_not_None:

  (n, s, t) ∈ renx r ==> s ≠ None ∧ t ≠ None

lemma ren_tr_nil:

  []t [[r]]tr []t

lemma ren_tr_Tick:

  [Tick]t [[r]]tr [Tick]t

lemma ren_tr_Ev:

  [| s [[r]]tr t; (a, b) ∈ r; s ≠ None |]
  ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)

lemmas ren_tr_intros:

  [| s [[r]]tr t; (a, b) ∈ r; s ≠ None |]
  ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)

lemma ren_tr_elims_lm:

  [| s [[r]]tr t; s = []t ∧ t = []t --> P; s = [Tick]t ∧ t = [Tick]t --> P;
     ∀a b s' t'.
        s' [[r]]tr t's = [Ev a]t @t s't = [Ev b]t @t t' ∧ (a, b) ∈ rs' ≠ None -->
        P |]
  ==> P

lemma ren_tr_elims:

  [| s [[r]]tr t; [| s = []t; t = []t |] ==> P;
     [| s = [Tick]t; t = [Tick]t |] ==> P;
     !!a b s' t'.
        [| s' [[r]]tr t'; s = [Ev a]t @t s'; t = [Ev b]t @t t'; (a, b) ∈ r;
           s' ≠ None |]
        ==> P |]
  ==> P

lemma ren_tr_not_None_lm:

r s t. s [[r]]tr t --> s ≠ None ∧ t ≠ None

lemma ren_tr_not_None:

  s [[r]]tr t ==> s ≠ None ∧ t ≠ None

lemma ren_tr_None_False1:

  ¬ None [[r]]tr t

lemma ren_tr_None_False2:

  ¬ s [[r]]tr None

lemma ren_tr_nil1:

  []t [[r]]tr s = (s = []t)

lemma ren_tr_nil2:

  s [[r]]tr []t = (s = []t)

lemma ren_tr_Tick1:

  [Tick]t [[r]]tr s = (s = [Tick]t)

lemma ren_tr_Tick2:

  s [[r]]tr [Tick]t = (s = [Tick]t)

lemma ren_tr_Ev_decompo_left_only_if:

  ([Ev a]t @t s) [[r]]tr u ==> ∃b t. u = [Ev b]t @t t ∧ (a, b) ∈ rs [[r]]tr t

lemma ren_tr_Ev_decompo_left_if:

  [| (a, b) ∈ r; s [[r]]tr t |] ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)

lemma ren_tr_Ev_decompo_left:

  ([Ev a]t @t s) [[r]]tr u = (∃b t. u = [Ev b]t @t t ∧ (a, b) ∈ rs [[r]]tr t)

lemma ren_tr_Ev_decompo_right_only_if:

  u [[r]]tr ([Ev b]t @t t) ==> ∃a s. u = [Ev a]t @t s ∧ (a, b) ∈ rs [[r]]tr t

lemma ren_tr_Ev_decompo_right_if:

  [| (a, b) ∈ r; s [[r]]tr t |] ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)

lemma ren_tr_Ev_decompo_right:

  u [[r]]tr ([Ev b]t @t t) = (∃a s. u = [Ev a]t @t s ∧ (a, b) ∈ rs [[r]]tr t)

lemmas ren_tr_Ev_decompo:

  ([Ev a]t @t s) [[r]]tr u = (∃b t. u = [Ev b]t @t t ∧ (a, b) ∈ rs [[r]]tr t)
  u [[r]]tr ([Ev b]t @t t) = (∃a s. u = [Ev a]t @t s ∧ (a, b) ∈ rs [[r]]tr t)

lemma ren_tr_one:

  (a, b) ∈ r ==> [Ev a]t [[r]]tr [Ev b]t

lemma ren_tr_one_decompo_left_only_if:

  [Ev a]t [[r]]tr t ==> ∃b. t = [Ev b]t ∧ (a, b) ∈ r

lemma ren_tr_one_decompo_left:

  [Ev a]t [[r]]tr t = (∃b. t = [Ev b]t ∧ (a, b) ∈ r)

lemma ren_tr_one_decompo_right_only_if:

  s [[r]]tr [Ev b]t ==> ∃a. s = [Ev a]t ∧ (a, b) ∈ r

lemma ren_tr_one_decompo_right:

  s [[r]]tr [Ev b]t = (∃a. s = [Ev a]t ∧ (a, b) ∈ r)

lemmas ren_tr_one_decompo:

  [Ev a]t [[r]]tr t = (∃b. t = [Ev b]t ∧ (a, b) ∈ r)
  s [[r]]tr [Ev b]t = (∃a. s = [Ev a]t ∧ (a, b) ∈ r)

lemma ren_tr_notick_left_lm:

r s t. s [[r]]tr t ∧ notick s --> notick t

lemma ren_tr_notick_left:

  [| s [[r]]tr t; notick s |] ==> notick t

lemma ren_tr_notick_right_lm:

r s t. s [[r]]tr t ∧ notick t --> notick s

lemma ren_tr_notick_right:

  [| s [[r]]tr t; notick t |] ==> notick s

lemma ren_tr_appt_notick_not_None:

r s1 s2 t1 t2.
     s1 [[r]]tr t1s2 [[r]]tr t2 ∧ (s1 @t s2 ≠ None ∨ t1 @t t2 ≠ None) -->
     (s1 @t s2) [[r]]tr (t1 @t t2)

lemma ren_tr_appt:

  [| s1 [[r]]tr t1; s2 [[r]]tr t2; s1 @t s2 ≠ None ∨ t1 @t t2 ≠ None |]
  ==> (s1 @t s2) [[r]]tr (t1 @t t2)

lemma ren_tr_appt_Ev:

  [| (a, b) ∈ r; s [[r]]tr t |] ==> ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t)

lemma ren_tr_appt_decompo_left_only_if_lm:

r s1 s2 t.
     (s1 @t s2) [[r]]tr t -->
     (∃t1 t2. t = t1 @t t2s1 [[r]]tr t1s2 [[r]]tr t2)

lemma ren_tr_appt_decompo_left_only_if:

  (s1 @t s2) [[r]]tr t ==> ∃t1 t2. t = t1 @t t2s1 [[r]]tr t1s2 [[r]]tr t2

lemma ren_tr_appt_decompo_left:

  t ≠ None
  ==> (s1 @t s2) [[r]]tr t =
      (∃t1 t2. t = t1 @t t2s1 [[r]]tr t1s2 [[r]]tr t2)

lemma ren_tr_appt_decompo_right_only_if_lm:

r t1 t2 s.
     s [[r]]tr (t1 @t t2) -->
     (∃s1 s2. s = s1 @t s2s1 [[r]]tr t1s2 [[r]]tr t2)

lemma ren_tr_appt_decompo_right_only_if:

  s [[r]]tr (t1 @t t2) ==> ∃s1 s2. s = s1 @t s2s1 [[r]]tr t1s2 [[r]]tr t2

lemma ren_tr_appt_decompo_right:

  s ≠ None
  ==> s [[r]]tr (t1 @t t2) =
      (∃s1 s2. s = s1 @t s2s1 [[r]]tr t1s2 [[r]]tr t2)

lemmas ren_tr_appt_decompo:

  t ≠ None
  ==> (s1 @t s2) [[r]]tr t =
      (∃t1 t2. t = t1 @t t2s1 [[r]]tr t1s2 [[r]]tr t2)
  s ≠ None
  ==> s [[r]]tr (t1 @t t2) =
      (∃s1 s2. s = s1 @t s2s1 [[r]]tr t1s2 [[r]]tr t2)

lemma ren_tr_head_decompo:

  ([Ev a]t @t s) [[r]]tr ([Ev b]t @t t) = ((a, b) ∈ rs [[r]]tr t)

lemma ren_tr_last_decompo_Ev:

  notick s ∨ notick t
  ==> (s @t [Ev a]t) [[r]]tr (t @t [Ev b]t) = (s [[r]]tr t ∧ (a, b) ∈ r)

lemma ren_tr_last_decompo_Tick:

  notick s ∨ notick t ==> (s @t [Tick]t) [[r]]tr (t @t [Tick]t) = s [[r]]tr t

lemma ren_tr_lengtht:

r s t. s [[r]]tr t --> lengtht s = lengtht t

lemma ren_tr_prefix_lm:

r u v s. prefix v us [[r]]tr u --> (∃t. prefix t st [[r]]tr v)

lemma ren_tr_prefix:

  [| prefix v u; s [[r]]tr u |] ==> ∃t. prefix t st [[r]]tr v

lemma ren_tr_prefixE:

  [| prefix v u; s [[r]]tr u; !!t. [| prefix t s; t [[r]]tr v |] ==> R |] ==> R

lemma ren_inv_sub_Evset:

  [[r]]inv Evset ⊆ Evset

lemma ren_inv_sub:

  XY ==> [[r]]inv X ⊆ [[r]]inv Y

lemma ren_inv_Un:

  [[r]]inv (XY) = [[r]]inv X ∪ [[r]]inv Y

lemma ren_inv_no_Tick:

  ([[r]]inv X ⊆ Evset) = (X ⊆ Evset)