Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/Archive-of-Formal-Proofs/thys/Psi_Calculi/   (Sammlung formaler Beweise Version 2026-5©)  Datei vom 31.4.2026 mit Größe 68 kB image not shown  

Quelle  Sim_Pres.thy

  Sprache: Isabelle
 

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

theory Sim_Pres
  imports Simulation
begin

context env begin

lemma inputPres:
  fixes Ψ    :: 'b
  and   P    :: "('a, 'b, 'c) psi"
  and   Rel  :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"
  and   Q    :: "('a, 'b, 'c) psi"
  and   M    :: 'a
  and   xvec :: "name list"
  and   N    :: 'a

  assumes PRelQ: "Tvec. length xvec = length Tvec ==> (Ψ, P[xvec::=Tvec], Q[xvec::=Tvec]) Rel"

  shows  M(λ*xvec N).P [Rel] M(λ*xvec N).Q"
proof(auto simp add: simulation_def residual.inject psi.inject)
  fix α Q'
  assume  M(λ*xvec N).Q α Q'"
  thus "P'. Ψ M(λ*xvec N).P α P' (Ψ, P', Q') Rel"
    by(induct rule: inputCases) (auto intro: Input PRelQ)
qed

lemma outputPres:
  fixes Ψ    :: 'b
  and   P    :: "('a, 'b, 'c) psi"
  and   Rel  :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"
  and   Q    :: "('a, 'b, 'c) psi"
  and   M    :: 'a
  and   N    :: 'a

  assumes PRelQ: "(Ψ, P, Q) Rel"

  shows  MN.P [Rel] MN.Q"
proof(auto simp add: simulation_def residual.inject psi.inject)
  fix α Q'
  assume  MN.Q α Q'"
  thus "P'. Ψ MN.P α P' (Ψ, P', Q') Rel"
    by(induct rule: outputCases) (auto intro: Output PRelQ)
qed

