Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  Tau_Sim.thy   Sprache: Isabelle

 

(* 
   Title: Psi-calculi   
   Author/Maintainer: Jesper Bengtson (jebe@itu.dk), 2012
*)

theory Tau_Sim
  imports Tau Sum
begin

nominal_datatype 'a prefix =
  pInput "'a::fs_name" "name list" 'a
| pOutput 'a 'a                           
| pTau                                    

context tau
begin

nominal_primrec bindPrefix :: "'a prefix → ('a, 'b, 'c) psi → ('a, 'b, 'c) psi"  (‹_⋅_› [100, 100] 100)
where
  "bindPrefix (pInput M xvec N) P = M(λ*xvec N).P"
| "bindPrefix (pOutput M N) P = M⟨N⟩.P"
| "bindPrefix (pTau) P = τ.(P)"
by(rule TrueI)+

lemma bindPrefixEqvt[eqvt]:
  fixes p :: "name prm"
  and   α :: "'a prefix"
  and   P :: "('a, 'b, 'c) psi"

  shows "(p ∙ (α⋅P)) = (p ∙ α)⋅(p ∙ P)"
by(nominal_induct α rule: prefix.strong_inducts) (auto simp add: eqvts)

lemma prefixCases[consumes 1, case_names cInput cOutput cTau]:
  fixes Ψ :: 'b
  and   α  :: "'a prefix"
  and   P  :: "('a, 'b, 'c) psi"
  and   β  :: "'a action"
  and   P' :: "('a, 'b, 'c) psi"

  assumes "Ψ ⊳ α⋅P ⟼β ≺ P'"
  and     rInput: "∧M xvec N K Tvec. [Ψ ⊨ M ↔ K; set xvec ⊆ supp N; length xvec = length Tvec; distinct xvec] ==>
                                       Prop (pInput M xvec N) (K(N[xvec::=Tvec])) (P[xvec::=Tvec])"
  and     rOutput: "∧M N K. Ψ ⊨ M ↔ K ==> Prop (pOutput M N) (K⟨N⟩) P"
  and     rTau: "Ψ ⊳ P ∼ P' ==> Prop (pTau) (τ) P'"

  shows "Prop α β P'"
using ‹Ψ ⊳ α⋅P ⟼β ≺ P'›
proof(nominal_induct rule: prefix.strong_induct)
  case(pInput M xvec N)
  from ‹Ψ ⊳ (pInput M xvec N)⋅P ⟼β ≺ P'› have "Ψ ⊳ M(λ*xvec N).P ⟼β ≺ P'" by simp
  thus ?case by(auto elim: inputCases intro: rInput)
next
  case(pOutput M N)
  from ‹Ψ ⊳ (pOutput M N)⋅P ⟼β ≺ P'› have "Ψ ⊳ M⟨N⟩.P ⟼β ≺ P'" by simp
  thus ?case by(auto elim: outputCases intro: rOutput)
next
  case pTau
  from ‹Ψ ⊳ (pTau)⋅P ⟼β ≺ P'› have "Ψ ⊳ τ.(P) ⟼β ≺ P'" by simp
  thus ?case
    by(nominal_induct rule: action.strong_induct) (auto dest: tauActionE intro: rTau)
qed  
  
lemma prefixTauCases[consumes 1, case_names cTau]:
  fixes α  :: "'a prefix"
  and   P  :: "('a, 'b, 'c) psi"
  and   P' :: "('a, 'b, 'c) psi"

  assumes "Ψ ⊳ α⋅P ⟼τ ≺ P'"
  and     rTau: "Ψ ⊳ P ∼ P' ==> Prop (pTau) P'"

  shows "Prop α P'"
proof -
  from ‹Ψ ⊳ α⋅P ⟼τ ≺ P'› obtain β where "Ψ ⊳ α⋅P ⟼β ≺ P'" and "β = τ" 
    by auto
  thus ?thesis
    by(induct rule: prefixCases) (auto intro: rTau)
qed

lemma hennessySim1:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"

  assumes "Ψ ⊳ P ↝<Rel> Q"
  and     C1: "∧Ψ P Q R. [Ψ ⊳ P ∼ Q; (Ψ, Q, R) ∈ Rel] ==> (Ψ, P, R) ∈ Rel"

  shows "Ψ ⊳ τ.(P) ↝«Rel¬ Q"
proof(induct rule: weakCongSimI)
  case(cTau Q')
  from ‹Ψ ⊳ P ↝🚫 Q› ‹Ψ ⊳ Q ⟼τ ≺ Q'›
  obtain P' where PChain: "Ψ ⊳ P ==>^\<tau> P'" and P'RelQ': "(Ψ, P', Q') ∈ Rel"
    by(blast dest: weakSimE)

  from PChain obtain P'' where "Ψ ⊳ τ.(P) ==>\<tau> P''" and "Ψ ⊳ P' ∼ P''"
    by(rule tauChainStepCons)
  thus ?case using P'RelQ' by(metis bisimE C1)
qed

lemma hennessySim2:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"

  assumes PTrans: "Ψ ⊳ P ⟼τ ≺ P'"
  and     P'RelQ: "(Ψ, P', Q) ∈ Rel"
  and     C1: "∧Ψ P Q R. [(Ψ, P, Q) ∈ Rel; Ψ ⊳ Q ∼ R] ==> (Ψ, P, R) ∈ Rel"

  shows "Ψ ⊳ P ↝«Rel¬ τ.(Q)"
