(*-------------------------------------------*
| CSP-Prover on Isabelle2004 |
| November 2004 |
| July 2005 (modified) |
| |
| CSP-Prover on Isabelle2005 |
| October 2005 (modified) |
| April 2006 (modified) |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory Trace_ren
imports Prefix
begin
(* The following simplification rules are deleted in this theory file *)
(* because they unexpectly rewrite (notick | t = <>) *)
(* *)
(* disj_not1: (~ P | Q) = (P --> Q) *)
declare disj_not1 [simp del]
(*****************************************************************
1.
2.
3.
4.
*****************************************************************)
(*************************************************************
functions used for defining [[ ]]
*************************************************************)
consts
renx :: "('a * 'b) set => ('a trace * 'b trace) set"
inductive "renx r"
intros
renx_nil:
"(<>, <>) : renx r"
renx_Tick:
"(<Tick>, <Tick>) : renx r"
renx_Ev:
"[| (s, t) : renx r ; (a, b) : r |]
==> (<Ev a> ^^ s, <Ev b> ^^ t) : renx r"
consts
ren_tr :: "'a trace => ('a * 'b) set => 'b trace => bool"
("(_ [[_]]* _)" [1000,0,1000] 1000)
defs
ren_tr_def : "s [[r]]* t == (( 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)}"
(*************************************************************
ren_tr intros and elims
*************************************************************)
(*-------------------*
| intros |
*-------------------*)
lemma ren_tr_nil[simp]:
"<> [[r]]* <>"
apply (simp add: ren_tr_def)
by (simp add: renx.intros)
lemma ren_tr_Tick[simp]:
"<Tick> [[r]]* <Tick>"
apply (simp add: ren_tr_def)
by (simp add: renx.intros)
lemma ren_tr_Ev:
"[| s [[r]]* t ; (a, b) : r |]
==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)"
apply (simp add: ren_tr_def)
by (simp add: renx.intros)
(*** intro rule ***)
lemmas ren_tr_intros = ren_tr_Ev
(*-------------------*
| elims |
*-------------------*)
lemma ren_tr_elims_lm:
"[| s [[r]]* t ;
(s = <> & t = <>) --> P ;
(s = <Tick> & t = <Tick>) --> P ;
ALL a b s' t'.
(s' [[r]]* t' & s = <Ev a> ^^ s' & t = <Ev b> ^^ t' &
(a, b) : r )
--> P |]
==> P"
apply (simp add: ren_tr_def)
apply (erule renx.elims)
apply (simp_all)
done
(*** elim rule ***)
lemma ren_tr_elims:
"[| s [[r]]* t ;
[| s = <>; t = <> |] ==> P ;
[| s = <Tick>; t = <Tick> |] ==> P ;
!!a b s' t'.
[| s' [[r]]* t' ; s = <Ev a> ^^ s' ; t = <Ev b> ^^ t' ;
(a, b) : r |]
==> P |]
==> P"
apply (rule ren_tr_elims_lm[of s r t])
by (auto)
(*************************************************************
ren_tr decomposition
*************************************************************)
(*-------------------*
| ren nil |
*-------------------*)
lemma ren_tr_nil1[simp]: "(<> [[r]]* s) = (s = <>)"
apply (rule iffI)
by (erule ren_tr_elims, simp_all)
lemma ren_tr_nil2[simp]: "(s [[r]]* <>) = (s = <>)"
apply (rule iffI)
by (erule ren_tr_elims, simp_all)
(*-------------------*
| ren Tick |
*-------------------*)
lemma ren_tr_Tick1[simp]: "(<Tick> [[r]]* s) = (s = <Tick>)"
apply (rule iffI)
by (erule ren_tr_elims, simp_all)
lemma ren_tr_Tick2[simp]: "(s [[r]]* <Tick>) = (s = <Tick>)"
apply (rule iffI)
by (erule ren_tr_elims, simp_all)
(*-------------------*
| ren Ev |
*-------------------*)
(*** left ***)
(* only if *)
lemma ren_tr_decompo_left_only_if:
"(<Ev a> ^^ s) [[r]]* u
==> (EX b t. u = <Ev b> ^^ t & (a, b) : r & s [[r]]* t)"
apply (insert trace_nil_or_Tick_or_Ev)
apply (drule_tac x="u" in spec)
apply (erule disjE, simp) (* <> --> contradict *)
apply (erule disjE, simp) (* <Tick> --> contradict *)
apply (erule ren_tr_elims)
by (simp_all)
(* if *)
lemma ren_tr_decompo_left_if:
"[| (a, b) : r ; s [[r]]* t |]
==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)"
apply (rule ren_tr_intros)
by (simp_all)
(* iff *)
lemma ren_tr_decompo_left:
"(<Ev a> ^^ s) [[r]]* u
= (EX b t. u = <Ev b> ^^ t & (a, b) : r & s [[r]]* t)"
apply (rule iffI)
apply (simp add: ren_tr_decompo_left_only_if)
apply (elim exE)
apply (simp add: ren_tr_decompo_left_if)
done
(*** right ***)
(* only if *)
lemma ren_tr_decompo_right_only_if:
"u [[r]]* (<Ev b> ^^ t)
==> (EX a s. u = <Ev a> ^^ s & (a, b) : r & s [[r]]* t)"
apply (insert trace_nil_or_Tick_or_Ev)
apply (drule_tac x="u" in spec)
apply (erule disjE, simp) (* <> --> contradict *)
apply (erule disjE, simp) (* <Tick> --> contradict *)
apply (erule ren_tr_elims)
by (simp_all)
(* if *)
lemma ren_tr_decompo_right_if:
"[| (a, b) : r ; s [[r]]* t |]
==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)"
apply (rule ren_tr_intros)
by (simp_all)
(* iff *)
lemma ren_tr_decompo_right:
"u [[r]]* (<Ev b> ^^ t)
= (EX a s. u = <Ev a> ^^ s & (a, b) : r & s [[r]]* t)"
apply (rule iffI)
apply (simp add: ren_tr_decompo_right_only_if)
apply (elim exE)
apply (simp add: ren_tr_decompo_right_if)
done
lemmas ren_tr_decompo = ren_tr_decompo_left ren_tr_decompo_right
(*-------------------*
| ren one |
*-------------------*)
lemma ren_tr_one[simp]:
"(a, b) : r ==> <Ev a> [[r]]* <Ev b>"
apply (insert ren_tr_Ev[of "<>" r "<>" a b])
by (simp)
(*** left ***)
lemma ren_tr_one_decompo_left_only_if:
"<Ev a> [[r]]* t ==> (EX b. t = <Ev b> & (a, b) : r)"
apply (insert ren_tr_decompo_left[of a "<>" r t])
by (simp)
lemma ren_tr_one_decompo_left:
"<Ev a> [[r]]* t = (EX b. t = <Ev b> & (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]]* <Ev b> ==> (EX a. s = <Ev a> & (a, b) : r)"
apply (insert ren_tr_decompo_right[of s r b "<>"])
by (simp)
lemma ren_tr_one_decompo_right:
"s [[r]]* <Ev b> = (EX a. s = <Ev a> & (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]]* 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_decompo)
apply (elim conjE exE)
by (simp)
(*** rule ***)
lemma ren_tr_noTick_left: "[| s [[r]]* 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]]* 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_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]]* 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_lm:
"ALL r s1 s2 t1 t2.
(s1 [[r]]* t1 & s2 [[r]]* t2 & (noTick s1 & noTick t1))
--> (s1 ^^ s2) [[r]]* (t1 ^^ 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 (simp add: appt_assoc)
apply (simp add: ren_tr_decompo)
done
(*** rule ***)
lemma ren_tr_appt:
"[| s1 [[r]]* t1 ; s2 [[r]]* t2 ; noTick s1 | noTick t1 | s2 = <> | t2 = <> |]
==> (s1 ^^ s2) [[r]]* (t1 ^^ t2)"
apply (elim disjE)
apply (simp add: ren_tr_appt_noTick_lm ren_tr_noTick_left)
apply (simp add: ren_tr_appt_noTick_lm ren_tr_noTick_right)
by (simp_all)
(*--------------------*
| <Ev a> ^^ ... |
*--------------------*)
lemma ren_tr_appt_Ev:
"[| (a, b) : r ; s [[r]]* t |]
==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)"
apply (insert ren_tr_appt[of "<Ev a>" r "<Ev b>" s t])
by (simp_all)
(*-------------------*
| decompo |
*-------------------*)
(*** left ***)
(* only if *)
lemma ren_tr_appt_decompo_left_only_if_lm:
"ALL r s1 s2 t. ((s1 ^^ s2) [[r]]* t & (noTick s1 | s2 = <>))
--> (EX t1 t2. t = t1 ^^ t2 & s1 [[r]]* t1 & s2 [[r]]* t2
& (noTick t1 | t2 = <>))"
apply (rule allI)
apply (rule allI)
apply (induct_tac s1 rule: induct_trace)
apply (simp_all)
(* [Ev a] ^^ ... *)
apply (intro allI impI)
apply (elim conjE exE)
apply (simp add: appt_assoc)
apply (simp add: ren_tr_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> ^^ t1" in exI)
apply (rule_tac x="t2" in exI)
apply (simp add: appt_assoc)
done
(* rule *)
lemma ren_tr_appt_decompo_left_only_if:
"[| (s1 ^^ s2) [[r]]* t ; noTick s1 | s2 = <> |]
==> (EX t1 t2. t = t1 ^^ t2 & s1 [[r]]* t1 & s2 [[r]]* t2
& (noTick t1 | t2 = <>))"
by (simp add: ren_tr_appt_decompo_left_only_if_lm)
(* iff *)
lemma ren_tr_appt_decompo_left:
"noTick s1 | s2 = <>
==> (s1 ^^ s2) [[r]]* t
= (EX t1 t2. t = t1 ^^ t2 & s1 [[r]]* t1 & s2 [[r]]* t2
& (noTick t1 | t2 = <>))"
apply (rule iffI)
apply (simp add: ren_tr_appt_decompo_left_only_if)
apply (elim conjE exE)
apply (auto simp add: ren_tr_appt)
done
(*** right ***)
(* only if *)
lemma ren_tr_appt_decompo_right_only_if_lm:
"ALL r t1 t2 s. (s [[r]]* (t1 ^^ t2) & (noTick t1 | t2 = <>))
--> (EX s1 s2. s = s1 ^^ s2 & s1 [[r]]* t1 & s2 [[r]]* t2
& (noTick s1 | s2 = <>))"
apply (rule allI)
apply (rule allI)
apply (induct_tac t1 rule: induct_trace)
apply (simp_all)
(* [Ev a] ^^ ... *)
apply (intro allI impI)
apply (elim conjE exE)
apply (simp add: appt_assoc)
apply (simp add: ren_tr_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> ^^ s1" in exI)
apply (rule_tac x="s2" in exI)
apply (simp add: appt_assoc)
done
(* rule *)
lemma ren_tr_appt_decompo_right_only_if:
"[| s [[r]]* (t1 ^^ t2) ; noTick t1 | t2 = <> |]
==> (EX s1 s2. s = s1 ^^ s2 & s1 [[r]]* t1 & s2 [[r]]* t2
& (noTick s1 | s2 = <>))"
by (simp add: ren_tr_appt_decompo_right_only_if_lm)
(* iff *)
lemma ren_tr_appt_decompo_right:
"noTick t1 | t2 = <>
==> s [[r]]* (t1 ^^ t2)
= (EX s1 s2. s = s1 ^^ s2 & s1 [[r]]* t1 & s2 [[r]]* t2
& (noTick s1 | s2 = <>))"
apply (rule iffI)
apply (simp add: ren_tr_appt_decompo_right_only_if)
apply (elim conjE exE)
by (auto simp add: ren_tr_appt)
lemmas ren_tr_appt_decompo
= ren_tr_appt_decompo_left ren_tr_appt_decompo_right
(*--------------------*
| <Ev a> ^^ ... |
*--------------------*)
lemma ren_tr_head_decompo[simp]:
"(<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t) = ((a, b) : r & s [[r]]* t)"
apply (insert ren_tr_appt_decompo_right[of "<Ev b>" t "<Ev a> ^^ s" r])
apply (rule iffI)
apply (simp add: ren_tr_one_decompo)
apply (elim conjE exE, simp)
by (simp add: ren_tr_appt_Ev)
(*--------------------*
| ... ^^ [e]t |
*--------------------*)
lemma ren_tr_last_decompo_Ev[simp]:
"[| noTick s ; noTick t |]
==> (s ^^ <Ev a>) [[r]]* (t ^^ <Ev b>) = (s [[r]]* t & (a,b) : r)"
apply (insert ren_tr_appt_decompo_right[of t "<Ev b>" "(s ^^ <Ev a>)" r])
apply (rule iffI)
(* => *)
apply (simp add: ren_tr_one_decompo)
apply (elim conjE exE)
apply (simp)
(* <= *)
apply (simp)
apply (rule_tac x="s" in exI)
apply (rule_tac x="<Ev a>" in exI)
apply (simp)
done
lemma ren_tr_last_decompo_Tick[simp]:
"[| noTick s ; noTick t |]
==> (s ^^ <Tick>) [[r]]* (t ^^ <Tick>) = (s [[r]]* t)"
apply (insert ren_tr_appt_decompo_right[of t "<Tick>" "(s ^^ <Tick>)" r])
by (auto simp add: ren_tr_noTick_right)
(*************************************************************
ren_tr lengtht
*************************************************************)
(*** ren same length ***)
lemma ren_tr_lengtht:
"ALL r s t. s [[r]]* 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)
done
(*************************************************************
ren_tr prefix
*************************************************************)
lemma ren_tr_prefix_lm:
"ALL r u v s. prefix v u & s [[r]]* u
--> (EX t. prefix t s & t [[r]]* v)"
apply (rule allI)
apply (rule allI)
apply (induct_tac u rule: induct_trace)
apply (simp_all)
(* <Ev a> ^^ ... *)
apply (intro allI impI)
apply (elim conjE)
apply (erule disjE, simp)
apply (simp add: ren_tr_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" in exI, simp)
done
(*** rule ***)
lemma ren_tr_prefix:
"[| prefix v u ; s [[r]]* u |] ==> (EX t. prefix t s & t [[r]]* 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]]* u ;
!! t. [| prefix t s ; t [[r]]* v |] ==> R
|] ==> R"
apply (insert ren_tr_prefix[of v u s r])
by (auto)
(*************************************************************
inj --> unique
*************************************************************)
lemma ren_tr_inj_unique_ALL:
"ALL s1 s2. (inj f &
s1 [[{b. EX a. b = (a, f a)}]]* t &
s2 [[{b. EX a. b = (a, f a)}]]* t )
--> s1 = s2"
apply (induct_tac t rule: induct_trace)
apply (simp_all)
apply (intro allI impI)
apply (elim conjE)
apply (simp add: ren_tr_decompo_right)
apply (elim conjE exE)
apply (simp)
apply (drule_tac x="sa" in spec)
apply (drule_tac x="sb" in spec)
apply (simp)
apply (simp add: inj_on_def)
done
lemma ren_tr_inj_unique:
"[| inj f ;
s1 [[{b. EX a. b = (a, f a)}]]* t ;
s2 [[{b. EX a. b = (a, f a)}]]* t |]
==> s1 = s2"
apply (insert ren_tr_inj_unique_ALL[of f t])
apply (simp)
done
(*************************************************************
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]
end
lemma ren_tr_nil:
<> [[r]]* <>
lemma ren_tr_Tick:
<Tick> [[r]]* <Tick>
lemma ren_tr_Ev:
[| s [[r]]* t; (a, b) ∈ r |] ==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)
lemmas ren_tr_intros:
[| s [[r]]* t; (a, b) ∈ r |] ==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)
lemmas ren_tr_intros:
[| s [[r]]* t; (a, b) ∈ r |] ==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)
lemma ren_tr_elims_lm:
[| s [[r]]* t; s = <> ∧ t = <> --> P; s = <Tick> ∧ t = <Tick> --> P; ∀a b s' t'. s' [[r]]* t' ∧ s = <Ev a> ^^ s' ∧ t = <Ev b> ^^ t' ∧ (a, b) ∈ r --> P |] ==> P
lemma ren_tr_elims:
[| s [[r]]* t; [| s = <>; t = <> |] ==> P; [| s = <Tick>; t = <Tick> |] ==> P; !!a b s' t'. [| s' [[r]]* t'; s = <Ev a> ^^ s'; t = <Ev b> ^^ t'; (a, b) ∈ r |] ==> P |] ==> P
lemma ren_tr_nil1:
<> [[r]]* s = (s = <>)
lemma ren_tr_nil2:
s [[r]]* <> = (s = <>)
lemma ren_tr_Tick1:
<Tick> [[r]]* s = (s = <Tick>)
lemma ren_tr_Tick2:
s [[r]]* <Tick> = (s = <Tick>)
lemma ren_tr_decompo_left_only_if:
(<Ev a> ^^ s) [[r]]* u ==> ∃b t. u = <Ev b> ^^ t ∧ (a, b) ∈ r ∧ s [[r]]* t
lemma ren_tr_decompo_left_if:
[| (a, b) ∈ r; s [[r]]* t |] ==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)
lemma ren_tr_decompo_left:
(<Ev a> ^^ s) [[r]]* u = (∃b t. u = <Ev b> ^^ t ∧ (a, b) ∈ r ∧ s [[r]]* t)
lemma ren_tr_decompo_right_only_if:
u [[r]]* (<Ev b> ^^ t) ==> ∃a s. u = <Ev a> ^^ s ∧ (a, b) ∈ r ∧ s [[r]]* t
lemma ren_tr_decompo_right_if:
[| (a, b) ∈ r; s [[r]]* t |] ==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)
lemma ren_tr_decompo_right:
u [[r]]* (<Ev b> ^^ t) = (∃a s. u = <Ev a> ^^ s ∧ (a, b) ∈ r ∧ s [[r]]* t)
lemmas ren_tr_decompo:
(<Ev a> ^^ s) [[r]]* u = (∃b t. u = <Ev b> ^^ t ∧ (a, b) ∈ r ∧ s [[r]]* t)
u [[r]]* (<Ev b> ^^ t) = (∃a s. u = <Ev a> ^^ s ∧ (a, b) ∈ r ∧ s [[r]]* t)
lemmas ren_tr_decompo:
(<Ev a> ^^ s) [[r]]* u = (∃b t. u = <Ev b> ^^ t ∧ (a, b) ∈ r ∧ s [[r]]* t)
u [[r]]* (<Ev b> ^^ t) = (∃a s. u = <Ev a> ^^ s ∧ (a, b) ∈ r ∧ s [[r]]* t)
lemma ren_tr_one:
(a, b) ∈ r ==> <Ev a> [[r]]* <Ev b>
lemma ren_tr_one_decompo_left_only_if:
<Ev a> [[r]]* t ==> ∃b. t = <Ev b> ∧ (a, b) ∈ r
lemma ren_tr_one_decompo_left:
<Ev a> [[r]]* t = (∃b. t = <Ev b> ∧ (a, b) ∈ r)
lemma ren_tr_one_decompo_right_only_if:
s [[r]]* <Ev b> ==> ∃a. s = <Ev a> ∧ (a, b) ∈ r
lemma ren_tr_one_decompo_right:
s [[r]]* <Ev b> = (∃a. s = <Ev a> ∧ (a, b) ∈ r)
lemmas ren_tr_one_decompo:
<Ev a> [[r]]* t = (∃b. t = <Ev b> ∧ (a, b) ∈ r)
s [[r]]* <Ev b> = (∃a. s = <Ev a> ∧ (a, b) ∈ r)
lemmas ren_tr_one_decompo:
<Ev a> [[r]]* t = (∃b. t = <Ev b> ∧ (a, b) ∈ r)
s [[r]]* <Ev b> = (∃a. s = <Ev a> ∧ (a, b) ∈ r)
lemma ren_tr_noTick_left_lm:
∀r s t. s [[r]]* t ∧ noTick s --> noTick t
lemma ren_tr_noTick_left:
[| s [[r]]* t; noTick s |] ==> noTick t
lemma ren_tr_noTick_right_lm:
∀r s t. s [[r]]* t ∧ noTick t --> noTick s
lemma ren_tr_noTick_right:
[| s [[r]]* t; noTick t |] ==> noTick s
lemma ren_tr_appt_noTick_lm:
∀r s1 s2 t1 t2. s1 [[r]]* t1 ∧ s2 [[r]]* t2 ∧ noTick s1 ∧ noTick t1 --> (s1 ^^ s2) [[r]]* (t1 ^^ t2)
lemma ren_tr_appt:
[| s1.0 [[r]]* t1.0; s2.0 [[r]]* t2.0; noTick s1.0 ∨ noTick t1.0 ∨ s2.0 = <> ∨ t2.0 = <> |] ==> (s1.0 ^^ s2.0) [[r]]* (t1.0 ^^ t2.0)
lemma ren_tr_appt_Ev:
[| (a, b) ∈ r; s [[r]]* t |] ==> (<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t)
lemma ren_tr_appt_decompo_left_only_if_lm:
∀r s1 s2 t. (s1 ^^ s2) [[r]]* t ∧ (noTick s1 ∨ s2 = <>) --> (∃t1 t2. t = t1 ^^ t2 ∧ s1 [[r]]* t1 ∧ s2 [[r]]* t2 ∧ (noTick t1 ∨ t2 = <>))
lemma ren_tr_appt_decompo_left_only_if:
[| (s1.0 ^^ s2.0) [[r]]* t; noTick s1.0 ∨ s2.0 = <> |] ==> ∃t1 t2. t = t1 ^^ t2 ∧ s1.0 [[r]]* t1 ∧ s2.0 [[r]]* t2 ∧ (noTick t1 ∨ t2 = <>)
lemma ren_tr_appt_decompo_left:
noTick s1.0 ∨ s2.0 = <> ==> (s1.0 ^^ s2.0) [[r]]* t = (∃t1 t2. t = t1 ^^ t2 ∧ s1.0 [[r]]* t1 ∧ s2.0 [[r]]* t2 ∧ (noTick t1 ∨ t2 = <>))
lemma ren_tr_appt_decompo_right_only_if_lm:
∀r t1 t2 s. s [[r]]* (t1 ^^ t2) ∧ (noTick t1 ∨ t2 = <>) --> (∃s1 s2. s = s1 ^^ s2 ∧ s1 [[r]]* t1 ∧ s2 [[r]]* t2 ∧ (noTick s1 ∨ s2 = <>))
lemma ren_tr_appt_decompo_right_only_if:
[| s [[r]]* (t1.0 ^^ t2.0); noTick t1.0 ∨ t2.0 = <> |] ==> ∃s1 s2. s = s1 ^^ s2 ∧ s1 [[r]]* t1.0 ∧ s2 [[r]]* t2.0 ∧ (noTick s1 ∨ s2 = <>)
lemma ren_tr_appt_decompo_right:
noTick t1.0 ∨ t2.0 = <> ==> s [[r]]* (t1.0 ^^ t2.0) = (∃s1 s2. s = s1 ^^ s2 ∧ s1 [[r]]* t1.0 ∧ s2 [[r]]* t2.0 ∧ (noTick s1 ∨ s2 = <>))
lemmas ren_tr_appt_decompo:
noTick s1.0 ∨ s2.0 = <> ==> (s1.0 ^^ s2.0) [[r]]* t = (∃t1 t2. t = t1 ^^ t2 ∧ s1.0 [[r]]* t1 ∧ s2.0 [[r]]* t2 ∧ (noTick t1 ∨ t2 = <>))
noTick t1.0 ∨ t2.0 = <> ==> s [[r]]* (t1.0 ^^ t2.0) = (∃s1 s2. s = s1 ^^ s2 ∧ s1 [[r]]* t1.0 ∧ s2 [[r]]* t2.0 ∧ (noTick s1 ∨ s2 = <>))
lemmas ren_tr_appt_decompo:
noTick s1.0 ∨ s2.0 = <> ==> (s1.0 ^^ s2.0) [[r]]* t = (∃t1 t2. t = t1 ^^ t2 ∧ s1.0 [[r]]* t1 ∧ s2.0 [[r]]* t2 ∧ (noTick t1 ∨ t2 = <>))
noTick t1.0 ∨ t2.0 = <> ==> s [[r]]* (t1.0 ^^ t2.0) = (∃s1 s2. s = s1 ^^ s2 ∧ s1 [[r]]* t1.0 ∧ s2 [[r]]* t2.0 ∧ (noTick s1 ∨ s2 = <>))
lemma ren_tr_head_decompo:
(<Ev a> ^^ s) [[r]]* (<Ev b> ^^ t) = ((a, b) ∈ r ∧ s [[r]]* t)
lemma ren_tr_last_decompo_Ev:
[| noTick s; noTick t |] ==> (s ^^ <Ev a>) [[r]]* (t ^^ <Ev b>) = (s [[r]]* t ∧ (a, b) ∈ r)
lemma ren_tr_last_decompo_Tick:
[| noTick s; noTick t |] ==> (s ^^ <Tick>) [[r]]* (t ^^ <Tick>) = s [[r]]* t
lemma ren_tr_lengtht:
∀r s t. s [[r]]* t --> lengtht s = lengtht t
lemma ren_tr_prefix_lm:
∀r u v s. prefix v u ∧ s [[r]]* u --> (∃t. prefix t s ∧ t [[r]]* v)
lemma ren_tr_prefix:
[| prefix v u; s [[r]]* u |] ==> ∃t. prefix t s ∧ t [[r]]* v
lemma ren_tr_prefixE:
[| prefix v u; s [[r]]* u; !!t. [| prefix t s; t [[r]]* v |] ==> R |] ==> R
lemma ren_tr_inj_unique_ALL:
∀s1 s2. inj f ∧ s1 [[{b. ∃a. b = (a, f a)}]]* t ∧ s2 [[{b. ∃a. b = (a, f a)}]]* t --> s1 = s2
lemma ren_tr_inj_unique:
[| inj f; s1.0 [[{b. ∃a. b = (a, f a)}]]* t; s2.0 [[{b. ∃a. b = (a, f a)}]]* t |] ==> s1.0 = s2.0
lemma ren_inv_sub_Evset:
[[r]]inv Evset ⊆ Evset
lemma ren_inv_sub:
X ⊆ Y ==> [[r]]inv X ⊆ [[r]]inv Y
lemma ren_inv_Un:
[[r]]inv (X ∪ Y) = [[r]]inv X ∪ [[r]]inv Y
lemma ren_inv_no_Tick:
([[r]]inv X ⊆ Evset) = (X ⊆ Evset)