lemma casePres:
  fixes Ψ    :: 'b
  and   CsP  :: "('c × ('a, 'b, 'c) psi) list"
  and   Rel  :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"
  and   CsQ  :: "('c × ('a, 'b, 'c) psi) list"
  and   M    :: 'a
  and   N    :: 'a

  assumes PRelQ: "φ Q. (φ, Q) mem CsQ ==> P. (φ, P) mem CsP guarded P (Ψ, P, Q) Rel"
  and     Sim: "Ψ' R S. (Ψ', R, S) Rel ==> Ψ' R [Rel] S"
  and          "Rel Rel'"

  shows  Cases CsP [Rel'] Cases CsQ"
proof(auto simp add: simulation_def residual.inject psi.inject)
  fix α Q'
  assume  Cases CsQ α Q'" and "bn α * CsP" and "bn α * Ψ"
  thus "P'. Ψ Cases CsP α P' (Ψ, P', Q') Rel'"
  proof(induct rule: caseCases)
    case(cCase φ Q)
    from (φ, Q) mem CsQ obtain P where "(φ, P) mem CsP" and "guarded P" and "(Ψ, P, Q) Rel"
      by(metis PRelQ)
    from (Ψ, P, Q) Rel have  P [Rel] Q" by(rule Sim)
    moreover from bn α * CsP (φ, P) mem CsP have "bn α * P" by(auto dest: memFreshChain)
    moreover note Ψ Q α Q' bn α * Ψ
    ultimately obtain P' where PTrans:  P α P'" and P'RelQ': "(Ψ, P', Q') Rel"
      by(blast dest: simE)
    from PTrans (φ, P) mem CsP Ψ φ guarded P have  Cases CsP α P'"
      by(rule Case)
    moreover from P'RelQ' Rel Rel' have "(Ψ, P', Q') Rel'" by blast
    ultimately show ?case by blast
  qed
qed

lemma resPres:
  fixes Ψ    :: 'b
  and   P    :: "('a, 'b, 'c) psi"
  and   Rel  :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"
  and   Q    :: "('a, 'b, 'c) psi"
  and   x    :: name
  and   Rel' :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"

  assumes PSimQ:  P [Rel] Q"
  and     "eqvt Rel'"
  and     "x Ψ"
  and     "Rel Rel'"
  and     C1:    "Ψ' R S y. [(Ψ', R, S) Rel; y Ψ'] ==> (Ψ', (νy)R, (νy)S) Rel'"

  shows    (νx)P [Rel'] (νx)Q"
proof -
  note eqvt Rel' x Ψ
  moreover have "x (νx)P" and "x (νx)Q" by(simp add: abs_fresh)+
  ultimately show ?thesis
  proof(induct rule: simIFresh[where C="()"])
    case(cSim α Q') 
    from bn α * (νx)P bn α * (νx)Q x α have "bn α * P" and "bn α * Q" by simp+
    from Ψ (νx)Q α Q' x Ψ x α x Q'  bn α * Ψ bn α * Q bn α * subject α
         bn α * Ψ bn α * P x α
    show ?case
    proof(induct rule: resCases)
      case(cOpen M xvec1 xvec2 y N Q')
      from bn (M(ν*(xvec1@y#xvec2))N) * Ψ have "xvec1 * Ψ" and "y Ψ" and "xvec2 * Ψ" by simp+
      from bn (M(ν*(xvec1@y#xvec2))N) * P have "xvec1 * P" and "y P" and "xvec2 * P" by simp+
      from x (M(ν*(xvec1@y#xvec2))N) have "x xvec1" and "x y" and "x xvec2" and "x M" by simp+
      from PSimQ Ψ Q M(ν*(xvec1@xvec2))([(x, y)] N) ([(x, y)] Q')
           xvec1 * Ψ xvec2 * Ψ xvec1 * P xvec2 * P
      obtain P' where PTrans:  P M(ν*(xvec1@xvec2))([(x, y)] N) P'" and P'RelQ': "(Ψ, P', ([(x, y)] Q')) Rel"
        by(force dest: simE)
      from y supp N x y have "x supp([(x, y)] N)" 
        by(drule_tac pt_set_bij2[OF pt_name_inst, OF at_name_inst, where pi="[(x, y)]"]) (simp add: eqvts calc_atm)
      with PTrans x Ψ x M x xvec1 x xvec2
      have  (νx)P M(ν*(xvec1@x#xvec2))([(x, y)] N) P'"
        by(rule_tac Open)
      hence "([(x, y)] Ψ) ([(x, y)] (νx)P) ([(x, y)] (M(ν*(xvec1@x#xvec2))([(x, y)] N) P'))"
        by(rule eqvts)
      with x Ψ y Ψ y P x M y M x xvec1 y xvec1 x xvec2 y xvec2 x y
      have  (νx)P M(ν*(xvec1@y#xvec2))N ([(x, y)] P')" by(simp add: eqvts calc_atm alphaRes)
      moreover from P'RelQ' Rel Rel' eqvt Rel' have "([(y, x)] Ψ, [(y, x)] P', [(y, x)] [(x, y)] Q') Rel'"
        by(force simp add: eqvt_def)
      with x Ψ y Ψ have "(Ψ, [(x, y)] P', Q') Rel'" by(simp add: name_swap)
      ultimately show ?case by blast
    next
      case(cRes Q')
      from PSimQ Ψ Q α Q' bn α * Ψ bn α * P
      obtain P' where PTrans:  P α P'" and P'RelQ': "(Ψ, P', Q') Rel"
        by(blast dest: simE)
      from PTrans x Ψ x α have  (νx)P α (νx)P'"
        by(rule Scope)
      moreover from P'RelQ' x Ψ have "(Ψ, (νx)P', (νx)Q') Rel'" by(rule C1)
      ultimately show ?case by blast
    qed
  qed
qed

lemma resChainPres:
  fixes Ψ    :: 'b
  and   P    :: "('a, 'b, 'c) psi"
  and   Rel  :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"
  and   Q    :: "('a, 'b, 'c) psi"
  and   xvec :: "name list"

  assumes PSimQ:  P [Rel] Q"
  and     "eqvt Rel"
  and     "xvec * Ψ"
  and     C1:    "Ψ' R S y. [(Ψ', R, S) Rel; y Ψ'] ==> (Ψ', (νy)R, (νy)S) Rel"

  shows    (ν*xvec)P [Rel] (ν*xvec)Q"
using xvec * Ψ
proof(induct xvec)
  case Nil
  from PSimQ show ?case by simp
next
  case(Cons x xvec)
  from (x#xvec) * Ψ have "x Ψ" and "xvec * Ψ" by simp+
  from xvec * Ψ have  (ν*xvec)P [Rel] (ν*xvec)Q" by(rule Cons)
  moreover note eqvt Rel x Ψ
  moreover have "Rel Rel" by simp
  ultimately have  (νx)((ν*xvec)P) [Rel] (νx)((ν*xvec)Q)" using C1
    by(rule resPres)
  thus ?case by simp
qed

lemma parPres:
  fixes Ψ    :: 'b
  and   P    :: "('a, 'b, 'c) psi"
  and   Rel  :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"
  and   Q    :: "('a, 'b, 'c) psi"
  and   R    :: "('a, 'b, 'c) psi"
  and   Rel' :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"
  
  assumes PRelQ: "AR ΨR. [extractFrame R = AR, ΨR; AR * Ψ; AR * P; AR * Q] ==> ΨR, P, Q) Rel" 
  and     Eqvt: "eqvt Rel"
  and     Eqvt': "eqvt Rel'"

  and     StatImp: "Ψ' S T. (Ψ', S, T) Rel ==> insertAssertion (extractFrame T) Ψ' F insertAssertion (extractFrame S) Ψ'"
  and     Sim:     "Ψ' S T. (Ψ', S, T) Rel ==> Ψ' S [Rel] T"
  and     Ext: "Ψ' S T Ψ''. [(Ψ', S, T) Rel] ==> (Ψ' Ψ'', S, T) Rel"


  and     C1: "Ψ' S T AU ΨU U. [(Ψ' ΨU, S, T) Rel; extractFrame U = AU, ΨU; AU * Ψ'; AU * S; AU * T] ==> (Ψ', S U, T U) Rel'"
  and     C2: "Ψ' S T xvec. [(Ψ', S, T) Rel'; xvec * Ψ'] ==> (Ψ', (ν*xvec)S, (ν*xvec)T) Rel'"
  and     C3: "Ψ' S T Ψ''. [(Ψ', S, T) Rel; Ψ' Ψ''] ==> (Ψ'', S, T) Rel"

  shows  P R [Rel'] Q R"
using Eqvt'
proof(induct rule: simI[of _ _ _ _ "()"])
  case(cSim α QR)
  from bn α * (P R) bn α * (Q R)
  have "bn α * P" and "bn α * Q" and "bn α * R"
    by simp+
  from Ψ Q R α QR bn α * Ψ bn α * Q bn α * R bn α * subject α
  show ?case
  proof(induct rule: parCases[where C = "(P, R)"])
    case(cPar1 Q' AR ΨR)
    from AR * (P, R) have "AR * P" by simp
    have FrR: "extractFrame R = AR, ΨR" by fact
    from AR * α bn α * R FrR
    have "bn α * ΨR" by(drule_tac extractFrameFreshChain) auto
    from FrR AR * Ψ AR * P AR * Q have  ΨR P [Rel] Q"
      by(blast intro: Sim PRelQ)
    moreover have QTrans:  ΨR Q α Q'" by fact
    ultimately obtain P' where PTrans:  ΨR P α P'"
                           and P'RelQ': "(Ψ ΨR, P', Q') Rel"
    using bn α * Ψ bn α * ΨR bn α * P
      by(force dest: simE)
    from PTrans QTrans AR * P AR * Q AR * α bn α * subject α distinct(bn α) have "AR * P'" and "AR * Q'"
      by(blast dest: freeFreshChainDerivative)+
    from PTrans bn α * R FrR  AR * Ψ AR * P AR * α have  P R α (P' R)" 
      by(rule_tac Par1) 
    moreover from P'RelQ' FrR AR * Ψ AR * P' AR * Q' have "(Ψ, P' R, Q' R) Rel'" by(rule C1)
    ultimately show ?case by blast
  next
    case(cPar2 R' AQ ΨQ)
    from AQ * (P, R) have "AQ * P" and "AQ * R" by simp+
    obtain AP ΨP where FrP: "extractFrame P = AP, ΨP" and "AP * (Ψ, AQ, ΨQ, α, R)"
      by(rule freshFrame)
    hence "AP * Ψ" and "AP * AQ" and "AP * ΨQ" and "AP * α" and "AP * R"
      by simp+

    have FrQ: "extractFrame Q = AQ, ΨQ" by fact
    from AQ * P FrP AP * AQ have "AQ * ΨP"
      by(drule_tac extractFrameFreshChain) auto

    from FrP FrQ bn α * P bn α * Q AP * α AQ * α
    have "bn α * ΨP" and "bn α * ΨQ"
      by(force dest: extractFrameFreshChain)+


    obtain AR ΨR where FrR: "extractFrame R = AR, ΨR" and "AR * (Ψ, P, Q, AQ, AP, ΨQ, ΨP, α, R)" and "distinct AR"
      by(rule freshFrame)
    then have "AR * Ψ" and "AR * P" and "AR * Q" and "AR * AQ" and  "AR * AP" and  "AR * ΨQ" and  "AR * ΨP" and "AR * α" and "AR * R"
      by simp+

    from AQ * R  FrR AR * AQ have "AQ * ΨR"
      by(drule_tac extractFrameFreshChain) auto
    from AP * R AR * AP FrR  have "AP * ΨR"
      by(drule_tac extractFrameFreshChain) auto

    have RTrans:  ΨQ R α R'" by fact
    moreover have "AQ, (Ψ ΨQ) ΨR F AP, (Ψ ΨP) ΨR"
    proof -
      have "AQ, (Ψ ΨQ) ΨR F AQ, (Ψ ΨR) ΨQ"
        by(metis frameIntAssociativity Commutativity FrameStatEqTrans frameIntCompositionSym FrameStatEqSym)
      moreover from FrR AR * Ψ AR * P AR * Q
      have "(insertAssertion (extractFrame Q) (Ψ ΨR)) F (insertAssertion (extractFrame P) (Ψ ΨR))"
        by(blast intro: PRelQ StatImp)
      with FrP FrQ AP * Ψ AQ * Ψ AP * ΨR AQ * ΨR
      have "AQ, (Ψ ΨR) ΨQ F AP, (Ψ ΨR) ΨP" using freshCompChain by auto
      moreover have "AP, (Ψ ΨR) ΨP F AP, (Ψ ΨP) ΨR"
        by(metis frameIntAssociativity Commutativity FrameStatEqTrans frameIntCompositionSym frameIntAssociativity[THEN FrameStatEqSym])
      ultimately show ?thesis
        by(rule FrameStatEqImpCompose)
    qed

    ultimately have  ΨP R α R'"
      using AP * Ψ AP * ΨQ AQ * Ψ AQ * ΨP AP * R AQ * R AP * α AQ * α
            AR * AP AR * AQ AR * ΨP AR * ΨQ AR * Ψ FrR distinct AR
      by(force intro: transferFrame)
    with bn α * P AP * Ψ  AP * R  AP * α FrP have  P R α (P R')"
      by(force intro: Par2)
    moreover obtain AR' ΨRwhere "extractFrame R' = AR', ΨR'" and "AR' * Ψ" and "AR' * P" and "AR' * Q"
      by(rule_tac freshFrame[where C="(Ψ, P, Q)"]) auto

    moreover from RTrans FrR distinct AR AR * Ψ AR * P AR * Q AR * R AR * α bn α * Ψ bn α * P bn α * Q bn α * R bn α * subject α distinct(bn α)
    obtain p Ψ' AR' ΨRwhere S: "set p set(bn α) × set(bn(p α))" and "(p ΨR) Ψ' ΨR'" and FrR': "extractFrame R' = AR', ΨR'"
                           and "bn(p α) * R" and "bn(p α) * Ψ" and "bn(p α) * P" and "bn(p α) * Q" and "bn(p α) * R"
                           and "AR' * Ψ" and "AR' * P" and "AR' * Q"
      by(rule_tac C="(Ψ, P, Q, R)" and C'="(Ψ, P, Q, R)" in expandFrame) (assumption | simp)+

    from AR * Ψ have "(p AR) * (p Ψ)" by(simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
    with bn α * Ψ bn(p α) * Ψhave "(p AR) * Ψ" by simp
    from AR * P have "(p AR) * (p P)" by(simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
    with bn α * P bn(p α) * Phave "(p AR) * P" by simp
    from AR * Q have "(p AR) * (p Q)" by(simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
    with bn α * Q bn(p α) * Qhave "(p AR) * Q" by simp

    from FrR have "(p extractFrame R) = p AR, ΨR" by simp
    with bn α * R bn(p α) * Rhave "extractFrame R = (p AR), (p ΨR)"
      by(simp add: eqvts)

    with (p AR) * Ψ (p AR) * P (p AR) * Q have "(Ψ (p ΨR), P, Q) Rel" by(rule_tac PRelQ)

    hence "((Ψ (p ΨR)) Ψ', P, Q) Rel" by(rule Ext)
    with (p ΨR) Ψ' ΨR' have "(Ψ ΨR', P, Q) Rel" by(blast intro: C3 Associativity compositionSym)
    with FrR' AR' * Ψ AR' * P AR' * Q have "(Ψ, P R', Q R') Rel'" by(rule_tac C1) 
    ultimately show ?case by blast
  next
    case(cComm1 ΨR M N Q' AQ ΨQ K xvec R' AR)
    have  FrQ: "extractFrame Q = AQ, ΨQ" by fact
    from AQ * (P, R) have "AQ * P" and "AQ * R" by simp+

    have  FrR: "extractFrame R = AR, ΨR" by fact
    from AR * (P, R) have "AR * P" and "AR * R" by simp+

    from xvec * (P, R) have "xvec * P" and "xvec * R" by simp+
  
    obtain AP ΨP where FrP: "extractFrame P = AP, ΨP" and "AP * (Ψ, AQ, ΨQ, AR, M, N, K, R, P, xvec)" and "distinct AP"
      by(rule freshFrame)
    hence "AP * Ψ" and "AP * AQ" and "AP * ΨQ" and "AP * M" and "AP * R"
      and "AP * N" and "AP * K" and "AP * AR" and "AP * P" and "AP * xvec"
      by simp+

    have QTrans:  ΨR Q M(N) Q'" and RTrans:  ΨQ R K(ν*xvec)N R'"
      and MeqK:  ΨQ ΨR M K" by fact+

    from FrP FrR AQ * P AP * R AR * P AP * AQ AP * AR AP * xvec xvec * P
    have "AP * ΨR" and "AQ * ΨP" and  "AR * ΨP" and "xvec * ΨP"
      by(fastforce dest!: extractFrameFreshChain)+
  
  from RTrans FrR distinct AR AR * R AR * xvec xvec * R xvec * Q xvec * Ψ xvec * ΨQ AR * Q
                  AR * Ψ AR * ΨQ xvec * K AR * K AR * N AR * R xvec * R AR * P xvec * P AP * AR AP * xvec
                  AQ * AR AQ * xvec AR * ΨP xvec * ΨP distinct xvec xvec * M
  obtain p Ψ' AR' ΨRwhere S: "set p set xvec × set(p xvec)" and FrR': "extractFrame R' = AR', ΨR'"
                         and "(p ΨR) Ψ' ΨR'" and "AR' * Q" and "AR' * Ψ" and "(p xvec) * Ψ"
                         and "(p xvec) * Q" and "(p xvec) * ΨQ" and "(p xvec) * K" and "(p xvec) * R"
                         and "(p xvec) * P" and "(p xvec) * AP" and "(p xvec) * AQ" and "(p xvec) * ΨP"
                         and "AR' * P" and "AR' * N"
    by(rule_tac C="(Ψ, Q, ΨQ, K, R, P, AP, AQ, ΨP)" and C'="(Ψ, Q, ΨQ, K, R, P, AP, AQ, ΨP)" in expandFrame) 
      (assumption | simp)+

  from AR * Ψ have "(p AR) * (p Ψ)" by(simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
  with xvec * Ψ (p xvec) * Ψhave "(p AR) * Ψ" by simp
  from AR * P have "(p AR) * (p P)" by(simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
  with xvec * P (p xvec) * Phave "(p AR) * P" by simp
  from AR * Q have "(p AR) * (p Q)" by(simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
  with xvec * Q (p xvec) * Qhave "(p AR) * Q" by simp
  from AR * R have "(p AR) * (p R)" by(simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
  with xvec * R (p xvec) * Rhave "(p AR) * R" by simp
  from AR * K have "(p AR) * (p K)" by(simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
  with xvec * K (p xvec) * Khave "(p AR) * K" by simp
  
  from AP * xvec (p xvec) * AP AP * Mhave "AP * (p M)" by(simp add: freshChainSimps)
  from AQ * xvec (p xvec) * AQ AQ * Mhave "AQ * (p M)" by(simp add: freshChainSimps)
  from AP * xvec (p xvec) * AP AP * ARhave "(p AR) * AP" by(simp add: freshChainSimps)
  from AQ * xvec (p xvec) * AQ AQ * ARhave "(p AR) * AQ" by(simp add: freshChainSimps)
  
  from QTrans S xvec * Q (p xvec) * Q have "(p ΨR)) Q (p M)(N) Q'"
    by(rule_tac inputPermFrameSubject) (assumption | auto simp add: fresh_star_def)+
  with xvec * Ψ (p xvec) * Ψhave QTrans: "(Ψ (p ΨR)) Q (p M)(N) Q'"
    by(simp add: eqvts)

  from FrR have "(p extractFrame R) = p AR, ΨR" by simp
  with xvec * R (p xvec) * Rhave FrR: "extractFrame R = (p AR), (p ΨR)"
    by(simp add: eqvts)

  note RTrans FrR
  moreover from FrR (p AR) * Ψ (p AR) * P (p AR) * Q have  (p ΨR) P [Rel] Q"
    by(metis Sim PRelQ)
  with QTrans obtain P' where PTrans:  (p ΨR) P (p M)(N) P'" and P'RelQ': "(Ψ (p ΨR), P', Q') Rel"
    by(force dest: simE)
  from PTrans QTrans AR' * P AR' * Q AR' * N have "AR' * P'" and "AR' * Q'"
    by(blast dest: inputFreshChainDerivative)+
    
  note PTrans
  moreover from MeqK have "(p ΨQ ΨR)) (p M) (p K)" by(rule chanEqClosed)
  with xvec * Ψ (p xvec) * Ψ xvec * ΨQ (p xvec) * ΨQ xvec * K (p xvec) * K S
  have MeqK:  ΨQ (p ΨR) (p M) K" by(simp add: eqvts)
  
  moreover have "AQ, (Ψ ΨQ) (p ΨR) F AP, (Ψ ΨP) (p ΨR)"
  proof -
    have "AP, (Ψ (p ΨR)) ΨP F AP, (Ψ ΨP) (p ΨR)"
      by(metis frameResChainPres frameNilStatEq Commutativity AssertionStatEqTrans Composition Associativity)
    moreover from FrR (p AR) * Ψ (p AR) * P (p AR) * Q
    have "(insertAssertion (extractFrame Q) (Ψ (p ΨR))) F (insertAssertion (extractFrame P) (Ψ (p ΨR)))"
      by(metis PRelQ StatImp)
    with FrP FrQ AP * Ψ AQ * Ψ AP * ΨR AQ * ΨR AP * xvec (p xvec) * AP AQ * xvec (p xvec) * AQ S
    have "AQ, (Ψ (p ΨR)) ΨQ F AP, (Ψ (p ΨR)) ΨP" using freshCompChain
      by(simp add: freshChainSimps)
    moreover have "AQ, (Ψ ΨQ) (p ΨR) F AQ, (Ψ (p ΨR)) ΨQ" 
      by(metis frameResChainPres frameNilStatEq Commutativity AssertionStatEqTrans Composition Associativity)
    ultimately show ?thesis by(rule_tac FrameStatEqImpCompose)
  qed
  moreover note FrP FrQ distinct AP
  moreover from distinct AR have "distinct(p AR)" by simp
  moreover note (p AR) * AP  (p AR) * AQ (p AR) * Ψ (p AR) * P (p AR) * Q (p AR) * R (p AR) * K
                AP * Ψ AP * R AP * P AP * (p M) AQ * R AQ * (p M) AP * xvec xvec * P AP * R
  ultimately obtain K' where  ΨP R K'(ν*xvec)N R'" and  ΨP (p ΨR) (p M) K'" and "(p AR) * K'"
    by(rule_tac comm1Aux)

  with PTrans FrP have  P R τ (ν*xvec)(P' R')" using FrR (p AR) * Ψ (p AR) * P (p AR) * R
    xvec * P AP * Ψ AP * P AP * R AP * (p M) (p AR) * K' (p AR) * AP
    by(rule_tac Comm1) (assumption | simp)+

  moreover from P'RelQ' have  "((Ψ (p ΨR)) Ψ', P', Q') Rel" by(rule Ext)
  with (p ΨR) Ψ' ΨR' have "(Ψ ΨR', P', Q') Rel" by(metis C3 Associativity compositionSym)
  with FrR' AR' * P' AR' * Q' AR' * Ψ have "(Ψ, P' R', Q' R') Rel'" by(rule_tac C1)
  with xvec * Ψ have "(Ψ, (ν*xvec)(P' R'), (ν*xvec)(Q' R')) Rel'" by(rule_tac C2)
  ultimately show ?case by blast
next
    case(cComm2 ΨR M xvec N Q' AQ ΨQ K R' AR)
    have  FrQ: "extractFrame Q = AQ, ΨQ" by fact
    from AQ * (P, R) have "AQ * P" and "AQ * R" by simp+

    have  FrR: "extractFrame R = AR, ΨR" by fact
    from AR * (P, R) have "AR * P" and "AR * R" by simp+

    from xvec * (P, R) have "xvec * P" and "xvec * R" by simp+

    obtain AP ΨP where FrP: "extractFrame P = AP, ΨP" and "AP * (Ψ, AQ, ΨQ, AR, M, N, K, R, P, xvec)" and "distinct AP"
      by(rule freshFrame)
    hence "AP * Ψ" and "AP * AQ" and "AP * ΨQ" and "AP * M" and "AP * R"
      and "AP * N" "AP * K" and "AP * AR" and "AP * P"  and "AP * xvec" 
      by simp+

    from FrP FrR AQ * P AP * R AR * P AP * AQ AP * AR AP * xvec xvec * P
    have "AP * ΨR" and "AQ * ΨP" and  "AR * ΨP" and "xvec * ΨP"
      by(fastforce dest!: extractFrameFreshChain)+

    have QTrans:  ΨR Q M(ν*xvec)N Q'" by fact 

    note Ψ ΨQ R K(N) R' FrR Ψ ΨQ ΨR M K
    moreover from FrR AR * Ψ AR * P AR * Q have  ΨR P [Rel] Q" by(metis PRelQ Sim)
    with QTrans obtain P' where PTrans:  ΨR P M(ν*xvec)N P'" and P'RelQ': "(Ψ ΨR, P', Q') Rel"
      using xvec * Ψ xvec * ΨR xvec * P
      by(force dest: simE)
    from PTrans QTrans AR * P AR * Q AR * xvec xvec * M distinct xvec have "AR * P'" and "AR * Q'"
      by(blast dest: outputFreshChainDerivative)+
    note PTrans Ψ ΨQ ΨR M K
    moreover have "AQ, (Ψ ΨQ) ΨR F AP, (Ψ ΨP) ΨR"
    proof -
      have "AP, (Ψ ΨR) ΨP F AP, (Ψ ΨP) ΨR"
        by(metis frameResChainPres frameNilStatEq Commutativity AssertionStatEqTrans Composition Associativity)
      moreover from FrR AR * Ψ AR * P AR * Q
      have "(insertAssertion (extractFrame Q) (Ψ ΨR)) F (insertAssertion (extractFrame P) (Ψ ΨR))"
        by(metis PRelQ StatImp)
      with FrP FrQ AP * Ψ AQ * Ψ AP * ΨR AQ * ΨR
      have "AQ, (Ψ ΨR) ΨQ F AP, (Ψ ΨR) ΨP" using freshCompChain by simp
      moreover have "AQ, (Ψ ΨQ) ΨR F AQ, (Ψ ΨR) ΨQ" 
        by(metis frameResChainPres frameNilStatEq Commutativity AssertionStatEqTrans Composition Associativity)
      ultimately show ?thesis by(rule_tac FrameStatEqImpCompose)
    qed
    moreover note FrP FrQ distinct AP distinct AR
    moreover from AP * AR AQ * AR have "AR * AP" and "AR * AQ" by simp+
    moreover note AR * Ψ AR * P AR * Q AR * R AR * K  AP * Ψ AP * P
                  AP * R AP * M AQ * R AQ * M AR * xvec xvec * M
    ultimately obtain K' where  ΨP R K'(N) R'" and  ΨP ΨR M K'" and "AR * K'"
      by(rule_tac comm2Aux) assumption+

    with PTrans FrP have  P R τ (ν*xvec)(P' R')" using FrR AR * Ψ AR * P AR * R
      AR * Ψ AR * P AR * R and xvec * R AP * Ψ AP * P AP * R AP * AR AP * M AR * K'
      by(force intro: Comm2)

    moreover from Ψ ΨP R K'(N) R' FrR distinct AR AR * Ψ AR * R AR * P' AR * Q' AR * N AR * K'
    obtain Ψ' AR' ΨRwhere  ReqR': R Ψ' ΨR'" and FrR': "extractFrame R' = AR', ΨR'" 
                         and "AR' * Ψ" and "AR' * P'" and "AR' * Q'"
      by(rule_tac C="(Ψ, P', Q')" and C'="Ψ" in expandFrame) auto

    from P'RelQ' have "((Ψ ΨR) Ψ', P', Q') Rel" by(rule Ext)
    with ReqR' have "(Ψ ΨR', P', Q') Rel" by(metis C3 Associativity compositionSym)
    with FrR' AR' * P' AR' * Q' AR' * Ψ have "(Ψ, P' R', Q' R') Rel'"
      by(rule_tac C1)
    with xvec * Ψ have "(Ψ, (ν*xvec)(P' R'), (ν*xvec)(Q' R')) Rel'" by(rule_tac C2)
    ultimately show ?case by blast
  qed
qed
unbundle no relcomp_syntax
lemma bangPres:
  fixes Ψ   :: 'b
  and   P    :: "('a, 'b, 'c) psi"
  and   Q    :: "('a, 'b, 'c) psi"
  and   R    :: "('a, 'b, 'c) psi"
  and   Rel  :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"
  and   Rel' :: "('b × ('a, 'b, 'c) psi × ('a, 'b, 'c) psi) set"

  assumes "(Ψ, P, Q) Rel"
  and     "eqvt Rel'"
  and     "guarded P"
  and     "guarded Q"
  and     cSim: "Ψ' S T. (Ψ', S, T) Rel ==> Ψ' S [Rel] T"
  and     cExt: "Ψ' S T Ψ''. (Ψ', S, T) Rel ==> (Ψ' Ψ'', S, T) Rel"
  and     cSym: "Ψ' S T. (Ψ', S, T) Rel ==> (Ψ', T, S) Rel"
  and     StatEq: "Ψ' S T Ψ''. [(Ψ', S, T) Rel; Ψ' Ψ''] ==> (Ψ'', S, T) Rel"
  and     Closed: "Ψ' S T p. (Ψ', S, T) Rel ==> ((p::name prm) Ψ', p S, p T) Rel"
  and     Assoc: "Ψ' S T U. (Ψ', S (T U), (S T) U) Rel"
  and     ParPres: "Ψ' S T U. (Ψ', S, T) Rel ==> (Ψ', S U, T U) Rel"
  and     FrameParPres: "Ψ' ΨU S T U AU. [(Ψ' ΨU, S, T) Rel; extractFrame U = AU, ΨU; AU * Ψ'; AU * S; AU * T] ==>
                                            (Ψ', U S, U T) Rel"
  and     ResPres: "Ψ' S T xvec. [(Ψ', S, T) Rel; xvec * Ψ'] ==> (Ψ', (ν*xvec)S, (ν*xvec)T) Rel"
  and     ScopeExt: "xvec Ψ' S T. [xvec * Ψ'; xvec * T] ==> (Ψ', (ν*xvec)(S T), ((ν*xvec)S) T) Rel"
  and     Trans: "Ψ' S T U. [(Ψ', S, T) Rel; (Ψ', T, U) Rel] ==> (Ψ', S, U) Rel"
  and     Compose"Ψ' S T U O. [(Ψ', S, T) Rel; (Ψ', T, U) Rel'; (Ψ', U, O) Rel] ==> (Ψ', S, O) Rel'"
  and     C1: "Ψ S T U. [(Ψ, S, T) Rel; guarded S; guarded T] ==> (Ψ, U !S, U !T) Rel'"
  and     Der: "Ψ' S α S' T. [Ψ' !S α S'; (Ψ', S, T) Rel; bn α * Ψ'; bn α * S; bn α * T; guarded T; bn α * subject α] ==>
                                      T' U O. Ψ' !T α T' (Ψ', S', U !S) Rel (Ψ', T', O !T) Rel
                                                (Ψ', U, O) Rel ((supp U)::name set) supp S'
                                                 ((supp O)::name set) supp T'"

  shows  R !P [Rel'] R !Q"
using eqvt Rel'
proof(induct rule: simI[of _ _ _ _ "()"])
  case(cSim α RQ')
  from bn α * (R !P) bn α * (R !Q) have "bn α * P" and "bn α * (!Q)" and "bn α * Q" and "bn α * R" by simp+
  from Ψ R !Q α RQ' bn α * Ψ bn α * R bn α * !Q bn α * subject α show ?case
  proof(induct rule: parCases[where C=P])
    case(cPar1 R' AQ ΨQ)
    from extractFrame (!Q) = AQ, ΨQ have "AQ = []" and Q = SBottom'" by simp+
    with Ψ ΨQ R α R' bn α * P have  R !P α (R' !P)"
      by(rule_tac Par1) (assumption | simp)+
    moreover from (Ψ, P, Q) Rel guarded P guarded Q have "(Ψ, R' !P, R' !Q) Rel'"
      by(rule C1)
    ultimately show ?case by blast
  next
    case(cPar2 Q' AR ΨR)
    have QTrans:  ΨR !Q α Q'" and FrR: "extractFrame R = AR, ΨR" by fact+
    with bn α * R AR * α have "bn α * ΨR" by(force dest: extractFrameFreshChain)
    with QTrans (Ψ, P, Q) Rel bn α * Ψ\<open>bn α * P bn α * Q guarded P bn α * subject α
    obtain P' S T where PTrans: "\<Psi> \<otimes> \<Psi>\<^sub>R \<rhd> !P \<longmapsto>\<alpha> \<prec> P'" and "(\<Psi> \<otimes> \<Psi>\<^sub>R, P', T \<parallel> !P) \<in> Rel"
                    and "(\<Psi> \<otimes> \<Psi>\<^sub>R, Q', S \<parallel> !Q) \<in> Rel" and "(\<Psi> \<otimes> \<Psi>\<^sub>R, S, T) \<in> Rel"
                    and suppT: "((supp T)::name set) \<subseteq> supp P'" and suppS: "((supp S)::name set) \<subseteq> supp Q'"
      by(drule_tac cSym) (auto dest: Der cExt)
    from PTrans FrR \<open>A\<^sub>R \<sharp>* \<Psi>\<close> \<open>A\<^sub>R \<sharp>* P\<close> \<open>A\<^sub>R \<sharp>* \<alpha>\<close> \<open>bn \<alpha> \<sharp>* R\<close> have "\<Psi> \<rhd> R \<parallel> !P \<longmapsto>\<alpha> \<prec> (R \<parallel> P')"
      by(rule_tac Par2) auto
    moreover 
    { 
      from \<open>A\<^sub>R \<sharp>* P\<close> \<open>A\<^sub>R \<sharp>* (!Q)\<close> \<open>A\<^sub>R \<sharp>* \<alpha>\<close> PTrans QTrans \<open>bn \<alpha> \<sharp>* subject \<alpha>\<close> \<open>distinct(bn \<alpha>)\<close> have "A\<^sub>R \<sharp>* P'" and "A\<^sub>R \<sharp>* Q'"
        by(force dest: freeFreshChainDerivative)+
      from \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, P', T \<parallel> !P) \<in> Rel\<close> FrR \<open>A\<^sub>R \<sharp>* \<Psi>\<close> \<open>A\<^sub>R \<sharp>* P'\<close> \<open>A\<^sub>R \<sharp>* P\<close> suppT have "(\<Psi>, R \<parallel> P', R \<parallel> (T \<parallel> !P)) \<in> Rel"
        by(rule_tac FrameParPres) (auto simp add: fresh_star_def fresh_def psi.supp)
      hence "(\<Psi>, R \<parallel> P', (R \<parallel> T) \<parallel> !P) \<in> Rel" by(blast intro: Assoc Trans)
      moreover from \<open>(\<Psi>, P, Q) \<in> Rel\<close> \<open>guarded P\<close> \<open>guarded Q\<close> have "(\<Psi>, (R \<parallel> T) \<parallel> !P, (R \<parallel> T) \<parallel> !Q) \<in> Rel'"
        by(rule C1)
      moreover from \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, Q', S \<parallel> !Q) \<in> Rel\<close> \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, S, T) \<in> Rel\<close> have "(\<Psi> \<otimes> \<Psi>\<^sub>R, Q', T \<parallel> !Q) \<in> Rel"
        by(blast intro: ParPres Trans)
      with FrR \<open>A\<^sub>R \<sharp>* \<Psi>\<close> \<open>A\<^sub>R \<sharp>* P'\<close> \<open>A\<^sub>R \<sharp>* Q'\<close> \<open>A\<^sub>R \<sharp>* (!Q)\<close> suppT suppS have "(\<Psi>, R \<parallel> Q', R \<parallel> (T \<parallel> !Q)) \<in> Rel"
        by(rule_tac FrameParPres) (auto simp add: fresh_star_def fresh_def psi.supp)
      hence "(\<Psi>, R \<parallel> Q', (R \<parallel> T) \<parallel> !Q) \<in> Rel" by(blast intro: Assoc Trans)
      ultimately have "(\<Psi>, R \<parallel> P', R \<parallel> Q') \<in> Rel'" by(blast intro: cSym Compose)
    }
    ultimately show ?case by blast
  next
    case(cComm1 \<Psi>\<^sub>Q M N R' A\<^sub>R \<Psi>\<^sub>R K xvec Q' A\<^sub>Q)
    from \<open>extractFrame (!Q) = \<langle>A\<^sub>Q, \<Psi>\<^sub>Q\<rangle>\<close> have "A\<^sub>Q = []" and "\<Psi>\<^sub>Q = SBottom'" by simp+
    have RTrans: "\<Psi> \<otimes> \<Psi>\<^sub>Q \<rhd> R \<longmapsto>M\<lparr>N\<rparr> \<prec> R'" and FrR: "extractFrame R = \<langle>A\<^sub>R, \<Psi>\<^sub>R\<rangle>" by fact+
    moreover have QTrans: "\<Psi> \<otimes> \<Psi>\<^sub>R \<rhd> !Q \<longmapsto>K\<lparr>\<nu>*xvec\<rparr>\<langle>N\<rangle> \<prec> Q'" by fact
    from FrR \<open>xvec \<sharp>* R\<close> \<open>A\<^sub>R \<sharp>* xvec\<close> have "xvec \<sharp>* \<Psi>\<^sub>R" by(force dest: extractFrameFreshChain)
    with QTrans \<open>(\<Psi>, P, Q) \<in> Rel\<close> \<open>xvec \<sharp>* \<Psi>\<close>\<open>xvec \<sharp>* P\<close> \<open>xvec \<sharp>* (!Q)\<close> \<open>guarded P\<close> \<open>xvec \<sharp>* K\<close>
    obtain P' S T where PTrans: "\<Psi> \<otimes> \<Psi>\<^sub>R \<rhd> !P \<longmapsto>K\<lparr>\<nu>*xvec\<rparr>\<langle>N\<rangle> \<prec> P'" and "(\<Psi> \<otimes> \<Psi>\<^sub>R, P', T \<parallel> !P) \<in> Rel"
                    and "(\<Psi> \<otimes> \<Psi>\<^sub>R, Q', S \<parallel> !Q) \<in> Rel" and "(\<Psi> \<otimes> \<Psi>\<^sub>R, S, T) \<in> Rel"
                    and suppT: "((supp T)::name set) \<subseteq> supp P'" and suppS: "((supp S)::name set) \<subseteq> supp Q'"
      by(drule_tac cSym) (fastforce dest: Der intro: cExt)
    note \<open>\<Psi> \<otimes> \<Psi>\<^sub>R \<otimes> \<Psi>\<^sub>Q \<turnstile> M \<leftrightarrow> K\<close>
    ultimately have "\<Psi> \<rhd> R \<parallel> !P \<longmapsto>\<tau> \<prec> \<lparr>\<nu>*xvec\<rparr>(R' \<parallel> P')" 
      using PTrans \<open>\<Psi>\<^sub>Q = SBottom'\<close> \<open>xvec \<sharp>* R\<close> \<open>A\<^sub>R \<sharp>* \<Psi>\<close> \<open>A\<^sub>R \<sharp>* R\<close> \<open>A\<^sub>R \<sharp>* M\<close> \<open>A\<^sub>R \<sharp>* P\<close>
      by(rule_tac Comm1) (assumption | simp)+

    moreover from \<open>A\<^sub>R \<sharp>* P\<close> \<open>A\<^sub>R \<sharp>* (!Q)\<close> \<open>A\<^sub>R \<sharp>* xvec\<close> PTrans QTrans \<open>xvec \<sharp>* K\<close> \<open>distinct xvec\<close> 
    have "A\<^sub>R \<sharp>* P'" and "A\<^sub>R \<sharp>* Q'" by(force dest: outputFreshChainDerivative)+
    moreover with RTrans FrR \<open>distinct A\<^sub>R\<close> \<open>A\<^sub>R \<sharp>* R\<close> \<open>A\<^sub>R \<sharp>* N\<close> \<open>A\<^sub>R \<sharp>* \<Psi>\<close> \<open>A\<^sub>R \<sharp>* P\<close> \<open>A\<^sub>R \<sharp>* (!Q)\<close> \<open>A\<^sub>R \<sharp>* M\<close>
    obtain \<Psi>' A\<^sub>R' \<Psi>\<^sub>R' where FrR': "extractFrame R' = \<langle>A\<^sub>R', \<Psi>\<^sub>R'\<rangle>" and "\<Psi>\<^sub>R \<otimes> \<Psi>' \<simeq> \<Psi>\<^sub>R'" and "A\<^sub>R' \<sharp>* \<Psi>"
                         and "A\<^sub>R' \<sharp>* P'" and "A\<^sub>R' \<sharp>* Q'" and "A\<^sub>R' \<sharp>* P" and "A\<^sub>R' \<sharp>* Q"
      by(rule_tac C="(\<Psi>, P, P', Q, Q')" and C'=\<Psi> in expandFrame) auto

    moreover 
    { 
      from \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, P', T \<parallel> !P) \<in> Rel\<close> have "((\<Psi> \<otimes> \<Psi>\<^sub>R) \<otimes> \<Psi>', P', T \<parallel> !P) \<in> Rel" by(rule cExt)
      with \<open>\<Psi>\<^sub>R \<otimes> \<Psi>' \<simeq> \<Psi>\<^sub>R'\<close> have "(\<Psi> \<otimes> \<Psi>\<^sub>R', P', T \<parallel> !P) \<in> Rel"
        by(metis Associativity StatEq compositionSym) 
      with FrR' \<open>A\<^sub>R' \<sharp>* \<Psi>\<close> \<open>A\<^sub>R' \<sharp>* P'\<close> \<open>A\<^sub>R' \<sharp>* P\<close> suppT have "(\<Psi>, R' \<parallel> P', R' \<parallel> (T \<parallel> !P)) \<in> Rel"
        by(rule_tac FrameParPres) (auto simp add: fresh_star_def fresh_def psi.supp)
      hence "(\<Psi>, R' \<parallel> P', (R' \<parallel> T) \<parallel> !P) \<in> Rel" by(blast intro: Assoc Trans)
      with \<open>xvec \<sharp>* \<Psi>\<close> \<open>xvec \<sharp>* P\<close> have "(\<Psi>, \<lparr>\<nu>*xvec\<rparr>(R' \<parallel> P'), (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> T)) \<parallel> !P) \<in> Rel"
        by(metis ResPres psiFreshVec ScopeExt Trans)
      moreover from \<open>(\<Psi>, P, Q) \<in> Rel\<close> \<open>guarded P\<close> \<open>guarded Q\<close> have "(\<Psi>, (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> T)) \<parallel> !P, (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> T)) \<parallel> !Q) \<in> Rel'"
        by(rule C1)
      moreover from \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, Q', S \<parallel> !Q) \<in> Rel\<close> \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, S, T) \<in> Rel\<close> have "(\<Psi> \<otimes> \<Psi>\<^sub>R, Q', T \<parallel> !Q) \<in> Rel"
        by(blast intro: ParPres Trans)
      hence "((\<Psi> \<otimes> \<Psi>\<^sub>R) \<otimes> \<Psi>', Q', T \<parallel> !Q) \<in> Rel" by(rule cExt)
      with \<open>\<Psi>\<^sub>R \<otimes> \<Psi>' \<simeq> \<Psi>\<^sub>R'\<close> have "(\<Psi> \<otimes> \<Psi>\<^sub>R', Q', T \<parallel> !Q) \<in> Rel"
        by(metis Associativity StatEq compositionSym) 
      with FrR' \<open>A\<^sub>R' \<sharp>* \<Psi>\<close> \<open>A\<^sub>R' \<sharp>* P'\<close> \<open>A\<^sub>R' \<sharp>* Q'\<close> \<open>A\<^sub>R' \<sharp>* Q\<close> suppT suppS have "(\<Psi>, R' \<parallel> Q', R' \<parallel> (T \<parallel> !Q)) \<in> Rel"
        by(rule_tac FrameParPres) (auto simp add: fresh_star_def fresh_def psi.supp)
      hence "(\<Psi>, R' \<parallel> Q', (R' \<parallel> T) \<parallel> !Q) \<in> Rel" by(blast intro: Assoc Trans)
      with \<open>xvec \<sharp>* \<Psi>\<close> \<open>xvec \<sharp>* (!Q)\<close> have "(\<Psi>, \<lparr>\<nu>*xvec\<rparr>(R' \<parallel> Q'), (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> T)) \<parallel> !Q) \<in> Rel"
        by(metis ResPres psiFreshVec ScopeExt Trans)
      ultimately have "(\<Psi>, \<lparr>\<nu>*xvec\<rparr>(R' \<parallel> P'), \<lparr>\<nu>*xvec\<rparr>(R' \<parallel> Q')) \<in> Rel'" by(blast intro: cSym Compose)
    }
    ultimately show ?case by blast
  next
    case(cComm2 \<Psi>\<^sub>Q M xvec N R' A\<^sub>R \<Psi>\<^sub>R K Q' A\<^sub>Q)
    from \<open>extractFrame (!Q) = \<langle>A\<^sub>Q, \<Psi>\<^sub>Q\<rangle>\<close> have "A\<^sub>Q = []" and "\<Psi>\<^sub>Q = SBottom'" by simp+
    have RTrans: "\<Psi> \<otimes> \<Psi>\<^sub>Q \<rhd> R \<longmapsto>M\<lparr>\<nu>*xvec\<rparr>\<langle>N\<rangle> \<prec> R'" and FrR: "extractFrame R = \<langle>A\<^sub>R, \<Psi>\<^sub>R\<rangle>" by fact+
    then obtain p \<Psi>' A\<^sub>R' \<Psi>\<^sub>R' where S: "set p \<subseteq> set xvec \<times> set(p \<bullet> xvec)"
                                and FrR': "extractFrame R' = \<langle>A\<^sub>R', \<Psi>\<^sub>R'\<rangle>" and "(p \<bullet> \<Psi>\<^sub>R) \<otimes> \<Psi>' \<simeq> \<Psi>\<^sub>R'" and "A\<^sub>R' \<sharp>* \<Psi>"
                                and "A\<^sub>R' \<sharp>* N" and "A\<^sub>R' \<sharp>* R'" and "A\<^sub>R' \<sharp>* P" and "A\<^sub>R' \<sharp>* Q" and "(p \<bullet> xvec) \<sharp>* \<Psi>"
                                and "(p \<bullet> xvec) \<sharp>* P" and "(p \<bullet> xvec) \<sharp>* Q" and "xvec \<sharp>* A\<^sub>R'" and "(p \<bullet> xvec) \<sharp>* A\<^sub>R'"
                                and "distinctPerm p" and "(p \<bullet> xvec) \<sharp>* R'" and "(p \<bullet> xvec) \<sharp>* N" 
      using \<open>distinct A\<^sub>R\<close> \<open>A\<^sub>R \<sharp>* R\<close> \<open>A\<^sub>R \<sharp>* M\<close> \<open>A\<^sub>R \<sharp>* xvec\<close> \<open>A\<^sub>R \<sharp>* N\<close> \<open>A\<^sub>R \<sharp>* \<Psi>\<close> \<open>A\<^sub>R \<sharp>* P\<close> \<open>A\<^sub>R \<sharp>* (!Q)\<close>
            \<open>xvec \<sharp>* \<Psi>\<close> \<open>xvec \<sharp>* P\<close> \<open>xvec \<sharp>* (!Q)\<close> \<open>xvec \<sharp>* R\<close> \<open>xvec \<sharp>* M\<close> \<open>distinct xvec\<close>
     by(rule_tac C="(\<Psi>, P, Q)" and C'="(\<Psi>, P, Q)" in expandFrame) (assumption | simp)+

    from RTrans S \<open>(p \<bullet> xvec) \<sharp>* N\<close> \<open>(p \<bullet> xvec) \<sharp>* R'\<close> have "\<Psi> \<otimes> \<Psi>\<^sub>Q \<rhd> R \<longmapsto>M\<lparr>\<nu>*(p \<bullet> xvec)\<rparr>\<langle>(p \<bullet> N)\<rangle> \<prec> (p \<bullet> R')"
      apply(simp add: residualInject)
      by(subst boundOutputChainAlpha''[symmetric]) auto

    moreover have QTrans: "\<Psi> \<otimes> \<Psi>\<^sub>R \<rhd> !Q \<longmapsto>K\<lparr>N\<rparr> \<prec> Q'" by fact
    with QTrans S \<open>(p \<bullet> xvec) \<sharp>* N\<close> have "\<Psi> \<otimes> \<Psi>\<^sub>R \<rhd> !Q \<longmapsto>K\<lparr>(p \<bullet> N)\<rparr> \<prec> (p \<bullet> Q')" using \<open>distinctPerm p\<close> \<open>xvec \<sharp>* (!Q)\<close> \<open>(p \<bullet> xvec) \<sharp>* Q\<close>
      by(rule_tac inputAlpha) auto
    with \<open>(\<Psi>, P, Q) \<in> Rel\<close> \<open>guarded P\<close>
    obtain P' S T where PTrans: "\<Psi> \<otimes> \<Psi>\<^sub>R \<rhd> !P \<longmapsto>K\<lparr>(p \<bullet> N)\<rparr> \<prec> P'" and "(\<Psi> \<otimes> \<Psi>\<^sub>R, P', T \<parallel> !P) \<in> Rel"
                    and "(\<Psi> \<otimes> \<Psi>\<^sub>R, (p \<bullet> Q'), S \<parallel> !Q) \<in> Rel" and "(\<Psi> \<otimes> \<Psi>\<^sub>R, S, T) \<in> Rel"
                    and suppT: "((supp T)::name set) \<subseteq> supp P'" and suppS: "((supp S)::name set) \<subseteq> supp(p \<bullet> Q')"
      by(drule_tac cSym) (auto dest: Der cExt)
    note \<open>\<Psi> \<otimes> \<Psi>\<^sub>R \<otimes> \<Psi>\<^sub>Q \<turnstile> M \<leftrightarrow> K\<close>
    ultimately have "\<Psi> \<rhd> R \<parallel> !P \<longmapsto>\<tau> \<prec> \<lparr>\<nu>*(p \<bullet> xvec)\<rparr>((p \<bullet> R') \<parallel> P')" 
      using PTrans FrR \<open>\<Psi>\<^sub>Q = SBottom'\<close> \<open>(p \<bullet> xvec) \<sharp>* P\<close> \<open>A\<^sub>R \<sharp>* \<Psi>\<close> \<open>A\<^sub>R \<sharp>* R\<close> \<open>A\<^sub>R \<sharp>* M\<close> \<open>A\<^sub>R \<sharp>* P\<close>
      by(rule_tac Comm2) (assumption | simp)+

    moreover from \<open>A\<^sub>R' \<sharp>* P\<close> \<open>A\<^sub>R' \<sharp>* Q\<close> \<open>A\<^sub>R' \<sharp>* N\<close> S \<open>xvec \<sharp>* A\<^sub>R'\<close> \<open>(p \<bullet> xvec) \<sharp>* A\<^sub>R'\<close> PTrans QTrans \<open>distinctPerm p\<close> have "A\<^sub>R' \<sharp>* P'" and "A\<^sub>R' \<sharp>* Q'"
      apply -
      apply(drule_tac inputFreshChainDerivative, auto)
      apply(subst pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst, symmetric, of _ _ p], simp)
      by(force dest: inputFreshChainDerivative)+
    from \<open>xvec \<sharp>* P\<close> \<open>(p \<bullet> xvec) \<sharp>* N\<close> PTrans \<open>distinctPerm p\<close> have "(p \<bullet> xvec) \<sharp>* (p \<bullet> P')"
      apply(drule_tac inputFreshChainDerivative, simp)
      apply(subst pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst, symmetric, of _ _ p], simp)
      by(subst pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst, symmetric, of _ _ p], simp)

    { 
      from \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, P', T \<parallel> !P) \<in> Rel\<close> have "(p \<bullet> (\<Psi> \<otimes> \<Psi>\<^sub>R), (p \<bullet> P'), p \<bullet> (T \<parallel> !P)) \<in> Rel"
        by(rule Closed)
      with \<open>xvec \<sharp>* \<Psi>\<close> \<open>(p \<bullet> xvec) \<sharp>* \<Psi>\<close> \<open>xvec \<sharp>* P\<close> \<open>(p \<bullet> xvec) \<sharp>* P\<close> S have "(\<Psi> \<otimes> (p \<bullet> \<Psi>\<^sub>R), p \<bullet> P', (p \<bullet> T) \<parallel> !P) \<in> Rel"
        by(simp add: eqvts)     
      hence "((\<Psi> \<otimes> (p \<bullet> \<Psi>\<^sub>R)) \<otimes> \<Psi>', p \<bullet> P', (p \<bullet> T) \<parallel> !P) \<in> Rel" by(rule cExt)
      with \<open>(p \<bullet> \<Psi>\<^sub>R) \<otimes> \<Psi>' \<simeq> \<Psi>\<^sub>R'\<close> have "(\<Psi> \<otimes> \<Psi>\<^sub>R', (p \<bullet> P'), (p \<bullet> T) \<parallel> !P) \<in> Rel"
        by(metis Associativity StatEq compositionSym) 
      with FrR' \<open>A\<^sub>R' \<sharp>* \<Psi>\<close> \<open>A\<^sub>R' \<sharp>* P'\<close> \<open>A\<^sub>R' \<sharp>* P\<close> \<open>xvec \<sharp>* A\<^sub>R'\<close> \<open>(p \<bullet> xvec) \<sharp>* A\<^sub>R'\<close> S \<open>distinctPerm p\<close> suppT
      have "(\<Psi>, R' \<parallel> (p \<bullet> P'), R' \<parallel> ((p \<bullet> T) \<parallel> !P)) \<in> Rel"
        apply(rule_tac FrameParPres)
        apply(assumption | simp add: freshChainSimps)+
        by(auto simp add: fresh_star_def fresh_def)
      hence "(\<Psi>, R' \<parallel> (p \<bullet> P'), (R' \<parallel> (p \<bullet> T)) \<parallel> !P) \<in> Rel" by(blast intro: Assoc Trans)
      with \<open>xvec \<sharp>* \<Psi>\<close> \<open>xvec \<sharp>* P\<close> have "(\<Psi>, \<lparr>\<nu>*xvec\<rparr>(R' \<parallel> (p \<bullet> P')), (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> (p \<bullet> T))) \<parallel> !P) \<in> Rel"
        by(metis ResPres psiFreshVec ScopeExt Trans)
      hence "(\<Psi>, \<lparr>\<nu>*(p \<bullet> xvec)\<rparr>((p \<bullet> R') \<parallel> P'), (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> (p \<bullet> T))) \<parallel> !P) \<in> Rel"
      using \<open>(p \<bullet> xvec) \<sharp>* R'\<close> \<open>(p \<bullet> xvec) \<sharp>* (p \<bullet> P')\<close> S \<open>distinctPerm p\<close>
      apply(erule_tac rev_mp) by(subst resChainAlpha[of p]) auto
      moreover from \<open>(\<Psi>, P, Q) \<in> Rel\<close> \<open>guarded P\<close> \<open>guarded Q\<close> have "(\<Psi>, (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> (p \<bullet> T))) \<parallel> !P, (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> (p \<bullet> T))) \<parallel> !Q) \<in> Rel'"
        by(rule C1)
      moreover from \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, (p \<bullet> Q'), S \<parallel> !Q) \<in> Rel\<close> \<open>(\<Psi> \<otimes> \<Psi>\<^sub>R, S, T) \<in> Rel\<close> have "(\<Psi> \<otimes> \<Psi>\<^sub>R, (p \<bullet> Q'), T \<parallel> !Q) \<in> Rel"
        by(blast intro: ParPres Trans)
      hence "(p \<bullet> (\<Psi> \<otimes> \<Psi>\<^sub>R), p \<bullet> p \<bullet> Q', p \<bullet> (T \<parallel> !Q)) \<in> Rel" by(rule Closed)
      with S \<open>xvec \<sharp>* \<Psi>\<close> \<open>(p \<bullet> xvec) \<sharp>* \<Psi>\<close> \<open>xvec \<sharp>* (!Q)\<close> \<open>(p \<bullet> xvec) \<sharp>* Q\<close> \<open>distinctPerm p\<close>
      have "(\<Psi> \<otimes> (p \<bullet> \<Psi>\<^sub>R), Q', (p \<bullet> T) \<parallel> !Q) \<in> Rel" by(simp add: eqvts)
      hence "((\<Psi> \<otimes> (p \<bullet> \<Psi>\<^sub>R)) \<otimes> \<Psi>', Q', (p \<bullet> T) \<parallel> !Q) \<in> Rel" by(rule cExt)
      with \<open>(p \<bullet> \<Psi>\<^sub>R) \<otimes> \<Psi>' \<simeq> \<Psi>\<^sub>R'\<close> have "(\<Psi> \<otimes> \<Psi>\<^sub>R', Q', (p \<bullet> T) \<parallel> !Q) \<in> Rel"
        by(metis Associativity StatEq compositionSym) 
      with FrR' \<open>A\<^sub>R' \<sharp>* \<Psi>\<close> \<open>A\<^sub>R' \<sharp>* P'\<close> \<open>A\<^sub>R' \<sharp>* Q'\<close> \<open>A\<^sub>R' \<sharp>* Q\<close> suppT suppS \<open>xvec \<sharp>* A\<^sub>R'\<close> \<open>(p \<bullet> xvec) \<sharp>* A\<^sub>R'\<close> S \<open>distinctPerm p\<close> 
      have "(\<Psi>, R' \<parallel> Q', R' \<parallel> ((p \<bullet> T) \<parallel> !Q)) \<in> Rel"
        apply(rule_tac FrameParPres)
        apply(assumption | simp)+
        apply(simp add: freshChainSimps)
        by(auto simp add: fresh_star_def fresh_def)
      hence "(\<Psi>, R' \<parallel> Q', (R' \<parallel> (p \<bullet> T)) \<parallel> !Q) \<in> Rel" by(blast intro: Assoc Trans)
      with \<open>xvec \<sharp>* \<Psi>\<close> \<open>xvec \<sharp>* (!Q)\<close> have "(\<Psi>, \<lparr>\<nu>*xvec\<rparr>(R' \<parallel> Q'), (\<lparr>\<nu>*xvec\<rparr>(R' \<parallel> (p \<bullet> T))) \<parallel> !Q) \<in> Rel"
        by(metis ResPres psiFreshVec ScopeExt Trans)
      ultimately have "(\<Psi>, \<lparr>\<nu>*(p \<bullet> xvec)\<rparr>((p \<bullet> R') \<parallel> P'), \<lparr>\<nu>*xvec\<rparr>(R' \<parallel> Q')) \<in> Rel'" by(blast intro: cSym Compose)
    }
    ultimately show ?case by blast
  qed
qed
unbundle relcomp_syntax
end

end

Messung V0.5 in Prozent
C=89 H=98 G=93

¤ Dauer der Verarbeitung: 0.26 Sekunden  (vorverarbeitet am  2026-06-10) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

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.