proof(induct rule: weakCongSimI)
  case(cTau Q')
  from ‹Ψ ⊳ τ.(Q) ⟼τ ≺ Q'› have "Ψ ⊳ Q ∼ Q'" by(blast dest: tauActionE)
  with PTrans P'RelQ show ?case by(metis C1 tauActTauStepChain)
qed

lemma hennessySim3:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"

  assumes "Ψ ⊳ P ↝<Rel> Q"
  and     C1: "∧Q'. Ψ ⊳ Q ⟼τ ≺ Q' ==> (Ψ, P, Q') ∉ Rel"

  shows "Ψ ⊳ P ↝«Rel¬ Q"
proof(induct rule: weakCongSimI)
  case(cTau Q')
  from ‹Ψ ⊳ P ↝🚫 Q› ‹Ψ ⊳ Q ⟼τ ≺ Q'›
  obtain P' where PChain: "Ψ ⊳ P ==>^\<tau> P'" and P'RelQ': "(Ψ, P', Q') ∈ Rel"
    by(blast dest: weakSimE)
  with C1 ‹Ψ ⊳ Q ⟼τ ≺ Q'› show ?case 
    by(force simp add: rtrancl_eq_or_trancl)
qed

lemma tauLaw1SimLeft:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"

  assumes "Ψ ⊳ P ↝<Rel> Q"
  and     "eqvt Rel"
  and     C1: "∧Ψ P Q R. [Ψ ⊳ P ∼ Q; (Ψ, Q, R) ∈ Rel] ==> (Ψ, P, R) ∈ Rel"

  shows "Ψ ⊳ τ.(P) ↝<Rel> Q"
proof(induct rule: weakSimI2)
  case(cAct Ψ' α Q')
  from ‹bn α ♯* (τ.(P))› have "bn α ♯* P" by simp
  with ‹Ψ ⊳ P ↝🚫 Q› ‹Ψ ⊳ Q ⟼α ≺ Q'› ‹bn α ♯* Ψ› ‹α ≠ τ›
  obtain P'' P' where PTrans: "Ψ : Q ⊳ P ==>α ≺ P''" and P''Chain: "Ψ ⊗ Ψ' ⊳ P'' ==>^\<tau> P'"
                  and P'RelQ': "(Ψ ⊗ Ψ', P', Q') ∈ Rel"
    by(blast dest: weakSimE)

  from PTrans ‹bn α ♯* Ψ› ‹bn α ♯* P› obtain P''' where "Ψ : Q ⊳ τ.(P) ==>α ≺ P'''" and "Ψ ⊳ P'' ∼ P'''"
    by(rule weakTransitionTau)
  moreover from ‹Ψ ⊳ P'' ∼ P'''› have "Ψ ⊗ Ψ' ⊳ P'' ∼ P'''" by(rule bisimE)
  with P''Chain obtain P'''' where "Ψ ⊗ Ψ' ⊳ P''' ==>^\<tau> P''''" and "Ψ ⊗ Ψ' ⊳ P' ∼ P''''"
    by(rule tauChainBisim)
  ultimately show ?case using ‹(Ψ ⊗ Ψ', P', Q') ∈ Rel› by(metis bisimE C1)
next
  case(cTau Q')
  from ‹Ψ ⊳ P ↝🚫 Q› ‹Ψ ⊳ Q ⟼τ ≺ Q'›
  obtain P' where PChain: "Ψ ⊳ P ==>^\<tau> P'" and P'RelQ': "(Ψ, P', Q') ∈ Rel"
    by(blast dest: weakSimE)

  from PChain obtain P'' where "Ψ ⊳ τ.(P) ==>^\<tau> P''" and "Ψ ⊳ P' ∼ P''"
    by(rule tauChainCons)
  thus ?case using P'RelQ' by(metis bisimE C1)  
qed

lemma tauLaw1SimRight:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"

  assumes "eqvt Rel"
  and     "(Ψ, P, Q) ∈ Rel"
  and     C1: "∧Ψ P Q R. [(Ψ, P, Q) ∈ Rel; Ψ ⊳ Q ∼ R] ==> (Ψ, P, R) ∈ Rel"

  shows "Ψ ⊳ P ↝<Rel> τ.(Q)"
using ‹eqvt Rel›
proof(induct rule: weakSimI[where C=Q])
  case(cAct Ψ' α Q')
  hence False by(cases rule: actionCases[where α=α]) auto
  thus ?case by simp
next
  case(cTau Q')
  have "Ψ ⊳ Q ==>^\<tau> Q" by simp
  moreover from ‹Ψ ⊳ τ.(Q) ⟼τ ≺ Q'› have "Ψ ⊳ Q ∼ Q'" by(rule tauActionE)
  with ‹(Ψ, P, Q) ∈ Rel› have "(Ψ, P, Q') ∈ Rel" by(rule C1)
  ultimately show ?case by blast
qed

lemma tauLaw3SimLeft:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"
  and   α :: "'a prefix"

  assumes "eqvt Rel"
  and     "(Ψ, P, Q) ∈ Rel"
  and     Subst: "∧xvec Tvec. length xvec = length Tvec ==> (Ψ, P[xvec::=Tvec], Q[xvec::=Tvec]) ∈ Rel"
  and     C1: "∧Ψ P Q R S. [Ψ ⊳ P ∼ Q; (Ψ, Q, R) ∈ Rel; Ψ ⊳ R ∼ S] ==> (Ψ, P, S) ∈ Rel"
  and     rExt: "∧Ψ P Q Ψ'. (Ψ, P, Q) ∈ Rel ==> (Ψ ⊗ Ψ', P, Q) ∈ Rel"

  shows "Ψ ⊳ α⋅(τ.(P)) ↝<Rel> α⋅Q"
using ‹eqvt Rel›
proof(induct rule: weakSimI[where C=Q])
  case(cAct Ψ' β Q')
  from ‹Ψ ⊳ α⋅Q ⟼β ≺ Q'› ‹β ≠ τ› show ?case
  proof(induct rule: prefixCases)
    case(cInput M xvec N K Tvec)
    note ‹Ψ ⊨ M ↔ K› ‹distinct xvec› ‹set xvec ⊆ supp N› ‹length xvec = length Tvec›
    moreover have "insertAssertion (extractFrame(M(λ*xvec N).Q)) Ψ ↪F ⟨ε, Ψ ⊗ 1⟩" by auto
    ultimately have "Ψ : (M(λ*xvec N).Q) ⊳ (M(λ*xvec N).(τ.(P))) ==>K((N[xvec::=Tvec])) ≺ (τ.(P))[xvec::=Tvec]" 
      by(rule weakInput)
    hence "Ψ : (M(λ*xvec N).Q) ⊳ (M(λ*xvec N).(τ.(P))) ==>K((N[xvec::=Tvec])) ≺ τ.(P[xvec::=Tvec])"
      using ‹length xvec = length Tvec› ‹distinct xvec›
      by simp
      
    moreover obtain P' where PTrans: "Ψ ⊗ Ψ' ⊳ τ.(P[xvec::=Tvec]) ⟼τ ≺ P'" and "Ψ ⊗ Ψ' ⊳ (P[xvec::=Tvec]) ∼ P'" using tauActionI
      by auto
    from PTrans have "Ψ ⊗ Ψ' ⊳ τ.(P[xvec::=Tvec]) ==>^\<tau> P'" by(rule tauActTauChain)
    moreover from ‹length xvec = length Tvec› have "(Ψ, P[xvec::=Tvec], Q[xvec::=Tvec]) ∈ Rel" by(rule Subst)
    hence "(Ψ ⊗ Ψ', P[xvec::=Tvec], Q[xvec::=Tvec]) ∈ Rel" by(rule rExt)
    with ‹Ψ ⊗ Ψ' ⊳ P[xvec::=Tvec] ∼ P'› have "(Ψ ⊗ Ψ', P', Q[xvec::=Tvec]) ∈ Rel" by(blast intro: bisimE C1 bisimReflexive)
    ultimately show ?case by fastforce
  next
    case(cOutput M N K)
    note ‹Ψ ⊨ M ↔ K›
    moreover have "insertAssertion (extractFrame (M⟨N⟩.Q)) Ψ ↪F ⟨ε, Ψ ⊗ 1⟩" by auto
    ultimately have "Ψ : M⟨N⟩.Q ⊳ M⟨N⟩.(τ.(P)) ==>K⟨N⟩ ≺ τ.(P)" by(rule weakOutput)
    moreover obtain P' where PTrans: "Ψ ⊗ Ψ' ⊳ τ.(P) ⟼τ ≺ P'" and "Ψ ⊗ Ψ' ⊳ P ∼ P'" using tauActionI
      by auto
    from PTrans have "Ψ ⊗ Ψ' ⊳ τ.(P) ==>^\<tau> P'" by(rule tauActTauChain)
    moreover from ‹(Ψ, P, Q) ∈ Rel› have "(Ψ ⊗ Ψ', P, Q) ∈ Rel" by(rule rExt)
    with ‹Ψ ⊗ Ψ' ⊳ P ∼ P'› have "(Ψ ⊗ Ψ', P', Q) ∈ Rel" by(blast intro: bisimE C1 bisimReflexive)
    ultimately show ?case by fastforce
  next
    case cTau
    with ‹τ ≠ τ› show ?case
      by simp
  qed
next
  case(cTau Q')
  from ‹Ψ ⊳ α⋅Q ⟼τ ≺ Q'› show ?case
  proof(induct rule: prefixTauCases)
    case cTau
    obtain P' where tPTrans: "Ψ ⊳ τ.(τ.(P)) ⟼τ ≺ P'" and "Ψ ⊳ τ.(P) ∼ P'" using tauActionI
      by auto
    obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
      by auto
    from PTrans ‹Ψ ⊳ τ.(P) ∼ P'› obtain P''' where P'Trans: "Ψ ⊳ P' ⟼τ ≺ P'''" and "Ψ ⊳ P'' ∼ P'''"
      apply(drule_tac bisimE(4))
      apply(drule_tac bisimE(2))
      apply(drule_tac simE, auto)
      by(metis bisimE)
    from tPTrans P'Trans have "Ψ ⊳ τ.(τ.(P)) ==>^\<tau> P'''" by(fastforce dest: tauActTauChain)
    moreover from ‹(Ψ, P, Q) ∈ Rel› ‹Ψ ⊳ P ∼ P''› ‹Ψ ⊳ P'' ∼ P'''› ‹Ψ ⊳ Q ∼ Q'› have "(Ψ, P''', Q') ∈ Rel"
      by(metis bisimTransitive C1 bisimSymmetric)
    ultimately show ?case by fastforce
  qed
qed

lemma tauLaw3SimRight:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"

  assumes "eqvt Rel"
  and     Subst: "∧Ψ xvec Tvec. length xvec = length Tvec ==> (Ψ, P[xvec::=Tvec], τ.(Q[xvec::=Tvec])) ∈ Rel"
  and     C1: "∧Ψ P Q R S. [Ψ ⊳ P ∼ Q; (Ψ, Q, R) ∈ Rel; Ψ ⊳ R ∼ S] ==> (Ψ, P, S) ∈ Rel"
  and     "∧Ψ. (Ψ, P, τ.(Q)) ∈ Rel"

  shows "Ψ ⊳ α⋅P ↝<Rel> α⋅(τ.(Q))"
using ‹eqvt Rel›
proof(induct rule: weakSimI[where C=Q])
  case(cAct Ψ' β Q')
  from ‹Ψ ⊳ α⋅(τ.(Q)) ⟼β ≺ Q'› ‹β ≠ τ›
  show ?case
  proof(induct rule: prefixCases)
    case(cInput M xvec N K Tvec)
    note ‹Ψ ⊨ M ↔ K› ‹distinct xvec› ‹set xvec ⊆ supp N› ‹length xvec=length Tvec›
    moreover have "insertAssertion (extractFrame (M(λ*xvec N).(τ.(Q)))) Ψ ↪F ⟨ε, Ψ ⊗ 1⟩" by auto
    ultimately have "Ψ : (M(λ*xvec N).(τ.(Q))) ⊳ M(λ*xvec N).P ==>K((N[xvec::=Tvec])) ≺ P[xvec::=Tvec]"
      by(rule weakInput)
    moreover have "Ψ ⊗ Ψ' ⊳ P[xvec::=Tvec] ==>^\<tau> P[xvec::=Tvec]" by auto
    ultimately show ?case using Subst ‹length xvec=length Tvec› ‹distinct xvec›
      by fastforce
  next
    case(cOutput M N K)
    note ‹Ψ ⊨ M ↔ K›
    moreover have "insertAssertion (extractFrame (M⟨N⟩.(τ.(Q)))) Ψ ↪F ⟨ε, Ψ ⊗ 1⟩" by auto
    ultimately have "Ψ : M⟨N⟩.(τ.(Q)) ⊳ M⟨N⟩.P ==>K⟨N⟩ ≺ P" by(rule weakOutput)
    moreover have "Ψ ⊗ Ψ' ⊳ P ==>^\<tau> P" by auto
    ultimately show ?case using ‹(Ψ ⊗ Ψ', P, τ.(Q)) ∈ Rel› by fastforce
  next
    case cTau
    with ‹τ ≠ τ› show ?case by simp
  qed
next
  case(cTau Q')
  from ‹Ψ ⊳ α⋅(τ.(Q)) ⟼τ ≺ Q'› show ?case
  proof(induct rule: prefixTauCases)
    case cTau
    obtain P' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P'" and "Ψ ⊳ P ∼ P'" using tauActionI
      by auto
    from PTrans have "Ψ ⊳ τ.(P) ==>^\<tau> P'" by(rule tauActTauChain)
    moreover from ‹Ψ ⊳ P ∼ P'› ‹Ψ ⊳ τ.(Q) ∼ Q'›  ‹(Ψ, P, τ.(Q)) ∈ Rel›
    have "(Ψ, P', Q') ∈ Rel" by(metis bisimTransitive bisimSymmetric C1)
    ultimately show ?case by fastforce
  qed
qed

lemma tauLaw3CongSimLeft:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"

  assumes "(Ψ, P, Q) ∈ Rel"
  and     C1: "∧Ψ P Q R S. [Ψ ⊳ P ∼ Q; (Ψ, Q, R) ∈ Rel; Ψ ⊳ R ∼ S] ==> (Ψ, P, S) ∈ Rel"
  and     rExt: "∧Ψ P Q Ψ'. (Ψ, P, Q) ∈ Rel ==> (Ψ ⊗ Ψ', P, Q) ∈ Rel"

  shows "Ψ ⊳ α⋅(τ.(P)) ↝«Rel¬ α⋅Q"
proof(induct rule: weakCongSimI)
  case(cTau Q')
  from ‹Ψ ⊳ α⋅Q ⟼τ ≺ Q'› show ?case
  proof(induct rule: prefixTauCases)
    case cTau
    obtain P' where tPTrans: "Ψ ⊳ τ.(τ.(P)) ⟼τ ≺ P'" and "Ψ ⊳ τ.(P) ∼ P'" using tauActionI
      by auto
    obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
      by auto
    from PTrans ‹Ψ ⊳ τ.(P) ∼ P'› obtain P''' where P'Trans: "Ψ ⊳ P' ⟼τ ≺ P'''" and "Ψ ⊳ P'' ∼ P'''"
      apply(drule_tac bisimE(4))
      apply(drule_tac bisimE(2))
      apply(drule_tac simE, auto)
      by(metis bisimE)
    from tPTrans P'Trans have "Ψ ⊳ τ.(τ.(P)) ==>\<tau> P'''" by(fastforce dest: tauActTauStepChain)
    moreover from ‹(Ψ, P, Q) ∈ Rel› ‹Ψ ⊳ P ∼ P''› ‹Ψ ⊳ P'' ∼ P'''› ‹Ψ ⊳ Q ∼ Q'› have "(Ψ, P''', Q') ∈ Rel"
      by(metis bisimTransitive C1 bisimSymmetric)
    ultimately show ?case by fastforce
  qed
qed

lemma tauLaw3CongSimRight:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"

  assumes "(Ψ, P, Q) ∈ Rel"
  and     C1: "∧Ψ P Q R S. [Ψ ⊳ P ∼ Q; (Ψ, Q, R) ∈ Rel; Ψ ⊳ R ∼ S] ==> (Ψ, P, S) ∈ Rel"
  and     "∧Ψ. (Ψ, P, τ.(Q)) ∈ Rel"

  shows "Ψ ⊳ α⋅P ↝«Rel¬ α⋅(τ.(Q))"
proof(induct rule: weakCongSimI)
  case(cTau Q')
  from ‹Ψ ⊳ α⋅(τ.(Q)) ⟼τ ≺ Q'› show ?case
  proof(induct rule: prefixTauCases)
    case cTau
    obtain P' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P'" and "Ψ ⊳ P ∼ P'" using tauActionI
      by auto
    from PTrans have "Ψ ⊳ τ.(P) ==>\<tau> P'" by(rule tauActTauStepChain)
    moreover from ‹Ψ ⊳ P ∼ P'› ‹Ψ ⊳ τ.(Q) ∼ Q'›  ‹(Ψ, P, τ.(Q)) ∈ Rel›
    have "(Ψ, P', Q') ∈ Rel" by(metis bisimTransitive bisimSymmetric C1)
    ultimately show ?case by fastforce
  qed
qed

end

locale tauSum = tau + sum
begin

lemma tauLaw2SimLeft:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"

  assumes Id: "∧Ψ P. (Ψ, P, P) ∈ Rel"
  and     C1: "∧Ψ P Q R S. [Ψ ⊳ P ∼ Q; (Ψ, Q, R) ∈ Rel; Ψ ⊳ R ∼ S] ==> (Ψ, P, S) ∈ Rel"

  shows "Ψ ⊳ P ⊕ τ.(P) ↝<Rel> τ.(P)"
proof(induct rule: weakSimI2)
  case(cAct Ψ' α P')
  thus ?case by(nominal_induct α rule: action.strong_inducts) auto
next
  case(cTau P')
  from ‹Ψ ⊳ τ.(P) ⟼τ ≺ P'› have "Ψ ⊳ P ∼ P'" by(rule tauActionE)
  obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
    by auto
  have "guarded(τ.(P))" by(rule guardedTau)
  with PTrans have "Ψ ⊳ P ⊕ τ.(P) ⟼τ ≺ P''" by(rule Sum2)
  hence "Ψ ⊳ P ⊕ τ.(P) ==>^\<tau> P''" by(rule tauActTauChain)
  moreover from ‹Ψ ⊳ P ∼ P''› ‹(Ψ, P, P) ∈ Rel› ‹Ψ ⊳ P ∼ P'› have "(Ψ, P'', P') ∈ Rel"
    by(metis C1 bisimE)
  ultimately show ?case by blast
qed  

lemma tauLaw2CongSimLeft:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"

  assumes Id: "∧Ψ P. (Ψ, P, P) ∈ Rel"
  and     C1: "∧Ψ P Q R S. [Ψ ⊳ P ∼ Q; (Ψ, Q, R) ∈ Rel; Ψ ⊳ R ∼ S] ==> (Ψ, P, S) ∈ Rel"

  shows "Ψ ⊳ P ⊕ τ.(P) ↝«Rel¬ τ.(P)"
proof(induct rule: weakCongSimI)
  case(cTau P')
  from ‹Ψ ⊳ τ.(P) ⟼τ ≺ P'› have "Ψ ⊳ P ∼ P'" by(rule tauActionE)
  obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
    by auto
  have "guarded(τ.(P))" by(rule guardedTau)
  with PTrans have "Ψ ⊳ P ⊕ τ.(P) ⟼τ ≺ P''" by(rule Sum2)
  hence "Ψ ⊳ P ⊕ τ.(P) ==>\<tau> P''" by(rule tauActTauStepChain)
  moreover from ‹Ψ ⊳ P ∼ P''› ‹(Ψ, P, P) ∈ Rel› ‹Ψ ⊳ P ∼ P'› have "(Ψ, P'', P') ∈ Rel"
    by(metis C1 bisimE)
  ultimately show ?case by blast
qed  

lemma tauLaw2SimRight:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"

  assumes C1: "∧Ψ P Q. Ψ ⊳ P ∼ Q ==> (Ψ, P, Q) ∈ Rel"

  shows "Ψ ⊳ τ.(P) ↝<Rel> P ⊕ τ.(P)"
proof(induct rule: weakSimI2)
  case(cAct Ψ' α P')
  from ‹Ψ ⊳ P ⊕ τ.(P) ⟼α ≺ P'›
  show ?case
  proof(induct rule: sumCases)
    case cSum1 
    obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
      by auto
    from PTrans have "Ψ ⊳ τ.(P) ==>^\<tau> P''" by(rule tauActTauChain)
    moreover from ‹guarded P› have "insertAssertion (extractFrame P) Ψ ≃F ⟨ε, Ψ ⊗ 1⟩"
      by(rule insertGuardedAssertion)
    with ‹Ψ ⊳ P ∼ P''› have "insertAssertion (extractFrame P'') Ψ ≃F ⟨ε, Ψ ⊗ 1⟩"
      by(metis bisimE FrameStatEqTrans FrameStatEqSym)
    hence "insertAssertion (extractFrame(P ⊕ τ.(P))) Ψ ↪F insertAssertion (extractFrame P'') Ψ"
      by(simp add: FrameStatEq_def)
    moreover from PTrans ‹bn α ♯* (τ.(P))› have "bn α ♯* P''" by(rule tauFreshChainDerivative)
    with ‹Ψ ⊳ P ∼ P''› ‹Ψ ⊳ P ⟼α ≺ P'› ‹bn α ♯* Ψ›
    obtain P''' where P''Trans: "Ψ ⊳ P'' ⟼α ≺ P'''" and "Ψ ⊳ P''' ∼ P'"
      by(metis bisimE simE)
    ultimately have "Ψ : (P ⊕ τ.(P)) ⊳ τ.(P) ==>α ≺ P'''"
      by(rule_tac weakTransitionI)
    moreover have "Ψ ⊗ Ψ' ⊳ P''' ==>^\<tau> P'''" by auto
    moreover from ‹Ψ ⊳ P''' ∼ P'› have "Ψ ⊗ Ψ' ⊳ P''' ∼ P'" by(rule bisimE)
    hence "(Ψ ⊗ Ψ', P''', P') ∈ Rel" by(rule C1)
    ultimately show ?case by blast
  next
    case cSum2
    thus ?case using ‹α ≠ τ›
      by(nominal_induct α rule: action.strong_inducts) auto
  qed
next
  case(cTau P')
  from ‹Ψ ⊳ P ⊕ τ.(P) ⟼τ ≺ P'›
  show ?case
  proof(induct rule: sumCases)
    case cSum1 
    obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
      by auto
    moreover from ‹Ψ ⊳ P ∼ P''› ‹Ψ ⊳ P ⟼τ ≺ P'›
    obtain P''' where P''Trans: "Ψ ⊳ P'' ⟼τ ≺ P'''" and "Ψ ⊳ P''' ∼ P'"
      apply(drule_tac bisimE(4))
      apply(drule_tac bisimE(2))
      by(drule_tac simE, auto)
    ultimately have "Ψ ⊳ τ.(P) ==>^\<tau> P'''" by(auto dest: tauActTauChain rtrancl_into_rtrancl)
    moreover from ‹Ψ ⊳ P''' ∼ P'› have "(Ψ, P''', P') ∈ Rel" by(rule C1)
    ultimately show ?case by blast
  next
    case cSum2
    from ‹Ψ ⊳ τ.(P) ⟼τ ≺ P'› have "Ψ ⊳ P ∼ P'" by(rule tauActionE)
    obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
      by auto
    hence "Ψ ⊳ τ.(P) ==>^\<tau> P''" by(rule_tac tauActTauChain)
    moreover from ‹Ψ ⊳ P ∼ P''› ‹Ψ ⊳ P ∼ P'› have "(Ψ, P'', P') ∈ Rel"
      by(metis C1 bisimTransitive bisimE)
    ultimately show ?case by blast
  qed
qed

lemma tauLaw2CongSimRight:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"

  assumes C1: "∧Ψ P Q. Ψ ⊳ P ∼ Q ==> (Ψ, P, Q) ∈ Rel"

  shows "Ψ ⊳ τ.(P) ↝«Rel¬ P ⊕ τ.(P)"
proof(induct rule: weakCongSimI)
  case(cTau P')
  from ‹Ψ ⊳ P ⊕ τ.(P) ⟼τ ≺ P'›
  show ?case
  proof(induct rule: sumCases)
    case cSum1 
    obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
      by auto
    moreover from ‹Ψ ⊳ P ∼ P''› ‹Ψ ⊳ P ⟼τ ≺ P'›
    obtain P''' where P''Trans: "Ψ ⊳ P'' ⟼τ ≺ P'''" and "Ψ ⊳ P''' ∼ P'"
      apply(drule_tac bisimE(4))
      apply(drule_tac bisimE(2))
      by(drule_tac simE) auto
    ultimately have "Ψ ⊳ τ.(P) ==>\<tau> P'''" by(auto dest: tauActTauStepChain trancl_into_trancl)
    moreover from ‹Ψ ⊳ P''' ∼ P'› have "(Ψ, P''', P') ∈ Rel" by(rule C1)
    ultimately show ?case by blast
  next
    case cSum2
    from ‹Ψ ⊳ τ.(P) ⟼τ ≺ P'› have "Ψ ⊳ P ∼ P'" by(rule tauActionE)
    obtain P'' where PTrans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
      by auto
    hence "Ψ ⊳ τ.(P) ==>\<tau> P''" by(rule_tac tauActTauStepChain)
    moreover from ‹Ψ ⊳ P ∼ P''› ‹Ψ ⊳ P ∼ P'› have "(Ψ, P'', P') ∈ Rel"
      by(metis C1 bisimTransitive bisimE)
    ultimately show ?case by blast
  qed
qed

lemma tauLaw4SimLeft:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"
  and   M :: 'a
  and   N :: 'a

  assumes "∧Ψ P. (Ψ, P, P) ∈ Rel"
  and     C1: "∧Ψ P Q. Ψ ⊳ P ∼ Q ==> (Ψ, P, Q) ∈ Rel"

  shows "Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ↝<Rel> α⋅(τ.(P) ⊕ Q)"
proof(induct rule: weakSimI2)
  case(cAct Ψ' β PQ)
  from ‹Ψ ⊳ α⋅(τ.(P) ⊕ Q) ⟼β ≺ PQ› ‹β ≠ τ›
  show ?case
  proof(induct rule: prefixCases)
    case(cInput M xvec N K Tvec)
    have "Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ==>^\<tau> α⋅P ⊕ α⋅(τ.(P) ⊕ Q)" by auto
    moreover have "insertAssertion (extractFrame(α⋅(τ.(P) ⊕ Q))) Ψ ↪F insertAssertion (extractFrame(α⋅P ⊕ α⋅(τ.(P) ⊕ Q))) Ψ"
      using insertTauAssertion Identity
      by(nominal_induct α rule: prefix.strong_inducts, auto) 
        (rule FrameStatImpTrans[where G="⟨ε, Ψ⟩"], auto simp add: FrameStatEq_def AssertionStatEq_def)
    moreover from ‹Ψ ⊨ M ↔ K› ‹distinct xvec› ‹set xvec ⊆ supp N› ‹length xvec=length Tvec›
    have "Ψ ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ⟼K((N[xvec::=Tvec])) ≺ (τ.(P) ⊕ Q)[xvec::=Tvec]"
      by(rule Input)
    hence "Ψ ⊳ (M(λ*xvec N).P) ⊕ M(λ*xvec N).(τ.(P) ⊕ Q) ⟼K((N[xvec::=Tvec])) ≺ (τ.(P) ⊕ Q)[xvec::=Tvec]" 
      by(rule_tac Sum2) auto
    ultimately have "Ψ : (M(λ*xvec N).(τ.(P) ⊕ Q)) ⊳ (M(λ*xvec N).P) ⊕ M(λ*xvec N).(τ.(P) ⊕ Q) ==>K((N[xvec::=Tvec])) ≺ (τ.(P) ⊕ Q)[xvec::=Tvec]"
      by(rule_tac weakTransitionI) auto
    moreover have "Ψ ⊗ Ψ' ⊳ (τ.(P) ⊕ Q)[xvec::=Tvec] ==>^\<tau> (τ.(P) ⊕ Q)[xvec::=Tvec]" by auto
    ultimately show ?case using ‹(Ψ ⊗ Ψ', (τ.(P) ⊕ Q)[xvec::=Tvec], (τ.(P) ⊕ Q)[xvec::=Tvec]) ∈ Rel› by fastforce
  next
    case(cOutput M N K)
    have "Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ==>^\<tau> α⋅P ⊕ α⋅(τ.(P) ⊕ Q)" by auto
    moreover have "insertAssertion (extractFrame(α⋅(τ.(P) ⊕ Q))) Ψ ↪F insertAssertion (extractFrame(α⋅P ⊕ α⋅(τ.(P) ⊕ Q))) Ψ"
      using insertTauAssertion Identity
      by(nominal_induct α rule: prefix.strong_inducts, auto) 
        (rule FrameStatImpTrans[where G="⟨ε, Ψ⟩"], auto simp add: FrameStatEq_def AssertionStatEq_def)

    moreover from ‹Ψ ⊨ M ↔ K› have "Ψ ⊳ M⟨N⟩.(τ.(P) ⊕ Q) ⟼K⟨N⟩ ≺ (τ.(P) ⊕ Q)"
      by(rule Output)
    hence "Ψ ⊳ M⟨N⟩.P ⊕ M⟨N⟩.(τ.(P) ⊕ Q) ⟼K⟨N⟩ ≺ (τ.(P) ⊕ Q)" by(rule_tac Sum2) auto
    ultimately have "Ψ : (M⟨N⟩.(τ.(P) ⊕ Q)) ⊳ M⟨N⟩.P ⊕ M⟨N⟩.(τ.(P) ⊕ Q) ==>K⟨N⟩ ≺ (τ.(P) ⊕ Q)"
      by(rule_tac weakTransitionI) auto
    moreover have "Ψ ⊗ Ψ' ⊳ τ.(P) ⊕ Q ==>^\<tau> τ.(P) ⊕ Q" by auto
    ultimately show ?case using ‹(Ψ ⊗ Ψ', τ.(P) ⊕ Q, τ.(P) ⊕ Q) ∈ Rel› by fastforce
  next
    case cTau
    from ‹τ ≠ τ› show ?case
      by simp
  qed
next
  case(cTau Q')
  from ‹Ψ ⊳ α⋅(τ.(P)) ⊕\⊤ Q ⟼ τ ≺ Q'› show ?case
  proof(induct rule: prefixTauCases)
    case cTau
    obtain P' where PTrans: "Ψ ⊳ τ.(τ.(P) ⊕ Q) ⟼τ ≺ P'" and "Ψ ⊳ τ.(P) ⊕ Q ∼ P'" using tauActionI
      by auto
    from PTrans have "Ψ ⊳ (τ.(P)) ⊕ τ.(τ.(P) ⊕ Q) ⟼τ ≺ P'" by(rule_tac Sum2) (auto intro: guardedTau)
    hence "Ψ ⊳ (τ.(P)) ⊕ τ.(τ.(P) ⊕ Q) ==>^\<tau> P'" by(rule tauActTauChain)
    moreover from ‹Ψ ⊳ τ.(P) ⊕ Q ∼ P'› ‹Ψ ⊳ (τ.(P)) ⊕ Q ∼ Q'› have "Ψ ⊳ P' ∼ Q'" by(metis bisimSymmetric bisimTransitive)
    hence "(Ψ, P', Q') ∈ Rel" by(rule C1)
    ultimately show ?case by fastforce
  qed
qed

lemma tauLaw4CongSimLeft:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"
  and   M :: 'a
  and   N :: 'a

  assumes "∧Ψ P. (Ψ, P, P) ∈ Rel"
  and     C1: "∧Ψ P Q. Ψ ⊳ P ∼ Q ==> (Ψ, P, Q) ∈ Rel"

  shows "Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ↝«Rel¬ α⋅(τ.(P) ⊕ Q)"
proof(induct rule: weakCongSimI)
  case(cTau Q')
  from ‹Ψ ⊳ α⋅(τ.(P)) ⊕\⊤ Q ⟼ τ ≺ Q'› show ?case
  proof(induct rule: prefixTauCases)
    case cTau
    obtain P' where PTrans: "Ψ ⊳ τ.(τ.(P) ⊕ Q) ⟼τ ≺ P'" and "Ψ ⊳ τ.(P) ⊕ Q ∼ P'" using tauActionI
      by auto
    from PTrans have "Ψ ⊳ (τ.(P)) ⊕ τ.(τ.(P) ⊕ Q) ⟼τ ≺ P'" by(rule_tac Sum2) (auto intro: guardedTau)
    hence "Ψ ⊳ (τ.(P)) ⊕ τ.(τ.(P) ⊕ Q) ==>\<tau> P'" by(rule tauActTauStepChain)
    moreover from ‹Ψ ⊳ τ.(P) ⊕ Q ∼ P'› ‹Ψ ⊳ (τ.(P)) ⊕ Q ∼ Q'› have "Ψ ⊳ P' ∼ Q'" by(metis bisimSymmetric bisimTransitive)
    hence "(Ψ, P', Q') ∈ Rel" by(rule C1)
    ultimately show ?case by fastforce
  qed
qed

lemma tauLaw4SimRight:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"
  and   α :: "'a prefix"

  assumes C1: "∧Ψ P Q. Ψ ⊳ P ∼ Q ==> (Ψ, P, Q) ∈ Rel"
  and         "∧Ψ P. (Ψ, P, P) ∈ Rel"

  shows "Ψ ⊳ α⋅(τ.(P) ⊕ Q) ↝<Rel> α⋅P ⊕ α⋅(τ.(P) ⊕ Q)"
proof(induct rule: weakSimI2)
  case(cAct Ψ' β PQ)
  from ‹Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ⟼β ≺ PQ› show ?case
  proof(induct rule: sumCases)
    case cSum1
    from ‹Ψ ⊳ α⋅P ⟼β ≺ PQ› ‹β ≠ τ› show ?case
    proof(induct rule: prefixCases)
      case(cInput M xvec N K Tvec)
      have "Ψ ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ==>^\<tau> M(λ*xvec N).(τ.(P) ⊕ Q)" by auto
      moreover have "insertAssertion (extractFrame((M(λ*xvec N).P) ⊕ M(λ*xvec N).(τ.(P) ⊕ Q))) Ψ ↪F insertAssertion (extractFrame(M(λ*xvec N).(τ.(P) ⊕ Q))) Ψ"
        by auto
      moreover from ‹Ψ ⊨ M ↔ K› ‹distinct xvec› ‹set xvec ⊆ supp N› ‹length xvec = length Tvec›
      have "Ψ ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ⟼K((N[xvec::=Tvec])) ≺ (τ.(P) ⊕ Q)[xvec::=Tvec]" by(rule Input)
      ultimately have "Ψ : ((M(λ*xvec N).P) ⊕ M(λ*xvec N).(τ.(P) ⊕ Q)) ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ==>K((N[xvec::=Tvec]))≺ (τ.(P) ⊕ Q)[xvec::=Tvec]"
        by(rule_tac weakTransitionI) auto
      with ‹length xvec = length Tvec› ‹distinct xvec›
      have "Ψ : ((M(λ*xvec N).P) ⊕ M(λ*xvec N).(τ.(P) ⊕ Q)) ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ==>K((N[xvec::=Tvec])) ≺ (τ.(P[xvec::=Tvec]) ⊕ Q[xvec::=Tvec])"
        by auto
      moreover obtain P' where PTrans: "Ψ ⊗ Ψ' ⊳ τ.(P[xvec::=Tvec]) ⟼τ ≺ P'" and "Ψ ⊗ Ψ' ⊳ P[xvec::=Tvec] ∼ P'" using tauActionI
        by auto
      have "guarded(τ.(P[xvec::=Tvec]))" by(rule guardedTau)
      with PTrans have "Ψ ⊗ Ψ' ⊳ (τ.(P[xvec::=Tvec])) ⊕ (Q[xvec::=Tvec]) ⟼τ ≺ P'" by(rule Sum1)
      hence "Ψ ⊗ Ψ' ⊳ (τ.(P[xvec::=Tvec])) ⊕ (Q[xvec::=Tvec]) ==>^\<tau> P'" by(rule tauActTauChain)
      moreover from ‹Ψ ⊗ Ψ' ⊳ P[xvec::=Tvec] ∼ P'› have "(Ψ ⊗ Ψ', P', P[xvec::=Tvec]) ∈ Rel" by(metis bisimE C1)
      ultimately show ?case by fastforce
    next
      case(cOutput M N K)
      have "Ψ ⊳ M⟨N⟩.(τ.(P) ⊕ Q) ==>^\<tau> M⟨N⟩.(τ.(P) ⊕ Q)" by auto
      moreover have "insertAssertion (extractFrame(M⟨N⟩.P ⊕ M⟨N⟩.(τ.(P) ⊕ Q))) Ψ ↪F insertAssertion (extractFrame(M⟨N⟩.(τ.(P) ⊕ Q))) Ψ"
        by auto
      moreover from ‹Ψ ⊨ M ↔ K› have "Ψ ⊳ M⟨N⟩.(τ.(P) ⊕ Q) ⟼K⟨N⟩ ≺ (τ.(P) ⊕ Q)" by(rule Output)
      ultimately have "Ψ : (M⟨N⟩.P ⊕ M⟨N⟩.(τ.(P) ⊕ Q)) ⊳ M⟨N⟩.(τ.(P) ⊕ Q) ==>K⟨N⟩ ≺ (τ.(P) ⊕ Q)"
        by(rule_tac weakTransitionI) auto
      moreover obtain P' where PTrans: "Ψ ⊗ Ψ' ⊳ τ.(P) ⟼τ ≺ P'" and "Ψ ⊗ Ψ' ⊳ P ∼ P'" using tauActionI
        by auto
      have "guarded(τ.(P))" by(rule guardedTau)
      with PTrans have "Ψ ⊗ Ψ' ⊳ (τ.(P)) ⊕ Q ⟼τ ≺ P'" by(rule Sum1)
      hence "Ψ ⊗ Ψ' ⊳ (τ.(P)) ⊕ Q ==>^\<tau> P'" by(rule tauActTauChain)
      moreover from ‹Ψ ⊗ Ψ' ⊳ P ∼ P'› have "(Ψ ⊗ Ψ', P', P) ∈ Rel" by(metis bisimE C1)
      ultimately show ?case by fastforce 
    next
      case cTau
      from ‹τ ≠ τ› show ?case by simp
    qed
  next
    case cSum2
    from ‹Ψ ⊳ α⋅(τ.(P) ⊕ Q) ⟼β ≺ PQ› ‹β ≠ τ› show ?case
    proof(induct rule: prefixCases)
      case(cInput M xvec N K Tvec)
      have "Ψ ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ==>^\<tau> M(λ*xvec N).(τ.(P) ⊕ Q)" by auto
      moreover have "insertAssertion (extractFrame((M(λ*xvec N).P) ⊕ M(λ*xvec N).(τ.(P) ⊕ Q))) Ψ ↪F insertAssertion (extractFrame(M(λ*xvec N).(τ.(P) ⊕ Q))) Ψ"
        by auto
      moreover from ‹Ψ ⊨ M ↔ K› ‹distinct xvec› ‹set xvec ⊆ supp N› ‹length xvec = length Tvec›
      have "Ψ ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ⟼K((N[xvec::=Tvec])) ≺ (τ.(P) ⊕ Q)[xvec::=Tvec]"
        by(rule Input)
      with ‹length xvec = length Tvec› ‹distinct xvec›
      have "Ψ ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ⟼K((N[xvec::=Tvec])) ≺ (τ.(P[xvec::=Tvec]) ⊕ Q[xvec::=Tvec])"
        by simp
      ultimately have "Ψ : ((M(λ*xvec N).P) ⊕ M(λ*xvec N).(τ.(P) ⊕ Q)) ⊳ M(λ*xvec N).(τ.(P) ⊕ Q) ==>K((N[xvec::=Tvec])) ≺ (τ.(P[xvec::=Tvec]) ⊕ Q[xvec::=Tvec])"
        by(rule_tac weakTransitionI) auto
      moreover have "Ψ ⊗ Ψ' ⊳ τ.(P[xvec::=Tvec]) ⊕ (Q[xvec::=Tvec]) ==>^\<tau> τ.(P[xvec::=Tvec]) ⊕ (Q[xvec::=Tvec])" by auto
      ultimately show ?case using ‹(Ψ ⊗ Ψ', τ.(P[xvec::=Tvec]) ⊕ (Q[xvec::=Tvec]), τ.(P[xvec::=Tvec]) ⊕ (Q[xvec::=Tvec])) ∈ Rel› ‹length xvec = length Tvec› ‹distinct xvec›
        by fastforce
    next
      case(cOutput M N K)
      have "Ψ ⊳ M⟨N⟩.(τ.(P) ⊕ Q) ==>^\<tau> M⟨N⟩.(τ.(P) ⊕ Q)" by auto
      moreover have "insertAssertion (extractFrame(M⟨N⟩.P ⊕ M⟨N⟩.(τ.(P) ⊕ Q))) Ψ ↪F insertAssertion (extractFrame(M⟨N⟩.(τ.(P) ⊕ Q))) Ψ"
        by auto
      moreover from ‹Ψ ⊨ M ↔ K› have "Ψ ⊳ M⟨N⟩.(τ.(P) ⊕ Q) ⟼K⟨N⟩ ≺ (τ.(P) ⊕ Q)"
        by(rule Output)
      ultimately have "Ψ : (M⟨N⟩.P ⊕ M⟨N⟩.(τ.(P) ⊕ Q)) ⊳ M⟨N⟩.(τ.(P) ⊕ Q) ==>K⟨N⟩ ≺ (τ.(P) ⊕ Q)"
        by(rule_tac weakTransitionI) auto
      moreover have "Ψ ⊗ Ψ' ⊳ τ.(P) ⊕ Q ==>^\<tau> τ.(P) ⊕ Q" by auto
      ultimately show ?case using ‹(Ψ ⊗ Ψ', τ.(P) ⊕ Q, τ.(P) ⊕ Q) ∈ Rel› by fastforce
    next
      case cTau
      from ‹τ ≠ τ› show ?case by simp
    qed
  qed
next
  case(cTau PQ)
  from ‹Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ⟼τ ≺ PQ› show ?case
  proof(induct rule: sumCases)
    case cSum1
    from ‹Ψ ⊳ α⋅P ⟼ τ ≺ PQ› show ?case
    proof(induct rule: prefixTauCases)
      case cTau
      obtain P' where PTrans: "Ψ ⊳ τ.((τ.(P)) ⊕ Q) ⟼τ ≺ P'" and "Ψ ⊳ (τ.(P)) ⊕ Q ∼ P'" using tauActionI
        by auto
      obtain P'' where P'Trans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
        by auto
      from P'Trans have "Ψ ⊳ τ.(P) ⊕ Q⟼τ ≺ P''" by(rule_tac Sum1) (auto intro: guardedTau)
      with ‹Ψ ⊳ (τ.(P)) ⊕ Q ∼ P'› obtain P''' where P''Trans: "Ψ ⊳ P' ⟼τ ≺ P'''" and "Ψ ⊳ P'' ∼ P'''"
        apply(drule_tac bisimE(4))
        apply(drule_tac bisimE(2))
        apply(drule_tac simE)
        by(auto dest: bisimE)
      from PTrans P''Trans have "Ψ ⊳ τ.((τ.(P)) ⊕ Q) ==>^\<tau> P'''" by(fastforce dest: tauActTauChain)
      moreover from ‹Ψ ⊳ P ∼ PQ› ‹Ψ ⊳ P'' ∼ P'''› ‹Ψ ⊳ P ∼ P''› have "Ψ ⊳ P''' ∼ PQ"
        by(metis bisimSymmetric bisimTransitive)
      hence "(Ψ, P''', PQ) ∈ Rel" by(rule C1)
      ultimately show ?case by fastforce
    qed
  next
    case cSum2
    from ‹Ψ ⊳ α⋅((τ.(P)) ⊕ Q) ⟼τ ≺ PQ› show ?case
    proof(induct rule: prefixTauCases)
      case cTau
      obtain P' where PTrans: "Ψ ⊳ τ.((τ.(P)) ⊕ Q) ⟼τ ≺ P'" and "Ψ ⊳ (τ.(P)) ⊕ Q ∼ P'" using tauActionI
        by auto
      from PTrans have "Ψ ⊳ τ.((τ.(P)) ⊕ Q) ==>^\<tau> P'" by(rule tauActTauChain)
      moreover from ‹Ψ ⊳ (τ.(P)) ⊕ Q ∼ P'› ‹Ψ ⊳ τ.(P) ⊕ Q ∼ PQ› have "Ψ ⊳ P' ∼ PQ"
        by(metis bisimSymmetric bisimTransitive)
      hence "(Ψ, P', PQ) ∈ Rel" by(rule C1)
      ultimately show ?case by fastforce
    qed
  qed
qed

lemma tauLaw4CongSimRight:
  fixes Ψ :: 'b
  and   P :: "('a, 'b, 'c) psi"
  and   Q :: "('a, 'b, 'c) psi"
  and   α :: "'a prefix"

  assumes C1: "∧Ψ P Q. Ψ ⊳ P ∼ Q ==> (Ψ, P, Q) ∈ Rel"

  shows "Ψ ⊳ α⋅(τ.(P) ⊕ Q) ↝«Rel¬ α⋅P ⊕ α⋅(τ.(P) ⊕ Q)"
proof(induct rule: weakCongSimI)
  case(cTau PQ)
  from ‹Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ⟼τ ≺ PQ› show ?case
  proof(induct rule: sumCases)
    case cSum1
    from ‹Ψ ⊳ α⋅P ⟼ τ ≺ PQ› show ?case
    proof(induct rule: prefixTauCases)
      case cTau
      obtain P' where PTrans: "Ψ ⊳ τ.((τ.(P)) ⊕ Q) ⟼τ ≺ P'" and "Ψ ⊳ (τ.(P)) ⊕ Q ∼ P'" using tauActionI
        by auto
      obtain P'' where P'Trans: "Ψ ⊳ τ.(P) ⟼τ ≺ P''" and "Ψ ⊳ P ∼ P''" using tauActionI
        by auto
      from P'Trans have "Ψ ⊳ τ.(P) ⊕ Q⟼τ ≺ P''" by(rule_tac Sum1) (auto intro: guardedTau)
      with ‹Ψ ⊳ (τ.(P)) ⊕ Q ∼ P'› obtain P''' where P''Trans: "Ψ ⊳ P' ⟼τ ≺ P'''" and "Ψ ⊳ P'' ∼ P'''"
        apply(drule_tac bisimE(4))
        apply(drule_tac bisimE(2))
        apply(drule_tac simE)
        by(auto dest: bisimE)
      from PTrans P''Trans have "Ψ ⊳ τ.((τ.(P)) ⊕ Q) ==>\<tau> P'''" by(fastforce dest: tauActTauStepChain)
      moreover from ‹Ψ ⊳ P ∼ PQ› ‹Ψ ⊳ P'' ∼ P'''› ‹Ψ ⊳ P ∼ P''› have "Ψ ⊳ P''' ∼ PQ"
        by(metis bisimSymmetric bisimTransitive)
      hence "(Ψ, P''', PQ) ∈ Rel" by(rule C1)
      ultimately show ?case by fastforce
    qed
  next
    case cSum2
    from ‹Ψ ⊳ α⋅((τ.(P)) ⊕ Q) ⟼τ ≺ PQ› show ?case
    proof(induct rule: prefixTauCases)
      case cTau
      obtain P' where PTrans: "Ψ ⊳ τ.((τ.(P)) ⊕ Q) ⟼τ ≺ P'" and "Ψ ⊳ (τ.(P)) ⊕ Q ∼ P'" using tauActionI
        by auto
      from PTrans have "Ψ ⊳ τ.((τ.(P)) ⊕ Q) ==>\<tau> P'" by(rule tauActTauStepChain)
      moreover from ‹Ψ ⊳ (τ.(P)) ⊕ Q ∼ P'› ‹Ψ ⊳ τ.(P) ⊕ Q ∼ PQ› have "Ψ ⊳ P' ∼ PQ"
        by(metis bisimSymmetric bisimTransitive)
      hence "(Ψ, P', PQ) ∈ Rel" by(rule C1)
      ultimately show ?case by fastforce
    qed
  qed
qed

end

end

Messung V0.5 in Prozent
C=79 H=96 G=87

¤ Dauer der Verarbeitung: 0.22 Sekunden  (vorverarbeitet am  2026-09-28) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1126438
#Domains=1897691