(*
Title : Psi - calculi
Author / Maintainer : Jesper Bengtson ( jebe @ itu . dk ) , 2012
*)
theory Semantics
imports Frame
begin
nominal_datatype ('a, 'b, 'c) boundOutput =
BOut "'a::fs_name" "('a, 'b::fs_name, 'c::fs_name) psi" (‹ _ ≺ '' _› [110 , 110 ] 110 )
| BStep "« name¬ ('a, 'b, 'c) boundOutput" (‹ ( ν_) _› [110 , 110 ] 110 )
primrec BOresChain :: "name list → ('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput →
('a, 'b, 'c) boundOutput" where
Base: "BOresChain [] B = B"
| Step: "BOresChain (x#xs) B = ( νx) (BOresChain xs B)"
abbreviation
BOresChainJudge (‹ ( ν*_) _› [80 , 80 ] 80 ) where "( ν*xvec) B ≡ BOresChain xvec B"
lemma BOresChainEqvt[eqvt]:
fixes perm :: "name prm"
and lst :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
shows "perm ∙ (( ν*xvec) B) = ( ν*(perm ∙ xvec)) (perm ∙ B)"
by (induct_tac xvec, auto)
lemma BOresChainSimps[simp]:
fixes xvec :: "name list"
and N :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and N' :: 'a
and P' :: "('a, 'b, 'c) psi"
and B :: "('a, 'b, 'c) boundOutput"
and B' :: "('a, 'b, 'c) boundOutput"
shows "(( ν*xvec) N ≺ ' P = N' ≺ ' P') = (xvec = [] ∧ N = N' ∧ P = P')"
and "(N' ≺ ' P' = ( ν*xvec) N ≺ ' P) = (xvec = [] ∧ N = N' ∧ P = P')"
and "(N' ≺ ' P' = N ≺ ' P) = (N = N' ∧ P = P')"
and "(( ν*xvec) B = ( ν*xvec) B') = (B = B')"
by (induct xvec) (auto simp add: boundOutput.inject alpha)
lemma outputFresh[simp]:
fixes Xs :: "name set"
and xvec :: "name list"
and N :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "(Xs ♯ * (N ≺ ' P)) = ((Xs ♯ * N) ∧ (Xs ♯ * P))"
and "(xvec ♯ * (N ≺ ' P)) = ((xvec ♯ * N) ∧ (xvec ♯ * P))"
by (auto simp add: fresh_star_def)
lemma boundOutputFresh:
fixes x :: name
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
shows "(x ♯ (( ν*xvec) B)) = (x ∈ set xvec ∨ x ♯ B)"
by (induct xvec) (simp_all add: abs_fresh)
lemma boundOutputFreshSet:
fixes Xs :: "name set"
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and x :: name
shows "Xs ♯ * (( ν*xvec) B) = (∀ x∈ Xs. x ∈ set xvec ∨ x ♯ B)"
and "yvec ♯ * (( ν*xvec) B) = (∀ x∈ (set yvec). x ∈ set xvec ∨ x ♯ B)"
and "Xs ♯ * (( νx) B) = Xs ♯ * [x].B"
and "xvec ♯ * (( νx) B) = xvec ♯ * [x].B"
by (simp add: fresh_star_def boundOutputFresh)+
lemma BOresChainSupp:
fixes xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
shows "(supp(( ν*xvec) B)::name set) = (supp B) - (supp xvec)"
by (induct xvec)
(auto simp add: boundOutput.supp supp_list_nil supp_list_cons abs_supp supp_atm)
lemma boundOutputFreshSimps[simp]:
fixes Xs :: "name set"
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and x :: name
shows "Xs ♯ * xvec ==> (Xs ♯ * (( ν*xvec) B)) = (Xs ♯ * B)"
and "yvec ♯ * xvec ==> yvec ♯ * (( ν*xvec) B) = yvec ♯ * B"
and "xvec ♯ * (( ν*xvec) B)"
and "x ♯ xvec ==> x ♯ ( ν*xvec) B = x ♯ B"
apply (simp add: boundOutputFreshSet) apply (force simp add: fresh_star_def name_list_supp fresh_def)
apply (simp add: boundOutputFreshSet) apply (force simp add: fresh_star_def name_list_supp fresh_def)
apply (simp add: boundOutputFreshSet)
by (simp add: BOresChainSupp fresh_def)
lemma boundOutputChainAlpha:
fixes p :: "name prm"
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
assumes xvecFreshB: "(p ∙ xvec) ♯ * B"
and S: "set p ⊆ set xvec × set (p ∙ xvec)"
and "(set xvec) ⊆ (set yvec)"
shows "(( ν*yvec) B) = (( ν*(p ∙ yvec)) (p ∙ B))"
proof -
note pt_name_inst at_name_inst S
moreover from ‹ (set xvec) ⊆ (set yvec)› have "set xvec ♯ * (( ν*yvec) B)"
by (force simp add: boundOutputFreshSet)
moreover from xvecFreshB ‹ (set xvec) ⊆ (set yvec)› have "set (p ∙ xvec) ♯ * (( ν*yvec) B)"
by (simp add: boundOutputFreshSet) (simp add: fresh_star_def)
ultimately have "(( ν*yvec) B) = p ∙ (( ν*yvec) B)"
by (rule_tac pt_freshs_freshs [symmetric])
then show ?thesis by (simp add: eqvts)
qed
lemma boundOutputChainAlpha':
fixes p :: "name prm"
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and zvec :: "name list"
assumes xvecFreshB: "xvec ♯ * B"
and S: "set p ⊆ set xvec × set yvec"
and "yvec ♯ * (( ν*zvec) B)"
shows "(( ν*zvec) B) = (( ν*(p ∙ zvec)) (p ∙ B))"
proof -
note pt_name_inst at_name_inst S ‹ yvec ♯ * (( ν*zvec) B)›
moreover from xvecFreshB have "set (xvec) ♯ * (( ν*zvec) B)"
by (simp add: boundOutputFreshSet) (simp add: fresh_star_def)
ultimately have "(( ν*zvec) B) = p ∙ (( ν*zvec) B)"
by (rule_tac pt_freshs_freshs [symmetric]) auto
then show ?thesis by (simp add: eqvts)
qed
lemma boundOutputChainAlpha'':
fixes p :: "name prm"
and xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a::fs_name, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
assumes "(p ∙ xvec) ♯ * M"
and "(p ∙ xvec) ♯ * P"
and "set p ⊆ set xvec × set (p ∙ xvec)"
and "(set xvec) ⊆ (set yvec)"
shows "(( ν*yvec) M ≺ ' P) = (( ν*(p ∙ yvec)) (p ∙ M) ≺ ' (p ∙ P))"
using assms
by (subst boundOutputChainAlpha) auto
lemma boundOutputChainSwap:
fixes x :: name
and y :: name
and N :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and xvec :: "name list"
assumes "y ♯ N"
and "y ♯ P"
and "x ∈ (set xvec)"
shows "( ν*xvec) N ≺ ' P = ( ν*([(x, y)] ∙ xvec)) ([(x ,y)] ∙ N) ≺ ' ([(x, y)] ∙ P)"
proof (case_tac "x=y" )
assume "x=y"
thus ?thesis by simp
next
assume "x ≠ y"
with assms show ?thesis
by (rule_tac xvec="[x]" in boundOutputChainAlpha'') (auto simp add: calc_atm)
qed
lemma alphaBoundOutput:
fixes x :: name
and y :: name
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
assumes "y ♯ B"
shows "( νx) B = ( νy) ([(x, y)] ∙ B)"
using assms
by (auto simp add: boundOutput.inject alpha fresh_left calc_atm)
lemma boundOutputEqFresh:
fixes B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and C :: "('a, 'b, 'c) boundOutput"
and x :: name
and y :: name
assumes "( νx) B = ( νy) C"
and "x ♯ B"
shows "y ♯ C"
using assms
by (auto simp add: boundOutput.inject alpha fresh_left calc_atm)
lemma boundOutputEqSupp:
fixes B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and C :: "('a, 'b, 'c) boundOutput"
and x :: name
and y :: name
assumes "( νx) B = ( νy) C"
and "x ∈ supp B"
shows "y ∈ supp C"
using assms
apply (auto simp add: boundOutput.inject alpha fresh_left calc_atm)
apply (drule_tac pi="[(x, y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
by (simp add: eqvts calc_atm)
lemma boundOutputChainEq:
fixes xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and B' :: "('a, 'b, 'c) boundOutput"
assumes "( ν*xvec) B = ( ν*yvec) B'"
and "xvec ♯ * yvec"
and "length xvec = length yvec"
shows "∃ p. (set p) ⊆ (set xvec) × set (yvec) ∧ distinctPerm p ∧ B = p ∙ B' ∧ (set (map fst p)) ⊆ (supp B) ∧ xvec ♯ * B' ∧ yvec ♯ * B"
proof -
obtain n where "n = length xvec" by auto
with assms show ?thesis
proof (induct n arbitrary: xvec yvec B B')
case (0 xvec yvec B B')
have Eq: "( ν*xvec) B = ( ν*yvec) B'" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with ‹ length xvec = length yvec› have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec B B')
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) B = ( ν*yvec) B'› ‹ xvec = x # xvec'› ‹ length xvec = length yvec›
obtain y yvec' where "( ν*(x#xvec')) B = ( ν*(y#yvec')) B'"
and "yvec = y#yvec'" and "length xvec' = length yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') B) = ( νy) (( ν*yvec') B')"
by simp
from ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ xvec ♯ * yvec›
have "x ≠ y" and "xvec' ♯ * yvec'" and "x ♯ yvec'" and "y ♯ xvec'"
by auto
have IH: "∧ xvec yvec B B'. [ ( ν*xvec) (B::('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput) = ( ν*yvec) B'; xvec ♯ * yvec; length xvec = length yvec; n = length xvec] ==> ∃ p. (set p) ⊆ (set xvec) × (set yvec) ∧ distinctPerm p ∧ B = p ∙ B' ∧ set(map fst p) ⊆ supp B ∧ xvec ♯ * B' ∧ yvec ♯ * B"
by fact
from EQ ‹ x ≠ y› have EQ': "( ν*xvec') B = ([(x, y)] ∙ (( ν*yvec') B'))"
and xFreshB': "x ♯ (( ν*yvec') B')"
and yFreshB: "y ♯ (( ν*xvec') B)"
by (metis boundOutput.inject alpha)+
from xFreshB' ‹ x ♯ yvec'› have "x ♯ B'"
by (auto simp add: boundOutputFresh) (simp add: fresh_def name_list_supp)+
from yFreshB ‹ y ♯ xvec'› have "y ♯ B"
by (auto simp add: boundOutputFresh) (simp add: fresh_def name_list_supp)+
show ?case
proof (case_tac "x ♯ ( ν*xvec') B" )
assume xFreshB: "x ♯ ( ν*xvec') B"
with EQ have yFreshB': "y ♯ ( ν*yvec') B'"
by (rule boundOutputEqFresh)
with xFreshB' EQ' have "( ν*xvec') B = ( ν*yvec') B'"
by (simp)
with ‹ xvec' ♯ * yvec'› ‹ length xvec' = length yvec'› ‹ length xvec' = n› IH
obtain p where S: "(set p) ⊆ (set xvec') × (set yvec')" and "distinctPerm p" and "B = p ∙ B'"
and "set(map fst p) ⊆ supp B" and "xvec' ♯ * B'" and "yvec' ♯ * B"
by blast
from S have "(set p) ⊆ set(x#xvec') × set(y#yvec')" by auto
moreover note ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ distinctPerm p› ‹ B = p ∙ B'›
‹ xvec' ♯ * B'› ‹ x ♯ B'› ‹ x ♯ B'› ‹ yvec' ♯ * B› ‹ y ♯ B› ‹ set(map fst p) ⊆ supp B›
ultimately show ?case by auto
next
assume "¬ (x ♯ ( ν*xvec') B)"
hence xSuppB: "x ∈ supp(( ν*xvec') B)"
by (simp add: fresh_def)
with EQ have ySuppB': "y ∈ supp (( ν*yvec') B')"
by (rule boundOutputEqSupp)
hence "y ♯ yvec'"
by (induct yvec') (auto simp add: boundOutput.supp abs_supp)
with ‹ x ♯ yvec'› EQ' have "( ν*xvec') B = ( ν*yvec') ([(x, y)] ∙ B')"
by (simp add: eqvts)
with ‹ xvec' ♯ * yvec'› ‹ length xvec' = length yvec'› ‹ length xvec' = n› IH
obtain p where S: "(set p) ⊆ (set xvec') × (set yvec')" and "distinctPerm p" and "B = p ∙ [(x, y)] ∙ B'"
and "set(map fst p) ⊆ supp B" and "xvec' ♯ * ([(x, y)] ∙ B')" and "yvec' ♯ * B"
by blast
from xSuppB have "x ♯ xvec'"
by (induct xvec') (auto simp add: boundOutput.supp abs_supp)
with ‹ x ♯ yvec'› ‹ y ♯ xvec'› ‹ y ♯ yvec'› S have "x ♯ p" and "y ♯ p"
apply (induct p)
by (auto simp add: name_list_supp) (auto simp add: fresh_def)
from S have "(set ((x, y)#p)) ⊆ (set(x#xvec')) × (set(y#yvec'))"
by force
moreover from ‹ x ≠ y› ‹ x ♯ p› ‹ y ♯ p› S ‹ distinctPerm p›
have "distinctPerm((x,y)#p)" by simp
moreover from ‹ B = p ∙ [(x, y)] ∙ B'› ‹ x ♯ p› ‹ y ♯ p› have "B = [(x, y)] ∙ p ∙ B'"
by (subst perm_compose) simp
hence "B = ((x, y)#p) ∙ B'" by simp
moreover from ‹ xvec' ♯ * ([(x, y)] ∙ B')› have "([(x, y)] ∙ xvec') ♯ * ([(x, y)] ∙ [(x, y)] ∙ B')"
by (simp only: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ♯ xvec'› ‹ y ♯ xvec'› ‹ x ♯ B'› have "(x#xvec') ♯ * B'" by simp
moreover from ‹ y ♯ B› ‹ yvec' ♯ * B› have "(y#yvec') ♯ * B" by simp
moreover from ‹ set(map fst p) ⊆ supp B› xSuppB ‹ x ♯ xvec'›
have "set(map fst ((x, y)#p)) ⊆ supp B"
by (simp add: BOresChainSupp)
ultimately show ?case using ‹ xvec=x#xvec'› ‹ yvec=y#yvec'›
by metis
qed
qed
qed
lemma boundOutputChainEqLength:
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: "'a::fs_name"
and Q :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
shows "length xvec = length yvec"
proof -
obtain n where "n = length xvec" by auto
with assms show ?thesis
proof (induct n arbitrary: xvec yvec M P N Q)
case (0 xvec yvec M P N Q)
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q› have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case by simp
next
case (Suc n xvec yvec M P N Q)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' Q"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' Q)"
by simp
have IH: "∧ xvec yvec M P N Q. [ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q::('a, 'b, 'c) psi); n = length xvec] ==> length xvec = length yvec"
by fact
show ?case
proof (case_tac "x = y" )
assume "x = y"
with EQ have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' Q"
by (simp add: alpha boundOutput.inject)
with IH ‹ length xvec' = n› have "length xvec' = length yvec'"
by blast
with ‹ xvec = x#xvec'› ‹ yvec=y#yvec'›
show ?case by simp
next
assume "x ≠ y"
with EQ have "( ν*xvec') M ≺ ' P = [(x, y)] ∙ ( ν*yvec') N ≺ ' Q"
by (simp add: alpha boundOutput.inject)
hence "( ν*xvec') M ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (simp add: eqvts)
with IH ‹ length xvec' = n› have "length xvec' = length ([(x, y)] ∙ yvec')"
by blast
hence "length xvec' = length yvec'"
by simp
with ‹ xvec = x#xvec'› ‹ yvec=y#yvec'›
show ?case by simp
qed
qed
qed
lemma boundOutputChainEq':
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a::fs_name, 'b::fs_name, 'c::fs_name) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
and "xvec ♯ * yvec"
shows "∃ p. (set p) ⊆ (set xvec) × set (yvec) ∧ distinctPerm p ∧ M = p ∙ N ∧ P = p ∙ Q ∧ xvec ♯ * N ∧ xvec ♯ * Q ∧ yvec ♯ * M ∧ yvec ♯ * P"
using assms
apply (frule_tac boundOutputChainEqLength)
apply (drule_tac boundOutputChainEq)
by (auto simp add: boundOutput.inject)
lemma boundOutputChainEq'':
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a::fs_name, 'b::fs_name, 'c::fs_name) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
and "xvec ♯ * yvec"
and "distinct xvec"
and "distinct yvec"
obtains p where "(set p) ⊆ (set xvec) × set (p ∙ xvec)" and "distinctPerm p" and "yvec = p ∙ xvec" and "N = p ∙ M" and "Q = p ∙ P" and "xvec ♯ * N" and "xvec ♯ * Q" and "(p ∙ xvec) ♯ * M" and "(p ∙ xvec) ♯ * P"
proof -
assume "∧ p. [ set p ⊆ set xvec × set (p ∙ xvec); distinctPerm p; yvec = p ∙ xvec; N = p ∙ M; Q = p ∙ P; xvec ♯ * N; xvec ♯ * Q; (p ∙ xvec) ♯ * M; (p ∙ xvec) ♯ * P] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ p. (set p) ⊆ (set xvec) × set (yvec) ∧ distinctPerm p ∧ yvec = p ∙ xvec ∧ N = p ∙ M ∧ Q = p ∙ P ∧ xvec ♯ * N ∧ xvec ♯ * Q ∧ (p ∙ xvec) ♯ * M ∧ (p ∙ xvec) ♯ * P"
proof (induct n arbitrary: xvec yvec M P N Q)
case (0 xvec yvec M P N Q)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M P N Q)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' Q"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' Q)"
by simp
from ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ xvec ♯ * yvec›
have "x ≠ y" and "xvec' ♯ * yvec'" and "x ♯ yvec'" and "y ♯ xvec'"
by auto
from ‹ distinct xvec› ‹ distinct yvec› ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› have "x ♯ xvec'" and "y ♯ yvec'" and "distinct xvec'" and "distinct yvec'"
by simp+
have IH: "∧ xvec yvec M P N Q. [ ( ν*xvec) (M::'a) ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' Q; xvec ♯ * yvec; distinct xvec; distinct yvec; n = length xvec] ==> ∃ p. (set p) ⊆ (set xvec) × (set yvec) ∧ distinctPerm p ∧ yvec = p ∙ xvec ∧ N = p ∙ M ∧ Q = p ∙ P ∧ xvec ♯ * N ∧ xvec ♯ * Q ∧ (p ∙ xvec) ♯ * M ∧ (p ∙ xvec) ♯ * P"
by fact
from EQ ‹ x ≠ y› ‹ x ♯ yvec'› ‹ y ♯ yvec'› ‹ y ♯ xvec'› ‹ x ♯ xvec'› have "( ν*xvec') M ≺ ' P = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)" and "x ♯ N" and "x ♯ Q" and "y ♯ M" and "y ♯ P"
apply -
apply (simp add: boundOutput.inject alpha eqvts)
apply (simp add: boundOutput.inject alpha eqvts)
apply (simp add: boundOutput.inject alpha eqvts)
by (simp add: boundOutput.inject alpha' eqvts)+
with ‹ xvec' ♯ * yvec'› ‹ distinct xvec'› ‹ distinct yvec'› ‹ length xvec' = n› IH
obtain p where S: "(set p) ⊆ (set xvec') × (set yvec')" and "distinctPerm p" and "yvec' = p ∙ xvec'" and "([(x, y)] ∙ N) = p ∙ M" and "([(x, y)] ∙ Q) = p ∙ P" and "xvec' ♯ * ([(x, y)] ∙ N)" and "xvec' ♯ * ([(x, y)] ∙ Q)" and "yvec' ♯ * M" and "yvec' ♯ * P"
by metis
from S have "set((x, y)#p) ⊆ set(x#xvec') × set(y#yvec')" by auto
moreover from ‹ x ♯ xvec'› ‹ x ♯ yvec'› ‹ y ♯ xvec'› ‹ y ♯ yvec'› S have "x ♯ p" and "y ♯ p"
apply (induct p)
by (auto simp add: fresh_prod name_list_supp) (auto simp add: fresh_def)
with S ‹ distinctPerm p› ‹ x ≠ y› have "distinctPerm((x, y)#p)" by auto
moreover from ‹ yvec' = p ∙ xvec'› ‹ x ♯ p› ‹ y ♯ p› ‹ x ♯ xvec'› ‹ y ♯ xvec'› have "(y#yvec') = ((x, y)#p) ∙ (x#xvec')"
by (simp add: eqvts calc_atm perm_compose freshChainSimps)
moreover from ‹ ([(x, y)] ∙ N) = p ∙ M›
have "([(x, y)] ∙ [(x, y)] ∙ N) = [(x, y)] ∙ p ∙ M"
by (simp add: pt_bij)
hence "N = ((x, y)#p) ∙ M" by simp
moreover from ‹ ([(x, y)] ∙ Q) = p ∙ P›
have "([(x, y)] ∙ [(x, y)] ∙ Q) = [(x, y)] ∙ p ∙ P"
by (simp add: pt_bij)
hence "Q = ((x, y)#p) ∙ P" by simp
moreover from ‹ xvec' ♯ * ([(x, y)] ∙ N)› have "([(x, y)] ∙ xvec') ♯ * ([(x, y)] ∙ [(x, y)] ∙ N)"
by (subst fresh_star_bij)
with ‹ x ♯ xvec'› ‹ y ♯ xvec'› have "xvec' ♯ * N" by simp
with ‹ x ♯ N› have "(x#xvec') ♯ * N" by simp
moreover from ‹ xvec' ♯ * ([(x, y)] ∙ Q)› have "([(x, y)] ∙ xvec') ♯ * ([(x, y)] ∙ [(x, y)] ∙ Q)"
by (subst fresh_star_bij)
with ‹ x ♯ xvec'› ‹ y ♯ xvec'› have "xvec' ♯ * Q" by simp
with ‹ x ♯ Q› have "(x#xvec') ♯ * Q" by simp
moreover from ‹ y ♯ M› ‹ yvec' ♯ * M› have "(y#yvec') ♯ * M" by simp
moreover from ‹ y ♯ P› ‹ yvec' ♯ * P› have "(y#yvec') ♯ * P" by simp
ultimately show ?case using ‹ xvec=x#xvec'› ‹ yvec=y#yvec'›
by metis
qed
ultimately show ?thesis by blast
qed
lemma boundOutputEqSupp':
fixes x :: name
and xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and y :: name
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
assumes Eq: "( νx) (( ν*xvec) M ≺ ' P) = ( νy) (( ν*yvec) N ≺ ' Q)"
and "x ≠ y"
and "x ♯ yvec"
and "x ♯ xvec"
and "y ♯ xvec"
and "y ♯ yvec"
and "xvec ♯ * yvec"
and "x ∈ supp M"
shows "y ∈ supp N"
proof -
from Eq ‹ x ≠ y› ‹ x ♯ yvec› ‹ y ♯ yvec› have "( ν*xvec) M ≺ ' P = ( ν*yvec) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (simp add: boundOutput.inject alpha eqvts)
then obtain p where S: "set p ⊆ set xvec × set yvec" and "M = p ∙ [(x, y)] ∙ N" and "distinctPerm p" using ‹ xvec ♯ * yvec›
by (blast dest: boundOutputChainEq')
with ‹ x ∈ supp M› have "x ∈ supp(p ∙ [(x, y)] ∙ N)" by simp
hence "(p ∙ x) ∈ p ∙ supp(p ∙ [(x, y)] ∙ N)"
by (simp add: pt_set_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ♯ xvec› ‹ x ♯ yvec› S ‹ distinctPerm p› have "x ∈ supp([(x, y)] ∙ N)"
by (simp add: eqvts)
hence "([(x, y)] ∙ x) ∈ ([(x, y)] ∙ (supp([(x, y)] ∙ N)))"
by (simp add: pt_set_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ≠ y› show ?thesis by (simp add: calc_atm eqvts)
qed
lemma boundOutputChainOpenIH:
fixes xvec :: "name list"
and x :: name
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and y :: name
and B' :: "('a, 'b, 'c) boundOutput"
assumes Eq: "( ν*xvec) (( νx) B) = ( ν*yvec) (( νy) B')"
and L: "length xvec = length yvec"
and xFreshB': "x ♯ B'"
and xFreshxvec: "x ♯ xvec"
and xFreshyvec: "x ♯ yvec"
shows "( ν*xvec) B = ( ν*yvec) ([(x, y)] ∙ B')"
using assms
proof (induct n=="length xvec" arbitrary: xvec yvec y B' rule: nat.induct)
case (zero xvec yvec y B')
have "0 = length xvec" and "length xvec = length yvec" by fact+
moreover have "( ν*xvec) ( νx) B = ( ν*yvec) ( νy) B'" by fact
ultimately show ?case by (auto simp add: boundOutput.inject alpha)
next
case (Suc n xvec yvec y B')
have L: "length xvec = length yvec" and "Suc n = length xvec" by fact+
then obtain x' xvec' y' yvec' where xEq: "xvec = x'#xvec'" and yEq: "yvec = y'#yvec'"
and L': "length xvec' = length yvec'"
by (cases xvec, auto, cases yvec, auto)
have xFreshB': "x ♯ B'" by fact
have "x ♯ xvec" and "x ♯ yvec" by fact+
with xEq yEq have xineqx': "x ≠ x'" and xFreshxvec': "x ♯ xvec'"
and xineqy': "x ≠ y'" and xFreshyvec': "x ♯ yvec'"
by simp+
have "( ν*xvec) ( νx) B = ( ν*yvec) ( νy) B'" by fact
with xEq yEq have Eq: "( νx') (( ν*xvec') ( νx) B) = ( νy') (( ν*yvec') ( νy) B')" by simp
have "Suc n = length xvec" by fact
with xEq have L'': "n = length xvec'" by simp
have "( νx') (( ν*xvec') B) = ( νy') (( ν*yvec') ([(x, y)] ∙ B'))"
proof (case_tac "x'=y'" )
assume x'eqy': "x' = y'"
with Eq have "( ν*xvec') ( νx) B = ( ν*yvec') ( νy) B'" by (simp add: boundOutput.inject alpha)
hence "( ν*xvec') B = ( ν*yvec') ([(x, y)] ∙ B')" using L' xFreshB' xFreshxvec' xFreshyvec' L''
by (rule_tac Suc)
with x'eqy' show ?thesis by (simp add: boundOutput.inject alpha)
next
assume x'ineqy': "x' ≠ y'"
with Eq have Eq': "( ν*xvec') ( νx) B = ( ν*([(x', y')] ∙ yvec')) ( ν([(x', y')] ∙ y)) ([(x', y')] ∙ B')"
and x'FreshB': "x' ♯ ( ν*yvec') ( νy) B'"
by (simp add: boundOutput.inject alpha eqvts)+
from L' have "length xvec' = length ([(x', y')] ∙ yvec')" by simp
moreover from xineqx' xineqy' xFreshB' have "x ♯ [(x', y')] ∙ B'" by (simp add: fresh_left calc_atm)
moreover from xineqx' xineqy' xFreshyvec' have "x ♯ [(x', y')] ∙ yvec'" by (simp add: fresh_left calc_atm)
ultimately have "( ν*xvec') B = ( ν*([(x', y')] ∙ yvec')) ([(x, ([(x', y')] ∙ y))] ∙ [(x', y')] ∙ B')" using Eq' xFreshxvec' L''
by (rule_tac Suc)
moreover from x'FreshB' have "x' ♯ ( ν*yvec') ([(x, y)] ∙ B')"
proof (case_tac "x' ♯ yvec'" )
assume "x' ♯ yvec'"
with x'FreshB' have x'FreshB': "x' ♯ ( νy) B'"
by (simp add: fresh_def BOresChainSupp)
show ?thesis
proof (case_tac "x'=y" )
assume x'eqy: "x' = y"
show ?thesis
proof (case_tac "x=y" )
assume "x=y"
with xFreshB' x'eqy show ?thesis by (simp add: BOresChainSupp fresh_def)
next
assume "x ≠ y"
with ‹ x ♯ B'› have "y ♯ [(x, y)] ∙ B'" by (simp add: fresh_left calc_atm)
with x'eqy show ?thesis by (simp add: BOresChainSupp fresh_def)
qed
next
assume x'ineqy: "x' ≠ y"
with x'FreshB' have "x' ♯ B'" by (simp add: abs_fresh)
with xineqx' x'ineqy have "x' ♯ ([(x, y)] ∙ B')" by (simp add: fresh_left calc_atm)
thus ?thesis by (simp add: BOresChainSupp fresh_def)
qed
next
assume "¬ x' ♯ yvec'"
thus ?thesis by (simp add: BOresChainSupp fresh_def)
qed
ultimately show ?thesis using x'ineqy' xineqx' xineqy'
apply (simp add: boundOutput.inject alpha eqvts)
apply (subst perm_compose[of "[(x', y')]" ])
by (simp add: calc_atm)
qed
with xEq yEq show ?case by simp
qed
lemma boundOutputPar1Dest:
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)"
and "xvec ♯ * R"
and "yvec ♯ * R"
obtains T where "P = T ∥ R" and "( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
proof -
assume "∧ T. [ P = T ∥ R; ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ T. P = T ∥ R ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
proof (induct n arbitrary: xvec yvec M N P Q R)
case (0 xvec yvec M N P Q R)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q R)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' (Q ∥ R)"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' (Q ∥ R))"
by simp
from ‹ xvec ♯ * R› ‹ yvec ♯ * R› ‹ xvec = x#xvec'› ‹ yvec = y#yvec'›
have "x ♯ R" and "xvec' ♯ * R" and "y ♯ R" and "yvec' ♯ * R" by auto
show ?case
proof (case_tac "x = y" )
assume "x = y"
with EQ have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha)
with ‹ xvec' ♯ * R› ‹ yvec' ♯ * R› ‹ length xvec' = n›
obtain T where "P = T ∥ R" and "( ν*xvec') M ≺ ' T = ( ν*yvec') N ≺ ' Q"
by (drule_tac Suc) auto
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› ‹ x=y› show ?case
by (force simp add: boundOutput.inject alpha)
next
assume "x ≠ y"
with EQ ‹ x ♯ R› ‹ y ♯ R›
have "( ν*xvec') M ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' (([(x, y)] ∙ Q) ∥ R)"
and xFreshQR: "x ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha eqvts)+
moreover from ‹ yvec' ♯ * R› have "([(x, y)] ∙ yvec') ♯ * ([(x, y)] ∙ R)"
by (simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ♯ R› ‹ y ♯ R› have "([(x, y)] ∙ yvec') ♯ * R" by simp
moreover note ‹ xvec' ♯ * R› ‹ length xvec' = n›
ultimately obtain T where "P = T ∥ R" and A: "( ν*xvec') M ≺ ' T = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (drule_tac Suc) auto
from A have "( νx) (( ν*xvec') M ≺ ' T) = ( νx) (( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q))"
by (simp add: boundOutput.inject alpha)
moreover from xFreshQR have "x ♯ ( ν*yvec') N ≺ ' Q"
by (force simp add: boundOutputFresh)
ultimately show ?thesis using ‹ P = T ∥ R› ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› xFreshQR
by (force simp add: alphaBoundOutput name_swap eqvts)
qed
qed
ultimately show ?thesis
by blast
qed
lemma boundOutputPar1Dest':
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)"
and "xvec ♯ * yvec"
obtains T p where "set p ⊆ set xvec × set yvec" and "P = T ∥ (p ∙ R)" and "( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
proof -
assume "∧ p T. [ set p ⊆ set xvec × set yvec; P = T ∥ (p ∙ R); ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ p T. set p ⊆ set xvec × set yvec ∧ P = T ∥ (p ∙ R) ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
proof (induct n arbitrary: xvec yvec M N P Q R)
case (0 xvec yvec M N P Q R)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q R)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' (Q ∥ R)"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence Eq: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' (Q ∥ R))"
by simp
from ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ xvec ♯ * yvec› have "x ≠ y" and "x ♯ yvec'" and "y ♯ xvec'" and "xvec' ♯ * yvec'"
by auto
from Eq ‹ x ≠ y› have Eq': "( ν*xvec') M ≺ ' P = [(x, y)] ∙ ( ν*yvec') N ≺ ' (Q ∥ R)"
and xFreshQR: "x ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha)+
have IH: "∧ xvec yvec M N P Q R. [ ( ν*xvec) M ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' (Q ∥ R); xvec ♯ * yvec; n = length xvec] ==> ∃ p T. set p ⊆ set xvec × set yvec ∧ P = T ∥ (p ∙ R) ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
by fact
show ?case
proof (case_tac "x ♯ ( ν*xvec') M ≺ ' P" )
assume "x ♯ ( ν*xvec') M ≺ ' P"
with Eq have yFreshQR: "y ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (rule boundOutputEqFresh)
with Eq' xFreshQR have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' (Q ∥ R)"
by simp
with ‹ xvec' ♯ * yvec'› ‹ length xvec' = n›
obtain p T where S: "set p ⊆ set xvec' × set yvec'" and "P = T ∥ (p ∙ R)" and A: "( ν*xvec') M ≺ ' T = ( ν*yvec') N ≺ ' Q"
by (drule_tac IH) auto
from yFreshQR xFreshQR have yFreshQ: "y ♯ ( ν*yvec') N ≺ ' Q" and xFreshQ: "x ♯ ( ν*yvec') N ≺ ' Q"
by (force simp add: BOresChainSupp fresh_def boundOutput.supp psi.supp)+
hence "( νx) (( ν*yvec') N ≺ ' Q) = ( νy) (( ν*yvec') N ≺ ' Q)" by (subst alphaBoundOutput) simp+
with A have "( νx) (( ν*xvec') M ≺ ' T) = ( νy) (( ν*yvec') N ≺ ' Q)" by simp
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› S ‹ P = T ∥ (p ∙ R)› show ?case
by auto
next
assume "¬ (x ♯ ( ν*xvec') M ≺ ' P)"
hence "x ∈ supp(( ν*xvec') M ≺ ' P)" by (simp add: fresh_def)
with Eq have "y ∈ supp(( ν*yvec') N ≺ ' (Q ∥ R))"
by (rule boundOutputEqSupp)
hence "y ♯ yvec'" by (simp add: BOresChainSupp fresh_def)
with Eq' ‹ x ♯ yvec'› have "( ν*xvec') M ≺ ' P = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' (([(x, y)] ∙ Q) ∥ ([(x, y)] ∙ R))"
by (simp add: eqvts)
moreover note ‹ xvec' ♯ * yvec'› ‹ length xvec' = n›
ultimately obtain p T where S: "set p ⊆ set xvec' × set yvec'" and "P = T ∥ (p ∙ [(x, y)] ∙ R)" and A: "( ν*xvec') M ≺ ' T = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (drule_tac IH) auto
from S have "set(p@[(x, y)]) ⊆ set(x#xvec') × set(y#yvec')" by auto
moreover from ‹ P = T ∥ (p ∙ [(x, y)] ∙ R)› have "P = T ∥ ((p @ [(x, y)]) ∙ R)"
by (simp add: pt2[OF pt_name_inst])
moreover from xFreshQR have xFreshQ: "x ♯ ( ν*yvec') N ≺ ' Q"
by (force simp add: BOresChainSupp fresh_def boundOutput.supp psi.supp)+
with ‹ x ♯ yvec'› ‹ y ♯ yvec'› ‹ x ≠ y› have "y ♯ ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (simp add: fresh_left calc_atm)
with ‹ x ♯ yvec'› ‹ y ♯ yvec'› have "( νx) (( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)) = ( νy) (( ν*yvec') N ≺ ' Q)"
by (subst alphaBoundOutput) (assumption | simp add: eqvts)+
with A have "( νx) (( ν*xvec') M ≺ ' T) = ( νy) (( ν*yvec') N ≺ ' Q)" by simp
ultimately show ?thesis using ‹ xvec=x#xvec'› ‹ yvec=y#yvec'›
by (rule_tac x="p@[(x, y)]" in exI) force
qed
qed
ultimately show ?thesis
by blast
qed
lemma boundOutputPar2Dest:
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)"
and "xvec ♯ * Q"
and "yvec ♯ * Q"
obtains T where "P = Q ∥ T" and "( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
proof -
assume "∧ T. [ P = Q ∥ T; ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ T. P = Q ∥ T ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
proof (induct n arbitrary: xvec yvec M N P Q R)
case (0 xvec yvec M N P Q R)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q R)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' (Q ∥ R)"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' (Q ∥ R))"
by simp
from ‹ xvec ♯ * Q› ‹ yvec ♯ * Q› ‹ xvec = x#xvec'› ‹ yvec = y#yvec'›
have "x ♯ Q" and "xvec' ♯ * Q" and "y ♯ Q" and "yvec' ♯ * Q" by auto
have IH: "∧ xvec yvec M N P Q R. [ ( ν*xvec) M ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' (Q ∥ R); xvec ♯ * Q; yvec ♯ * Q; n = length xvec] ==> ∃ T. P = Q ∥ T ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
by fact
show ?case
proof (case_tac "x = y" )
assume "x = y"
with EQ have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha)
with ‹ xvec' ♯ * Q› ‹ yvec' ♯ * Q› ‹ length xvec' = n›
obtain T where "P = Q ∥ T" and "( ν*xvec') M ≺ ' T = ( ν*yvec') N ≺ ' R"
by (drule_tac IH) auto
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› ‹ x=y› show ?case
by (force simp add: boundOutput.inject alpha)
next
assume "x ≠ y"
with EQ ‹ x ♯ Q› ‹ y ♯ Q›
have "( ν*xvec') M ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' (Q ∥ ([(x, y)] ∙ R))"
and xFreshQR: "x ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha eqvts)+
moreover from ‹ yvec' ♯ * Q› have "([(x, y)] ∙ yvec') ♯ * ([(x, y)] ∙ Q)"
by (simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ♯ Q› ‹ y ♯ Q› have "([(x, y)] ∙ yvec') ♯ * Q" by simp
moreover note ‹ xvec' ♯ * Q› ‹ length xvec' = n›
ultimately obtain T where "P = Q ∥ T" and A: "( ν*xvec') M ≺ ' T = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R)"
by (drule_tac IH) auto
from A have "( νx) (( ν*xvec') M ≺ ' T) = ( νx) (( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R))"
by (simp add: boundOutput.inject alpha)
moreover from xFreshQR have "x ♯ ( ν*yvec') N ≺ ' R"
by (force simp add: boundOutputFresh)
ultimately show ?thesis using ‹ P = Q ∥ T› ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› xFreshQR
by (force simp add: alphaBoundOutput name_swap eqvts)
qed
qed
ultimately show ?thesis
by blast
qed
lemma boundOutputPar2Dest':
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)"
and "xvec ♯ * yvec"
obtains T p where "set p ⊆ set xvec × set yvec" and "P = (p ∙ Q) ∥ T" and "( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
proof -
assume "∧ p T. [ set p ⊆ set xvec × set yvec; P = (p ∙ Q) ∥ T; ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ p T. set p ⊆ set xvec × set yvec ∧ P = (p ∙ Q) ∥ T ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
proof (induct n arbitrary: xvec yvec M N P Q R)
case (0 xvec yvec M N P Q R)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q R)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' (Q ∥ R)"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence Eq: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' (Q ∥ R))"
by simp
from ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ xvec ♯ * yvec› have "x ≠ y" and "x ♯ yvec'" and "y ♯ xvec'" and "xvec' ♯ * yvec'"
by auto
from Eq ‹ x ≠ y› have Eq': "( ν*xvec') M ≺ ' P = [(x, y)] ∙ ( ν*yvec') N ≺ ' (Q ∥ R)"
and xFreshQR: "x ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha)+
have IH: "∧ xvec yvec M N P Q R. [ ( ν*xvec) M ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' (Q ∥ R); xvec ♯ * yvec; n = length xvec] ==> ∃ p T. set p ⊆ set xvec × set yvec ∧ P = (p ∙ Q) ∥ T ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
by fact
show ?case
proof (case_tac "x ♯ ( ν*xvec') M ≺ ' P" )
assume "x ♯ ( ν*xvec') M ≺ ' P"
with Eq have yFreshQR: "y ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (rule boundOutputEqFresh)
with Eq' xFreshQR have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' (Q ∥ R)"
by simp
with ‹ xvec' ♯ * yvec'› ‹ length xvec' = n›
obtain p T where S: "set p ⊆ set xvec' × set yvec'" and "P = (p ∙ Q) ∥ T" and A: "( ν*xvec') M ≺ ' T = ( ν*yvec') N ≺ ' R"
by (drule_tac IH) auto
from yFreshQR xFreshQR have yFreshR: "y ♯ ( ν*yvec') N ≺ ' R" and xFreshQ: "x ♯ ( ν*yvec') N ≺ ' R"
by (force simp add: BOresChainSupp fresh_def boundOutput.supp psi.supp)+
hence "( νx) (( ν*yvec') N ≺ ' R) = ( νy) (( ν*yvec') N ≺ ' R)" by (subst alphaBoundOutput) simp+
with A have "( νx) (( ν*xvec') M ≺ ' T) = ( νy) (( ν*yvec') N ≺ ' R)" by simp
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› S ‹ P = (p ∙ Q) ∥ T› show ?case
by auto
next
assume "¬ (x ♯ ( ν*xvec') M ≺ ' P)"
hence "x ∈ supp(( ν*xvec') M ≺ ' P)" by (simp add: fresh_def)
with Eq have "y ∈ supp(( ν*yvec') N ≺ ' (Q ∥ R))"
by (rule boundOutputEqSupp)
hence "y ♯ yvec'" by (simp add: BOresChainSupp fresh_def)
with Eq' ‹ x ♯ yvec'› have "( ν*xvec') M ≺ ' P = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' (([(x, y)] ∙ Q) ∥ ([(x, y)] ∙ R))"
by (simp add: eqvts)
moreover note ‹ xvec' ♯ * yvec'› ‹ length xvec' = n›
ultimately obtain p T where S: "set p ⊆ set xvec' × set yvec'" and "P = (p ∙ [(x, y)] ∙ Q) ∥ T" and A: "( ν*xvec') M ≺ ' T = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R)"
by (drule_tac IH) auto
from S have "set(p@[(x, y)]) ⊆ set(x#xvec') × set(y#yvec')" by auto
moreover from ‹ P = (p ∙ [(x, y)] ∙ Q) ∥ T› have "P = ((p @ [(x, y)]) ∙ Q) ∥ T"
by (simp add: pt2[OF pt_name_inst])
moreover from xFreshQR have xFreshR: "x ♯ ( ν*yvec') N ≺ ' R"
by (force simp add: BOresChainSupp fresh_def boundOutput.supp psi.supp)+
with ‹ x ♯ yvec'› ‹ y ♯ yvec'› ‹ x ≠ y› have "y ♯ ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R)"
by (simp add: fresh_left calc_atm)
with ‹ x ♯ yvec'› ‹ y ♯ yvec'› have "( νx) (( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R)) = ( νy) (( ν*yvec') N ≺ ' R)"
by (subst alphaBoundOutput) (assumption | simp add: eqvts)+
with A have "( νx) (( ν*xvec') M ≺ ' T) = ( νy) (( ν*yvec') N ≺ ' R)" by simp
ultimately show ?thesis using ‹ xvec=x#xvec'› ‹ yvec=y#yvec'›
by (rule_tac x="p@[(x, y)]" in exI) force
qed
qed
ultimately show ?thesis
by blast
qed
lemma boundOutputApp:
fixes xvec :: "name list"
and yvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
shows "( ν*(xvec@yvec)) B = ( ν*xvec) (( ν*yvec) B)"
by (induct xvec) auto
lemma openInjectAuxAuxAux:
fixes x :: name
and xvec :: "name list"
shows "∃ y yvec. x # xvec = yvec @ [y] ∧ length xvec = length yvec"
apply (induct xvec arbitrary: x)
apply auto
apply (subgoal_tac "∃ y yvec. a # xvec = yvec @ [y] ∧ length xvec = length yvec" )
apply (clarify)
apply (rule_tac x=y in exI)
by auto
lemma openInjectAuxAux:
fixes xvec1 :: "name list"
and xvec2 :: "name list"
and yvec :: "name list"
assumes "length(xvec1@xvec2) = length yvec"
shows "∃ yvec1 yvec2. yvec = yvec1@yvec2 ∧ length xvec1 = length yvec1 ∧ length xvec2 = length yvec2"
using assms
apply (induct yvec arbitrary: xvec1)
apply simp
apply simp
apply (case_tac xvec1)
apply simp
apply simp
apply (subgoal_tac "∃ yvec1 yvec2.
yvec = yvec1 @ yvec2 ∧ length list = length yvec1 ∧ length xvec2 = length yvec2" )
apply (clarify)
apply (rule_tac x="a#yvec1" in exI)
apply (rule_tac x=yvec2 in exI)
by auto
lemma openInjectAux:
fixes xvec1 :: "name list"
and x :: name
and xvec2 :: "name list"
and yvec :: "name list"
assumes "length(xvec1@x#xvec2) = length yvec"
shows "∃ yvec1 y yvec2. yvec = yvec1@y#yvec2 ∧ length xvec1 = length yvec1 ∧ length xvec2 = length yvec2"
using assms
apply (case_tac yvec)
apply simp
apply simp
apply (subgoal_tac "∃ (yvec1::name list) (yvec2::name list). yvec1@yvec2 = list ∧ length xvec1 = length yvec1 ∧ length xvec2 = length yvec2" )
apply (clarify)
apply hypsubst_thin
apply simp
apply (subgoal_tac "∃ y (yvec::name list). a # yvec1 = yvec @ [y] ∧ length yvec1 = length yvec" )
apply (clarify)
apply (rule_tac x=yvec in exI)
apply (rule_tac x=y in exI)
apply simp
apply (rule_tac x=yvec2 in exI)
apply simp
apply (rule openInjectAuxAuxAux)
apply (insert openInjectAuxAux)
apply simp
by blast
lemma boundOutputOpenDest:
fixes yvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and xvec1 :: "name list"
and x :: name
and xvec2 :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
assumes Eq: "( ν*(xvec1@x#xvec2)) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
and "x ♯ xvec1"
and "x ♯ yvec"
and "x ♯ N"
and "x ♯ Q"
and "distinct yvec"
obtains yvec1 y yvec2 where "yvec=yvec1@y#yvec2" and "length xvec1 = length yvec1" and "length xvec2 = length yvec2"
and "( ν*(xvec1@xvec2)) M ≺ ' P = ( ν*(yvec1@yvec2)) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
proof -
assume Ass: "∧ yvec1 y yvec2.
[ yvec = yvec1 @ y # yvec2; length xvec1 = length yvec1; length xvec2 = length yvec2;
( ν*(xvec1 @ xvec2)) M ≺ ' P = ( ν*(yvec1 @ yvec2)) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)]
==> thesis"
from Eq have "length(xvec1@x#xvec2) = length yvec" by (rule boundOutputChainEqLength)
then obtain yvec1 y yvec2 where A: "yvec = yvec1@y#yvec2" and "length xvec1 = length yvec1"
and "length xvec2 = length yvec2"
by (metis openInjectAux sym)
from ‹ distinct yvec› A have "y ♯ yvec2" by simp
from A ‹ x ♯ yvec› have "x ♯ yvec2" and "x ♯ yvec1" by simp+
with Eq ‹ length xvec1 = length yvec1› ‹ x ♯ N› ‹ x ♯ Q› ‹ y ♯ yvec2› ‹ x ♯ xvec1› A
have "( ν*(xvec1@xvec2)) M ≺ ' P = ( ν*(yvec1@yvec2)) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (force dest: boundOutputChainOpenIH simp add: boundOutputApp BOresChainSupp fresh_def boundOutput.supp eqvts)
with ‹ length xvec1 = length yvec1› ‹ length xvec2 = length yvec2› A Ass show ?thesis
by blast
qed
lemma boundOutputOpenDest':
fixes yvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and xvec1 :: "name list"
and x :: name
and xvec2 :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
assumes Eq: "( ν*(xvec1@x#xvec2)) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
and "x ♯ xvec1"
and "x ♯ yvec"
and "x ♯ N"
and "x ♯ Q"
obtains yvec1 y yvec2 where "yvec=yvec1@y#yvec2" and "length xvec1 = length yvec1" and "length xvec2 = length yvec2"
and "( ν*(xvec1@xvec2)) M ≺ ' P = ( ν*(yvec1@[(x, y)] ∙ yvec2)) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
proof -
assume Ass: "∧ yvec1 y yvec2.
[ yvec = yvec1 @ y # yvec2; length xvec1 = length yvec1; length xvec2 = length yvec2;
( ν*(xvec1 @ xvec2)) M ≺ ' P = ( ν*(yvec1 @ ([(x, y)] ∙ yvec2))) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)]
==> thesis"
from Eq have "length(xvec1@x#xvec2) = length yvec" by (rule boundOutputChainEqLength)
then obtain yvec1 y yvec2 where A: "yvec = yvec1@y#yvec2" and "length xvec1 = length yvec1"
and "length xvec2 = length yvec2"
by (metis openInjectAux sym)
from A ‹ x ♯ yvec› have "x ♯ yvec2" and "x ♯ yvec1" by simp+
with Eq ‹ length xvec1 = length yvec1› ‹ x ♯ N› ‹ x ♯ Q› ‹ x ♯ xvec1› A
have "( ν*(xvec1@xvec2)) M ≺ ' P = ( ν*(yvec1@([(x, y)] ∙ yvec2))) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (force dest: boundOutputChainOpenIH simp add: boundOutputApp BOresChainSupp fresh_def boundOutput.supp eqvts)
with ‹ length xvec1 = length yvec1› ‹ length xvec2 = length yvec2› A Ass show ?thesis
by blast
qed
lemma boundOutputScopeDest:
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and x :: name
and Q :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' ( νz) Q"
and "z ♯ xvec"
and "z ♯ yvec"
obtains R where "P = ( νz) R" and "( ν*xvec) M ≺ ' R = ( ν*yvec) N ≺ ' Q"
proof -
assume "∧ R. [ P = ( νz) R; ( ν*xvec) M ≺ ' R = ( ν*yvec) N ≺ ' Q] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ R. P = ( νz) R ∧ ( ν*xvec) M ≺ ' R = ( ν*yvec) N ≺ ' Q"
proof (induct n arbitrary: xvec yvec M N P Q z)
case (0 xvec yvec M N P Q z)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' ( νz) Q" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q z)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (( νz) Q)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' ( νz) Q"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' ( νz) Q)"
by simp
from ‹ z ♯ xvec› ‹ z ♯ yvec› ‹ xvec = x#xvec'› ‹ yvec = y#yvec'›
have "z ≠ x" and "z ≠ y" and "z ♯ xvec'" and "z ♯ yvec'"
by simp+
have IH: "∧ xvec yvec M N P Q z. [ ( ν*xvec) M ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' ( νz) Q; z ♯ xvec; z ♯ yvec; n = length xvec] ==> ∃ R. P = ( νz) R ∧ ( ν*xvec) M ≺ ' R = ( ν*yvec) N ≺ ' Q"
by fact
show ?case
proof (case_tac "x = y" )
assume "x = y"
with EQ have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' ( νz) Q"
by (simp add: boundOutput.inject alpha)
with ‹ z ♯ xvec'› ‹ z ♯ yvec'› ‹ length xvec' = n›
obtain R where "P = ( νz) R" and "( ν*xvec') M ≺ ' R = ( ν*yvec') N ≺ ' Q"
by (drule_tac IH) auto
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› ‹ x=y› show ?case
by (force simp add: boundOutput.inject alpha)
next
assume "x ≠ y"
with EQ ‹ z ≠ x› ‹ z ≠ y›
have "( ν*xvec') M ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ( νz) ([(x, y)] ∙ Q)"
and xFreshzQ: "x ♯ ( ν*yvec') N ≺ ' ( νz) Q"
by (simp add: boundOutput.inject alpha eqvts)+
moreover from ‹ z ≠ x› ‹ z ≠ y› ‹ z ♯ yvec'› ‹ x ≠ y› have "z ♯ ([(x, y)] ∙ yvec')"
by (simp add: fresh_left calc_atm)
moreover note ‹ z ♯ xvec'› ‹ length xvec' = n›
ultimately obtain R where "P = ( νz) R" and A: "( ν*xvec') M ≺ ' R = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (drule_tac IH) auto
from A have "( νx) (( ν*xvec') M ≺ ' R) = ( νx) (( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q))"
by (simp add: boundOutput.inject alpha)
moreover from xFreshzQ ‹ z ≠ x› have "x ♯ ( ν*yvec') N ≺ ' Q"
by (simp add: boundOutputFresh abs_fresh)
ultimately show ?thesis using ‹ P = ( νz) R› ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› xFreshzQ
by (force simp add: alphaBoundOutput name_swap eqvts)
qed
qed
ultimately show ?thesis
by blast
qed
nominal_datatype ('a, 'b, 'c) residual =
RIn "'a::fs_name" 'a "('a, 'b::fs_name, 'c::fs_name) psi"
| ROut 'a "('a, 'b, 'c) boundOutput"
| RTau "('a, 'b, 'c) psi"
nominal_datatype 'a action = In "'a::fs_name" 'a (‹ _( _) › [90 , 90 ] 90 )
| Out "'a::fs_name" "name list" 'a (‹ _( ν*_) ⟨ _⟩ › [90 , 90 , 90 ] 90 )
| Tau (‹ τ› 90 )
nominal_primrec bn :: "('a::fs_name) action → name list"
where
"bn (M( N) ) = []"
| "bn (M( ν*xvec) ⟨ N⟩ ) = xvec"
| "bn (τ) = []"
by (rule TrueI)+
lemma bnEqvt[eqvt]:
fixes p :: "name prm"
and α :: "('a::fs_name) action"
shows "(p ∙ bn α) = bn(p ∙ α)"
by (nominal_induct α rule: action.strong_induct) auto
nominal_primrec create_residual :: "('a::fs_name) action → ('a, 'b::fs_name, 'c::fs_name) psi → ('a, 'b, 'c) residual" (‹ _ ≺ _› [80 , 80 ] 80 )
where
"(M( N) ) ≺ P = RIn M N P"
| "M( ν*xvec) ⟨ N⟩ ≺ P = ROut M (( ν*xvec) (N ≺ ' P))"
| "τ ≺ P = (RTau P)"
by (rule TrueI)+
nominal_primrec subject :: "('a::fs_name) action → 'a option"
where
"subject (M( N) ) = Some M"
| "subject (M( ν*xvec) ⟨ N⟩ ) = Some M"
| "subject (τ) = None"
by (rule TrueI)+
nominal_primrec object :: "('a::fs_name) action → 'a option"
where
"object (M( N) ) = Some N"
| "object (M( ν*xvec) ⟨ N⟩ ) = Some N"
| "object (τ) = None"
by (rule TrueI)+
lemma optionFreshChain[simp]:
fixes xvec :: "name list"
and X :: "name set"
shows "xvec ♯ * (Some x) = xvec ♯ * x"
and "X ♯ * (Some x) = X ♯ * x"
and "xvec ♯ * None"
and "X ♯ * None"
by (auto simp add: fresh_star_def fresh_some fresh_none)
lemmas [simp] = fresh_some fresh_none
lemma actionFresh[simp]:
fixes x :: name
and α :: "('a::fs_name) action"
shows "(x ♯ α) = (x ♯ (subject α) ∧ x ♯ (bn α) ∧ x ♯ (object α))"
by (nominal_induct α rule: action.strong_induct) auto
lemma actionFreshChain[simp]:
fixes X :: "name set"
and α :: "('a::fs_name) action"
and xvec :: "name list"
shows "(X ♯ * α) = (X ♯ * (subject α) ∧ X ♯ * (bn α) ∧ X ♯ * (object α))"
and "(xvec ♯ * α) = (xvec ♯ * (subject α) ∧ xvec ♯ * (bn α) ∧ xvec ♯ * (object α))"
by (auto simp add: fresh_star_def)
lemma subjectEqvt[eqvt]:
fixes p :: "name prm"
and α :: "('a::fs_name) action"
shows "(p ∙ subject α) = subject(p ∙ α)"
by (nominal_induct α rule: action.strong_induct) auto
lemma okjectEqvt[eqvt]:
fixes p :: "name prm"
and α :: "('a::fs_name) action"
shows "(p ∙ object α) = object(p ∙ α)"
by (nominal_induct α rule: action.strong_induct) auto
lemma create_residualEqvt[eqvt]:
fixes p :: "name prm"
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "(p ∙ (α ≺ P)) = (p ∙ α) ≺ (p ∙ P)"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: eqvts)
lemma residualFresh:
fixes x :: name
and α :: "'a::fs_name action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "(x ♯ (α ≺ P)) = (x ♯ (subject α) ∧ (x ∈ (set(bn(α))) ∨ (x ♯ object(α) ∧ x ♯ P)))"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: fresh_some fresh_none boundOutputFresh)
lemma residualFresh2[simp]:
fixes x :: name
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "x ♯ α"
and "x ♯ P"
shows "x ♯ α ≺ P"
using assms
by (nominal_induct α rule: action.strong_induct) auto
lemma residualFreshChain2[simp]:
fixes xvec :: "name list"
and X :: "name set"
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "[ xvec ♯ * α; xvec ♯ * P] ==> xvec ♯ * (α ≺ P)"
and "[ X ♯ * α; X ♯ * P] ==> X ♯ * (α ≺ P)"
by (auto simp add: fresh_star_def)
lemma residualFreshSimp[simp]:
fixes x :: name
and M :: "'a::fs_name"
and N :: 'a
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "x ♯ (M( N) ≺ P) = (x ♯ M ∧ x ♯ N ∧ x ♯ P)"
and "x ♯ (M( ν*xvec) ⟨ N⟩ ≺ P) = (x ♯ M ∧ x ♯ (( ν*xvec) (N ≺ ' P)))"
and "x ♯ (τ ≺ P) = (x ♯ P)"
by (auto simp add: residualFresh)
lemma residualInject':
shows "(α ≺ P = RIn M N Q) = (P = Q ∧ α = M( N) )"
and "(α ≺ P = ROut M B) = (∃ xvec N. α = M( ν*xvec) ⟨ N⟩ ∧ B = ( ν*xvec) (N ≺ ' P))"
and "(α ≺ P = RTau Q) = (α = τ ∧ P = Q)"
and "(RIn M N Q = α ≺ P) = (P = Q ∧ α = M( N) )"
and "(ROut M B = α ≺ P) = (∃ xvec N. α = M( ν*xvec) ⟨ N⟩ ∧ B = ( ν*xvec) (N ≺ ' P))"
and "(RTau Q = α ≺ P) = (α = τ ∧ P = Q)"
proof -
show "(α ≺ P = RIn M N Q) = (P = Q ∧ α = M( N) )"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(α ≺ P = ROut M B) = (∃ xvec N. α = M( ν*xvec) ⟨ N⟩ ∧ B = ( ν*xvec) (N ≺ ' P))"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(α ≺ P = RTau Q) = (α = τ ∧ P = Q)"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(RIn M N Q = α ≺ P) = (P = Q ∧ α = M( N) )"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(ROut M B = α ≺ P) = (∃ xvec N. α = M( ν*xvec) ⟨ N⟩ ∧ B = ( ν*xvec) (N ≺ ' P))"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(RTau Q = α ≺ P) = (α = τ ∧ P = Q)"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
qed
lemma residualFreshChainSimp[simp]:
fixes xvec :: "name list"
and X :: "name set"
and M :: "'a::fs_name"
and N :: 'a
and yvec :: "name list"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "xvec ♯ * (M( N) ≺ P) = (xvec ♯ * M ∧ xvec ♯ * N ∧ xvec ♯ * P)"
and "xvec ♯ * (M( ν*yvec) ⟨ N⟩ ≺ P) = (xvec ♯ * M ∧ xvec ♯ * (( ν*yvec) (N ≺ ' P)))"
and "xvec ♯ * (τ ≺ P) = (xvec ♯ * P)"
and "X ♯ * (M( N) ≺ P) = (X ♯ * M ∧ X ♯ * N ∧ X ♯ * P)"
and "X ♯ * (M( ν*yvec) ⟨ N⟩ ≺ P) = (X ♯ * M ∧ X ♯ * (( ν*yvec) (N ≺ ' P)))"
and "X ♯ * (τ ≺ P) = (X ♯ * P)"
by (auto simp add: fresh_star_def)
lemma residualFreshChainSimp2[simp]:
fixes xvec :: "name list"
and X :: "name set"
and M :: "'a::fs_name"
and N :: 'a
and yvec :: "name list"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "xvec ♯ * (RIn M N P) = (xvec ♯ * M ∧ xvec ♯ * N ∧ xvec ♯ * P)"
and "xvec ♯ * (ROut M B) = (xvec ♯ * M ∧ xvec ♯ * B)"
and "xvec ♯ * (RTau P) = (xvec ♯ * P)"
and "X ♯ * (RIn M N P) = (X ♯ * M ∧ X ♯ * N ∧ X ♯ * P)"
and "X ♯ * (ROut M B) = (X ♯ * M ∧ X ♯ * B)"
and "X ♯ * (RTau P) = (X ♯ * P)"
by (auto simp add: fresh_star_def)
lemma freshResidual3[dest]:
fixes x :: name
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "x ♯ bn α"
and "x ♯ α ≺ P"
shows "x ♯ α" and "x ♯ P"
using assms
by (nominal_induct rule: action.strong_induct) auto
lemma freshResidualChain3[dest]:
fixes xvec :: "name list"
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "xvec ♯ * (α ≺ P)"
and "xvec ♯ * bn α"
shows "xvec ♯ * α" and "xvec ♯ * P"
using assms
by (nominal_induct rule: action.strong_induct) auto
lemma freshResidual4[dest]:
fixes x :: name
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "x ♯ α ≺ P"
shows "x ♯ subject α"
using assms
by (nominal_induct rule: action.strong_induct) auto
lemma freshResidualChain4[dest]:
fixes xvec :: "name list"
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "xvec ♯ * (α ≺ P)"
shows "xvec ♯ * subject α"
using assms
by (nominal_induct rule: action.strong_induct) auto
lemma alphaOutputResidual:
fixes M :: "'a::fs_name"
and xvec :: "name list"
and N :: 'a
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and p :: "name prm"
assumes "(p ∙ xvec) ♯ * N"
and "(p ∙ xvec) ♯ * P"
and "set p ⊆ set xvec × set(p ∙ xvec)"
and "set xvec ⊆ set yvec"
shows "M( ν*yvec) ⟨ N⟩ ≺ P = M( ν*(p ∙ yvec)) ⟨ (p ∙ N)⟩ ≺ (p ∙ P)"
using assms
by (simp add: boundOutputChainAlpha'')
lemmas [simp del] = create_residual.simps
lemma residualInject'':
assumes "bn α = bn β"
shows "(α ≺ P = β ≺ Q) = (α = β ∧ P = Q)"
using assms
apply (nominal_induct α rule: action.strong_induct)
apply (auto simp add: residual.inject create_residual.simps residualInject' action.inject boundOutput.inject)
by (rule_tac x="bn β" in exI) auto
lemmas residualInject = residual.inject create_residual.simps residualInject' residualInject''
lemma bnFreshResidual[simp]:
fixes α :: "('a::fs_name) action"
shows "(bn α) ♯ * (α ≺ P) = bn α ♯ * (subject α)"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residualFresh fresh_some fresh_star_def)
lemma actionCases[case_names cInput cOutput cTau]:
fixes α :: "('a::fs_name) action"
assumes "∧ M N. α = M( N) ==> Prop"
and "∧ M xvec N. α = M( ν*xvec) ⟨ N⟩ ==> Prop"
and "α = τ ==> Prop"
shows Prop
using assms
by (nominal_induct α rule: action.strong_induct) auto
lemma actionPar1Dest:
fixes α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and β :: "('a::fs_name) action"
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "α ≺ P = β ≺ (Q ∥ R)"
and "bn α ♯ * bn β"
obtains T p where "set p ⊆ set(bn α) × set(bn β)" and "P = T ∥ (p ∙ R)" and "α ≺ T = β ≺ Q"
using assms
apply (cases rule: actionCases[where α=α])
apply (auto simp add: residualInject)
by (drule_tac boundOutputPar1Dest') auto
lemma actionPar2Dest:
fixes α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and β :: "('a::fs_name) action"
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "α ≺ P = β ≺ (Q ∥ R)"
and "bn α ♯ * bn β"
obtains T p where "set p ⊆ set(bn α) × set(bn β)" and "P = (p ∙ Q) ∥ T" and "α ≺ T = β ≺ R"
using assms
apply (cases rule: actionCases[where α=α])
apply (auto simp add: residualInject)
by (drule_tac boundOutputPar2Dest') auto
lemma actionScopeDest:
fixes α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
fixes β :: "('a::fs_name) action"
and x :: name
and Q :: "('a, 'b, 'c) psi"
assumes "α ≺ P = β ≺ ( νx) Q"
and "x ♯ bn α"
and "x ♯ bn β"
obtains R where "P = ( νx) R" and "α ≺ R = β ≺ Q"
using assms
apply (cases rule: actionCases[where α=α])
apply (auto simp add: residualInject)
by (drule_tac boundOutputScopeDest) auto
abbreviation
outputJudge (‹ _⟨ _⟩ › [110 , 110 ] 110 ) where "M⟨ N⟩ ≡ M( ν*([])) ⟨ N⟩ "
declare [[unify_trace_bound=100 ]]
locale env = substPsi substTerm substAssert substCond +
assertion SCompose' SImp' SBottom' SChanEq'
for substTerm :: "('a::fs_name) → name list → 'a::fs_name list → 'a"
and substAssert :: "('b::fs_name) → name list → 'a::fs_name list → 'b"
and substCond :: "('c::fs_name) → name list → 'a::fs_name list → 'c"
and SCompose' :: "'b → 'b → 'b"
and SImp' :: "'b → 'c → bool"
and SBottom' :: 'b
and SChanEq' :: "'a → 'a → 'c"
begin
notation SCompose' (infixr ‹ ⊗ › 90 )
notation SImp' (‹ _ ⊨ _› [85 , 85 ] 85 )
notation FrameImp (‹ _ ⊨ F _› [85 , 85 ] 85 )
abbreviation
FBottomJudge (‹ ⊥ F › 90 ) where "⊥ F ≡ (FAssert SBottom')"
notation SChanEq' (‹ _ ↔ _› [90 , 90 ] 90 )
notation substTerm (‹ _[_::=_]› [100 , 100 , 100 ] 100 )
notation subs (‹ _[_::=_]› [100 , 100 , 100 ] 100 )
notation AssertionStatEq (‹ _ ≃ _› [80 , 80 ] 80 )
notation FrameStatEq (‹ _ ≃ F _› [80 , 80 ] 80 )
notation SBottom' (‹ 1 › 190 )
abbreviation insertAssertion' (‹ insertAssertion› ) where "insertAssertion' ≡ assertionAux.insertAssertion (⊗ )"
inductive semantics :: "'b → ('a, 'b, 'c) psi → ('a, 'b, 'c) residual → bool"
(‹ _ ⊳ _ ⟼ _› [50 , 50 , 50 ] 50 )
where
cInput: "[ Ψ ⊨ M ↔ K; distinct xvec; set xvec ⊆ supp N; xvec ♯ * Tvec;
length xvec = length Tvec;
xvec ♯ * Ψ; xvec ♯ * M; xvec ♯ * K] ==> Ψ ⊳ M( λ*xvec N) .P ⟼ K( (N[xvec::=Tvec])) ≺ P[xvec::=Tvec]"
| Output : "[ Ψ ⊨ M ↔ K] ==> Ψ ⊳ M⟨ N⟩ .P ⟼ K⟨ N⟩ ≺ P"
| Case : "[ Ψ ⊳ P ⟼ Rs; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==> Ψ ⊳ Cases Cs ⟼ Rs"
| cPar1: "[ (Ψ ⊗ ΨQ ) ⊳ P ⟼ α ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * α; AQ ♯ * P'; distinct(bn α);
bn α ♯ * Ψ; bn α ♯ * ΨQ ; bn α ♯ * Q; bn α ♯ * P; bn α ♯ * (subject α)] ==>
Ψ ⊳ P ∥ Q ⟼ α ≺ (P' ∥ Q)"
| cPar2: "[ (Ψ ⊗ ΨP ) ⊳ Q ⟼ α ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * α; AP ♯ * Q'; distinct(bn α);
bn α ♯ * Ψ; bn α ♯ * ΨP ; bn α ♯ * P; bn α ♯ * Q; bn α ♯ * (subject α)] ==>
Ψ ⊳ P ∥ Q ⟼ α ≺ (P ∥ Q')"
| cComm1: "[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec;
AQ ♯ * Ψ; AQ ♯ * ΨP ; AQ ♯ * P; AQ ♯ * N; AQ ♯ * P';
AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q'; AQ ♯ * xvec; distinct xvec;
xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K] ==>
Ψ ⊳ P ∥ Q ⟼ τ ≺ ( ν*xvec) (P' ∥ Q')"
| cComm2: "[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( N) ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec;
AQ ♯ * Ψ; AQ ♯ * ΨP ; AQ ♯ * P; AQ ♯ * N; AQ ♯ * P';
AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q'; AQ ♯ * xvec; distinct xvec;
xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K] ==>
Ψ ⊳ P ∥ Q ⟼ τ ≺ ( ν*xvec) (P' ∥ Q')"
| cOpen: "[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; x ∈ supp N; x ♯ xvec; x ♯ yvec; x ♯ M; x ♯ Ψ;
distinct xvec; distinct yvec;
xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * yvec; yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M] ==>
Ψ ⊳ ( νx) P ⟼ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P'"
| cScope: "[ Ψ ⊳ P ⟼ α ≺ P'; x ♯ Ψ; x ♯ α; bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * (subject α); distinct(bn α)] ==> Ψ ⊳ ( νx) P ⟼ α ≺ (( νx) P')"
| Bang: "[ Ψ ⊳ P ∥ !P ⟼ Rs; guarded P] ==> Ψ ⊳ !P ⟼ Rs"
abbreviation
semanticsBottomJudge (‹ _ ⟼ _› [50 , 50 ] 50 ) where "P ⟼ Rs ≡ 1 ⊳ P ⟼ Rs"
equivariance env.semantics
nominal_inductive2 env.semantics
avoids cInput: "set xvec"
| cPar1: "set AQ ∪ set(bn α)"
| cPar2: "set AP ∪ set(bn α)"
| cComm1: "set AP ∪ set AQ ∪ set xvec"
| cComm2: "set AP ∪ set AQ ∪ set xvec"
| cOpen: "{x} ∪ set xvec ∪ set yvec"
| cScope: "{x} ∪ set(bn α)"
apply (auto intro: substTerm.subst4Chain subst4Chain simp add: abs_fresh residualFresh)
apply (force simp add: fresh_star_def abs_fresh)
apply (simp add: boundOutputFresh)
apply (simp add: boundOutputFreshSet)
apply (simp add: boundOutputFreshSet)
by (simp add: fresh_star_def abs_fresh)
lemma nilTrans[dest]:
fixes Ψ :: 'b
and Rs :: "('a, 'b, 'c) residual"
and M :: 'a
and xvec :: "name list"
and N :: 'a
and P :: "('a, 'b, 'c) psi"
and K :: 'a
and yvec :: "name list"
and N' :: 'a
and P' :: "('a, 'b, 'c) psi"
and CsP :: "('c × ('a, 'b, 'c) psi) list"
and Ψ' :: 'b
shows "Ψ ⊳ 0 ⟼ Rs ==> False"
and "Ψ ⊳ M( λ*xvec N) .P ⟼ K( ν*yvec) ⟨ N'⟩ ≺ P' ==> False"
and "Ψ ⊳ M( λ*xvec N) .P ⟼ τ ≺ P' ==> False"
and "Ψ ⊳ M⟨ N⟩ .P ⟼ K( N') ≺ P' ==> False"
and "Ψ ⊳ M⟨ N⟩ .P ⟼ τ ≺ P' ==> False"
and "Ψ ⊳ { Ψ'} ⟼ Rs ==> False"
apply (cases rule: semantics.cases) apply auto
apply (cases rule: semantics.cases) apply (auto simp add: residualInject)
apply (cases rule: semantics.cases) apply (auto simp add: residualInject)
apply (cases rule: semantics.cases) apply (auto simp add: residualInject)
apply (cases rule: semantics.cases) apply (auto simp add: residualInject)
by (cases rule: semantics.cases) (auto simp add: residualInject)
lemma residualEq:
fixes α :: "'a action"
and P :: "('a, 'b, 'c) psi"
and β :: "'a action"
and Q :: "('a, 'b, 'c) psi"
assumes "α ≺ P = β ≺ Q"
and "bn α ♯ * (bn β)"
and "distinct(bn α)"
and "distinct(bn β)"
and "bn α ♯ * (α ≺ P)"
and "bn β ♯ * (β ≺ Q)"
obtains p where "set p ⊆ set(bn α) × set(bn(p ∙ α))" and "distinctPerm p" and "β = p ∙ α" and "Q = p ∙ P" and "bn α ♯ * β" and "bn α ♯ * Q" and "bn(p ∙ α) ♯ * α" and "bn(p ∙ α) ♯ * P"
using assms
proof (nominal_induct α rule: action.strong_induct)
case (In M N)
thus ?case by (simp add: residualInject)
next
case (Out M xvec N)
thus ?case
by (auto simp add: residualInject)
(drule_tac boundOutputChainEq'', auto)
next
case Tau
thus ?case by (simp add: residualInject)
qed
lemma semanticsInduct[consumes 3 , case_names cAlpha cInput cOutput cCase cPar1 cPar2 cComm1 cComm2 cOpen cScope cBang]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and Prop :: "'d::fs_name → 'b → ('a, 'b, 'c) psi →
'a action → ('a, 'b, 'c) psi → bool"
and C :: "'d::fs_name"
assumes "Ψ ⊳ P ⟼ α ≺ P'"
and "bn α ♯ * (subject α)"
and "distinct(bn α)"
and rAlpha: "∧ Ψ P α P' p C. [ bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * (subject α);
bn α ♯ * C; bn α ♯ * (bn(p ∙ α));
set p ⊆ set(bn α) × set(bn(p ∙ α)); distinctPerm p;
(bn(p ∙ α)) ♯ * α; (bn(p ∙ α)) ♯ * P'; Prop C Ψ P α P'] ==>
Prop C Ψ P (p ∙ α) (p ∙ P')"
and rInput: "∧ Ψ M K xvec N Tvec P C.
[ Ψ ⊨ M ↔ K; distinct xvec; set xvec ⊆ supp N;
length xvec = length Tvec; xvec ♯ * Ψ;
xvec ♯ * M; xvec ♯ * K; xvec ♯ * C] ==>
Prop C Ψ (M( λ*xvec N) .P)
(K( (N[xvec::=Tvec])) ) (P[xvec::=Tvec])"
and rOutput: "∧ Ψ M K N P C. [ Ψ ⊨ M ↔ K] ==> Prop C Ψ (M⟨ N⟩ .P) (K⟨ N⟩ ) P"
and rCase: "∧ Ψ P α P' φ Cs C. [ Ψ ⊳ P ⟼ α ≺ P'; ∧ C. Prop C Ψ P α P'; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) α P'"
and rPar1: "∧ Ψ ΨQ P α P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ α ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P α P';
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * α; AQ ♯ * P'; AQ ♯ * C; distinct(bn α); bn α ♯ * Q;
bn α ♯ * Ψ; bn α ♯ * ΨQ ; bn α ♯ * P; bn α ♯ * subject α; bn α ♯ * C] ==>
Prop C Ψ (P ∥ Q) α (P' ∥ Q)"
and rPar2: "∧ Ψ ΨP Q α Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ α ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q α Q';
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * α; AP ♯ * Q'; AP ♯ * C; distinct(bn α); bn α ♯ * Q;
bn α ♯ * Ψ; bn α ♯ * ΨP ; bn α ♯ * P; bn α ♯ * subject α; bn α ♯ * C] ==>
Prop C Ψ (P ∥ Q) α (P ∥ Q')"
and rComm1: "∧ Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; ∧ C. Prop C (Ψ ⊗ ΨQ ) P (M( N) ) P';
extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'; ∧ C. Prop C (Ψ ⊗ ΨP ) Q (K( ν*xvec) ⟨ N⟩ ) Q';
extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q'; distinct xvec;
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (τ) (( ν*xvec) (P' ∥ Q'))"
and rComm2: "∧ Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; ∧ C. Prop C (Ψ ⊗ ΨQ ) P (M( ν*xvec) ⟨ N⟩ ) P';
extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( N) ≺ Q'; ∧ C. Prop C (Ψ ⊗ ΨP ) Q (K( N) ) Q';
extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q'; distinct xvec;
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (τ) (( ν*xvec) (P' ∥ Q'))"
and rOpen: "∧ Ψ P M xvec yvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; x ∈ supp N; ∧ C. Prop C Ψ P (M( ν*(xvec@yvec)) ⟨ N⟩ ) P';
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ yvec; xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M; distinct xvec; distinct yvec;
yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M; yvec ♯ * C; x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) (M( ν*(xvec@x#yvec)) ⟨ N⟩ ) P'"
and rScope: "∧ Ψ P α P' x C.
[ Ψ ⊳ P ⟼ α ≺ P'; ∧ C. Prop C Ψ P α P';
x ♯ Ψ; x ♯ α; bn α ♯ * Ψ;
bn α ♯ * P; bn α ♯ * (subject α); x ♯ C; bn α ♯ * C; distinct(bn α)] ==>
Prop C Ψ (( νx) P) α (( νx) P')"
and rBang: "∧ Ψ P α P' C.
[ Ψ ⊳ P ∥ !P ⟼ α ≺ P'; guarded P; ∧ C. Prop C Ψ (P ∥ !P) α P'] ==>
Prop C Ψ (!P) α P'"
shows "Prop C Ψ P α P'"
using ‹ Ψ ⊳ P ⟼ α ≺ P'› ‹ bn α ♯ * (subject α)› ‹ distinct(bn α)›
proof (nominal_induct x3=="α ≺ P'" avoiding: α C arbitrary: P' rule: semantics.strong_induct)
case (cInput Ψ M K xvec N Tvec P α C P')
thus ?case by (force intro: rInput simp add: residualInject)
next
case (Output Ψ M K N P α C P')
thus ?case by (force intro: rOutput simp add: residualInject)
next
case (Case Ψ P Rs φ Cs α C)
thus ?case by (auto intro: rCase)
next
case (cPar1 Ψ ΨQ P α P' Q AQ α' C P'')
note ‹ α ≺ (P' ∥ Q) = α' ≺ P''›
moreover from ‹ bn α ♯ * α'› have "bn α ♯ * (bn α')" by auto
moreover note ‹ distinct (bn α)› ‹ distinct(bn α')›
moreover from ‹ bn α ♯ * subject α› ‹ bn α' ♯ * subject α'›
have "bn α ♯ * (α ≺ P' ∥ Q)" and "bn α' ♯ * (α' ≺ P'')" by simp+
ultimately obtain p where S: "(set p) ⊆ (set(bn α)) × (set(bn(p ∙ α)))" and "distinctPerm p"
and αEq: "α' = p ∙ α" and P'eq: "P'' = p ∙ (P' ∥ Q)" and "(bn(p ∙ α)) ♯ * α"
and "(bn(p ∙ α)) ♯ * (P' ∥ Q)"
by (rule residualEq)
note ‹ Ψ ⊗ ΨQ ⊳ P ⟼ α ≺ P'› ‹ extractFrame Q = ⟨ AQ , ΨQ ⟩ › ‹ distinct AQ ›
moreover from ‹ bn α ♯ * subject α› ‹ distinct(bn α)›
have "∧ C. Prop C (Ψ ⊗ ΨQ ) P α P'" by (rule_tac cPar1) auto
moreover note ‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * Ψ› ‹ AQ ♯ * α› ‹ AQ ♯ * P'› ‹ AQ ♯ * C›
‹ bn α ♯ * Q› ‹ distinct(bn α)› ‹ bn α ♯ * Ψ› ‹ bn α ♯ * ΨQ › ‹ bn α ♯ * P› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C ›
ultimately have "Prop C Ψ (P ∥ Q) α (P' ∥ Q)"
by (rule_tac rPar1)
with ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * Q› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C› ‹ bn α ♯ * bn α'› S ‹ distinctPerm p› ‹ bn(p ∙ α) ♯ * α› ‹ bn(p ∙ α) ♯ * (P' ∥ Q)› ‹ AQ ♯ * C›
have "Prop C Ψ (P ∥ Q) (p ∙ α) (p ∙ (P' ∥ Q))"
by (rule_tac rAlpha) auto
with αEq P'eq ‹ distinctPerm p› show ?case by simp
next
case (cPar2 Ψ ΨP Q α Q' P AP α' C Q'')
note ‹ α ≺ (P ∥ Q') = α' ≺ Q''›
moreover from ‹ bn α ♯ * α'› have "bn α ♯ * (bn α')" by auto
moreover note ‹ distinct (bn α)› ‹ distinct(bn α')›
moreover from ‹ bn α ♯ * subject α› ‹ bn α' ♯ * subject α'›
have "bn α ♯ * (α ≺ P ∥ Q')" and "bn α' ♯ * (α' ≺ Q'')" by simp+
ultimately obtain p where S: "(set p) ⊆ (set(bn α)) × (set(bn(p ∙ α)))" and "distinctPerm p"
and αEq: "α' = p ∙ α" and Q'eq: "Q'' = p ∙ (P ∥ Q')" and "(bn(p ∙ α)) ♯ * α"
and "(bn(p ∙ α)) ♯ * (P ∥ Q')"
by (rule residualEq)
note ‹ Ψ ⊗ ΨP ⊳ Q ⟼ α ≺ Q'› ‹ extractFrame P = ⟨ AP , ΨP ⟩ › ‹ distinct AP ›
moreover from ‹ bn α ♯ * subject α› ‹ distinct(bn α)›
have "∧ C. Prop C (Ψ ⊗ ΨP ) Q α Q'" by (rule_tac cPar2) auto
moreover note ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * Ψ› ‹ AP ♯ * α› ‹ AP ♯ * Q'› ‹ AP ♯ * C›
‹ bn α ♯ * Q› ‹ distinct(bn α)› ‹ bn α ♯ * Ψ› ‹ bn α ♯ * ΨP › ‹ bn α ♯ * P› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C ›
ultimately have "Prop C Ψ (P ∥ Q) α (P ∥ Q')"
by (rule_tac rPar2)
with ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * Q› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C› ‹ bn α ♯ * (bn α')› S ‹ distinctPerm p› ‹ bn(p ∙ α) ♯ * α› ‹ bn(p ∙ α) ♯ * (P ∥ Q')›
have "Prop C Ψ (P ∥ Q) (p ∙ α) (p ∙ (P ∥ Q'))"
by (rule_tac rAlpha) auto
with αEq Q'eq ‹ distinctPerm p› show ?case by simp
next
case (cComm1 Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ α C P'')
hence "Prop C Ψ (P ∥ Q) (τ) (( ν*xvec) (P' ∥ Q'))"
by (rule_tac rComm1) (assumption | simp)+
thus ?case using ‹ τ ≺ ( ν*xvec) (P' ∥ Q') = α ≺ P''›
by (simp add: residualInject)
next
case (cComm2 Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ α C P'')
hence "Prop C Ψ (P ∥ Q) (τ) (( ν*xvec) (P' ∥ Q'))"
by (rule_tac rComm2) (assumption | simp)+
thus ?case using ‹ τ ≺ ( ν*xvec) (P' ∥ Q') = α ≺ P''›
by (simp add: residualInject)
next
case (cOpen Ψ P M xvec yvec N P' x α C P'')
note ‹ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P' = α ≺ P''›
moreover from ‹ xvec ♯ * α› ‹ x ♯ α› ‹ yvec ♯ * α› have "(xvec@x#yvec) ♯ * (bn α)"
by auto
moreover from ‹ xvec ♯ * yvec› ‹ x ♯ xvec› ‹ x ♯ yvec› ‹ distinct xvec› ‹ distinct yvec›
have "distinct(xvec@x#yvec)"
by (auto simp add: fresh_star_def) (simp add: fresh_def name_list_supp)
moreover note ‹ distinct(bn α)›
moreover from ‹ xvec ♯ * M› ‹ x ♯ M› ‹ yvec ♯ * M› have "(xvec@x#yvec) ♯ * M" by auto
hence "(xvec@x#yvec) ♯ * (M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P')" by auto
moreover from ‹ bn α ♯ * subject α› have "bn α ♯ * (α ≺ P'')" by simp
ultimately obtain p where S: "(set p) ⊆ (set(xvec@x#yvec)) × (set(p ∙ (xvec@x#yvec)))" and "distinctPerm p"
and αeq: "α = (p ∙ M)( ν*(p ∙ (xvec@x#yvec))) ⟨ (p ∙ N)⟩ " and P'eq: "P'' = (p ∙ P')"
and A: "(xvec@x#yvec) ♯ * ((p ∙ M)( ν*(p ∙ (xvec@x#yvec))) ⟨ (p ∙ N)⟩ )"
and B: "(p ∙ (xvec@x#yvec)) ♯ * (M( ν*(xvec@x#yvec)) ⟨ N⟩ )"
and C: "(p ∙ (xvec@x#yvec)) ♯ * P'"
by (rule_tac residualEq) (assumption | simp)+
note ‹ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'› ‹ x ∈ (supp N)›
moreover {
fix C
from ‹ xvec ♯ * M› ‹ yvec ♯ * M› have "(xvec@yvec) ♯ * M" by simp
moreover from ‹ distinct xvec› ‹ distinct yvec› ‹ xvec ♯ * yvec› have "distinct(xvec@yvec)"
by auto (simp add: fresh_star_def name_list_supp fresh_def)
ultimately have "Prop C Ψ P (M( ν*(xvec@yvec)) ⟨ N⟩ ) P'" by (rule_tac cOpen) auto
}
moreover note ‹ x ♯ Ψ› ‹ x ♯ M› ‹ x ♯ xvec› ‹ x ♯ yvec› ‹ xvec ♯ * Ψ› ‹ xvec ♯ * P› ‹ xvec ♯ * M ›
‹ yvec ♯ * Ψ› ‹ yvec ♯ * P› ‹ yvec ♯ * M› ‹ yvec ♯ * C› ‹ x ♯ C› ‹ xvec ♯ * C› ‹ distinct xvec › ‹ distinct yvec›
ultimately have "Prop C Ψ (( νx) P) (M( ν*(xvec@x#yvec)) ⟨ N⟩ ) P'"
by (rule_tac rOpen)
with ‹ xvec ♯ * Ψ› ‹ yvec ♯ * Ψ› ‹ xvec ♯ * P› ‹ yvec ♯ * P› ‹ xvec ♯ * M› ‹ yvec ♯ * M›
‹ yvec ♯ * C› S ‹ distinctPerm p› ‹ x ♯ C› ‹ xvec ♯ * C›
‹ x ♯ Ψ› ‹ x ♯ M› ‹ x ♯ xvec› ‹ x ♯ yvec› A B C
have "Prop C Ψ (( νx) P) (p ∙ (M( ν*(xvec@x#yvec)) ⟨ N⟩ )) (p ∙ P')"
apply (rule_tac α="M( ν*(xvec@x#yvec)) ⟨ N⟩ " in rAlpha)
apply (assumption | simp)+
apply (fastforce simp add: fresh_star_def abs_fresh)
by (assumption | simp)+
with αeq P'eq show ?case by simp
next
case (cScope Ψ P α P' x α' C P'')
note ‹ α ≺ (( νx) P') = α' ≺ P''›
moreover from ‹ bn α ♯ * α'› have "bn α ♯ * (bn α')" by auto
moreover note ‹ distinct (bn α)› ‹ distinct(bn α')›
moreover from ‹ bn α ♯ * subject α› ‹ bn α' ♯ * subject α'›
have "bn α ♯ * (α ≺ ( νx) P')" and "bn α' ♯ * (α' ≺ P'')" by simp+
ultimately obtain p where S: "(set p) ⊆ (set(bn α)) × (set(bn(p ∙ α)))" and "distinctPerm p"
and αEq: "α' = p ∙ α" and P'eq: "P'' = p ∙ (( νx) P')" and "(bn(p ∙ α)) ♯ * α"
and "(bn(p ∙ α)) ♯ * (( νx) P')"
by (rule residualEq)
note ‹ Ψ ⊳ P ⟼ α ≺ P'›
moreover from ‹ bn α ♯ * subject α› ‹ distinct(bn α)›
have "∧ C. Prop C Ψ P α P'" by (rule_tac cScope) auto
moreover note ‹ x ♯ Ψ› ‹ x ♯ α› ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * subject α›
‹ x ♯ C› ‹ bn α ♯ * C› ‹ distinct(bn α)›
ultimately have "Prop C Ψ (( νx) P) α (( νx) P')"
by (rule rScope)
with ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ x ♯ α› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C› ‹ bn α ♯ * (bn α')› S ‹ distinctPerm p › ‹ bn(p ∙ α) ♯ * α› ‹ bn(p ∙ α) ♯ * (( νx) P')›
have "Prop C Ψ (( νx) P) (p ∙ α) (p ∙ (( νx) P'))"
by (rule_tac rAlpha) simp+
with αEq P'eq ‹ distinctPerm p› show ?case by simp
next
case (Bang Ψ P Rs α C)
thus ?case by (rule_tac rBang) auto
qed
lemma outputInduct[consumes 1 , case_names cOutput cCase cPar1 cPar2 cOpen cScope cBang]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and B :: "('a, 'b, 'c) boundOutput"
and Prop :: "'d::fs_name → 'b → ('a, 'b, 'c) psi →
'a → ('a, 'b, 'c) boundOutput → bool"
and C :: "'d::fs_name"
assumes "Ψ ⊳ P ⟼ ROut M B"
and rOutput: "∧ Ψ M K N P C. [ Ψ ⊨ M ↔ K] ==> Prop C Ψ (M⟨ N⟩ .P) K (N ≺ ' P)"
and rCase: "∧ Ψ P M B φ Cs C.
[ Ψ ⊳ P ⟼ (ROut M B); ∧ C. Prop C Ψ P M B; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) M B"
and rPar1: "∧ Ψ ΨQ P M xvec N P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P M (( ν*xvec) N ≺ ' P');
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * M;
AQ ♯ * xvec; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * C; xvec ♯ * Q;
xvec ♯ * Ψ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) M (( ν*xvec) N ≺ ' (P' ∥ Q))"
and rPar2: "∧ Ψ ΨP Q M xvec N Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ M( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q M (( ν*xvec) N ≺ ' Q');
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * M;
AP ♯ * xvec; AP ♯ * N; AP ♯ * Q'; AP ♯ * C; xvec ♯ * P;
xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * Q; xvec ♯ * M; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) M (( ν*xvec) N ≺ ' (P ∥ Q'))"
and rOpen: "∧ Ψ P M xvec yvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; x ∈ supp N; ∧ C. Prop C Ψ P M (( ν*(xvec@yvec)) N ≺ ' P');
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ yvec; xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * yvec; yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M; yvec ♯ * C; x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) M (( ν*(xvec@x#yvec)) N ≺ ' P')"
and rScope: "∧ Ψ P M xvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; ∧ C. Prop C Ψ P M (( ν*xvec) N ≺ ' P');
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ N; xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M;
x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) M (( ν*xvec) N ≺ ' ( νx) P')"
and rBang: "∧ Ψ P M B C.
[ Ψ ⊳ P ∥ !P ⟼ (ROut M B); guarded P; ∧ C. Prop C Ψ (P ∥ !P) M B] ==>
Prop C Ψ (!P) M B"
shows "Prop C Ψ P M B"
using ‹ Ψ ⊳ P ⟼ (ROut M B)›
proof (nominal_induct Ψ P Rs=="(ROut M B)" avoiding: C arbitrary: B rule: semantics.strong_induct)
case (cInput Ψ M K xvec N Tvec P C)
thus ?case by (simp add: residualInject)
next
case (Output Ψ M K N P C)
thus ?case by (force simp add: residualInject intro: rOutput)
next
case (Case Ψ P Rs φ Cs C)
thus ?case by (force intro: rCase)
next
case (cPar1 Ψ ΨQ P α P' Q AQ C)
thus ?case by (force intro: rPar1 simp add: residualInject)
next
case (cPar2 Ψ ΨP Q α Q' P AP C)
thus ?case by (force intro: rPar2 simp add: residualInject)
next
case cComm1
thus ?case by (simp add: residualInject)
next
case cComm2
thus ?case by (simp add: residualInject)
next
case (cOpen Ψ P M xvec yvec N P' x C B)
thus ?case by (force intro: rOpen simp add: residualInject)
next
case (cScope Ψ P M α P' x C)
thus ?case by (force intro: rScope simp add: residualInject)
next
case (Bang Ψ P Rs C)
thus ?case by (force intro: rBang)
qed
lemma boundOutputBindObject:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and yvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and y :: name
assumes "Ψ ⊳ P ⟼ α ≺ P'"
and "bn α ♯ * subject α"
and "distinct(bn α)"
and "y ∈ set(bn α)"
shows "y ∈ supp(object α)"
using assms
proof (nominal_induct avoiding: P' arbitrary: y rule: semanticsInduct)
case (cAlpha Ψ P α P' p P'' y)
from ‹ y ∈ set(bn(p ∙ α))› have "(p ∙ y) ∈ (p ∙ set(bn(p ∙ α)))"
by (rule pt_set_bij2[OF pt_name_inst, OF at_name_inst])
hence "(p ∙ y) ∈ set(bn α)" using ‹ distinctPerm p›
by (simp add: eqvts)
hence "(p ∙ y) ∈ supp(object α)" by (rule cAlpha)
hence "(p ∙ p ∙ y) ∈ (p ∙ supp(object α))"
by (rule pt_set_bij2[OF pt_name_inst, OF at_name_inst])
thus ?case using ‹ distinctPerm p›
by (simp add: eqvts)
next
case cInput
thus ?case by (simp add: supp_list_nil)
next
case cOutput
thus ?case by (simp add: supp_list_nil)
next
case cCase
thus ?case by simp
next
case cPar1
thus ?case by simp
next
case cPar2
thus ?case by simp
next
case cComm1
thus ?case by (simp add: supp_list_nil)
next
case cComm2
thus ?case by (simp add: supp_list_nil)
next
case cOpen
thus ?case by (auto simp add: supp_list_cons supp_list_append supp_atm supp_some)
next
case cScope
thus ?case by simp
next
case cBang
thus ?case by simp
qed
lemma alphaBoundOutputChain':
fixes yvec :: "name list"
and xvec :: "name list"
and B :: "('a, 'b, 'c) boundOutput"
assumes "length xvec = length yvec"
and "yvec ♯ * B"
and "yvec ♯ * xvec"
and "distinct yvec"
shows "( ν*xvec) B = ( ν*yvec) ([xvec yvec] ∙ v B)"
using assms
proof (induct rule: composePermInduct)
case cBase
show ?case by simp
next
case (cStep x xvec y yvec)
thus ?case
apply auto
by (subst alphaBoundOutput[of y]) (auto simp add: eqvts)
qed
lemma alphaBoundOutputChain'':
fixes yvec :: "name list"
and xvec :: "name list"
and N :: 'a
and P :: "('a, 'b, 'c) psi"
assumes "length xvec = length yvec"
and "yvec ♯ * N"
and "yvec ♯ * P"
and "yvec ♯ * xvec"
and "distinct yvec"
shows "( ν*xvec) (N ≺ ' P) = ( ν*yvec) (([xvec yvec] ∙ v N) ≺ ' ([xvec yvec] ∙ v P))"
proof -
from assms have "( ν*xvec) (N ≺ ' P) = ( ν*yvec) ([xvec yvec] ∙ v (N ≺ ' P))"
by (simp add: alphaBoundOutputChain')
thus ?thesis by simp
qed
lemma alphaDistinct:
fixes xvec :: "name list"
and N :: 'a
and P :: "('a, 'b, 'c) psi"
and yvec :: "name list"
and M :: 'a
and Q :: "('a, 'b, 'c) psi"
assumes "α ≺ P = β ≺ Q"
and "distinct(bn α)"
and "∧ x. x ∈ set(bn α) ==> x ∈ supp(object α)"
and "bn α ♯ * bn β"
and "bn α ♯ * (object β)"
and "bn α ♯ * Q"
shows "distinct(bn β)"
using assms
proof (rule_tac actionCases[where α=α], auto simp add: residualInject supp_some)
fix xvec M yvec N
assume Eq: "( ν*xvec) N ≺ ' P = ( ν*yvec) M ≺ ' Q"
assume "distinct xvec" and "xvec ♯ * M" and "xvec ♯ * yvec" and "xvec ♯ * Q"
assume Mem: "∧ x. x ∈ set xvec ==> x ∈ (supp N)"
show "distinct yvec"
proof -
from Eq have "length xvec = length yvec"
by (rule boundOutputChainEqLength)
with Eq ‹ distinct xvec› ‹ xvec ♯ * yvec› ‹ xvec ♯ * M› ‹ xvec ♯ * Q› Mem show ?thesis
proof (induct n=="length xvec" arbitrary: xvec yvec M Q rule: nat.induct)
case (zero xvec yvec M Q)
thus ?case by simp
next
case (Suc n xvec yvec M Q)
have L: "length xvec = length yvec" and "Suc n = length xvec" by fact+
then obtain x xvec' y yvec' where xEq: "xvec = x#xvec'" and yEq: "yvec = y#yvec'"
and L': "length xvec' = length yvec'"
by (cases xvec, auto, cases yvec, auto)
have xvecFreshyvec: "xvec ♯ * yvec" and xvecDist: "distinct xvec" by fact+
with xEq yEq have xineqy: "x ≠ y" and xvec'Freshyvec': "xvec' ♯ * yvec'"
and xvec'Dist: "distinct xvec'" and xFreshxvec': "x ♯ xvec'"
and xFreshyvec': "x ♯ yvec'" and yFreshxvec': "y ♯ xvec'"
by auto
have Eq: "( ν*xvec) N ≺ ' P = ( ν*yvec) M ≺ ' Q" by fact
with xEq yEq xineqy have Eq': "( ν*xvec') N ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ M) ≺ ' ([(x, y)] ∙ Q)"
by (simp add: boundOutput.inject alpha eqvts)
moreover have Mem:"∧ x. x ∈ set xvec ==> x ∈ supp N" by fact
with xEq have "∧ x. x ∈ set xvec' ==> x ∈ supp N" by simp
moreover have "xvec ♯ * M" by fact
with xEq xFreshxvec' yFreshxvec' have "xvec' ♯ * ([(x, y)] ∙ M)" by simp
moreover have xvecFreshQ: "xvec ♯ * Q" by fact
with xEq xFreshxvec' yFreshxvec' have "xvec' ♯ * ([(x, y)] ∙ Q)" by simp
moreover have "Suc n = length xvec" by fact
with xEq have "n = length xvec'" by simp
moreover from xvec'Freshyvec' xFreshxvec' yFreshxvec' have "xvec' ♯ * ([(x, y)] ∙ yvec')"
by simp
moreover from L' have "length xvec' = length([(x, y)] ∙ yvec')" by simp
ultimately have "distinct([(x, y)] ∙ yvec')" using xvec'Dist
by (rule_tac Suc) (assumption | simp)+
hence "distinct yvec'" by simp
from Mem xEq have xSuppN: "x ∈ supp N" by simp
from L ‹ distinct xvec› ‹ xvec ♯ * yvec› ‹ xvec ♯ * M› ‹ xvec ♯ * Q›
have "( ν*yvec) M ≺ ' Q = ( ν*xvec) ([yvec xvec] ∙ v M) ≺ ' ([yvec xvec] ∙ v Q)"
by (simp add: alphaBoundOutputChain'')
with Eq have "N = [yvec xvec] ∙ v M" by simp
with xEq yEq have "N = [(y, x)] ∙ [yvec' xvec'] ∙ v M"
by simp
with xSuppN have ySuppM: "y ∈ supp([yvec' xvec'] ∙ v M)"
by (drule_tac pi="[(x, y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
(simp add: calc_atm eqvts name_swap)
have "y ♯ yvec'"
proof (simp add: fresh_def, rule notI)
assume "y ∈ supp yvec'"
hence "y mem yvec'"
by (induct yvec') (auto simp add: supp_list_nil supp_list_cons supp_atm)
moreover from ‹ xvec ♯ * M› xEq xFreshxvec' have "xvec' ♯ * M" by simp
ultimately have "y ♯ [yvec' xvec'] ∙ v M" using L' xvec'Freshyvec' xvec'Dist
by (force intro: freshChainPerm)
with ySuppM show "False" by (simp add: fresh_def)
qed
with ‹ distinct yvec'› yEq show ?case by simp
qed
qed
qed
lemma boundOutputDistinct:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⟼ α ≺ P'"
shows "distinct(bn α)"
using assms
proof (nominal_induct Ψ P x3=="α ≺ P'" avoiding: α P' rule: semantics.strong_induct)
case cInput
thus ?case by (simp add: residualInject)
next
case Output
thus ?case by (simp add: residualInject)
next
case Case
thus ?case by (simp add: residualInject)
next
case cPar1
thus ?case by (force intro: alphaDistinct boundOutputBindObject)
next
case cPar2
thus ?case by (force intro: alphaDistinct boundOutputBindObject)
next
case cComm1
thus ?case by (simp add: residualInject)
next
case cComm2
thus ?case by (simp add: residualInject)
next
case (cOpen Ψ P M xvec yvec N P' x α P'')
note ‹ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P' = α ≺ P''›
moreover from ‹ xvec ♯ * yvec› ‹ x ♯ xvec› ‹ x ♯ yvec› ‹ distinct xvec› ‹ distinct yvec›
have "distinct(bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))"
by auto (simp add: fresh_star_def fresh_def name_list_supp)
moreover {
fix y
from ‹ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'› ‹ x ∈ supp N› ‹ x ♯ xvec› ‹ x ♯ yvec› ‹ x ♯ M› ‹ x ♯ Ψ› ‹ distinct xvec› ‹ distinct yvec› ‹ xvec ♯ * Ψ› ‹ xvec ♯ * P› ‹ xvec ♯ * M› ‹ xvec ♯ * yvec › ‹ yvec ♯ * Ψ› ‹ yvec ♯ * P› ‹ yvec ♯ * M›
have "Ψ ⊳ ( νx) P ⟼ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P'" by (rule semantics.cOpen)
moreover moreover from ‹ xvec ♯ * M› ‹ x ♯ M› ‹ yvec ♯ * M›
have "bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ) ♯ * (subject(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))"
by simp
moreover note ‹ distinct(bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))›
moreover assume "y ∈ set(bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))"
ultimately have "y ∈ supp(object(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))"
by (rule_tac boundOutputBindObject)
}
moreover from ‹ xvec ♯ * α› ‹ x ♯ α› ‹ yvec ♯ * α›
have "bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ) ♯ * bn α" and "bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ) ♯ * object α" by simp+
moreover from ‹ xvec ♯ * P''› ‹ x ♯ P''› ‹ yvec ♯ * P''›
have "bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ) ♯ * P''" by simp
ultimately show ?case by (rule alphaDistinct)
next
case cScope
thus ?case
by (rule_tac alphaDistinct, auto) (rule_tac boundOutputBindObject, auto)
next
case Bang
thus ?case by simp
qed
lemma inputDistinct:
fixes Ψ :: 'b
and M :: 'a
and xvec :: "name list"
and N :: 'a
and P :: "('a, 'b, 'c) psi"
and Rs :: "('a, 'b, 'c) residual"
assumes "Ψ ⊳ M( λ*xvec N) .P ⟼ Rs"
shows "distinct xvec"
using assms
by (nominal_induct Ψ P=="M( λ*xvec N) .P" Rs avoiding: xvec N P rule: semantics.strong_induct)
(auto simp add: psi.inject intro: alphaInputDistinct)
lemma outputInduct'[consumes 2 , case_names cAlpha cOutput cCase cPar1 cPar2 cOpen cScope cBang]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and yvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and Prop :: "'d::fs_name → 'b → ('a, 'b, 'c) psi →
'a → name list → 'a → ('a, 'b, 'c) psi → bool"
and C :: "'d::fs_name"
assumes "Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'"
and "xvec ♯ * M"
and rAlpha: "∧ Ψ P M xvec N P' p C. [ xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * C; xvec ♯ * (p ∙ xvec);
set p ⊆ set xvec × set(p ∙ xvec); distinctPerm p;
(p ∙ xvec) ♯ * N; (p ∙ xvec) ♯ * P'; Prop C Ψ P M xvec N P'] ==>
Prop C Ψ P M (p ∙ xvec) (p ∙ N) (p ∙ P')"
and rOutput: "∧ Ψ M K N P C. [ Ψ ⊨ M ↔ K] ==> Prop C Ψ (M⟨ N⟩ .P) K ([]) N P"
and rCase: "∧ Ψ P M xvec N P' φ Cs C. [ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; ∧ C. Prop C Ψ P M xvec N P'; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) M xvec N P'"
and rPar1: "∧ Ψ ΨQ P M xvec N P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P M xvec N P';
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * M;
AQ ♯ * xvec; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * C; xvec ♯ * Q;
xvec ♯ * Ψ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) M xvec N (P' ∥ Q)"
and rPar2: "∧ Ψ ΨP Q M xvec N Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ M( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q M xvec N Q';
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * M;
AP ♯ * xvec; AP ♯ * N; AP ♯ * Q'; AP ♯ * C; xvec ♯ * Q;
xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) M xvec N (P ∥ Q')"
and rOpen: "∧ Ψ P M xvec yvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; x ∈ supp N; ∧ C. Prop C Ψ P M (xvec@yvec) N P';
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ yvec; xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M;
yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M; yvec ♯ * C; x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) M (xvec@x#yvec) N P'"
and rScope: "∧ Ψ P M xvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; ∧ C. Prop C Ψ P M xvec N P';
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ N; xvec ♯ * Ψ;
xvec ♯ * P; xvec ♯ * M; x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) M xvec N (( νx) P')"
and rBang: "∧ Ψ P M xvec N P' C.
[ Ψ ⊳ P ∥ !P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; guarded P; ∧ C. Prop C Ψ (P ∥ !P) M xvec N P'] ==>
Prop C Ψ (!P) M xvec N P'"
shows "Prop C Ψ P M xvec N P'"
proof -
note ‹ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'›
moreover from ‹ xvec ♯ * M› have "bn(M( ν*xvec) ⟨ N⟩ ) ♯ * subject(M( ν*xvec) ⟨ N⟩ )" by simp
moreover from ‹ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'› have "distinct(bn(M( ν*xvec) ⟨ N⟩ ))"
by (rule boundOutputDistinct)
ultimately show ?thesis
proof (nominal_induct Ψ P α=="M( ν*xvec) ⟨ N⟩ " P' avoiding: C arbitrary: M xvec N rule: semanticsInduct)
case (cAlpha Ψ P α P' p C M xvec N)
from ‹ (p ∙ α) = M( ν*xvec) ⟨ N⟩ › have "(p ∙ p ∙ α) = p ∙ (M( ν*xvec) ⟨ N⟩ )"
by (simp add: fresh_bij)
with ‹ distinctPerm p› have A: "α = (p ∙ M)( ν*(p ∙ xvec)) ⟨ (p ∙ N)⟩ "
by (simp add: eqvts)
with ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * subject α › ‹ bn α ♯ * C› ‹ bn α ♯ * bn(p ∙ α)› ‹ distinctPerm p ›
have "(p ∙ xvec) ♯ * Ψ" and "(p ∙ xvec) ♯ * P" and "(p ∙ xvec) ♯ * (p ∙ M)" and "(p ∙ xvec) ♯ * C" and "(p ∙ xvec) ♯ * (p ∙ p ∙ xvec)"
by auto
moreover from A ‹ set p ⊆ set(bn α) × set(bn(p ∙ α))› ‹ distinctPerm p›
have S: "set p ⊆ set(p ∙ xvec) × set(p ∙ p ∙ xvec)" by simp
moreover note ‹ distinctPerm p›
moreover from A ‹ bn(p ∙ α) ♯ * α› ‹ bn(p ∙ α) ♯ * P'›
have "(p ∙ p ∙ xvec) ♯ * (p ∙ N)" and "(p ∙ p ∙ xvec) ♯ * P'" by simp+
moreover from A have "Prop C Ψ P (p ∙ M) (p ∙ xvec) (p ∙ N) P'"
by (rule cAlpha)
ultimately have "Prop C Ψ P (p ∙ M) (p ∙ p ∙ xvec) (p ∙ p ∙ N) (p ∙ P')"
by (rule rAlpha)
moreover from A ‹ bn α ♯ * subject α› have "(p ∙ xvec) ♯ * (p ∙ M)" by simp
hence "xvec ♯ * M" by (simp add: fresh_star_bij)
from A ‹ bn(p ∙ α) ♯ * α› ‹ distinctPerm p› have "xvec ♯ * (p ∙ M)" by simp
hence "(p ∙ xvec) ♯ * (p ∙ p ∙ M)" by (simp add: fresh_star_bij)
with ‹ distinctPerm p› have "(p ∙ xvec) ♯ * M" by simp
with ‹ xvec ♯ * M› S ‹ distinctPerm p› have "(p ∙ M) = M" by simp
ultimately show ?case using S ‹ distinctPerm p› by simp
next
case cInput
thus ?case by (simp add: residualInject)
next
case cOutput
thus ?case by (force dest: rOutput simp add: action.inject)
next
case cCase
thus ?case by (force intro: rCase)
next
case cPar1
thus ?case by (force intro: rPar1)
next
case cPar2
thus ?case by (force intro: rPar2)
next
case cComm1
thus ?case by (simp add: action.inject)
next
case cComm2
thus ?case by (simp add: action.inject)
next
case cOpen
thus ?case by (fastforce intro: rOpen simp add: action.inject)
next
case cScope
thus ?case by (fastforce intro: rScope)
next
case cBang
thus ?case by (fastforce intro: rBang)
qed
qed
lemma inputInduct[consumes 1 , case_names cInput cCase cPar1 cPar2 cScope cBang]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and Prop :: "'d::fs_name → 'b → ('a, 'b, 'c) psi →
'a → 'a → ('a, 'b, 'c) psi → bool"
and C :: "'d::fs_name"
assumes Trans: "Ψ ⊳ P ⟼ M( N) ≺ P'"
and rInput: "∧ Ψ M K xvec N Tvec P C.
[ Ψ ⊨ M ↔ K; distinct xvec; set xvec ⊆ supp N;
length xvec = length Tvec; xvec ♯ * Ψ;
xvec ♯ * M; xvec ♯ * K; xvec ♯ * C] ==>
Prop C Ψ (M( λ*xvec N) .P)
K (N[xvec::=Tvec]) (P[xvec::=Tvec])"
and rCase: "∧ Ψ P M N P' φ Cs C. [ Ψ ⊳ P ⟼ M( N) ≺ P'; ∧ C. Prop C Ψ P M N P'; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) M N P'"
and rPar1: "∧ Ψ ΨQ P M N P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P M N P'; distinct AQ ;
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * M; AQ ♯ * N;
AQ ♯ * P'; AQ ♯ * C] ==>
Prop C Ψ (P ∥ Q) M N (P' ∥ Q)"
and rPar2: "∧ Ψ ΨP Q M N Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ M( N) ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q M N Q'; distinct AP ;
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * M; AP ♯ * N;
AP ♯ * Q'; AP ♯ * C] ==>
Prop C Ψ (P ∥ Q) M N (P ∥ Q')"
and rScope: "∧ Ψ P M N P' x C.
[ Ψ ⊳ P ⟼ M( N) ≺ P'; ∧ C. Prop C Ψ P M N P'; x ♯ Ψ; x ♯ M; x ♯ N; x ♯ C] ==>
Prop C Ψ (( νx) P) M N (( νx) P')"
and rBang: "∧ Ψ P M N P' C.
[ Ψ ⊳ P ∥ !P ⟼ M( N) ≺ P'; guarded P; ∧ C. Prop C Ψ (P ∥ !P) M N P'] ==> Prop C Ψ (!P) M N P'"
shows "Prop C Ψ P M N P'"
using Trans
proof (nominal_induct Ψ P Rs=="M( N) ≺ P'" avoiding: C arbitrary: P' rule: semantics.strong_induct)
case (cInput Ψ M K xvec N Tvec P C)
thus ?case
by (force intro: rInput simp add: residualInject action.inject)
next
case (Output Ψ M K N P C)
thus ?case by (simp add: residualInject)
next
case (Case Ψ P Rs φ CS C)
thus ?case by (force intro: rCase)
next
case (cPar1 Ψ ΨQ P α P' Q AQ C P'')
thus ?case by (force intro: rPar1 simp add: residualInject)
next
case (cPar2 Ψ ΨP Q α Q' xvec P C Q'')
thus ?case by (force intro: rPar2 simp add: residualInject)
next
case (cComm1 Ψ ΨQ P M N P' xvec ΨP Q K zvec Q' yvec C PQ)
thus ?case by (simp add: residualInject)
next
case (cComm2 Ψ ΨQ P M zvec N P' xvec ΨP Q K yvec Q' C PQ)
thus ?case by (simp add: residualInject)
next
case (cOpen Ψ P M xvec N P' x yvec C P'')
thus ?case by (simp add: residualInject)
next
case (cScope Ψ P α P' x C P'')
thus ?case by (force intro: rScope simp add: residualInject)
next
case (Bang Ψ P Rs C)
thus ?case by (force intro: rBang)
qed
lemma tauInduct[consumes 1 , case_names cCase cPar1 cPar2 cComm1 cComm2 cScope cBang]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Rs :: "('a, 'b, 'c) residual"
and Prop :: "'d::fs_name → 'b → ('a, 'b, 'c) psi →
('a, 'b, 'c) psi → bool"
and C :: "'d::fs_name"
assumes Trans: "Ψ ⊳ P ⟼ τ ≺ P'"
and rCase: "∧ Ψ P P' φ Cs C. [ Ψ ⊳ P ⟼ τ ≺ P'; ∧ C. Prop C Ψ P P'; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) P'"
and rPar1: "∧ Ψ ΨQ P P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ τ ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P P';
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ;
AQ ♯ * P'; AQ ♯ * C] ==>
Prop C Ψ (P ∥ Q) (P' ∥ Q)"
and rPar2: "∧ Ψ ΨP Q Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ τ ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q Q';
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ;
AP ♯ * Q'; AP ♯ * C] ==>
Prop C Ψ (P ∥ Q) (P ∥ Q')"
and rComm1: "∧ Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q';
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (( ν*xvec) (P' ∥ Q'))"
and rComm2: "∧ Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( N) ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q';
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (( ν*xvec) (P' ∥ Q'))"
and rScope: "∧ Ψ P P' x C.
[ Ψ ⊳ P ⟼ τ ≺ P'; ∧ C. Prop C Ψ P P'; x ♯ Ψ; x ♯ C] ==>
Prop C Ψ (( νx) P) (( νx) P')"
and rBang: "∧ Ψ P P' C.
[ Ψ ⊳ P ∥ !P ⟼ τ ≺ P'; guarded P; ∧ C. Prop C Ψ (P ∥ !P) P'] ==> Prop C Ψ (!P) P'"
shows "Prop C Ψ P P'"
using Trans
proof (nominal_induct Ψ P Rs=="τ ≺ P'" avoiding: C arbitrary: P' rule: semantics.strong_induct)
case (cInput M K xvec N Tvec P C)
thus ?case by (simp add: residualInject)
next
case (Output Ψ M K N P C)
thus ?case by (simp add: residualInject)
next
case (Case Ψ P Rs φ Cs C)
thus ?case by (force intro: rCase simp add: residualInject)
next
case (cPar1 Ψ ΨQ P α P' AQ Q C P'')
thus ?case by (force intro: rPar1 simp add: residualInject)
next
case (cPar2 Ψ ΨP Q α Q' AP P C Q'')
thus ?case by (force intro: rPar2 simp add: residualInject)
next
case (cComm1 Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ C PQ)
thus ?case by (force intro: rComm1 simp add: residualInject)
next
case (cComm2 Ψ ΨQ P M xvec N P' AP ΨP Q' AQ C PQ)
thus ?case by (force intro: rComm2 simp add: residualInject)
next
case (cOpen Ψ P M xvec N P' x yvec C P'')
thus ?case by (simp add: residualInject)
next
case (cScope Ψ P α P' x C P'')
thus ?case by (force intro: rScope simp add: residualInject)
next
case (Bang Ψ P Rs C )
thus ?case by (force intro: rBang simp add: residualInject)
qed
lemma semanticsFrameInduct[consumes 3 , case_names cAlpha cInput cOutput cCase cPar1 cPar2 cComm1 cComm2 cOpen cScope cBang]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Rs :: "('a, 'b, 'c) residual"
and AP :: "name list"
and ΨP :: 'b
and Prop :: "'d::fs_name → 'b → ('a, 'b, 'c) psi →
('a, 'b, 'c) residual → name list → 'b → bool"
and C :: "'d::fs_name"
assumes Trans: "Ψ ⊳ P ⟼ Rs"
and FrP: "extractFrame P = ⟨ AP , ΨP ⟩ "
and "distinct AP "
and rAlpha: "∧ Ψ P AP ΨP p Rs C. [ AP ♯ * Ψ; AP ♯ * P; AP ♯ * (p ∙ AP ); AP ♯ * Rs; AP ♯ * C;
set p ⊆ set AP × set(p ∙ AP ); distinctPerm p;
Prop C Ψ P Rs AP ΨP ] ==> Prop C Ψ P Rs (p ∙ AP ) (p ∙ ΨP )"
and rInput: "∧ Ψ M K xvec N Tvec P C.
[ Ψ ⊨ M ↔ K; distinct xvec; set xvec ⊆ supp N;
length xvec = length Tvec; xvec ♯ * Ψ;
xvec ♯ * M; xvec ♯ * K; xvec ♯ * C] ==>
Prop C Ψ (M( λ*xvec N) .P)
(K( (N[xvec::=Tvec])) ≺ (P[xvec::=Tvec])) ([]) (1 )"
and rOutput: "∧ Ψ M K N P C. Ψ ⊨ M ↔ K ==> Prop C Ψ (M⟨ N⟩ .P) (K⟨ N⟩ ≺ P) ([]) (1 )"
and rCase: "∧ Ψ P Rs φ Cs AP ΨP C. [ Ψ ⊳ P ⟼ Rs; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ; ∧ C. Prop C Ψ P Rs AP ΨP ;
(φ, P) mem Cs; Ψ ⊨ φ; guarded P; ΨP ≃ 1 ; (supp ΨP ) = ({}::name set);
AP ♯ * Ψ; AP ♯ * P; AP ♯ * Rs; AP ♯ * C] ==> Prop C Ψ (Cases Cs) Rs ([]) (1 )"
and rPar1: "∧ Ψ ΨQ P α P' AQ Q AP ΨP C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ α ≺ P';
extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P (α ≺ P') AP ΨP ; distinct(bn α);
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * α; AP ♯ * P'; AP ♯ * AQ ; AP ♯ * ΨQ ;
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * α; AQ ♯ * P'; AQ ♯ * ΨP ;
bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * Q; bn α ♯ * subject α; bn α ♯ * ΨP ; bn α ♯ * ΨQ ;
AP ♯ * C; AQ ♯ * C; bn α ♯ * C] ==>
Prop C Ψ (P ∥ Q) (α ≺ (P' ∥ Q)) (AP @AQ ) (ΨP ⊗ ΨQ )"
and rPar2: "∧ Ψ ΨP Q α Q' AP P AQ ΨQ C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ α ≺ Q';
extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q (α ≺ Q') AQ ΨQ ; distinct(bn α);
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * α; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * ΨQ ;
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * α; AQ ♯ * Q'; AQ ♯ * ΨP ;
bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * Q; bn α ♯ * subject α; bn α ♯ * ΨP ; bn α ♯ * ΨQ ;
AP ♯ * C; AQ ♯ * C; bn α ♯ * C] ==>
Prop C Ψ (P ∥ Q) (α ≺ (P ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
and rComm1: "∧ Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P ((M( N) ) ≺ P') AP ΨP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
∧ C. Prop C (Ψ ⊗ ΨP ) Q (K( ν*xvec) ⟨ N⟩ ≺ Q') AQ ΨQ ; distinct xvec;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q';
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
and rComm2: "∧ Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P (M( ν*xvec) ⟨ N⟩ ≺ P') AP ΨP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( N) ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q (K( N) ≺ Q') AQ ΨQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K; distinct xvec;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q';
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
and rOpen: "∧ Ψ P M xvec yvec N P' x AP ΨP C.
[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C Ψ P (M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P') AP ΨP ; x ∈ supp N; x ♯ Ψ; x ♯ M;
x ♯ AP ; x ♯ xvec; x ♯ yvec; AP ♯ * Ψ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * xvec; AP ♯ * yvec; xvec ♯ * yvec; distinct xvec; distinct yvec;
xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * ΨP ; yvec ♯ * ΨP ;
yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M; AP ♯ * C; x ♯ C; xvec ♯ * C; yvec ♯ * C] ==>
Prop C Ψ (( νx) P) (M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P') (x#AP ) ΨP "
and rScope: "∧ Ψ P α P' x AP ΨP C.
[ Ψ ⊳ P ⟼ α ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C Ψ P (α ≺ P') AP ΨP ;
x ♯ Ψ; x ♯ α; x ♯ AP ; AP ♯ * Ψ; AP ♯ * P;
AP ♯ * α; AP ♯ * P'; distinct(bn α);
bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * subject α; bn α ♯ * ΨP ;
AP ♯ * C; x ♯ C; bn α ♯ * C] ==>
Prop C Ψ (( νx) P) (α ≺ (( νx) P')) (x#AP ) ΨP "
and rBang: "∧ Ψ P Rs AP ΨP C.
[ Ψ ⊳ P ∥ !P ⟼ Rs; guarded P; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C Ψ (P ∥ !P) Rs AP (ΨP ⊗ 1 ); ΨP ≃ 1 ; supp ΨP = ({}::name set);
AP ♯ * Ψ; AP ♯ * P; AP ♯ * Rs; AP ♯ * C] ==> Prop C Ψ (!P) Rs ([]) (1 )"
shows "Prop C Ψ P Rs AP ΨP "
using Trans FrP ‹ distinct AP ›
proof (nominal_induct avoiding: AP ΨP C rule: semantics.strong_induct)
case (cInput Ψ M K xvec N Tvec P AP ΨP C)
from ‹ extractFrame (M( λ*xvec N) .P) = ⟨ AP , ΨP ⟩ ›
have "AP = []" and "ΨP = 1 "
by auto
with ‹ Ψ ⊨ M ↔ K› ‹ distinct xvec› ‹ set xvec ⊆ supp N› ‹ length xvec = length Tvec›
‹ xvec ♯ * Ψ› ‹ xvec ♯ * M› ‹ xvec ♯ * K› ‹ xvec ♯ * C›
show ?case by (blast intro: rInput)
next
case (Output Ψ M K N P AP ΨP )
from ‹ extractFrame (M⟨ N⟩ .P) = ⟨ AP , ΨP ⟩ ›
have "AP = []" and "ΨP = 1 "
by auto
with ‹ Ψ ⊨ M ↔ K› show ?case
by (blast intro: rOutput)
next
case (Case Ψ P Rs φ Cs Ac P Ψc P C)
obtain AP ΨP where FrP: "extractFrame P = ⟨ AP , ΨP ⟩ " and "distinct AP "
and "AP ♯ * (Ψ, P, Rs, C)"
by (rule freshFrame)
hence "AP ♯ * Ψ" and "AP ♯ * P" and "AP ♯ * Rs" and "AP ♯ * C"
by simp+
note ‹ Ψ ⊳ P ⟼ Rs› FrP ‹ distinct AP ›
moreover from FrP ‹ distinct AP › ‹ ∧ AP ΨP C. [ extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ] ==> Prop C Ψ P Rs AP ΨP ›
have "∧ C. Prop C Ψ P Rs AP ΨP " by simp
moreover note ‹ (φ, P) mem Cs› ‹ Ψ ⊨ φ› ‹ guarded P›
moreover from ‹ guarded P› FrP have "ΨP ≃ 1 " and "supp ΨP = ({}::name set)" by (metis guardedStatEq)+
moreover note ‹ AP ♯ * Ψ› ‹ AP ♯ * P› ‹ AP ♯ * Rs› ‹ AP ♯ * C›
ultimately have "Prop C Ψ (Cases Cs) Rs ([]) (1 )"
by (rule rCase)
thus ?case using ‹ extractFrame(Cases Cs) = ⟨ Ac P , Ψc P ⟩ › by simp
next
case (cPar1 Ψ ΨQ P α P' Q AQ AP Q ΨP Q C)
obtain AP ΨP where FrP: "extractFrame P = ⟨ AP , ΨP ⟩ " and "distinct AP "
"AP ♯ * (P, Q, Ψ, α, P', AQ , AP Q , C, ΨQ )"
by (rule freshFrame)
hence "AP ♯ * P" and "AP ♯ * Q" and "AP ♯ * Ψ" and "AP ♯ * α" and "AP ♯ * P'"
and "AP ♯ * AQ " and "AP ♯ * AP Q " and "AP ♯ * C" and "AP ♯ * ΨQ "
by simp+
have FrQ: "extractFrame Q = ⟨ AQ , ΨQ ⟩ " by fact
from ‹ AQ ♯ * P› ‹ AP ♯ * AQ › FrP have "AQ ♯ * ΨP "
by (force dest: extractFrameFreshChain)
from ‹ bn α ♯ * P› ‹ AP ♯ * α› FrP have "bn α ♯ * ΨP "
by (force dest: extractFrameFreshChain)
from ‹ extractFrame(P ∥ Q) = ⟨ AP Q , ΨP Q ⟩ › FrP FrQ ‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ › ‹ AQ ♯ * ΨP ›
have "⟨ (AP @AQ ), ΨP ⊗ ΨQ ⟩ = ⟨ AP Q , ΨP Q ⟩ "
by simp
moreover from ‹ distinct AP › ‹ distinct AQ › ‹ AP ♯ * AQ › have "distinct(AP @AQ )"
by (auto simp add: fresh_star_def fresh_def name_list_supp)
ultimately obtain p where S: "set p ⊆ set(AP @AQ ) × set((p ∙ AP )@(p ∙ AQ ))" and "distinctPerm p"
and Ψeq: "ΨP Q = p ∙ (ΨP ⊗ ΨQ )" and Aeq: "AP Q = (p ∙ AP )@(p ∙ AQ )"
using ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q › ‹ distinct AP Q ›
by (rule_tac frameChainEq') (assumption | simp add: eqvts)+
note ‹ Ψ ⊗ ΨQ ⊳ P ⟼ α ≺ P'› FrP ‹ distinct AP › FrQ ‹ distinct AQ ›
moreover from FrP ‹ distinct AP › ‹ ∧ AP ΨP C. [ extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ] ==> Prop C (Ψ ⊗ ΨQ ) P (α ≺ P') AP ΨP ›
have "∧ C. Prop C (Ψ ⊗ ΨQ ) P (α ≺ P') AP ΨP " by simp
moreover note ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * Ψ› ‹ AP ♯ * α› ‹ AP ♯ * P'› ‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ ›
‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * Ψ› ‹ AQ ♯ * α› ‹ AQ ♯ * P'› ‹ AQ ♯ * ΨP › ‹ distinct(bn α)›
‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * Q› ‹ bn α ♯ * subject α› ‹ bn α ♯ * ΨP › ‹ bn α ♯ * ΨQ ›
‹ AP ♯ * C› ‹ AQ ♯ * C› ‹ bn α ♯ * C›
ultimately have "Prop C Ψ (P ∥ Q) (α ≺ (P' ∥ Q)) (AP @AQ ) (ΨP ⊗ ΨQ )"
by (rule_tac rPar1)
with ‹ AP ♯ * Ψ› ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * α› ‹ AP ♯ * P'› ‹ AP ♯ * AP Q › ‹ AP ♯ * C›
‹ AQ ♯ * Ψ› ‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * α› ‹ AQ ♯ * P'› ‹ AQ ♯ * AP Q › ‹ AQ ♯ * C›
S ‹ distinctPerm p› Aeq
have "Prop C Ψ (P ∥ Q) (α ≺ (P' ∥ Q)) (p ∙ (AP @AQ )) (p ∙ (ΨP ⊗ ΨQ ))"
by (rule_tac rAlpha) (assumption | simp add: eqvts)+
with Ψeq Aeq show ?case by (simp add: eqvts)
next
case (cPar2 Ψ ΨP Q α Q' P AP AP Q ΨP Q C)
obtain AQ ΨQ where FrQ: "extractFrame Q = ⟨ AQ , ΨQ ⟩ " and "distinct AQ "
"AQ ♯ * (P, Q, Ψ, α, Q', AP , AP Q , C, ΨP )"
by (rule freshFrame)
hence "AQ ♯ * P" and "AQ ♯ * Q" and "AQ ♯ * Ψ" and "AQ ♯ * α" and "AQ ♯ * Q'"
and "AQ ♯ * AP " and "AQ ♯ * AP Q " and "AQ ♯ * C" and "AQ ♯ * ΨP "
by simp+
from ‹ AQ ♯ * AP › have "AP ♯ * AQ " by simp
have FrP: "extractFrame P = ⟨ AP , ΨP ⟩ " by fact
from ‹ AP ♯ * Q› ‹ AQ ♯ * AP › FrQ have "AP ♯ * ΨQ "
by (force dest: extractFrameFreshChain)
from ‹ bn α ♯ * Q› ‹ AQ ♯ * α› FrQ have "bn α ♯ * ΨQ "
by (force dest: extractFrameFreshChain)
from ‹ extractFrame(P ∥ Q) = ⟨ AP Q , ΨP Q ⟩ › FrP FrQ ‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ › ‹ AQ ♯ * ΨP ›
have "⟨ (AP @AQ ), ΨP ⊗ ΨQ ⟩ = ⟨ AP Q , ΨP Q ⟩ "
by simp
moreover from ‹ distinct AP › ‹ distinct AQ › ‹ AP ♯ * AQ › have "distinct(AP @AQ )"
by (auto simp add: fresh_star_def fresh_def name_list_supp)
ultimately obtain p where S: "(set p ⊆ (set(AP @AQ )) × (set AP Q ))" and "distinctPerm p"
and Ψeq: "ΨP Q = p ∙ (ΨP ⊗ ΨQ )" and Aeq: "AP Q = ((p ∙ AP )@(p ∙ AQ ))"
using ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q › ‹ distinct AP Q ›
by (rule_tac frameChainEq') (assumption | simp add: eqvts)+
note ‹ Ψ ⊗ ΨP ⊳ Q ⟼ α ≺ Q'› FrP ‹ distinct AP › FrQ ‹ distinct AQ ›
moreover from FrQ ‹ distinct AQ › ‹ ∧ AQ ΨQ C. [ extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ] ==> Prop C (Ψ ⊗ ΨP ) Q (α ≺ Q') AQ ΨQ ›
have "∧ C. Prop C (Ψ ⊗ ΨP ) Q (α ≺ Q') AQ ΨQ " by simp
moreover note ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * Ψ› ‹ AP ♯ * α› ‹ AP ♯ * Q'› ‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ ›
‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * Ψ› ‹ AQ ♯ * α› ‹ AQ ♯ * Q'› ‹ AQ ♯ * ΨP › ‹ distinct(bn α)›
‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * Q› ‹ bn α ♯ * subject α› ‹ bn α ♯ * ΨP › ‹ bn α ♯ * ΨQ ›
‹ AP ♯ * C› ‹ AQ ♯ * C› ‹ bn α ♯ * C›
ultimately have "Prop C Ψ (P ∥ Q) (α ≺ (P ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
by (rule_tac rPar2)
with ‹ AP ♯ * Ψ› ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * α› ‹ AP ♯ * Q'› ‹ AP ♯ * AP Q › ‹ AP ♯ * C›
‹ AQ ♯ * Ψ› ‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * α› ‹ AQ ♯ * Q'› ‹ AQ ♯ * AP Q › ‹ AQ ♯ * C›
S ‹ distinctPerm p› Aeq
have "Prop C Ψ (P ∥ Q) (α ≺ (P ∥ Q')) (p ∙ (AP @AQ )) (p ∙ (ΨP ⊗ ΨQ ))"
by (rule_tac rAlpha) (assumption | simp add: eqvts)+
with Ψeq Aeq show ?case by (simp add: eqvts)
next
case (cComm1 Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ AP Q ΨP Q C)
from ‹ distinct AP › ‹ distinct AQ › ‹ AP ♯ * AQ › have "distinct(AP @AQ )"
by (auto simp add: fresh_star_def fresh_def name_list_supp)
from cComm1 have "Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
by (rule_tac rComm1)
moreover from ‹ extractFrame(P ∥ Q) = ⟨ AP Q , ΨP Q ⟩ › ‹ extractFrame P = ⟨ AP , ΨP ⟩ › ‹ extractFrame Q = ⟨ AQ , ΨQ ⟩ ›
‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ › ‹ AQ ♯ * ΨP ›
have "⟨ (AP @AQ ), (ΨP ⊗ ΨQ )⟩ = ⟨ AP Q , ΨP Q ⟩ "
by simp
with ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q › ‹ distinct(AP @AQ )› ‹ distinct AP Q ›
obtain p where S: "(set p ⊆ (set(AP @AQ )) × (set AP Q ))" and "distinctPerm p"
and Ψeq: "ΨP Q = p ∙ (ΨP ⊗ ΨQ )" and Aeq: "AP Q = p ∙ (AP @AQ )"
by (rule_tac frameChainEq') (assumption | simp)+
moreover note ‹ AP ♯ * Ψ› ‹ AQ ♯ * Ψ› ‹ AP ♯ * P› ‹ AQ ♯ * P› ‹ AP ♯ * Q› ‹ AQ ♯ * Q› ‹ AP ♯ * xvec ›
‹ AQ ♯ * xvec› ‹ AP ♯ * P'› ‹ AQ ♯ * P'› ‹ AP ♯ * Q'› ‹ AQ ♯ * Q'› ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q ›
‹ AP ♯ * C› ‹ AQ ♯ * C›
ultimately have "Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (p ∙ (AP @AQ )) (p ∙ (ΨP ⊗ ΨQ ))"
by (rule_tac rAlpha) auto
with Ψeq Aeq show ?case by simp
next
case (cComm2 Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ AP Q ΨP Q C)
from ‹ distinct AP › ‹ distinct AQ › ‹ AP ♯ * AQ › have "distinct(AP @AQ )"
by (auto simp add: fresh_star_def fresh_def name_list_supp)
from cComm2 have "Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
by (rule_tac rComm2)
moreover from ‹ extractFrame(P ∥ Q) = ⟨ AP Q , ΨP Q ⟩ › ‹ extractFrame P = ⟨ AP , ΨP ⟩ › ‹ extractFrame Q = ⟨ AQ , ΨQ ⟩ ›
‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ › ‹ AQ ♯ * ΨP ›
have "⟨ (AP @AQ ), (ΨP ⊗ ΨQ )⟩ = ⟨ AP Q , ΨP Q ⟩ "
by simp
with ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q › ‹ distinct(AP @AQ )› ‹ distinct AP Q ›
obtain p where S: "(set p ⊆ (set(AP @AQ )) × (set AP Q ))" and "distinctPerm p"
and Ψeq: "ΨP Q = p ∙ (ΨP ⊗ ΨQ )" and Aeq: "AP Q = p ∙ (AP @AQ )"
by (rule_tac frameChainEq') (assumption | simp)+
moreover note ‹ AP ♯ * Ψ› ‹ AQ ♯ * Ψ› ‹ AP ♯ * P› ‹ AQ ♯ * P› ‹ AP ♯ * Q› ‹ AQ ♯ * Q› ‹ AP ♯ * xvec ›
‹ AQ ♯ * xvec› ‹ AP ♯ * P'› ‹ AQ ♯ * P'› ‹ AP ♯ * Q'› ‹ AQ ♯ * Q'› ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q ›
‹ AP ♯ * C› ‹ AQ ♯ * C›
ultimately have "Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (p ∙ (AP @AQ )) (p ∙ (ΨP ⊗ ΨQ ))"
by (rule_tac rAlpha) auto
with Ψeq Aeq show ?case by simp
next
case (cOpen Ψ P M xvec yvec N P' x Ax P Ψx P C)
obtain AP ΨP where FrP: "extractFrame P = ⟨ AP , ΨP ⟩ " and "distinct AP "
and "AP ♯ * (Ψ, P, M, xvec, yvec, N, P', Ax P , Ψx P , C, x)"
by (rule freshFrame)
hence "AP ♯ * Ψ" and "AP ♯ * P" and "AP ♯ * M" and "AP ♯ * xvec" and "AP ♯ * yvec" and "AP ♯ * N" and "AP ♯ * P'"
and "AP ♯ * Ax P " and "AP ♯ * Ψx P " and "AP ♯ * C" and "x ♯ AP "
by simp+
from ‹ xvec ♯ * P› ‹ AP ♯ * xvec› FrP have "xvec ♯ * ΨP "
by (force dest: extractFrameFreshChain)
from ‹ yvec ♯ * P› ‹ AP ♯ * yvec› FrP have "yvec ♯ * ΨP "
by (force dest: extractFrameFreshChain)
from ‹ extractFrame(( νx) P) = ⟨ Ax P , Ψx P ⟩ › FrP
have "⟨ (x#AP ), ΨP ⟩ = ⟨ Ax P , Ψx P ⟩ "
by simp
moreover from ‹ x ♯ AP › ‹ distinct AP › have "distinct(x#AP )" by simp
ultimately obtain p where S: "set p ⊆ set (x#AP ) × set (p ∙ (x#AP ))" and "distinctPerm p"
and Ψeq: "Ψx P = p ∙ ΨP " and Aeq: "Ax P = (p ∙ x)#(p ∙ AP )"
using ‹ AP ♯ * Ax P › \<open >x ♯ Ax P › ‹ distinct Ax P ›
by ( rule_tac frameChainEq ' ) ( assumption | simp add : eqvts ) +
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > \ < And > A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < close >
have " \ < And > C . Prop C \ < Psi > P ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P " by simp
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < in > supp N \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close >
\ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * M \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > x \ < sharp > C \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > yvec \ < sharp > * C \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close >
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rOpen )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > x \ < sharp > A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close >
\ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > C \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > Aeq
S \ < open > distinctPerm p \ < close >
have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) ( p \ < bullet > ( x # A \ < ^ sub > P ) ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( rule_tac A \ < ^ sub > P = " x # A \ < ^ sub > P " in rAlpha ) ( assumption | simp add : abs_fresh fresh_star_def boundOutputFresh ) +
with \ < Psi > eq Aeq show ? case by ( simp add : eqvts )
next
case ( cScope \ < Psi > P \ < alpha > P ' x A \ < ^ sub > x \ < ^ sub > P \ < Psi > \ < ^ sub > x \ < ^ sub > P C )
obtain A \ < ^ sub > P \ < Psi > \ < ^ sub > P where FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P "
and " A \ < ^ sub > P \ < sharp > * ( \ < Psi > , P , \ < alpha > , P ' , A \ < ^ sub > x \ < ^ sub > P , \ < Psi > \ < ^ sub > x \ < ^ sub > P , C , x ) "
by ( rule freshFrame )
hence " A \ < ^ sub > P \ < sharp > * \ < Psi > " and " A \ < ^ sub > P \ < sharp > * P " and " A \ < ^ sub > P \ < sharp > * \ < alpha > " and " A \ < ^ sub > P \ < sharp > * P ' "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P " and " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > x \ < ^ sub > P " and " A \ < ^ sub > P \ < sharp > * C " and " x \ < sharp > A \ < ^ sub > P "
by simp +
from \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > FrP have " bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( force dest : extractFrameFreshChain )
from \ < open > extractFrame ( \ < lparr > \ < nu > x \ < rparr > P ) = \ < langle > A \ < ^ sub > x \ < ^ sub > P , \ < Psi > \ < ^ sub > x \ < ^ sub > P \ < rangle > \ < close > FrP
have " \ < langle > ( x # A \ < ^ sub > P ) , \ < Psi > \ < ^ sub > P \ < rangle > = \ < langle > A \ < ^ sub > x \ < ^ sub > P , \ < Psi > \ < ^ sub > x \ < ^ sub > P \ < rangle > "
by simp
moreover from \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( x # A \ < ^ sub > P ) " by simp
ultimately obtain p where S : " set p \ < subseteq > set ( x # A \ < ^ sub > P ) \ < times > set ( p \ < bullet > ( x # A \ < ^ sub > P ) ) " and " distinctPerm p "
and \ < Psi > eq : " \ < Psi > \ < ^ sub > x \ < ^ sub > P = p \ < bullet > \ < Psi > \ < ^ sub > P " and Aeq : " A \ < ^ sub > x \ < ^ sub > P = ( p \ < bullet > x ) # ( p \ < bullet > A \ < ^ sub > P ) "
using \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > distinct A \ < ^ sub > x \ < ^ sub > P \ < close >
by ( rule_tac frameChainEq ' ) ( assumption | simp add : eqvts ) +
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > \ < And > A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P ( \ < alpha > \ < prec > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < close >
have " \ < And > C . Prop C \ < Psi > P ( \ < alpha > \ < prec > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P " by simp
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
\ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > x \ < sharp > C \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close >
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( \ < alpha > \ < prec > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rScope )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > x \ < sharp > A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close >
\ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > C \ < close > Aeq
S \ < open > distinctPerm p \ < close >
have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( \ < alpha > \ < prec > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) ( p \ < bullet > ( x # A \ < ^ sub > P ) ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( rule_tac A \ < ^ sub > P = " x # A \ < ^ sub > P " in rAlpha ) ( assumption | simp add : abs_fresh fresh_star_def ) +
with \ < Psi > eq Aeq show ? case by ( simp add : eqvts )
next
case ( Bang \ < Psi > P Rs A \ < ^ sub > b \ < ^ sub > P \ < Psi > \ < ^ sub > b \ < ^ sub > P C )
obtain A \ < ^ sub > P \ < Psi > \ < ^ sub > P where FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P "
and " A \ < ^ sub > P \ < sharp > * ( \ < Psi > , P , Rs , C ) "
by ( rule freshFrame )
hence " A \ < ^ sub > P \ < sharp > * \ < Psi > " and " A \ < ^ sub > P \ < sharp > * P " and " A \ < ^ sub > P \ < sharp > * Rs " and " A \ < ^ sub > P \ < sharp > * C "
by simp +
note \ < open > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > Rs \ < close > \ < open > guarded P \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from FrP have " extractFrame ( P \ < parallel > ! P ) = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < rangle > "
by simp
with \ < open > distinct A \ < ^ sub > P \ < close > \ < open > \ < And > A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > extractFrame ( P \ < parallel > ! P ) = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( P \ < parallel > ! P ) Rs A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < close >
have " \ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) Rs A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) " by simp
moreover from \ < open > guarded P \ < close > FrP have " \ < Psi > \ < ^ sub > P \ < simeq > \ < one > " and " supp \ < Psi > \ < ^ sub > P = ( { } : : name set ) " by ( metis guardedStatEq ) +
moreover note \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Rs \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
ultimately have " Prop C \ < Psi > ( ! P ) Rs ( [ ] ) ( \ < one > ) "
by ( rule rBang )
thus ? case using \ < open > extractFrame ( ! P ) = \ < langle > A \ < ^ sub > b \ < ^ sub > P , \ < Psi > \ < ^ sub > b \ < ^ sub > P \ < rangle > \ < close > by simp
qed
lemma semanticsFrameInduct ' [ consumes 5 , case_names cAlpha cFrameAlpha cInput cOutput cCase cPar1 cPar2 cComm1 cComm2 cOpen cScope cBang ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Rs : : " ( ' a , ' b , ' c ) residual "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Prop : : " ' d : : fs_name \ < Rightarrow > ' b \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow > ' a action \ < Rightarrow >
( ' a , ' b , ' c ) psi \ < Rightarrow > name list \ < Rightarrow > ' b \ < Rightarrow > bool "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " distinct ( bn \ < alpha > ) "
and rAlpha : " \ < And > \ < Psi > P \ < alpha > P ' p A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ;
bn \ < alpha > \ < sharp > * C ; bn \ < alpha > \ < sharp > * ( p \ < bullet > \ < alpha > ) ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) ; distinctPerm p ;
bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > ; ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P ' ; Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > P ( p \ < bullet > \ < alpha > ) ( p \ < bullet > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
and rFrameAlpha : " \ < And > \ < Psi > P A \ < ^ sub > P \ < Psi > \ < ^ sub > P p \ < alpha > P ' C . \ < lbrakk > A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) ; distinctPerm p ; A \ < ^ sub > P \ < sharp > * subject \ < alpha > ;
Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P \ < alpha > P ' ( p \ < bullet > A \ < ^ sub > P ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
and rInput : " \ < And > \ < Psi > M K xvec N Tvec P C .
\ < lbrakk > \ < Psi > \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ; set xvec \ < subseteq > supp N ;
length xvec = length Tvec ; xvec \ < sharp > * \ < Psi > ;
xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P )
( K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > ) ( P [ xvec : : = Tvec ] ) ( [ ] ) ( \ < one > ) "
and rOutput : " \ < And > \ < Psi > M K N P C . \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < Longrightarrow > Prop C \ < Psi > ( M \ < langle > N \ < rangle > . P ) ( K \ < langle > N \ < rangle > ) P ( [ ] ) ( \ < one > ) "
and rCase : " \ < And > \ < Psi > P \ < alpha > P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ; \ < And > C . Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( Cases Cs ) \ < alpha > P ' ( [ ] ) ( \ < one > ) "
and rPar1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * Q ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; bn \ < alpha > \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) \ < alpha > ( P ' \ < parallel > Q ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rPar2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q \ < alpha > Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * Q ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; bn \ < alpha > \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) \ < alpha > ( P \ < parallel > Q ' ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rComm1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P ( M \ < lparr > N \ < rparr > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q ( K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * Q ' ;
A \ < ^ sub > Q \ < sharp > * xvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ;
xvec \ < sharp > * Q ; xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rComm2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q ( K \ < lparr > N \ < rparr > ) Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * Q ' ;
A \ < ^ sub > Q \ < sharp > * xvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ;
xvec \ < sharp > * Q ; xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rOpen : " \ < And > \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P y C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ; x \ < in > supp N ; x \ < sharp > \ < Psi > ; x \ < sharp > M ;
x \ < sharp > A \ < ^ sub > P ; x \ < sharp > xvec ; x \ < sharp > yvec ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * yvec ; xvec \ < sharp > * yvec ; distinct xvec ; distinct yvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ;
yvec \ < sharp > * \ < Psi > ; yvec \ < sharp > * P ; yvec \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C ; xvec \ < sharp > * C ; yvec \ < sharp > * C ;
y \ < noteq > x ; y \ < sharp > \ < Psi > ; y \ < sharp > P ; y \ < sharp > M ; y \ < sharp > xvec ; y \ < sharp > yvec ; y \ < sharp > N ; y \ < sharp > P ' ; y \ < sharp > A \ < ^ sub > P ; y \ < sharp > \ < Psi > \ < ^ sub > P ; y \ < sharp > C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( M \ < lparr > \ < nu > * ( xvec @ y # yvec ) \ < rparr > \ < langle > ( [ ( x , y ) ] \ < bullet > N ) \ < rangle > ) ( [ ( x , y ) ] \ < bullet > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rScope : " \ < And > \ < Psi > P \ < alpha > P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
x \ < sharp > \ < Psi > ; x \ < sharp > \ < alpha > ; x \ < sharp > A \ < ^ sub > P ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ;
A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ;
bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C ; bn \ < alpha > \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) \ < alpha > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rBang : " \ < And > \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > \ < alpha > \ < prec > P ' ; guarded P ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) \ < alpha > P ' A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; supp \ < Psi > \ < ^ sub > P = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( ! P ) \ < alpha > P ' ( [ ] ) ( \ < one > ) "
shows " Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
using Trans FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
proof ( nominal_induct \ < Psi > P Rs = = " \ < alpha > \ < prec > P ' " A \ < ^ sub > P \ < Psi > \ < ^ sub > P avoiding : C \ < alpha > P ' rule : semanticsFrameInduct )
case cAlpha
thus ? case using rFrameAlpha
by auto
next
case cInput
thus ? case using rInput
by ( auto simp add : residualInject )
next
case cOutput
thus ? case using rOutput
by ( auto simp add : residualInject )
next
case cCase
thus ? case using rCase
by ( auto simp add : residualInject )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C \ < alpha > ' P ' ' )
note \ < open > \ < alpha > \ < prec > ( P ' \ < parallel > Q ) = \ < alpha > ' \ < prec > P ' ' \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > have " bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) " by auto
moreover note \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct ( bn \ < alpha > ' ) \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > ' \ < sharp > * subject \ < alpha > ' \ < close >
have " bn \ < alpha > \ < sharp > * ( \ < alpha > \ < prec > P ' \ < parallel > Q ) " and " bn \ < alpha > ' \ < sharp > * ( \ < alpha > ' \ < prec > P ' ' ) " by simp +
ultimately obtain p where S : " ( set p ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( p \ < bullet > \ < alpha > ) ) ) " and " distinctPerm p "
and \ < alpha > Eq : " \ < alpha > ' = p \ < bullet > \ < alpha > " and P ' eq : " P ' ' = p \ < bullet > ( P ' \ < parallel > Q ) " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * ( P ' \ < parallel > Q ) "
by ( rule residualEq )
note \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > Q \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close >
have " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " by ( rule_tac cPar1 ) auto
moreover note \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
\ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close >
\ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
ultimately have " Prop C \ < Psi > ( P \ < parallel > Q ) \ < alpha > ( P ' \ < parallel > Q ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
by ( rule_tac rPar1 )
with \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close > \ < open > bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) \ < close > S \ < open > distinctPerm p \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * ( P ' \ < parallel > Q ) \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > ' \ < close > \ < alpha > Eq \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
have " Prop C \ < Psi > ( P \ < parallel > Q ) ( p \ < bullet > \ < alpha > ) ( p \ < bullet > ( P ' \ < parallel > Q ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
by ( rule_tac rAlpha ) auto
with \ < alpha > Eq P ' eq \ < open > distinctPerm p \ < close > show ? case by simp
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C \ < alpha > ' Q ' ' )
note \ < open > \ < alpha > \ < prec > ( P \ < parallel > Q ' ) = \ < alpha > ' \ < prec > Q ' ' \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > have " bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) " by auto
moreover note \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct ( bn \ < alpha > ' ) \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > ' \ < sharp > * subject \ < alpha > ' \ < close >
have " bn \ < alpha > \ < sharp > * ( \ < alpha > \ < prec > P \ < parallel > Q ' ) " and " bn \ < alpha > ' \ < sharp > * ( \ < alpha > ' \ < prec > Q ' ' ) " by simp +
ultimately obtain p where S : " ( set p ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( p \ < bullet > \ < alpha > ) ) ) " and " distinctPerm p "
and \ < alpha > Eq : " \ < alpha > ' = p \ < bullet > \ < alpha > " and Q ' eq : " Q ' ' = p \ < bullet > ( P \ < parallel > Q ' ) " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * ( P \ < parallel > Q ' ) "
by ( rule residualEq )
note \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > P \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close >
have " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q \ < alpha > Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q " by ( rule_tac cPar2 ) auto
moreover note \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
\ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close >
\ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
ultimately have " Prop C \ < Psi > ( P \ < parallel > Q ) \ < alpha > ( P \ < parallel > Q ' ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
by ( rule_tac rPar2 ) auto
with \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close > \ < open > bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) \ < close > S \ < open > distinctPerm p \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * ( P \ < parallel > Q ' ) \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > ' \ < close > \ < alpha > Eq \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
have " Prop C \ < Psi > ( P \ < parallel > Q ) ( p \ < bullet > \ < alpha > ) ( p \ < bullet > ( P \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
by ( rule_tac rAlpha ) auto
with \ < alpha > Eq Q ' eq \ < open > distinctPerm p \ < close > show ? case by simp
next
case ( cComm1 \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q C \ < alpha > P ' ' )
thus ? case using rComm1
apply ( auto )
apply ( drule_tac x = " M \ < lparr > N \ < rparr > " in meta_spec )
apply ( drule_tac x = " K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " in meta_spec )
apply ( drule_tac x = P ' in meta_spec )
apply ( drule_tac x = Q ' in meta_spec )
apply auto
apply ( drule_tac x = \ < Psi > in meta_spec )
apply ( drule_tac x = \ < Psi > \ < ^ sub > Q in meta_spec )
apply ( drule_tac x = P in meta_spec )
apply ( drule_tac x = M in meta_spec )
apply ( drule_tac x = N in meta_spec )
apply ( drule_tac x = P ' in meta_spec )
apply ( drule_tac x = A \ < ^ sub > P in meta_spec )
apply ( drule_tac x = \ < Psi > \ < ^ sub > P in meta_spec )
apply ( drule_tac x = Q in meta_spec )
apply ( drule_tac x = K in meta_spec )
apply ( drule_tac x = xvec in meta_spec )
apply ( drule_tac x = Q ' in meta_spec )
apply ( drule_tac x = A \ < ^ sub > Q in meta_spec )
apply auto
apply ( subgoal_tac " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q ( K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q " )
apply ( subgoal_tac " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P ( M \ < lparr > N \ < rparr > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " )
by ( auto simp add : residualInject )
next
case ( cComm2 \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q C \ < alpha > Q ' ' )
thus ? case using rComm2
apply ( drule_tac x = " M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " in meta_spec )
apply ( drule_tac x = " K \ < lparr > N \ < rparr > " in meta_spec )
apply ( drule_tac x = P ' in meta_spec )
apply ( drule_tac x = Q ' in meta_spec )
apply auto
apply ( drule_tac x = \ < Psi > in meta_spec )
apply ( drule_tac x = \ < Psi > \ < ^ sub > Q in meta_spec )
apply ( drule_tac x = P in meta_spec )
apply ( drule_tac x = M in meta_spec )
apply ( drule_tac x = xvec in meta_spec )
apply ( drule_tac x = N in meta_spec )
apply ( drule_tac x = P ' in meta_spec )
apply ( drule_tac x = A \ < ^ sub > P in meta_spec )
apply ( drule_tac x = \ < Psi > \ < ^ sub > P in meta_spec )
apply ( drule_tac x = Q in meta_spec )
apply ( drule_tac x = K in meta_spec )
apply ( drule_tac x = Q ' in meta_spec )
apply ( drule_tac x = A \ < ^ sub > Q in meta_spec )
apply auto
apply ( subgoal_tac " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " )
apply ( subgoal_tac " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q ( K \ < lparr > N \ < rparr > ) Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q " )
by ( auto simp add : residualInject )
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C \ < alpha > P ' ' )
note \ < open > M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' = \ < alpha > \ < prec > P ' ' \ < close >
moreover from \ < open > xvec \ < sharp > * \ < alpha > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > yvec \ < sharp > * \ < alpha > \ < close > have " ( xvec @ x # yvec ) \ < sharp > * ( bn \ < alpha > ) "
by auto
moreover from \ < open > xvec \ < sharp > * yvec \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close >
have " distinct ( xvec @ x # yvec ) "
by ( auto simp add : fresh_star_def ) ( simp add : fresh_def name_list_supp )
moreover note \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover from \ < open > xvec \ < sharp > * M \ < close > \ < open > x \ < sharp > M \ < close > \ < open > yvec \ < sharp > * M \ < close > have " ( xvec @ x # yvec ) \ < sharp > * M " by auto
hence " ( xvec @ x # yvec ) \ < sharp > * ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) " by auto
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > have " bn \ < alpha > \ < sharp > * ( \ < alpha > \ < prec > P ' ' ) " by simp
ultimately obtain p where S : " ( set p ) \ < subseteq > ( set ( xvec @ x # yvec ) ) \ < times > ( set ( p \ < bullet > ( xvec @ x # yvec ) ) ) " and " distinctPerm p "
and \ < alpha > eq : " \ < alpha > = ( p \ < bullet > M ) \ < lparr > \ < nu > * ( p \ < bullet > ( xvec @ x # yvec ) ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > " and P ' eq : " P ' ' = ( p \ < bullet > P ' ) "
and A : " ( xvec @ x # yvec ) \ < sharp > * ( ( p \ < bullet > M ) \ < lparr > \ < nu > * ( p \ < bullet > ( xvec @ x # yvec ) ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > ) "
and B : " ( p \ < bullet > ( xvec @ x # yvec ) ) \ < sharp > * ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > ) "
and C : " ( p \ < bullet > ( xvec @ x # yvec ) ) \ < sharp > * P ' "
by ( rule_tac residualEq ) ( assumption | simp ) +
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > x \ < in > ( supp N ) \ < close >
moreover {
fix C
from \ < open > xvec \ < sharp > * M \ < close > \ < open > yvec \ < sharp > * M \ < close > have " ( xvec @ yvec ) \ < sharp > * M " by simp
moreover from \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close > \ < open > xvec \ < sharp > * yvec \ < close > have " distinct ( xvec @ yvec ) "
by auto ( simp add : fresh_star_def name_list_supp fresh_def )
ultimately have " Prop C \ < Psi > P ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " using \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close >
by ( rule_tac cOpen ) auto
}
moreover obtain y : : name where " y \ < sharp > \ < Psi > " and " y \ < noteq > x " and " y \ < sharp > P " and " y \ < sharp > xvec " and " y \ < sharp > yvec " and " y \ < sharp > \ < alpha > " and " y \ < sharp > P ' " and " y \ < sharp > A \ < ^ sub > P " and " y \ < sharp > \ < Psi > \ < ^ sub > P " and " y \ < sharp > M " and " y \ < sharp > N " and " y \ < sharp > C " and " y \ < sharp > p "
by ( generate_fresh " name " ) auto
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M \ < close >
\ < open > yvec \ < sharp > * \ < Psi > \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * M \ < close > \ < open > yvec \ < sharp > * C \ < close > \ < open > x \ < sharp > C \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close >
\ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( M \ < lparr > \ < nu > * ( xvec @ y # yvec ) \ < rparr > \ < langle > ( [ ( x , y ) ] \ < bullet > N ) \ < rangle > ) ( [ ( x , y ) ] \ < bullet > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rOpen )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > M ) = [ ( x , y ) ] \ < bullet > p \ < bullet > M "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > M \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < alpha > eq \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > M \ < close > have D : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > M ) = p \ < bullet > M "
by ( auto simp add : eqvts freshChainSimps )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > xvec ) = [ ( x , y ) ] \ < bullet > p \ < bullet > xvec "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > xvec \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < alpha > eq \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > xvec \ < close > have E : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > xvec ) = p \ < bullet > xvec "
by ( auto simp add : eqvts freshChainSimps )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > yvec ) = [ ( x , y ) ] \ < bullet > p \ < bullet > yvec "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > yvec \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < alpha > eq \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > yvec \ < close > have F : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > yvec ) = p \ < bullet > yvec "
by ( auto simp add : eqvts freshChainSimps )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > x ) = [ ( x , y ) ] \ < bullet > p \ < bullet > x "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < noteq > x \ < close > \ < open > y \ < sharp > p \ < close > have G : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > y ) = p \ < bullet > x "
apply ( simp add : freshChainSimps calc_atm )
apply ( subgoal_tac " y \ < noteq > p \ < bullet > x " )
apply ( clarsimp )
using A \ < alpha > eq
apply ( simp add : eqvts )
apply ( subst fresh_atm [ symmetric ] )
apply ( simp only : freshChainSimps )
by simp
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > N ) = [ ( x , y ) ] \ < bullet > p \ < bullet > N "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > N \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > y \ < sharp > p \ < close > \ < alpha > eq have H : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > N ) = p \ < bullet > N "
by ( auto simp add : eqvts freshChainSimps )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > P ' ) = [ ( x , y ) ] \ < bullet > p \ < bullet > P ' "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > P ' \ < close > \ < open > x \ < sharp > P ' ' \ < close > \ < open > y \ < sharp > p \ < close > P ' eq have I : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > P ' ) = p \ < bullet > P ' "
by ( auto simp add : eqvts freshChainSimps )
from \ < open > y \ < sharp > p \ < close > \ < open > y \ < noteq > x \ < close > have " y \ < noteq > p \ < bullet > x "
apply ( subst fresh_atm [ symmetric ] )
apply ( simp only : freshChainSimps )
by simp
moreover from S have " ( [ ( x , y ) ] \ < bullet > set p ) \ < subseteq > [ ( x , y ) ] \ < bullet > ( set ( xvec @ x # yvec ) \ < times > set ( p \ < bullet > ( xvec @ x # yvec ) ) ) "
by ( simp )
with \ < open > y \ < noteq > p \ < bullet > x \ < close > \ < open > ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > y ) = p \ < bullet > x \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > y \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > y \ < sharp > yvec \ < close > \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < alpha > eq have
" set ( [ ( x , y ) ] \ < bullet > p ) \ < subseteq > set ( xvec @ y # yvec ) \ < times > set ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > ( xvec @ y # yvec ) ) "
by ( simp add : eqvts calc_atm perm_compose )
moreover note \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > yvec \ < sharp > * M \ < close >
\ < open > yvec \ < sharp > * C \ < close > S \ < open > distinctPerm p \ < close > \ < open > x \ < sharp > C \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > x \ < sharp > \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close >
A B C \ < alpha > eq \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > \ < open > y \ < noteq > x \ < close > \ < open > y \ < sharp > P \ < close > \ < open > y \ < sharp > M \ < close > \ < open > y \ < sharp > \ < Psi > \ < ^ sub > P \ < close > \ < open > y \ < sharp > C \ < close > \ < open > xvec \ < sharp > * \ < alpha > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > yvec \ < sharp > * \ < alpha > \ < close > \ < open > y \ < sharp > \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > y \ < sharp > A \ < ^ sub > P \ < close > \ < open > y \ < sharp > N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > y \ < sharp > P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > P ' eq
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > ( M \ < lparr > \ < nu > * ( xvec @ y # yvec ) \ < rparr > \ < langle > ( [ ( x , y ) ] \ < bullet > N ) \ < rangle > ) ) ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
apply ( rule_tac \ < alpha > = " M \ < lparr > \ < nu > * ( xvec @ y # yvec ) \ < rparr > \ < langle > ( [ ( x , y ) ] \ < bullet > N ) \ < rangle > " in rAlpha )
apply ( assumption | simp ) +
apply ( simp add : eqvts )
apply ( assumption | simp add : abs_fresh ) +
apply ( simp add : fresh_left calc_atm )
apply ( assumption | simp ) +
apply ( simp add : fresh_left calc_atm )
apply ( assumption | simp ) +
by ( simp add : eqvts fresh_left ) +
with \ < alpha > eq P ' eq D E F G H I show ? case
by ( simp add : eqvts )
next
case ( cScope \ < Psi > P \ < alpha > P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C \ < alpha > ' P ' ' )
note \ < open > \ < alpha > \ < prec > ( \ < lparr > \ < nu > x \ < rparr > P ' ) = \ < alpha > ' \ < prec > P ' ' \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > have " bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) " by auto
moreover note \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct ( bn \ < alpha > ' ) \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > ' \ < sharp > * subject \ < alpha > ' \ < close >
have " bn \ < alpha > \ < sharp > * ( \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' ) " and " bn \ < alpha > ' \ < sharp > * ( \ < alpha > ' \ < prec > P ' ' ) " by simp +
ultimately obtain p where S : " ( set p ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( p \ < bullet > \ < alpha > ) ) ) " and " distinctPerm p "
and \ < alpha > Eq : " \ < alpha > ' = p \ < bullet > \ < alpha > " and P ' eq : " P ' ' = p \ < bullet > ( \ < lparr > \ < nu > x \ < rparr > P ' ) " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * ( \ < lparr > \ < nu > x \ < rparr > P ' ) "
by ( rule residualEq )
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
have " \ < And > C . Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " by ( rule_tac cScope ) auto
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > x \ < sharp > C \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close >
\ < open > distinct A \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) \ < alpha > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rScope )
with \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close > \ < open > bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) \ < close > S \ < open > distinctPerm p \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * ( \ < lparr > \ < nu > x \ < rparr > P ' ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > ' \ < close > \ < alpha > Eq \ < open > x \ < sharp > \ < alpha > ' \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > x \ < sharp > C \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( p \ < bullet > \ < alpha > ) ( p \ < bullet > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rAlpha ) ( simp add : abs_fresh ) +
with \ < alpha > Eq P ' eq \ < open > distinctPerm p \ < close > show ? case by simp
next
case ( cBang \ < Psi > P Rs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C \ < alpha > )
thus ? case by ( rule_tac rBang ) auto
qed
lemma inputFrameInduct [ consumes 3 , case_names cAlpha cInput cCase cPar1 cPar2 cScope cBang ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and Prop : : " ' d : : fs_name \ < Rightarrow > ' b \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow >
' a \ < Rightarrow > ' a \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow > name list \ < Rightarrow > ' b \ < Rightarrow > bool "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and rAlpha : " \ < And > \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P p C . \ < lbrakk > A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) ; distinctPerm p ;
Prop C \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P M N P ' ( p \ < bullet > A \ < ^ sub > P ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
and rInput : " \ < And > \ < Psi > M K xvec N Tvec P C .
\ < lbrakk > \ < Psi > \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ; set xvec \ < subseteq > supp N ;
length xvec = length Tvec ; xvec \ < sharp > * \ < Psi > ;
xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P )
K ( N [ xvec : : = Tvec ] ) ( P [ xvec : : = Tvec ] ) ( [ ] ) ( \ < one > ) "
and rCase : " \ < And > \ < Psi > P M N P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ; \ < And > C . Prop C \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( Cases Cs ) M N P ' ( [ ] ) ( \ < one > ) "
and rPar1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) M N ( P ' \ < parallel > Q ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rPar2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > P Q M N Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > Q ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q M N Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) M N ( P \ < parallel > Q ' ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rScope : " \ < And > \ < Psi > P M N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ; x \ < sharp > \ < Psi > ; x \ < sharp > M ; x \ < sharp > N ;
x \ < sharp > A \ < ^ sub > P ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) M N ( \ < lparr > \ < nu > x \ < rparr > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rBang : " \ < And > \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; guarded P ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) M N P ' A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( ! P ) M N P ' ( [ ] ) ( \ < one > ) "
shows " Prop C \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
using assms
by ( nominal_induct \ < Psi > P Rs = = " M \ < lparr > N \ < rparr > \ < prec > P ' " A \ < ^ sub > P \ < Psi > \ < ^ sub > P avoiding : C arbitrary : P ' rule : semanticsFrameInduct )
( auto simp add : residualInject )
lemma outputFrameInduct [ consumes 3 , case_names cAlpha cOutput cCase cPar1 cPar2 cOpen cScope cBang ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Prop : : " ' d : : fs_name \ < Rightarrow > ' b \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow >
' a \ < Rightarrow > ( ' a , ' b , ' c ) boundOutput \ < Rightarrow > name list \ < Rightarrow > ' b \ < Rightarrow > bool "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > ROut M B "
and FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and rAlpha : " \ < And > \ < Psi > P M A \ < ^ sub > P \ < Psi > \ < ^ sub > P p B C . \ < lbrakk > A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) ; A \ < ^ sub > P \ < sharp > * B ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) ; distinctPerm p ;
Prop C \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P M B ( p \ < bullet > A \ < ^ sub > P ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
and rOutput : " \ < And > \ < Psi > M K N P C . \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < Longrightarrow > Prop C \ < Psi > ( M \ < langle > N \ < rangle > . P ) K ( N \ < prec > ' P ) ( [ ] ) ( \ < one > ) "
and rCase : " \ < And > \ < Psi > P M B \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > ( ROut M B ) ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ; \ < And > C . Prop C \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * B ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( Cases Cs ) M B ( [ ] ) ( \ < one > ) "
and rPar1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * Q ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' ( P ' \ < parallel > Q ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rPar2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > P Q M xvec N Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' Q ' ) A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * Q ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' ( P \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rOpen : " \ < And > \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P M ( \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > N \ < prec > ' P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P ; x \ < in > supp N ; x \ < sharp > \ < Psi > ; x \ < sharp > M ;
x \ < sharp > A \ < ^ sub > P ; x \ < sharp > xvec ; x \ < sharp > yvec ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * yvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ;
yvec \ < sharp > * \ < Psi > ; yvec \ < sharp > * P ; yvec \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C ; xvec \ < sharp > * C ; yvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) M ( \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > N \ < prec > ' P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rScope : " \ < And > \ < Psi > P M xvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
x \ < sharp > \ < Psi > ; x \ < sharp > M ; x \ < sharp > xvec ; x \ < sharp > N ; x \ < sharp > A \ < ^ sub > P ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ;
A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rBang : " \ < And > \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > ROut M B ; guarded P ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) M B A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; supp \ < Psi > \ < ^ sub > P = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( ! P ) M B ( [ ] ) ( \ < one > ) "
shows " Prop C \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
proof -
{
fix B
assume " \ < Psi > \ < rhd > P \ < longmapsto > ROut M B "
hence " Prop C \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P " using FrP \ < open > distinct A \ < ^ sub > P \ < close >
proof ( nominal_induct \ < Psi > P Rs = = " ROut M B " A \ < ^ sub > P \ < Psi > \ < ^ sub > P avoiding : C arbitrary : B rule : semanticsFrameInduct )
case cAlpha
thus ? case by ( fastforce intro : rAlpha )
next
case cInput
thus ? case by ( simp add : residualInject )
next
case cOutput
thus ? case by ( force intro : rOutput simp add : residualInject )
next
case cCase
thus ? case by ( force intro : rCase simp add : residualInject )
next
case cPar1
thus ? case
by ( fastforce intro : rPar1 simp add : residualInject )
next
case cPar2
thus ? case
by ( fastforce intro : rPar2 simp add : residualInject )
next
case cComm1
thus ? case by ( simp add : residualInject )
next
case cComm2
thus ? case by ( simp add : residualInject )
next
case cOpen
thus ? case by ( fastforce intro : rOpen simp add : residualInject )
next
case cScope
thus ? case by ( force intro : rScope simp add : residualInject )
next
case cBang
thus ? case by ( force intro : rBang simp add : residualInject )
qed
}
with Trans show ? thesis by ( simp add : residualInject )
qed
lemma tauFrameInduct [ consumes 3 , case_names cAlpha cCase cPar1 cPar2 cComm1 cComm2 cScope cBang ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and P ' : : " ( ' a , ' b , ' c ) psi "
and Prop : : " ' d : : fs_name \ < Rightarrow > ' b \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow >
( ' a , ' b , ' c ) psi \ < Rightarrow > name list \ < Rightarrow > ' b \ < Rightarrow > bool "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' "
and FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and rAlpha : " \ < And > \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P p C . \ < lbrakk > A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) ; distinctPerm p ;
Prop C \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P P ' ( p \ < bullet > A \ < ^ sub > P ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
and rCase : " \ < And > \ < Psi > P P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ; \ < And > C . Prop C \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( Cases Cs ) P ' ( [ ] ) ( \ < one > ) "
and rPar1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( P ' \ < parallel > Q ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rPar2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > P Q Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < tau > \ < prec > Q ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( P \ < parallel > Q ' ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rComm1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * Q ' ;
A \ < ^ sub > Q \ < sharp > * xvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ;
xvec \ < sharp > * Q ; xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rComm2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * Q ' ;
A \ < ^ sub > Q \ < sharp > * xvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ;
xvec \ < sharp > * Q ; xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rScope : " \ < And > \ < Psi > P P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ; x \ < sharp > \ < Psi > ;
x \ < sharp > A \ < ^ sub > P ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( \ < lparr > \ < nu > x \ < rparr > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rBang : " \ < And > \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > \ < tau > \ < prec > P ' ; guarded P ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) P ' A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; supp \ < Psi > \ < ^ sub > P = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( ! P ) P ' ( [ ] ) ( \ < one > ) "
shows " Prop C \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
using Trans FrP \ < open > distinct A \ < ^ sub > P \ < close >
proof ( nominal_induct \ < Psi > P Rs = = " \ < tau > \ < prec > P ' " A \ < ^ sub > P \ < Psi > \ < ^ sub > P avoiding : C arbitrary : P ' rule : semanticsFrameInduct )
case cAlpha
thus ? case by ( force intro : rAlpha simp add : residualInject )
next
case cInput
thus ? case by ( simp add : residualInject )
next
case cOutput
thus ? case by ( simp add : residualInject )
next
case cCase
thus ? case by ( force intro : rCase simp add : residualInject )
next
case cPar1
thus ? case by ( force intro : rPar1 simp add : residualInject )
next
case cPar2
thus ? case by ( force intro : rPar2 simp add : residualInject )
next
case cComm1
thus ? case by ( force intro : rComm1 simp add : residualInject )
next
case cComm2
thus ? case by ( force intro : rComm2 simp add : residualInject )
next
case cOpen
thus ? case by ( simp add : residualInject )
next
case cScope
thus ? case by ( force intro : rScope simp add : residualInject )
next
case cBang
thus ? case by ( force intro : rBang simp add : residualInject )
qed
lemma inputFreshDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " x \ < sharp > P "
and " x \ < sharp > N "
shows " x \ < sharp > P ' "
proof -
have " bn ( M \ < lparr > N \ < rparr > ) \ < sharp > * subject ( M \ < lparr > N \ < rparr > ) " and " distinct ( bn ( M \ < lparr > N \ < rparr > ) ) " by simp +
with \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > show ? thesis using \ < open > x \ < sharp > P \ < close > \ < open > x \ < sharp > N \ < close >
proof ( nominal_induct \ < Psi > P \ < alpha > = = " M \ < lparr > N \ < rparr > " P ' avoiding : x rule : semanticsInduct )
case ( cAlpha \ < Psi > P \ < alpha > P ' p x )
thus ? case by simp
next
case ( cInput \ < Psi > M ' K xvec N ' Tvec P x )
from \ < open > K \ < lparr > ( N ' [ xvec : : = Tvec ] ) \ < rparr > = M \ < lparr > N \ < rparr > \ < close > have " M = K " and NeqN ' : " N = N ' [ xvec : : = Tvec ] " by ( simp add : action . inject ) +
note \ < open > length xvec = length Tvec \ < close > \ < open > distinct xvec \ < close > then
moreover have " x \ < sharp > Tvec " using \ < open > set xvec \ < subseteq > supp N ' \ < close > \ < open > x \ < sharp > N \ < close > NeqN '
by ( blast intro : substTerm . subst3 )
moreover from \ < open > xvec \ < sharp > * x \ < close > \ < open > x \ < sharp > M ' \ < lparr > \ < lambda > * xvec N ' \ < rparr > . P \ < close >
have " x \ < sharp > P " by ( simp add : inputChainFresh ) ( simp add : name_list_supp fresh_def )
ultimately show ? case using \ < open > xvec \ < sharp > * x \ < close > by auto
next
case ( cOutput \ < Psi > M K N P x )
thus ? case by simp
next
case ( cCase \ < Psi > P P ' \ < phi > Cs x )
thus ? case by ( induct Cs , auto )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P P ' xvec Q x )
thus ? case by simp
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q Q ' xvec P x )
thus ? case by simp
next
case ( cComm1 \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q x )
thus ? case by simp
next
case ( cComm2 \ < Psi > \ < Psi > \ < ^ sub > Q P M xwec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q x )
thus ? case by simp
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x y )
thus ? case by simp
next
case ( cScope \ < Psi > P P ' x y )
thus ? case by ( simp add : abs_fresh )
next
case ( cBang \ < Psi > P P ' x )
thus ? case by simp
qed
qed
lemma inputFreshChainDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and xvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " xvec \ < sharp > * P "
and " xvec \ < sharp > * N "
shows " xvec \ < sharp > * P ' "
using assms
by ( induct xvec )
( auto intro : inputFreshDerivative )
lemma outputFreshDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " distinct xvec "
and " x \ < sharp > P "
and " x \ < sharp > xvec "
shows " x \ < sharp > N "
and " x \ < sharp > P ' "
proof -
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover from \ < open > xvec \ < sharp > * M \ < close > have " bn ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) \ < sharp > * subject ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) " by simp
moreover from \ < open > distinct xvec \ < close > have " distinct ( bn ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) ) " by simp
ultimately show " x \ < sharp > N " using \ < open > x \ < sharp > P \ < close > \ < open > x \ < sharp > xvec \ < close >
proof ( nominal_induct \ < Psi > P \ < alpha > = = " M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " P ' avoiding : x arbitrary : M xvec N rule : semanticsInduct )
case ( cAlpha \ < Psi > P \ < alpha > P ' p x M xvec N )
have S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " by fact
from \ < open > ( p \ < bullet > \ < alpha > ) = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > have " ( p \ < bullet > p \ < bullet > \ < alpha > ) = p \ < bullet > ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) " by ( simp add : fresh_star_bij )
with \ < open > distinctPerm p \ < close > have " \ < alpha > = ( p \ < bullet > M ) \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > " by simp
moreover from \ < open > ( p \ < bullet > \ < alpha > ) = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > \ < open > x \ < sharp > xvec \ < close > have " x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) " by simp
with \ < open > ( bn \ < alpha > ) \ < sharp > * x \ < close > \ < open > x \ < sharp > xvec \ < close > S have " x \ < sharp > ( p \ < bullet > xvec ) "
by ( drule_tac pt_fresh_bij1 [ OF pt_name_inst , OF at_name_inst , where pi = p and x = xvec ] ) simp
ultimately have " x \ < sharp > ( p \ < bullet > N ) " using \ < open > x \ < sharp > P \ < close > by ( rule_tac cAlpha )
hence " ( p \ < bullet > x ) \ < sharp > ( p \ < bullet > p \ < bullet > N ) " by ( simp add : pt_fresh_bij1 [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > distinctPerm p \ < close > \ < open > bn ( \ < alpha > ) \ < sharp > * x \ < close > \ < open > x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) \ < close > S show ? case by simp
next
case cInput
thus ? case by simp
next
case cOutput
thus ? case by ( simp add : action . inject )
next
case cCase
thus ? case
by ( rule_tac cCase ) ( auto dest : memFresh )
next
case cPar1
thus ? case by simp
next
case cPar2
thus ? case by simp
next
case cComm1
thus ? case by simp
next
case cComm2
thus ? case by simp
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x y M ' zvec N ' )
from \ < open > M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > = M ' \ < lparr > \ < nu > * zvec \ < rparr > \ < langle > N ' \ < rangle > \ < close > have " zvec = xvec @ x # yvec " and " N = N ' "
by ( simp add : action . inject ) +
from \ < open > y \ < sharp > \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > x \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
moreover from \ < open > y \ < sharp > zvec \ < close > \ < open > zvec = xvec @ x # yvec \ < close > have " y \ < sharp > ( xvec @ yvec ) "
by simp
ultimately have " y \ < sharp > N " by ( rule_tac cOpen ) auto
with \ < open > N = N ' \ < close > show ? case by simp
next
case cScope
thus ? case by ( auto simp add : abs_fresh )
next
case cBang
thus ? case by simp
qed
next
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover from \ < open > xvec \ < sharp > * M \ < close > have " bn ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) \ < sharp > * subject ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) " by simp
moreover from \ < open > distinct xvec \ < close > have " distinct ( bn ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) ) " by simp
ultimately show " x \ < sharp > P ' " using \ < open > x \ < sharp > P \ < close > \ < open > x \ < sharp > xvec \ < close >
proof ( nominal_induct \ < Psi > P \ < alpha > = = " M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " P ' avoiding : x arbitrary : M xvec N rule : semanticsInduct )
case ( cAlpha \ < Psi > P \ < alpha > P ' p x M xvec N )
have S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " by fact
from \ < open > ( p \ < bullet > \ < alpha > ) = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > have " ( p \ < bullet > p \ < bullet > \ < alpha > ) = p \ < bullet > ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) " by ( simp add : fresh_star_bij )
with \ < open > distinctPerm p \ < close > have " \ < alpha > = ( p \ < bullet > M ) \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > " by simp
moreover from \ < open > ( p \ < bullet > \ < alpha > ) = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > \ < open > x \ < sharp > xvec \ < close > have " x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) " by simp
with \ < open > ( bn \ < alpha > ) \ < sharp > * x \ < close > \ < open > x \ < sharp > xvec \ < close > S have " x \ < sharp > ( p \ < bullet > xvec ) "
by ( drule_tac pt_fresh_bij1 [ OF pt_name_inst , OF at_name_inst , where pi = p and x = xvec ] ) simp
ultimately have " x \ < sharp > P ' " using \ < open > x \ < sharp > P \ < close > by ( rule_tac cAlpha )
hence " ( p \ < bullet > x ) \ < sharp > ( p \ < bullet > P ' ) " by ( simp add : pt_fresh_bij1 [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > distinctPerm p \ < close > \ < open > bn ( \ < alpha > ) \ < sharp > * x \ < close > \ < open > x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) \ < close > S show ? case by simp
next
case cInput
thus ? case by simp
next
case cOutput
thus ? case by ( simp add : action . inject )
next
case cCase
thus ? case by ( fastforce simp add : action . inject dest : memFresh )
next
case cPar1
thus ? case by simp
next
case cPar2
thus ? case by simp
next
case cComm1
thus ? case by simp
next
case cComm2
thus ? case by simp
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x y M ' zvec N ' )
from \ < open > M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > = M ' \ < lparr > \ < nu > * zvec \ < rparr > \ < langle > N ' \ < rangle > \ < close > have " zvec = xvec @ x # yvec "
by ( simp add : action . inject )
from \ < open > y \ < sharp > \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > x \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
moreover from \ < open > y \ < sharp > zvec \ < close > \ < open > zvec = xvec @ x # yvec \ < close > have " y \ < sharp > ( xvec @ yvec ) "
by simp
ultimately show " y \ < sharp > P ' " by ( rule_tac cOpen ) auto
next
case cScope
thus ? case by ( auto simp add : abs_fresh )
next
case cBang
thus ? case by simp
qed
qed
lemma outputFreshChainDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and yvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " distinct xvec "
and " yvec \ < sharp > * P "
and " yvec \ < sharp > * xvec "
shows " yvec \ < sharp > * N "
and " yvec \ < sharp > * P ' "
using assms
by ( induct yvec ) ( auto intro : outputFreshDerivative )
lemma tauFreshDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' "
and " x \ < sharp > P "
shows " x \ < sharp > P ' "
proof -
have " bn ( \ < tau > ) \ < sharp > * subject ( \ < tau > ) " and " distinct ( bn ( \ < tau > ) ) " by simp +
with \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' \ < close > show ? thesis using \ < open > x \ < sharp > P \ < close >
proof ( nominal_induct \ < Psi > P \ < alpha > = = " ( \ < tau > : : ( ' a action ) ) " P ' avoiding : x rule : semanticsInduct )
case cAlpha
thus ? case by simp
next
case cInput
thus ? case by simp
next
case cOutput
thus ? case by simp
next
case cCase
thus ? case by ( auto dest : memFresh )
next
case cPar1
thus ? case by simp
next
case cPar2
thus ? case by simp
next
case cComm1
thus ? case
by ( fastforce dest : inputFreshDerivative outputFreshDerivative simp add : resChainFresh )
next
case cComm2
thus ? case
by ( fastforce dest : inputFreshDerivative outputFreshDerivative simp add : resChainFresh )
next
case cOpen
thus ? case by simp
next
case cScope
thus ? case by ( simp add : abs_fresh )
next
case cBang
thus ? case by simp
qed
qed
lemma tauFreshChainDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and xvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' "
and " xvec \ < sharp > * P "
shows " xvec \ < sharp > * P ' "
using assms
by ( induct xvec ) ( auto intro : tauFreshDerivative )
lemma freeFreshDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " distinct ( bn \ < alpha > ) "
and " x \ < sharp > \ < alpha > "
and " x \ < sharp > P "
shows " x \ < sharp > P ' "
using assms
by ( rule_tac actionCases [ where \ < alpha > = \ < alpha > ] )
( auto intro : inputFreshDerivative tauFreshDerivative outputFreshDerivative )
lemma freeFreshChainDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and xvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " distinct ( bn \ < alpha > ) "
and " xvec \ < sharp > * P "
and " xvec \ < sharp > * \ < alpha > "
shows " xvec \ < sharp > * P ' "
using assms
by ( auto intro : freeFreshDerivative simp add : fresh_star_def )
lemma Input :
fixes \ < Psi > : : ' b
and M : : ' a
and K : : ' a
and xvec : : " name list "
and N : : ' a
and Tvec : : " ' a list "
assumes " \ < Psi > \ < turnstile > M \ < leftrightarrow > K "
and " distinct xvec "
and " set xvec \ < subseteq > supp N "
and " length xvec = length Tvec "
shows " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < longmapsto > K \ < lparr > N [ xvec : : = Tvec ] \ < rparr > \ < prec > P [ xvec : : = Tvec ] "
proof -
obtain p where xvecFreshPsi : " ( ( p : : name prm ) \ < bullet > ( xvec : : name list ) ) \ < sharp > * \ < Psi > "
and xvecFreshM : " ( p \ < bullet > xvec ) \ < sharp > * M "
and xvecFreshN : " ( p \ < bullet > xvec ) \ < sharp > * N "
and xvecFreshK : " ( p \ < bullet > xvec ) \ < sharp > * K "
and xvecFreshTvec : " ( p \ < bullet > xvec ) \ < sharp > * Tvec "
and xvecFreshP : " ( p \ < bullet > xvec ) \ < sharp > * P "
and S : " ( set p ) \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) "
and dp : " distinctPerm p "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , M , K , N , P , Tvec ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
note \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > distinct xvec \ < close > have " distinct ( p \ < bullet > xvec ) "
by simp
moreover from \ < open > ( set xvec ) \ < subseteq > ( supp N ) \ < close > have " ( p \ < bullet > ( set xvec ) ) \ < subseteq > ( p \ < bullet > ( supp N ) ) "
by simp
hence " set ( p \ < bullet > xvec ) \ < subseteq > supp ( p \ < bullet > N ) "
by ( simp add : eqvts )
moreover from \ < open > length xvec = length Tvec \ < close > have " length ( p \ < bullet > xvec ) = length Tvec "
by simp
ultimately have " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * ( p \ < bullet > xvec ) ( p \ < bullet > N ) \ < rparr > . ( p \ < bullet > P ) \ < longmapsto > K \ < lparr > ( p \ < bullet > N ) [ ( p \ < bullet > xvec ) : : = Tvec ] \ < rparr > \ < prec > ( p \ < bullet > P ) [ ( p \ < bullet > xvec ) : : = Tvec ] "
using xvecFreshPsi xvecFreshM xvecFreshK xvecFreshTvec
by ( rule_tac cInput )
thus ? thesis using xvecFreshN xvecFreshP S \ < open > length xvec = length Tvec \ < close > dp
by ( auto simp add : inputChainAlpha ' substTerm . renaming renaming )
qed
lemma residualAlpha :
fixes p : : " name prm "
and \ < alpha > : : " ' a action "
and P : : " ( ' a , ' b , ' c ) psi "
assumes " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * object \ < alpha > "
and " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * P "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * subject \ < alpha > "
and " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) "
shows " \ < alpha > \ < prec > P = ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ) "
using assms
apply ( rule_tac \ < alpha > = \ < alpha > in actionCases )
apply ( simp only : eqvts bn . simps )
apply simp
apply ( simp add : boundOutputChainAlpha ' ' residualInject )
by simp
lemma Par1 :
fixes \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
and Q : : " ( ' a , ' b , ' c ) psi "
assumes Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " bn \ < alpha > \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * \ < alpha > "
shows " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > ( P ' \ < parallel > Q ) "
proof -
{
fix \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
and Q : : " ( ' a , ' b , ' c ) psi "
assume " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " bn \ < alpha > \ < sharp > * Q "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * \ < alpha > "
and " distinct A \ < ^ sub > Q "
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > ( P ' \ < parallel > Q ) "
proof -
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > have " distinct ( bn \ < alpha > ) " by ( rule boundOutputDistinct )
obtain q : : " name prm " where " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > "
and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > Q " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P ' " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sq : " ( set q ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( q \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , Q , \ < alpha > , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , P ' ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < alpha > "
and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' "
and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > Q ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > Q ) ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , \ < alpha > , bn \ < alpha > , q \ < bullet > \ < alpha > , P ' , ( q \ < bullet > P ' ) , \ < Psi > \ < ^ sub > Q ) " in name_list_avoiding ) auto
from \ < open > distinct ( bn \ < alpha > ) \ < close > have " distinct ( bn ( q \ < bullet > \ < alpha > ) ) "
by ( rule_tac \ < alpha > = \ < alpha > in actionCases ) ( auto simp add : eqvts )
from \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > Q \ < close > Sq have " A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) "
apply ( rule_tac \ < alpha > = \ < alpha > in actionCases )
apply ( simp only : bn . simps eqvts , simp )
apply ( simp add : freshChainSimps )
by simp
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > have " ( q \ < bullet > ( bn \ < alpha > ) ) \ < sharp > * ( q \ < bullet > ( subject \ < alpha > ) ) "
by ( simp add : fresh_star_bij )
hence " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) " by ( simp add : eqvts )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * ( subject \ < alpha > ) \ < close > Sq
have Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) "
by ( force simp add : residualAlpha )
hence " A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > P ' ) " using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
by ( auto intro : freeFreshChainDerivative )
from Trans have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > ( p \ < bullet > P ) \ < longmapsto > p \ < bullet > ( ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) ) "
by ( rule semantics . eqvt )
with \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > P ' ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) \ < close > Sp
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) " by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sp have " extractFrame Q = \ < langle > ( p \ < bullet > A \ < ^ sub > Q ) , ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha ' eqvts )
moreover from \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > Sp
have " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshAlphaPerm )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > Q ) " by simp
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( ( q \ < bullet > P ' ) \ < parallel > Q ) "
using \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close >
\ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( subject ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close >
by ( rule_tac cPar1 )
thus ? thesis using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > Sq
by ( force simp add : residualAlpha )
qed
}
note Goal = this
from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close >
obtain A \ < ^ sub > Q ' where FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q ' , \ < Psi > \ < ^ sub > Q \ < rangle > " and " distinct A \ < ^ sub > Q ' " and " A \ < ^ sub > Q ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > Q ' \ < sharp > * P " and " A \ < ^ sub > Q ' \ < sharp > * \ < alpha > "
by ( rule_tac C = " ( \ < Psi > , P , \ < alpha > ) " in distinctFrame ) auto
show ? thesis
proof ( induct rule : actionCases [ where \ < alpha > = \ < alpha > ] )
case ( cInput M N )
from Trans FrQ \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close > \ < open > distinct A \ < ^ sub > Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close >
show ? case using \ < open > \ < alpha > = M \ < lparr > N \ < rparr > \ < close > by ( force intro : Goal )
next
case cTau
from Trans FrQ \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close > \ < open > distinct A \ < ^ sub > Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close >
show ? case using \ < open > \ < alpha > = \ < tau > \ < close > by ( force intro : Goal )
next
case ( cOutput M xvec N )
from \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > have " xvec \ < sharp > * A \ < ^ sub > Q ' " and " xvec \ < sharp > * Q "
by simp +
obtain p where " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * P ' " and " ( p \ < bullet > xvec ) \ < sharp > * Q "
and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q ' "
and S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) "
by ( rule_tac xvec = xvec and c = " ( N , P ' , Q , M , A \ < ^ sub > Q ' ) " in name_list_avoiding ) auto
from Trans \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by simp
with \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P ' \ < close > S
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
moreover from \ < open > xvec \ < sharp > * A \ < ^ sub > Q ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q ' \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close > S
have " A \ < ^ sub > Q ' \ < sharp > * ( p \ < bullet > \ < alpha > ) " by ( simp add : freshChainSimps del : actionFreshChain )
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > P ' ) \ < parallel > Q "
using FrQ \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * P \ < close > \ < open > distinct A \ < ^ sub > Q ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close >
\ < open > ( p \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close >
by ( force intro : Goal )
with \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * Q \ < close > \ < open > xvec \ < sharp > * Q \ < close > S \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close >
show ? case
by ( simp add : boundOutputChainAlpha ' ' eqvts create_residual . simps )
qed
qed
lemma Par2 :
fixes \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and P : : " ( ' a , ' b , ' c ) psi "
assumes Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " bn \ < alpha > \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * \ < alpha > "
shows " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > ( P \ < parallel > Q ' ) "
proof -
{
fix \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and P : : " ( ' a , ' b , ' c ) psi "
assume " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " bn \ < alpha > \ < sharp > * P "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * \ < alpha > "
and " distinct A \ < ^ sub > P "
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > ( P \ < parallel > Q ' ) "
proof -
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > have " distinct ( bn \ < alpha > ) " by ( rule boundOutputDistinct )
obtain q : : " name prm " where " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > "
and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > P " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q ' " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > \ < ^ sub > P "
and Sq : " ( set q ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( q \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , Q , \ < alpha > , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , Q ' ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < alpha > "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P "
and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , \ < alpha > , q \ < bullet > \ < alpha > , Q ' , ( q \ < bullet > Q ' ) , \ < Psi > \ < ^ sub > P ) " in name_list_avoiding ) auto
from \ < open > distinct ( bn \ < alpha > ) \ < close > have " distinct ( bn ( q \ < bullet > \ < alpha > ) ) "
by ( rule_tac \ < alpha > = \ < alpha > in actionCases ) ( auto simp add : eqvts )
from \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > P \ < close > Sq have " A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) "
apply ( rule_tac \ < alpha > = \ < alpha > in actionCases )
apply ( simp only : bn . simps eqvts , simp )
apply ( simp add : freshChainSimps )
by simp
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > have " ( q \ < bullet > ( bn \ < alpha > ) ) \ < sharp > * ( q \ < bullet > ( subject \ < alpha > ) ) "
by ( simp add : fresh_star_bij )
hence " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) " by ( simp add : eqvts )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * ( subject \ < alpha > ) \ < close > Sq
have Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) "
by ( force simp add : residualAlpha )
hence " A \ < ^ sub > P \ < sharp > * ( q \ < bullet > Q ' ) " using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
by ( auto intro : freeFreshChainDerivative )
from Trans have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > ( p \ < bullet > Q ) \ < longmapsto > p \ < bullet > ( ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) ) "
by ( rule semantics . eqvt )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > Q ' ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) \ < close > Sp
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) " by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha ' eqvts )
moreover from \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > Sp
have " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshAlphaPerm )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( P \ < parallel > ( q \ < bullet > Q ' ) ) "
using \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close >
\ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( subject ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close >
by ( rule_tac cPar2 )
thus ? thesis using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > Sq
by ( force simp add : residualAlpha )
qed
}
note Goal = this
from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close >
obtain A \ < ^ sub > P ' where FrP : " extractFrame P = \ < langle > A \ < ^ sub > P ' , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P ' " and " A \ < ^ sub > P ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > P ' \ < sharp > * Q " and " A \ < ^ sub > P ' \ < sharp > * \ < alpha > "
by ( rule_tac C = " ( \ < Psi > , Q , \ < alpha > ) " in distinctFrame ) auto
show ? thesis
proof ( induct rule : actionCases [ where \ < alpha > = \ < alpha > ] )
case ( cInput M N )
from Trans FrP \ < open > A \ < ^ sub > P ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close > \ < open > distinct A \ < ^ sub > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close >
show ? case using \ < open > \ < alpha > = M \ < lparr > N \ < rparr > \ < close > by ( force intro : Goal )
next
case cTau
from Trans FrP \ < open > A \ < ^ sub > P ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close > \ < open > distinct A \ < ^ sub > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close >
show ? case using \ < open > \ < alpha > = \ < tau > \ < close > by ( force intro : Goal )
next
case ( cOutput M xvec N )
from \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > have " xvec \ < sharp > * A \ < ^ sub > P ' " and " xvec \ < sharp > * P "
by simp +
obtain p where " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * Q ' " and " ( p \ < bullet > xvec ) \ < sharp > * P "
and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P ' "
and S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) "
by ( rule_tac xvec = xvec and c = " ( N , Q ' , P , M , A \ < ^ sub > P ' ) " in name_list_avoiding ) auto
from Trans \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' " by simp
with \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * Q ' \ < close > S
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > Q ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
moreover from \ < open > xvec \ < sharp > * A \ < ^ sub > P ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P ' \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close > S
have " A \ < ^ sub > P ' \ < sharp > * ( p \ < bullet > \ < alpha > ) " by ( simp add : freshChainSimps del : actionFreshChain )
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > P \ < parallel > ( p \ < bullet > Q ' ) "
using FrP \ < open > A \ < ^ sub > P ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * Q \ < close > \ < open > distinct A \ < ^ sub > P ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close >
\ < open > ( p \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close >
by ( force intro : Goal )
with \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * Q ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * P \ < close > S \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close >
show ? case
by ( simp add : boundOutputChainAlpha ' ' eqvts create_residual . simps )
qed
qed
lemma Open :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and yvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " x \ < in > supp N "
and " x \ < sharp > \ < Psi > "
and " x \ < sharp > M "
and " x \ < sharp > xvec "
and " x \ < sharp > yvec "
shows " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from Trans have " distinct ( xvec @ yvec ) " by ( force dest : boundOutputDistinct )
hence " xvec \ < sharp > * yvec " by ( induct xvec ) auto
obtain p where " ( p \ < bullet > yvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > yvec ) \ < sharp > * P " and " ( p \ < bullet > yvec ) \ < sharp > * M "
and " ( p \ < bullet > yvec ) \ < sharp > * yvec " and " ( p \ < bullet > yvec ) \ < sharp > * N " and " ( p \ < bullet > yvec ) \ < sharp > * P ' "
and " x \ < sharp > ( p \ < bullet > yvec ) " and " ( p \ < bullet > yvec ) \ < sharp > * xvec "
and Sp : " ( set p ) \ < subseteq > ( set yvec ) \ < times > ( set ( p \ < bullet > yvec ) ) "
by ( rule_tac xvec = yvec and c = " ( \ < Psi > , P , M , xvec , yvec , N , P ' , x ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain q where " ( q \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > xvec ) \ < sharp > * P " and " ( q \ < bullet > xvec ) \ < sharp > * M "
and " ( q \ < bullet > xvec ) \ < sharp > * xvec " and " ( q \ < bullet > xvec ) \ < sharp > * N " and " ( q \ < bullet > xvec ) \ < sharp > * P ' "
and " x \ < sharp > ( q \ < bullet > xvec ) " and " ( q \ < bullet > xvec ) \ < sharp > * yvec "
and " ( q \ < bullet > xvec ) \ < sharp > * p " and " ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) "
and Sq : " ( set q ) \ < subseteq > ( set xvec ) \ < times > ( set ( q \ < bullet > xvec ) ) "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , M , xvec , yvec , p \ < bullet > yvec , N , P ' , x , p ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * N \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * N " apply ( simp only : eqvts ) apply ( simp only : pt2 [ OF pt_name_inst ] )
by simp
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * P ' \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * P ' " by ( simp del : freshAlphaPerm add : eqvts pt2 [ OF pt_name_inst ] )
moreover from Sp Sq \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close >
have Spq : " set ( p @ q ) \ < subseteq > set ( xvec @ yvec ) \ < times > set ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) "
by ( simp add : pt2 [ OF pt_name_inst ] eqvts ) blast
ultimately have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < rparr > \ < langle > ( ( p @ q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ q ) \ < bullet > P ' ) "
apply ( simp add : create_residual . simps )
by ( erule_tac rev_mp ) ( subst boundOutputChainAlpha , auto )
with Sp Sq \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( p @ q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ q ) \ < bullet > P ' ) "
by ( simp add : eqvts pt2 [ OF pt_name_inst ] del : freshAlphaPerm )
moreover from \ < open > x \ < in > supp N \ < close > have " ( ( p @ q ) \ < bullet > x ) \ < in > ( p @ q ) \ < bullet > ( supp N ) "
by ( simp add : pt_set_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > Sp Sq
have " x \ < in > supp ( ( p @ q ) \ < bullet > N ) " by ( simp add : eqvts pt2 [ OF pt_name_inst ] )
moreover from \ < open > distinct ( xvec @ yvec ) \ < close > have " distinct ( q \ < bullet > xvec ) " and " distinct ( p \ < bullet > yvec ) "
by auto
moreover note \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > \ < Psi > \ < close >
\ < open > ( q \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close >
\ < open > ( p \ < bullet > yvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * M \ < close > \ < open > distinct ( q \ < bullet > xvec ) \ < close >
ultimately have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ x # ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( p @ q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ q ) \ < bullet > P ' ) "
by ( rule_tac cOpen )
with \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close >
\ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( p @ q ) \ < bullet > ( xvec @ x # yvec ) ) \ < rparr > \ < langle > ( ( p @ q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ q ) \ < bullet > P ' ) "
by ( simp add : eqvts pt2 [ OF pt_name_inst ] del : freshAlphaPerm )
thus ? thesis using \ < open > ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * N \ < close > \ < open > ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * P ' \ < close > Spq
apply ( simp add : create_residual . simps )
by ( erule_tac rev_mp ) ( subst boundOutputChainAlpha , auto )
qed
lemma Scope :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " x \ < sharp > \ < Psi > "
and " x \ < sharp > \ < alpha > "
shows " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' "
proof -
{
fix \ < Psi > P M xvec N P ' x
assume " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " ( x : : name ) \ < sharp > \ < Psi > "
and " x \ < sharp > M "
and " x \ < sharp > xvec "
and " x \ < sharp > N "
obtain p : : " name prm " where " ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > xvec ) \ < sharp > * P " and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * xvec "
and " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * P ' " and " x \ < sharp > ( p \ < bullet > xvec ) "
and S : " ( set p ) \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , M , xvec , N , P ' , x ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P ' \ < close > S
have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
moreover hence " distinct ( p \ < bullet > xvec ) " by ( force dest : boundOutputDistinct )
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > ( p \ < bullet > xvec ) \ < close >
moreover from \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > p \ < bullet > xvec \ < close > \ < open > x \ < sharp > N \ < close > S have " x \ < sharp > ( p \ < bullet > N ) "
by ( simp add : fresh_left del : freshAlphaSwap )
ultimately have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > \ < lparr > \ < nu > x \ < rparr > ( p \ < bullet > P ' ) " using \ < open > ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * M \ < close >
by ( rule_tac cScope ) auto
moreover from \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > p \ < bullet > xvec \ < close > S have " p \ < bullet > x = x " by simp
ultimately have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) " by simp
moreover from \ < open > ( p \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > ( p \ < bullet > xvec ) \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * \ < lparr > \ < nu > x \ < rparr > P ' "
by ( simp add : abs_fresh_star )
ultimately have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' " using \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > S
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
}
note Goal = this
show ? thesis
proof ( induct rule : actionCases [ where \ < alpha > = \ < alpha > ] )
case ( cInput M N )
with assms show ? case by ( force intro : cScope )
next
case ( cOutput M xvec N )
with assms show ? case by ( force intro : Goal )
next
case cTau
with assms show ? case by ( force intro : cScope )
qed
qed
lemma inputSwapFrameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " x \ < sharp > P "
and " y \ < sharp > P "
shows " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
using assms
proof ( nominal_induct avoiding : x y rule : inputInduct )
case ( cInput \ < Psi > M K xvec N Tvec P x y )
from \ < open > x \ < sharp > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < close > have " x \ < sharp > M " by simp
from \ < open > y \ < sharp > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < close > have " y \ < sharp > M " by simp
from \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > ( [ ( x , y ) ] \ < bullet > M ) \ < leftrightarrow > ( [ ( x , y ) ] \ < bullet > K ) "
by ( rule chanEqClosed )
with \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > M \ < leftrightarrow > ( [ ( x , y ) ] \ < bullet > K ) "
by ( simp )
thus ? case using \ < open > distinct xvec \ < close > \ < open > set xvec \ < subseteq > supp N \ < close > \ < open > length xvec = length Tvec \ < close >
by ( rule Input )
next
case ( cCase \ < Psi > P M N P ' \ < phi > Cs x y )
from \ < open > x \ < sharp > Cases Cs \ < close > \ < open > y \ < sharp > Cases Cs \ < close > \ < open > ( \ < phi > , P ) mem Cs \ < close > have " x \ < sharp > \ < phi > " and " x \ < sharp > P " and " y \ < sharp > \ < phi > " and " y \ < sharp > P "
by ( auto dest : memFresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' " by ( rule cCase )
moreover note \ < open > ( \ < phi > , P ) mem Cs \ < close >
moreover from \ < open > \ < Psi > \ < turnstile > \ < phi > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > ( [ ( x , y ) ] \ < bullet > \ < phi > ) " by ( rule statClosed )
with \ < open > x \ < sharp > \ < phi > \ < close > \ < open > y \ < sharp > \ < phi > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > \ < phi > " by simp
ultimately show ? case using \ < open > guarded P \ < close > by ( rule Case )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > Q Q x y )
from \ < open > x \ < sharp > P \ < parallel > Q \ < close > have " x \ < sharp > P " and " x \ < sharp > Q " by simp +
from \ < open > y \ < sharp > P \ < parallel > Q \ < close > have " y \ < sharp > P " and " y \ < sharp > Q " by simp +
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < otimes > ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > have " ( [ ( x , y ) ] \ < bullet > ( extractFrame Q ) ) = ( [ ( x , y ) ] \ < bullet > \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ) "
by simp
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > x \ < sharp > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > \ < open > y \ < sharp > Q \ < close > have " \ < langle > A \ < ^ sub > Q , ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > = extractFrame Q "
by ( simp add : eqvts )
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > have " A \ < ^ sub > Q \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) " by simp
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * M \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > have " A \ < ^ sub > Q \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) " by simp
ultimately show ? case using \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close >
by ( rule_tac Par1 ) auto
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q M N Q ' A \ < ^ sub > P P x y )
from \ < open > x \ < sharp > P \ < parallel > Q \ < close > have " x \ < sharp > P " and " x \ < sharp > Q " by simp +
from \ < open > y \ < sharp > P \ < parallel > Q \ < close > have " y \ < sharp > P " and " y \ < sharp > Q " by simp +
from \ < open > x \ < sharp > Q \ < close > \ < open > y \ < sharp > Q \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > Q ; y \ < sharp > Q \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > Q ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < otimes > ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > Q ' "
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > have " ( [ ( x , y ) ] \ < bullet > ( extractFrame P ) ) = ( [ ( x , y ) ] \ < bullet > \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ) "
by simp
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > x \ < sharp > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > \ < open > y \ < sharp > P \ < close > have " \ < langle > A \ < ^ sub > P , ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > = extractFrame P "
by ( simp add : eqvts )
moreover from \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > have " A \ < ^ sub > P \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) " by simp
moreover from \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > have " A \ < ^ sub > P \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) " by simp
ultimately show ? case using \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close >
by ( rule_tac Par2 ) auto
next
case ( cScope \ < Psi > P M N P ' z x y )
from \ < open > x \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > x \ < close > have " x \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > y \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' " by simp
moreover with \ < open > z \ < sharp > \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > " by simp
moreover with \ < open > z \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > M "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > M " by simp
ultimately show ? case using \ < open > z \ < sharp > N \ < close >
by ( rule_tac Scope ) ( assumption | simp ) +
next
case ( cBang \ < Psi > P M N P ' x y )
thus ? case by ( force intro : Bang )
qed
lemma inputPermFrameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and Xs : : " name set "
and Ys : : " name set "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and S : " set p \ < subseteq > Xs \ < times > Ys "
and " Xs \ < sharp > * P "
and " Ys \ < sharp > * P "
shows " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
using S
proof ( induct p )
case Nil
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
show ? case by simp
next
case ( Cons a p )
from \ < open > set ( a # p ) \ < subseteq > Xs \ < times > Ys \ < close > have " set p \ < subseteq > Xs \ < times > Ys " by auto
with \ < open > set p \ < subseteq > Xs \ < times > Ys \ < Longrightarrow > ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have Trans : " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' " by simp
from \ < open > set ( a # p ) \ < subseteq > Xs \ < times > Ys \ < close > show ? case
proof ( cases a , clarsimp )
fix a b
assume " a \ < in > Xs " and " b \ < in > Ys "
with \ < open > Xs \ < sharp > * P \ < close > \ < open > Ys \ < sharp > * P \ < close >
have " a \ < sharp > P " and " b \ < sharp > P "
by ( auto simp add : fresh_star_def )
with Trans show " ( [ ( a , b ) ] \ < bullet > p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( a , b ) ] \ < bullet > p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputSwapFrameSubject )
qed
qed
lemma inputSwapSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " x \ < sharp > P "
and " y \ < sharp > P "
and " x \ < sharp > \ < Psi > "
and " y \ < sharp > \ < Psi > "
shows " \ < Psi > \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputSwapFrameSubject )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > show ? thesis
by simp
qed
lemma inputPermSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and Xs : : " name set "
and Ys : : " name set "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and S : " set p \ < subseteq > Xs \ < times > Ys "
and " Xs \ < sharp > * P "
and " Ys \ < sharp > * P "
and " Xs \ < sharp > * \ < Psi > "
and " Ys \ < sharp > * \ < Psi > "
shows " \ < Psi > \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > S \ < open > Xs \ < sharp > * P \ < close > \ < open > Ys \ < sharp > * P \ < close >
have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputPermFrameSubject )
with \ < open > Xs \ < sharp > * \ < Psi > \ < close > \ < open > Ys \ < sharp > * \ < Psi > \ < close > S show ? thesis
by simp
qed
lemma inputSwapFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " x \ < sharp > P "
and " y \ < sharp > P "
and " x \ < sharp > M "
and " y \ < sharp > M "
shows " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputSwapFrameSubject )
with \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > show ? thesis
by simp
qed
lemma inputPermFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and Xs : : " name set "
and Ys : : " name set "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and S : " set p \ < subseteq > Xs \ < times > Ys "
and " Xs \ < sharp > * P "
and " Ys \ < sharp > * P "
and " Xs \ < sharp > * M "
and " Ys \ < sharp > * M "
shows " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > S \ < open > Xs \ < sharp > * P \ < close > \ < open > Ys \ < sharp > * P \ < close >
have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputPermFrameSubject )
with \ < open > Xs \ < sharp > * M \ < close > \ < open > Ys \ < sharp > * M \ < close > S show ? thesis
by simp
qed
lemma inputAlpha :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and xvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " set p \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) "
and " distinctPerm p "
and " xvec \ < sharp > * P "
and " ( p \ < bullet > xvec ) \ < sharp > * P "
shows " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > ( p \ < bullet > N ) \ < rparr > \ < prec > ( p \ < bullet > P ' ) "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > \ < open > set p \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close >
have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' " by ( rule_tac inputPermFrameSubject ) auto
hence " ( p \ < bullet > p \ < bullet > \ < Psi > ) \ < rhd > ( p \ < bullet > P ) \ < longmapsto > ( p \ < bullet > ( ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' ) ) " by ( rule eqvts )
with \ < open > distinctPerm p \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > set p \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) \ < close >
show ? thesis by ( simp add : eqvts )
qed
lemma frameFresh [ dest ] :
fixes x : : name
and A \ < ^ sub > F : : " name list "
and \ < Psi > \ < ^ sub > F : : ' b
assumes " x \ < sharp > A \ < ^ sub > F "
and " x \ < sharp > \ < langle > A \ < ^ sub > F , \ < Psi > \ < ^ sub > F \ < rangle > "
shows " x \ < sharp > \ < Psi > \ < ^ sub > F "
using assms
by ( simp add : frameResChainFresh ) ( simp add : fresh_def name_list_supp )
lemma outputSwapFrameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " x \ < sharp > P "
and " y \ < sharp > P "
shows " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
using assms
proof ( nominal_induct avoiding : x y rule : outputInduct ' )
case cAlpha
thus ? case by ( simp add : create_residual . simps boundOutputChainAlpha ' ' )
next
case ( cOutput \ < Psi > M K N P x y )
from \ < open > x \ < sharp > M \ < langle > N \ < rangle > . P \ < close > have " x \ < sharp > M " by simp
from \ < open > y \ < sharp > M \ < langle > N \ < rangle > . P \ < close > have " y \ < sharp > M " by simp
from \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > ( [ ( x , y ) ] \ < bullet > M ) \ < leftrightarrow > ( [ ( x , y ) ] \ < bullet > K ) "
by ( rule chanEqClosed )
with \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > M \ < leftrightarrow > ( [ ( x , y ) ] \ < bullet > K ) "
by ( simp )
thus ? case by ( rule Output )
next
case ( cCase \ < Psi > P M xvec N P ' \ < phi > Cs x y )
from \ < open > x \ < sharp > Cases Cs \ < close > \ < open > y \ < sharp > Cases Cs \ < close > \ < open > ( \ < phi > , P ) mem Cs \ < close > have " x \ < sharp > \ < phi > " and " x \ < sharp > P " and " y \ < sharp > \ < phi > " and " y \ < sharp > P "
by ( auto dest : memFresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( rule cCase )
moreover note \ < open > ( \ < phi > , P ) mem Cs \ < close >
moreover from \ < open > \ < Psi > \ < turnstile > \ < phi > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > ( [ ( x , y ) ] \ < bullet > \ < phi > ) " by ( rule statClosed )
with \ < open > x \ < sharp > \ < phi > \ < close > \ < open > y \ < sharp > \ < phi > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > \ < phi > " by simp
ultimately show ? case using \ < open > guarded P \ < close > by ( rule Case )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > Q Q x y )
from \ < open > x \ < sharp > P \ < parallel > Q \ < close > have " x \ < sharp > P " and " x \ < sharp > Q " by simp +
from \ < open > y \ < sharp > P \ < parallel > Q \ < close > have " y \ < sharp > P " and " y \ < sharp > Q " by simp +
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < otimes > ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ) = ( [ ( x , y ) ] \ < bullet > ( extractFrame Q ) ) "
by simp
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > x \ < sharp > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > \ < open > y \ < sharp > Q \ < close > have " \ < langle > A \ < ^ sub > Q , ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > = extractFrame Q "
by ( simp add : eqvts )
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > have " A \ < ^ sub > Q \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) " by simp
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * M \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > have " A \ < ^ sub > Q \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) " by simp
ultimately show ? case using \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close >
by ( rule_tac Par1 ) auto
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q M xvec N Q ' A \ < ^ sub > P P x y )
from \ < open > x \ < sharp > P \ < parallel > Q \ < close > have " x \ < sharp > P " and " x \ < sharp > Q " by simp +
from \ < open > y \ < sharp > P \ < parallel > Q \ < close > have " y \ < sharp > P " and " y \ < sharp > Q " by simp +
from \ < open > x \ < sharp > Q \ < close > \ < open > y \ < sharp > Q \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > Q ; y \ < sharp > Q \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < otimes > ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' "
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ) = ( [ ( x , y ) ] \ < bullet > ( extractFrame P ) ) "
by simp
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > x \ < sharp > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > \ < open > y \ < sharp > P \ < close > have " \ < langle > A \ < ^ sub > P , ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > = extractFrame P "
by ( simp add : eqvts )
moreover from \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > have " A \ < ^ sub > P \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) " by simp
moreover from \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > have " A \ < ^ sub > P \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) " by simp
ultimately show ? case using \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close >
by ( rule_tac Par2 ) auto
next
case ( cOpen \ < Psi > P M xvec yvec N P ' z x y )
from \ < open > x \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > x \ < close > have " x \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > y \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by simp
moreover with \ < open > z \ < sharp > \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > " by simp
moreover with \ < open > z \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > M "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > M " by simp
ultimately show ? case using \ < open > z \ < in > supp N \ < close > \ < open > z \ < sharp > xvec \ < close > \ < open > z \ < sharp > yvec \ < close >
by ( rule_tac Open ) ( assumption | simp ) +
next
case ( cScope \ < Psi > P M xvec N P ' z x y )
from \ < open > x \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > x \ < close > have " x \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > y \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by simp
moreover with \ < open > z \ < sharp > \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > " by simp
moreover with \ < open > z \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > M "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > M " by simp
ultimately show ? case using \ < open > z \ < sharp > N \ < close > \ < open > z \ < sharp > xvec \ < close >
by ( rule_tac Scope ) ( assumption | simp ) +
next
case ( cBang \ < Psi > P M B x y )
thus ? case by ( force intro : Bang )
qed
lemma outputPermFrameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and yvec : : " name list "
and zvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and S : " set p \ < subseteq > set yvec \ < times > set zvec "
and " yvec \ < sharp > * P "
and " zvec \ < sharp > * P "
shows " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
{
fix xvec N P ' Xs YS
assume " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " and " xvec \ < sharp > * M " and " xvec \ < sharp > * yvec " and " xvec \ < sharp > * zvec "
have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " using S
proof ( induct p )
case Nil
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
show ? case by simp
next
case ( Cons a p )
from \ < open > set ( a # p ) \ < subseteq > set yvec \ < times > set zvec \ < close > have " set p \ < subseteq > set yvec \ < times > set zvec " by auto
then have Trans : " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( rule Cons )
from \ < open > set ( a # p ) \ < subseteq > set yvec \ < times > set zvec \ < close > show ? case
proof ( cases a , clarsimp )
fix x y
note Trans
moreover from \ < open > xvec \ < sharp > * yvec \ < close > \ < open > xvec \ < sharp > * zvec \ < close > \ < open > set p \ < subseteq > set yvec \ < times > set zvec \ < close > \ < open > xvec \ < sharp > * M \ < close > have " xvec \ < sharp > * ( p \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover assume " x \ < in > set yvec " and " y \ < in > set zvec "
with \ < open > yvec \ < sharp > * P \ < close > \ < open > zvec \ < sharp > * P \ < close > have " x \ < sharp > P " and " y \ < sharp > P "
by ( auto simp add : fresh_star_def )
ultimately show " ( [ ( x , y ) ] \ < bullet > p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule outputSwapFrameSubject )
qed
qed
}
note Goal = this
obtain q : : " name prm " where " ( q \ < bullet > xvec ) \ < sharp > * yvec " and " ( q \ < bullet > xvec ) \ < sharp > * zvec " and " ( q \ < bullet > xvec ) \ < sharp > * xvec "
and " ( q \ < bullet > xvec ) \ < sharp > * N " and " ( q \ < bullet > xvec ) \ < sharp > * P ' " and " ( q \ < bullet > xvec ) \ < sharp > * M "
and Sq : " ( set q ) \ < subseteq > ( set xvec ) \ < times > ( set ( q \ < bullet > xvec ) ) "
by ( rule_tac xvec = xvec and c = " ( P , xvec , yvec , zvec , N , M , P ' ) " in name_list_avoiding ) auto
with \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( q \ < bullet > xvec ) \ < rparr > \ < langle > ( q \ < bullet > N ) \ < rangle > \ < prec > ( q \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' residualInject )
hence " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * ( q \ < bullet > xvec ) \ < rparr > \ < langle > ( q \ < bullet > N ) \ < rangle > \ < prec > ( q \ < bullet > P ' ) "
using \ < open > ( q \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * zvec \ < close >
by ( rule Goal )
with \ < open > ( q \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P ' \ < close > Sq show ? thesis
by ( simp add : boundOutputChainAlpha ' ' residualInject )
qed
lemma outputSwapSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " x \ < sharp > P "
and " y \ < sharp > P "
and " x \ < sharp > \ < Psi > "
and " y \ < sharp > \ < Psi > "
shows " \ < Psi > \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule outputSwapFrameSubject )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > show ? thesis
by simp
qed
lemma outputPermSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and p : : " name prm "
and yvec : : " name list "
and zvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and S : " set p \ < subseteq > set yvec \ < times > set zvec "
and " yvec \ < sharp > * P "
and " zvec \ < sharp > * P "
and " yvec \ < sharp > * \ < Psi > "
and " zvec \ < sharp > * \ < Psi > "
shows " \ < Psi > \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from assms have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule_tac outputPermFrameSubject )
with S \ < open > yvec \ < sharp > * \ < Psi > \ < close > \ < open > zvec \ < sharp > * \ < Psi > \ < close > show ? thesis
by simp
qed
lemma outputSwapFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " x \ < sharp > P "
and " y \ < sharp > P "
and " x \ < sharp > M "
and " y \ < sharp > M "
shows " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule outputSwapFrameSubject )
with \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > show ? thesis
by simp
qed
lemma outputPermFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and p : : " name prm "
and yvec : : " name list "
and zvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and S : " set p \ < subseteq > set yvec \ < times > set zvec "
and " yvec \ < sharp > * P "
and " zvec \ < sharp > * P "
and " yvec \ < sharp > * M "
and " zvec \ < sharp > * M "
shows " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from assms have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule_tac outputPermFrameSubject )
with S \ < open > yvec \ < sharp > * M \ < close > \ < open > zvec \ < sharp > * M \ < close > show ? thesis
by simp
qed
lemma Comm1 :
fixes \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and K : : ' a
and xvec : : " name list "
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
assumes " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * K "
and " xvec \ < sharp > * P "
shows " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) "
proof -
{
fix \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and K : : ' a
and xvec : : " name list "
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
assume " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " distinct A \ < ^ sub > Q "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * K "
and " xvec \ < sharp > * P "
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) "
proof -
obtain r : : " name prm " where " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( r \ < bullet > xvec ) \ < sharp > * P " and " ( r \ < bullet > xvec ) \ < sharp > * Q " and " ( r \ < bullet > xvec ) \ < sharp > * M "
and " ( r \ < bullet > xvec ) \ < sharp > * K " and " ( r \ < bullet > xvec ) \ < sharp > * N " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * P ' " and " ( r \ < bullet > xvec ) \ < sharp > * Q ' " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sr : " ( set r ) \ < subseteq > ( set xvec ) \ < times > ( set ( r \ < bullet > xvec ) ) " and " distinctPerm r "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , Q , M , K , N , A \ < ^ sub > P , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , \ < Psi > \ < ^ sub > Q , P ' , Q ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sq : " set q \ < subseteq > set A \ < ^ sub > Q \ < times > set ( q \ < bullet > A \ < ^ sub > Q ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , K , r \ < bullet > N , r \ < bullet > xvec , \ < Psi > \ < ^ sub > Q , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , r \ < bullet > Q ' , r \ < bullet > P ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , M , r \ < bullet > N , r \ < bullet > xvec , A \ < ^ sub > Q , q \ < bullet > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , r \ < bullet > Q ' , r \ < bullet > P ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " by fact
have FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > " by fact
from \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > FrQ \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > FrP \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > Sr \ < open > distinctPerm r \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) "
by ( rule inputAlpha )
hence " ( q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close >
by ( rule_tac inputPermFrameSubject ) ( assumption | simp ) +
hence PTrans : " \ < Psi > \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > Sp \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
have FrP : " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > Sr \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
hence " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) \ < close >
by ( rule_tac outputPermFrameSubject ) ( assumption | auto )
hence QTrans : " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover hence " distinct ( r \ < bullet > xvec ) " by ( force dest : boundOutputDistinct )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > Sq \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
have FrQ : " extractFrame Q = \ < langle > ( q \ < bullet > A \ < ^ sub > Q ) , ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( q \ < bullet > A \ < ^ sub > Q ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < turnstile > ( p \ < bullet > q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > q \ < bullet > K ) "
by ( rule_tac chanEqClosed ) +
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > Sp Sq
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < turnstile > ( q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) " by ( simp add : eqvts freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( ( r \ < bullet > P ' ) \ < parallel > ( r \ < bullet > Q ' ) ) "
by ( rule_tac cComm1 )
with \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close > Sr
show ? thesis
by ( subst resChainAlpha ) auto
qed
}
note Goal = this
note \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close >
obtain A \ < ^ sub > P ' where " extractFrame P = \ < langle > A \ < ^ sub > P ' , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P ' " and " A \ < ^ sub > P ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > P ' \ < sharp > * P " and " A \ < ^ sub > P ' \ < sharp > * Q " and " A \ < ^ sub > P ' \ < sharp > * M " and " A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q "
by ( rule_tac C = " ( \ < Psi > , P , Q , M , A \ < ^ sub > Q ) " in distinctFrame ) auto
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q \ < close >
obtain A \ < ^ sub > Q ' where " extractFrame Q = \ < langle > A \ < ^ sub > Q ' , \ < Psi > \ < ^ sub > Q \ < rangle > " and " distinct A \ < ^ sub > Q ' " and " A \ < ^ sub > Q ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > Q ' \ < sharp > * P " and " A \ < ^ sub > Q ' \ < sharp > * Q " and " A \ < ^ sub > Q ' \ < sharp > * K " and " A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q ' "
apply ( rule_tac C = " ( \ < Psi > , P , Q , K , A \ < ^ sub > P ' ) " in distinctFrame ) by auto
ultimately show ? thesis using \ < open > xvec \ < sharp > * P \ < close >
by ( rule_tac Goal )
qed
lemma Comm2 :
fixes \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and K : : ' a
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
assumes " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * K "
and " xvec \ < sharp > * Q "
shows " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) "
proof -
{
fix \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and K : : ' a
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
assume " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " distinct A \ < ^ sub > Q "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * K "
and " xvec \ < sharp > * Q "
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) "
proof -
obtain r : : " name prm " where " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( r \ < bullet > xvec ) \ < sharp > * P " and " ( r \ < bullet > xvec ) \ < sharp > * Q " and " ( r \ < bullet > xvec ) \ < sharp > * M "
and " ( r \ < bullet > xvec ) \ < sharp > * K " and " ( r \ < bullet > xvec ) \ < sharp > * N " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * P ' " and " ( r \ < bullet > xvec ) \ < sharp > * Q ' " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sr : " ( set r ) \ < subseteq > ( set xvec ) \ < times > ( set ( r \ < bullet > xvec ) ) " and " distinctPerm r "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , Q , M , K , N , A \ < ^ sub > P , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , \ < Psi > \ < ^ sub > Q , P ' , Q ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sq : " set q \ < subseteq > set A \ < ^ sub > Q \ < times > set ( q \ < bullet > A \ < ^ sub > Q ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , K , r \ < bullet > N , r \ < bullet > xvec , \ < Psi > \ < ^ sub > Q , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , r \ < bullet > Q ' , r \ < bullet > P ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , M , r \ < bullet > N , r \ < bullet > xvec , A \ < ^ sub > Q , q \ < bullet > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , r \ < bullet > Q ' , r \ < bullet > P ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " by fact
have FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > " by fact
from \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > FrQ \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > FrP \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > Sr \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
hence " ( q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
by ( rule_tac outputPermFrameSubject ) ( assumption | auto )
hence PTrans : " \ < Psi > \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover hence " distinct ( r \ < bullet > xvec ) " by ( force dest : boundOutputDistinct )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > Sp \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
have FrP : " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > Sr \ < open > distinctPerm r \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) "
by ( rule inputAlpha )
hence " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close >
by ( rule_tac inputPermFrameSubject ) ( assumption | simp ) +
hence QTrans : " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > Sq \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
have FrQ : " extractFrame Q = \ < langle > ( q \ < bullet > A \ < ^ sub > Q ) , ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( q \ < bullet > A \ < ^ sub > Q ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < turnstile > ( p \ < bullet > q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > q \ < bullet > K ) "
by ( rule_tac chanEqClosed ) +
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > Sp Sq
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < turnstile > ( q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( simp add : eqvts freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( ( r \ < bullet > P ' ) \ < parallel > ( r \ < bullet > Q ' ) ) "
by ( rule_tac cComm2 )
with \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close > Sr
show ? thesis
by ( subst resChainAlpha ) auto
qed
}
note Goal = this
note \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close >
obtain A \ < ^ sub > P ' where " extractFrame P = \ < langle > A \ < ^ sub > P ' , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P ' " and " A \ < ^ sub > P ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > P ' \ < sharp > * P " and " A \ < ^ sub > P ' \ < sharp > * Q " and " A \ < ^ sub > P ' \ < sharp > * M " and " A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q "
by ( rule_tac C = " ( \ < Psi > , P , Q , M , A \ < ^ sub > Q ) " in distinctFrame ) auto
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q \ < close >
obtain A \ < ^ sub > Q ' where " extractFrame Q = \ < langle > A \ < ^ sub > Q ' , \ < Psi > \ < ^ sub > Q \ < rangle > " and " distinct A \ < ^ sub > Q ' " and " A \ < ^ sub > Q ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > Q ' \ < sharp > * P " and " A \ < ^ sub > Q ' \ < sharp > * Q " and " A \ < ^ sub > Q ' \ < sharp > * K " and " A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q ' "
by ( rule_tac C = " ( \ < Psi > , P , Q , K , A \ < ^ sub > P ' ) " in distinctFrame ) auto
ultimately show ? thesis using \ < open > xvec \ < sharp > * Q \ < close >
by ( rule_tac Goal )
qed
lemma semanticsCasesAux [ consumes 1 , case_names cInput cOutput cCase cPar1 cPar2 cComm1 cComm2 cOpen cScope cBang ] :
fixes \ < Psi > : : ' b
and cP : : " ( ' a , ' b , ' c ) psi "
and cRs : : " ( ' a , ' b , ' c ) residual "
and C : : " ' d : : fs_name "
and x : : name
assumes " \ < Psi > \ < rhd > cP \ < longmapsto > cRs "
and rInput : " \ < And > M K xvec N Tvec P . \ < lbrakk > cP = M \ < lparr > \ < lambda > * xvec N \ < rparr > . P ; cRs = K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > \ < prec > P [ xvec : : = Tvec ] ;
\ < Psi > \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ; set xvec \ < subseteq > supp N ; length xvec = length Tvec ;
xvec \ < sharp > * Tvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop "
and rOutput : " \ < And > M K N P . \ < lbrakk > cP = M \ < langle > N \ < rangle > . P ; cRs = K \ < langle > N \ < rangle > \ < prec > P ; \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < rbrakk > \ < Longrightarrow > Prop "
and rCase : " \ < And > Cs P \ < phi > . \ < lbrakk > cP = Cases Cs ; \ < Psi > \ < rhd > P \ < longmapsto > cRs ; ( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P \ < rbrakk > \ < Longrightarrow > Prop "
and rPar1 : " \ < And > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' Q A \ < ^ sub > Q . \ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < alpha > \ < prec > ( P ' \ < parallel > Q ) ;
( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( \ < alpha > \ < prec > P ' ) ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * P ' ; bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q ;
bn \ < alpha > \ < sharp > * Q ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * C ; distinct ( bn \ < alpha > ) \ < rbrakk > \ < Longrightarrow >
Prop "
and rPar2 : " \ < And > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' P A \ < ^ sub > P . \ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < alpha > \ < prec > ( P \ < parallel > Q ' ) ;
( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > P \ < sharp > * Q ' ; bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * Q ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * C ; distinct ( bn \ < alpha > ) \ < rbrakk > \ < Longrightarrow > Prop "
and rComm1 : " \ < And > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q .
\ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > P ' \ < parallel > Q ' ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ;
A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * Q ;
xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop "
and rComm2 : " \ < And > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q .
\ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > P ' \ < parallel > Q ' ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ;
A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * Q ;
xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop "
and rOpen : " \ < And > P M xvec yvec N P ' x .
\ < lbrakk > cP = \ < lparr > \ < nu > x \ < rparr > P ; cRs = M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ;
\ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; x \ < in > supp N ; x \ < sharp > xvec ; x \ < sharp > yvec ; x \ < sharp > M ; x \ < sharp > \ < Psi > ; distinct xvec ; distinct yvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * yvec ; yvec \ < sharp > * \ < Psi > ; yvec \ < sharp > * P ; yvec \ < sharp > * M ; xvec \ < sharp > * C ; x \ < sharp > C ; yvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop "
and rScope : " \ < And > P \ < alpha > P ' x . \ < lbrakk > cP = \ < lparr > \ < nu > x \ < rparr > P ; cRs = \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' ;
\ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; x \ < sharp > \ < Psi > ; x \ < sharp > \ < alpha > ; x \ < sharp > C ; bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * C ; distinct ( bn \ < alpha > ) \ < rbrakk > \ < Longrightarrow > Prop "
and rBang : " \ < And > P . \ < lbrakk > cP = ! P ; \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > cRs ; guarded P \ < rbrakk > \ < Longrightarrow > Prop "
shows Prop
using \ < open > \ < Psi > \ < rhd > cP \ < longmapsto > cRs \ < close >
proof ( cases rule : semantics . cases )
case ( cInput M K xvec N Tvec P )
obtain p : : " name prm " where " ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * K "
and " ( p \ < bullet > xvec ) \ < sharp > * Tvec " and " ( p \ < bullet > xvec ) \ < sharp > * P " and " ( p \ < bullet > xvec ) \ < sharp > * C "
and S : " ( set p ) \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) " and " distinctPerm p "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , M , K , N , P , C , Tvec ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
from \ < open > cP = M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > S
have " cP = M \ < lparr > \ < lambda > * ( p \ < bullet > xvec ) ( p \ < bullet > N ) \ < rparr > . ( p \ < bullet > P ) "
by ( simp add : inputChainAlpha ' )
moreover from \ < open > cRs = K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > \ < prec > P [ xvec : : = Tvec ] \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > S \ < open > length xvec = length Tvec \ < close > \ < open > distinctPerm p \ < close >
have " cRs = K \ < lparr > ( ( p \ < bullet > N ) [ ( p \ < bullet > xvec ) : : = Tvec ] ) \ < rparr > \ < prec > ( p \ < bullet > P ) [ ( p \ < bullet > xvec ) : : = Tvec ] "
by ( auto simp add : substTerm . renaming renaming residualInject )
moreover note \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > distinct xvec \ < close > have " distinct ( p \ < bullet > xvec ) "
by simp
moreover from \ < open > ( set xvec ) \ < subseteq > ( supp N ) \ < close > have " ( p \ < bullet > ( set xvec ) ) \ < subseteq > ( p \ < bullet > ( supp N ) ) "
by simp
hence " set ( p \ < bullet > xvec ) \ < subseteq > supp ( p \ < bullet > N ) "
by ( simp add : eqvts )
moreover from \ < open > length xvec = length Tvec \ < close > have " length ( p \ < bullet > xvec ) = length Tvec "
by simp
ultimately show ? thesis using \ < open > ( p \ < bullet > xvec ) \ < sharp > * Tvec \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * K \ < close >
\ < open > ( p \ < bullet > xvec ) \ < sharp > * C \ < close >
by ( rule rInput )
next
case ( Output M K N P )
thus ? thesis by ( rule rOutput )
next
case ( Case P \ < phi > Cs )
thus ? thesis by ( rule rCase )
next
case ( cPar1 \ < Psi > \ < ^ sub > Q P \ < alpha > P ' Q A \ < ^ sub > Q )
obtain q : : " name prm " where " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q "
and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > Q " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P ' " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and " distinctPerm q "
and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > set ( bn \ < alpha > ) \ < times > ( set ( bn ( q \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , Q , \ < alpha > , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , P ' , C ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q "
and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' "
and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C "
and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > Q ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > Q ) ) " and " distinctPerm p "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , \ < alpha > , q \ < bullet > \ < alpha > , P ' , ( q \ < bullet > P ' ) , \ < Psi > \ < ^ sub > Q , C ) " in name_list_avoiding ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > Q \ < close > Sq \ < open > distinctPerm q \ < close > have " A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ q ] ) ( simp add : eqvts )
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinctPerm q \ < close > have " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ q ] ) ( simp add : eqvts )
from \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinctPerm q \ < close > have " distinct ( bn ( q \ < bullet > \ < alpha > ) ) "
by ( subst distinctClosed [ symmetric , of _ q ] ) ( simp add : eqvts )
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from \ < open > cRs = \ < alpha > \ < prec > ( P ' \ < parallel > Q ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P ' \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > Sq
have " cRs = ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) \ < parallel > Q "
by ( force simp add : residualAlpha )
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P ' \ < close > Sq
have Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) "
by ( force simp add : residualAlpha )
hence " A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > P ' ) " using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
by ( drule_tac freeFreshChainDerivative ) auto
from Trans have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > ( p \ < bullet > P ) \ < longmapsto > p \ < bullet > ( ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) ) "
by ( rule semantics . eqvt )
with \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > P ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) \ < close > Sp
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) " by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sp have " extractFrame Q = \ < langle > ( p \ < bullet > A \ < ^ sub > Q ) , ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha ' eqvts )
moreover from \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > Sp have " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshAlphaPerm )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > Q ) " by simp
ultimately show ? thesis
using \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close >
\ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * C \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close >
by ( rule_tac rPar1 )
next
case ( cPar2 \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' P A \ < ^ sub > P )
obtain q : : " name prm " where " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q "
and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > P " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q ' " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > P "
and " distinctPerm q "
and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > set ( bn \ < alpha > ) \ < times > ( set ( bn ( q \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , Q , \ < alpha > , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , Q ' , C ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C "
and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) " and " distinctPerm p "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , \ < alpha > , q \ < bullet > \ < alpha > , Q ' , ( q \ < bullet > Q ' ) , \ < Psi > \ < ^ sub > P , C ) " in name_list_avoiding ) auto
from \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > P \ < close > Sq \ < open > distinctPerm q \ < close > have " A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ q ] ) ( simp add : eqvts )
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinctPerm q \ < close > have " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ q ] ) ( simp add : eqvts )
from \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinctPerm q \ < close > have " distinct ( bn ( q \ < bullet > \ < alpha > ) ) "
by ( subst distinctClosed [ symmetric , of _ q ] ) ( simp add : eqvts )
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from \ < open > cRs = \ < alpha > \ < prec > ( P \ < parallel > Q ' ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q ' \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > Sq
have " cRs = ( q \ < bullet > \ < alpha > ) \ < prec > P \ < parallel > ( q \ < bullet > Q ' ) "
by ( force simp add : residualAlpha )
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q ' \ < close > Sq
have Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) "
by ( force simp add : residualAlpha )
hence " A \ < ^ sub > P \ < sharp > * ( q \ < bullet > Q ' ) " using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
by ( drule_tac freeFreshChainDerivative ) auto
from Trans have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > ( p \ < bullet > Q ) \ < longmapsto > p \ < bullet > ( ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) ) "
by ( rule semantics . eqvt )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > Q ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) \ < close > Sp
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) " by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha ' eqvts )
moreover from \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > Sp have " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshAlphaPerm )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
ultimately show ? thesis
using \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close >
\ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * C \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close >
by ( rule_tac rPar2 )
next
case ( cComm1 \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q )
obtain r : : " name prm " where " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( r \ < bullet > xvec ) \ < sharp > * P " and " ( r \ < bullet > xvec ) \ < sharp > * Q " and " ( r \ < bullet > xvec ) \ < sharp > * M "
and " ( r \ < bullet > xvec ) \ < sharp > * K " and " ( r \ < bullet > xvec ) \ < sharp > * N " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * P ' " and " ( r \ < bullet > xvec ) \ < sharp > * Q ' " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * C " and Sr : " ( set r ) \ < subseteq > ( set xvec ) \ < times > ( set ( r \ < bullet > xvec ) ) " and " distinctPerm r "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , Q , M , K , N , A \ < ^ sub > P , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , \ < Psi > \ < ^ sub > Q , P ' , Q ' , C ) " in name_list_avoiding )
( auto simp add : eqvts )
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * N " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q ' " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > ( set A \ < ^ sub > Q ) \ < times > ( set ( q \ < bullet > A \ < ^ sub > Q ) ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , K , N , xvec , r \ < bullet > xvec , \ < Psi > \ < ^ sub > Q , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , Q ' , P ' , C ) " in name_list_avoiding ) clarsimp
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * N " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P ' " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , M , N , xvec , r \ < bullet > xvec , A \ < ^ sub > Q , q \ < bullet > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , Q ' , P ' , C ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " by fact
have FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > " by fact
from \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > FrQ \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > FrP \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( drule_tac extractFrameFreshChain ) auto
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close > have " ( r \ < bullet > xvec ) \ < sharp > * ( P ' \ < parallel > Q ' ) "
by simp
with \ < open > cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > Sr
have " cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( r \ < bullet > ( P ' \ < parallel > Q ' ) ) " by ( simp add : resChainAlpha residualInject )
hence " cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( ( r \ < bullet > P ' ) \ < parallel > ( r \ < bullet > Q ' ) ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > Sr \ < open > distinctPerm r \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) "
by ( rule inputAlpha )
hence " ( q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close >
by ( rule_tac inputPermFrameSubject ) ( assumption | simp ) +
hence PTrans : " \ < Psi > \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > Sp \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
have FrP : " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > Sr \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) "
by ( simp add : boundOutputChainAlpha ' ' residualInject )
hence " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close >
by ( rule_tac outputPermFrameSubject ) ( assumption | auto )
hence QTrans : " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > Sq \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
have FrQ : " extractFrame Q = \ < langle > ( q \ < bullet > A \ < ^ sub > Q ) , ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( q \ < bullet > A \ < ^ sub > Q ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < turnstile > ( p \ < bullet > q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > q \ < bullet > K ) "
by ( rule_tac chanEqClosed ) +
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > Sp Sq
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < turnstile > ( q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( simp add : eqvts freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * N \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P ' \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * N \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q ' \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * C \ < close >
moreover from \ < open > distinct xvec \ < close > have " distinct ( r \ < bullet > xvec ) " by simp
ultimately show ? thesis by ( rule rComm1 )
next
case ( cComm2 \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q )
obtain r : : " name prm " where " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( r \ < bullet > xvec ) \ < sharp > * P " and " ( r \ < bullet > xvec ) \ < sharp > * Q " and " ( r \ < bullet > xvec ) \ < sharp > * M "
and " ( r \ < bullet > xvec ) \ < sharp > * K " and " ( r \ < bullet > xvec ) \ < sharp > * N " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * P ' " and " ( r \ < bullet > xvec ) \ < sharp > * Q ' " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * C " and Sr : " ( set r ) \ < subseteq > ( set xvec ) \ < times > ( set ( r \ < bullet > xvec ) ) " and " distinctPerm r "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , Q , M , K , N , A \ < ^ sub > P , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , \ < Psi > \ < ^ sub > Q , P ' , Q ' , C ) " in name_list_avoiding )
( auto simp add : eqvts )
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * N " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q ' " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > ( set A \ < ^ sub > Q ) \ < times > ( set ( q \ < bullet > A \ < ^ sub > Q ) ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , K , N , xvec , r \ < bullet > xvec , \ < Psi > \ < ^ sub > Q , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , Q ' , P ' , C ) " in name_list_avoiding ) clarsimp
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * N " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P ' " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , M , N , xvec , r \ < bullet > xvec , A \ < ^ sub > Q , q \ < bullet > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , Q ' , P ' , C ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " by fact
have FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > " by fact
from \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > FrQ \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > FrP \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( drule_tac extractFrameFreshChain ) auto
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close > have " ( r \ < bullet > xvec ) \ < sharp > * ( P ' \ < parallel > Q ' ) "
by simp
with \ < open > cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > Sr
have " cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( r \ < bullet > ( P ' \ < parallel > Q ' ) ) " by ( simp add : resChainAlpha residualInject )
hence " cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( ( r \ < bullet > P ' ) \ < parallel > ( r \ < bullet > Q ' ) ) "
by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > Sr \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " by ( simp add : boundOutputChainAlpha ' ' residualInject )
hence " ( q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close >
by ( rule_tac outputPermFrameSubject ) ( assumption | auto )
hence PTrans : " \ < Psi > \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > Sp \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
have FrP : " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > Sr \ < open > distinctPerm r \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " by ( rule inputAlpha )
hence " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close >
by ( rule_tac inputPermFrameSubject ) ( assumption | simp ) +
hence QTrans : " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > Sq \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
have FrQ : " extractFrame Q = \ < langle > ( q \ < bullet > A \ < ^ sub > Q ) , ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( q \ < bullet > A \ < ^ sub > Q ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < turnstile > ( p \ < bullet > q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > q \ < bullet > K ) "
by ( rule_tac chanEqClosed ) +
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > Sp Sq
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < turnstile > ( q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( simp add : eqvts freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * N \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P ' \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * N \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q ' \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * C \ < close >
moreover from \ < open > distinct xvec \ < close > have " distinct ( r \ < bullet > xvec ) " by simp
ultimately show ? thesis by ( rule rComm2 )
next
case ( cOpen P M xvec yvec N P ' x )
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > have " distinct ( xvec @ yvec ) " by ( force dest : boundOutputDistinct )
hence " xvec \ < sharp > * yvec " by ( induct xvec ) auto
obtain p where " ( p \ < bullet > yvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > yvec ) \ < sharp > * P " and " ( p \ < bullet > yvec ) \ < sharp > * M "
and " ( p \ < bullet > yvec ) \ < sharp > * yvec " and " ( p \ < bullet > yvec ) \ < sharp > * N " and " ( p \ < bullet > yvec ) \ < sharp > * P ' "
and " x \ < sharp > ( p \ < bullet > yvec ) " and " ( p \ < bullet > yvec ) \ < sharp > * xvec "
and " ( p \ < bullet > yvec ) \ < sharp > * C " and Sp : " ( set p ) \ < subseteq > ( set yvec ) \ < times > ( set ( p \ < bullet > yvec ) ) "
by ( rule_tac xvec = yvec and c = " ( \ < Psi > , P , M , xvec , yvec , N , P ' , x , C ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain q where " ( q \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > xvec ) \ < sharp > * P " and " ( q \ < bullet > xvec ) \ < sharp > * M "
and " ( q \ < bullet > xvec ) \ < sharp > * xvec " and " ( q \ < bullet > xvec ) \ < sharp > * N " and " ( q \ < bullet > xvec ) \ < sharp > * P ' "
and " x \ < sharp > ( q \ < bullet > xvec ) " and " ( q \ < bullet > xvec ) \ < sharp > * yvec "
and " ( q \ < bullet > xvec ) \ < sharp > * p " and " ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) "
and " ( q \ < bullet > xvec ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > ( set xvec ) \ < times > ( set ( q \ < bullet > xvec ) ) "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , M , xvec , yvec , p \ < bullet > yvec , N , P ' , x , p , C ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain y : : name where " y \ < sharp > P " and " y \ < sharp > C " and " y \ < sharp > xvec " and " y \ < sharp > yvec " and " y \ < noteq > x " and " y \ < sharp > N "
and " y \ < sharp > ( q \ < bullet > xvec ) " and " y \ < sharp > ( p \ < bullet > yvec ) " and " y \ < sharp > M " and " y \ < sharp > \ < Psi > " and " y \ < sharp > P ' "
by ( generate_fresh " name " ) ( auto simp add : freshChainSimps )
from \ < open > cP = \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > y \ < sharp > P \ < close > have " cP = \ < lparr > \ < nu > y \ < rparr > ( [ ( x , y ) ] \ < bullet > P ) " by ( simp add : alphaRes )
moreover have " cRs = M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ y # ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( q @ ( x , y ) # p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ ( x , y ) # p ) \ < bullet > P ' ) "
proof -
note \ < open > cRs = M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover have " \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > N \ < prec > ' P ' = \ < lparr > \ < nu > * xvec \ < rparr > ( \ < lparr > \ < nu > x \ < rparr > ( \ < lparr > \ < nu > * yvec \ < rparr > N \ < prec > ' P ' ) ) " by ( simp add : boundOutputApp )
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * P ' \ < close > Sp have " \ < dots > = \ < lparr > \ < nu > * xvec \ < rparr > ( \ < lparr > \ < nu > x \ < rparr > ( \ < lparr > \ < nu > * ( p \ < bullet > yvec ) \ < rparr > ( p \ < bullet > N ) \ < prec > ' ( p \ < bullet > P ' ) ) ) "
by ( simp add : boundOutputChainAlpha ' ' )
moreover with \ < open > y \ < sharp > N \ < close > \ < open > y \ < sharp > P ' \ < close > \ < open > y \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > y \ < sharp > yvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > Sp
have " \ < dots > = \ < lparr > \ < nu > * xvec \ < rparr > ( \ < lparr > \ < nu > y \ < rparr > ( \ < lparr > \ < nu > * ( p \ < bullet > yvec ) \ < rparr > ( ( [ ( x , y ) ] \ < bullet > p \ < bullet > N ) \ < prec > ' ( [ ( x , y ) ] \ < bullet > p \ < bullet > P ' ) ) ) ) "
by ( subst alphaBoundOutput [ where y = y ] ) ( simp add : freshChainSimps eqvts ) +
moreover hence " \ < dots > = \ < lparr > \ < nu > * xvec \ < rparr > ( \ < lparr > \ < nu > y \ < rparr > ( \ < lparr > \ < nu > * ( p \ < bullet > yvec ) \ < rparr > ( ( ( ( x , y ) # p ) \ < bullet > N ) \ < prec > ' ( ( ( x , y ) # p ) \ < bullet > P ' ) ) ) ) "
by simp
moreover from \ < open > ( q \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close >
\ < open > y \ < sharp > xvec \ < close > \ < open > y \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > Sp Sq
have " \ < dots > = \ < lparr > \ < nu > * ( q \ < bullet > xvec ) \ < rparr > ( \ < lparr > \ < nu > y \ < rparr > ( \ < lparr > \ < nu > * ( p \ < bullet > yvec ) \ < rparr > ( ( q \ < bullet > ( ( x , y ) # p ) \ < bullet > N ) \ < prec > ' ( q \ < bullet > ( ( x , y ) # p ) \ < bullet > P ' ) ) ) ) "
apply ( subst boundOutputChainAlpha [ where p = q and xvec = xvec and yvec = " xvec " ] )
defer
apply assumption
apply simp
apply ( simp add : eqvts )
apply ( simp add : eqvts )
apply ( simp add : boundOutputFreshSet ( 4 ) )
apply ( rule conjI )
apply ( simp add : freshChainSimps )
apply ( simp add : freshChainSimps )
done
moreover hence " \ < dots > = \ < lparr > \ < nu > * ( q \ < bullet > xvec @ y # ( p \ < bullet > yvec ) ) \ < rparr > ( ( q @ ( x , y ) # p ) \ < bullet > N ) \ < prec > ' ( ( q @ ( x , y ) # p ) \ < bullet > P ' ) "
by ( simp only : pt2 [ OF pt_name_inst ] boundOutputApp BOresChain . simps )
ultimately show ? thesis
by ( simp only : residualInject )
qed
moreover have " \ < Psi > \ < rhd > ( [ ( x , y ) ] \ < bullet > P ) \ < longmapsto > M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( q @ ( x , y ) # p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ ( x , y ) # p ) \ < bullet > P ' ) "
proof -
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * N \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " ( ( q @ p ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * N " apply ( simp only : eqvts ) apply ( simp only : pt2 [ OF pt_name_inst ] )
by simp
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * P ' \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " ( ( q @ p ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * P ' " by ( simp del : freshAlphaPerm add : eqvts pt2 [ OF pt_name_inst ] )
moreover from Sp Sq \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close >
have Spq : " set ( q @ p ) \ < subseteq > set ( xvec @ yvec ) \ < times > set ( ( q @ p ) \ < bullet > ( xvec @ yvec ) ) "
by ( simp add : pt2 [ OF pt_name_inst ] eqvts ) blast
ultimately have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( q @ p ) \ < bullet > ( xvec @ yvec ) ) \ < rparr > \ < langle > ( ( q @ p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ p ) \ < bullet > P ' ) "
apply ( simp only : residualInject )
by ( erule_tac rev_mp ) ( subst boundOutputChainAlpha , auto )
with Sp Sq \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( q @ p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ p ) \ < bullet > P ' ) "
by ( simp add : eqvts pt2 [ OF pt_name_inst ] del : freshAlphaPerm )
hence " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > ( [ ( x , y ) ] \ < bullet > P ) \ < longmapsto > [ ( x , y ) ] \ < bullet > ( M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( q @ p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ p ) \ < bullet > P ' ) ) "
by ( rule semantics . eqvt )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > y \ < sharp > xvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > y \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > y \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > y \ < sharp > ( p \ < bullet > yvec ) \ < close > Sp Sq
show ? thesis
apply ( simp add : eqvts pt2 [ OF pt_name_inst ] )
by ( subst perm_compose [ of q ] , simp ) +
qed
moreover from \ < open > x \ < in > supp N \ < close > have " ( ( q @ ( x , y ) # p ) \ < bullet > x ) \ < in > ( ( q @ ( x , y ) # p ) \ < bullet > ( supp N ) ) "
by ( simp add : pt_set_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > y \ < sharp > xvec \ < close > \ < open > y \ < sharp > ( q \ < bullet > xvec ) \ < close > Sp Sq
have " y \ < in > supp ( ( q @ ( x , y ) # p ) \ < bullet > N ) " by ( simp add : pt2 [ OF pt_name_inst ] calc_atm eqvts )
moreover from \ < open > distinct xvec \ < close > have " distinct ( q \ < bullet > xvec ) " by simp
moreover from \ < open > distinct yvec \ < close > have " distinct ( p \ < bullet > yvec ) " by simp
moreover note \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > \ < Psi > \ < close >
\ < open > ( q \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close >
\ < open > ( p \ < bullet > yvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * M \ < close > \ < open > y \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > y \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > y \ < sharp > M \ < close > \ < open > y \ < sharp > C \ < close > \ < open > y \ < sharp > \ < Psi > \ < close >
\ < open > ( p \ < bullet > yvec ) \ < sharp > * C \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * C \ < close >
ultimately show Prop by ( rule_tac rOpen ) ( assumption | simp ) +
next
case ( cScope P \ < alpha > P ' x )
obtain p : : " name prm " where " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P ' " and " x \ < sharp > bn ( p \ < bullet > \ < alpha > ) "
and " distinctPerm p "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * C " and Sp : " ( set p ) \ < subseteq > set ( bn \ < alpha > ) \ < times > ( set ( bn ( p \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , \ < alpha > , x , P ' , C ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain y : : name where " y \ < sharp > \ < Psi > " and " y \ < sharp > P " and " y \ < sharp > ( p \ < bullet > P ' ) " and " y \ < sharp > ( p \ < bullet > \ < alpha > ) " and " y \ < sharp > C "
by ( generate_fresh " name " ) ( auto simp add : freshChainSimps simp del : actionFresh )
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinctPerm p \ < close > have " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * subject ( p \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ p ] ) ( simp add : eqvts )
from \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " distinct ( bn ( p \ < bullet > \ < alpha > ) ) "
by ( subst distinctClosed [ symmetric , of _ p ] ) ( simp add : eqvts )
from \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) \ < close > \ < open > distinctPerm p \ < close > Sp have " x \ < sharp > ( p \ < bullet > \ < alpha > ) "
by ( subst fresh_bij [ symmetric , of _ _ p ] ) ( simp add : eqvts freshChainSimps )
moreover from \ < open > cP = \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > y \ < sharp > P \ < close > have " cP = \ < lparr > \ < nu > y \ < rparr > ( [ ( x , y ) ] \ < bullet > P ) " by ( simp add : alphaRes )
moreover from \ < open > cRs = \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > x \ < sharp > bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P ' \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > Sp
have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > x \ < rparr > ( p \ < bullet > P ' ) "
by ( force simp add : residualAlpha )
with \ < open > y \ < sharp > ( p \ < bullet > P ' ) \ < close > have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > y \ < rparr > ( [ ( x , y ) ] \ < bullet > p \ < bullet > P ' ) "
by ( simp add : alphaRes )
moreover from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P ' \ < close > Sp
have " \ < Psi > \ < rhd > P \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) " by ( force simp add : residualAlpha )
hence " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > ( [ ( x , y ) ] \ < bullet > P ) \ < longmapsto > [ ( x , y ) ] \ < bullet > ( ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) ) "
by ( rule eqvts )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > ( p \ < bullet > \ < alpha > ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > \ < alpha > ) \ < close > Sp \ < open > distinctPerm p \ < close >
have " \ < Psi > \ < rhd > ( [ ( x , y ) ] \ < bullet > P ) \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( [ ( x , y ) ] \ < bullet > p \ < bullet > P ' ) "
by ( simp add : eqvts )
moreover from \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * P \ < close > \ < open > y \ < sharp > ( p \ < bullet > \ < alpha > ) \ < close > \ < open > y \ < sharp > P \ < close > have " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > P ) "
by ( auto simp add : fresh_star_def fresh_left calc_atm ) ( simp add : fresh_def name_list_supp )
moreover from \ < open > distinct ( bn \ < alpha > ) \ < close > have " distinct ( p \ < bullet > bn \ < alpha > ) " by simp
hence " distinct ( bn ( p \ < bullet > \ < alpha > ) ) " by ( simp add : eqvts )
ultimately show ? thesis
using \ < open > y \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > ( p \ < bullet > \ < alpha > ) \ < close > \ < open > y \ < sharp > C \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * subject ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * C \ < close >
by ( rule_tac rScope )
next
case ( Bang P )
thus ? thesis by ( rule_tac rBang )
qed
nominal_primrec
inputLength : : " ( ' a : : fs_name , ' b : : fs_name , ' c : : fs_name ) psi \ < Rightarrow > nat "
and inputLength ' : : " ( ' a : : fs_name , ' b : : fs_name , ' c : : fs_name ) input \ < Rightarrow > nat "
and inputLength ' ' : : " ( ' a : : fs_name , ' b : : fs_name , ' c : : fs_name ) psiCase \ < Rightarrow > nat "
where
" inputLength ( \ < zero > ) = 0 "
| " inputLength ( M \ < langle > N \ < rangle > . P ) = 0 "
| " inputLength ( M \ < lparr > I ) = inputLength ' I "
| " inputLength ( Case C ) = 0 "
| " inputLength ( P \ < parallel > Q ) = 0 "
| " inputLength ( \ < lparr > \ < nu > x \ < rparr > P ) = 0 "
| " inputLength ( \ < lbrace > \ < Psi > \ < rbrace > ) = 0 "
| " inputLength ( ! P ) = 0 "
| " inputLength ' ( Trm M P ) = 0 "
| " inputLength ' ( \ < nu > y I ) = 1 + ( inputLength ' I ) "
| " inputLength ' ' ( \ < bottom > \ < ^ sub > c ) = 0 "
| " inputLength ' ' ( \ < box > \ < Phi > \ < Rightarrow > P C ) = 0 "
apply ( finite_guess ) +
apply ( rule TrueI ) +
by ( fresh_guess add : fresh_nat ) +
nominal_primrec boundOutputLength : : " ( ' a , ' b , ' c ) boundOutput \ < Rightarrow > nat "
where
" boundOutputLength ( BOut M P ) = 0 "
| " boundOutputLength ( BStep x B ) = ( boundOutputLength B ) + 1 "
apply ( finite_guess ) +
apply ( rule TrueI ) +
by ( fresh_guess add : fresh_nat ) +
nominal_primrec residualLength : : " ( ' a , ' b , ' c ) residual \ < Rightarrow > nat "
where
" residualLength ( RIn M N P ) = 0 "
| " residualLength ( ROut M B ) = boundOutputLength B "
| " residualLength ( RTau P ) = 0 "
by ( rule TrueI ) +
lemma inputLengthProc [ simp ] :
shows " inputLength ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P ) = length xvec "
by ( induct xvec ) auto
lemma boundOutputLengthSimp [ simp ] :
shows " residualLength ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ) = length xvec "
by ( induct xvec ) ( auto simp add : residualInject )
lemma boundOuputLengthSimp2 [ simp ] :
shows " residualLength ( \ < alpha > \ < prec > P ) = length ( bn \ < alpha > ) "
by ( nominal_induct \ < alpha > rule : action . strong_induct , auto ) ( auto simp add : residualInject )
lemmas [ simp del ] = inputLength_inputLength ' _ inputLength ' ' . simps residualLength . simps boundOutputLength . simps
lemma constructPerm :
fixes xvec : : " name list "
and yvec : : " name list "
assumes " length xvec = length yvec "
and " xvec \ < sharp > * yvec "
and " distinct xvec "
and " distinct yvec "
obtains p where " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) " and " distinctPerm p " and " yvec = p \ < bullet > xvec "
proof -
assume " \ < And > p . \ < lbrakk > set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) ; distinctPerm p ; yvec = p \ < bullet > xvec \ < rbrakk > \ < Longrightarrow > thesis "
moreover obtain n where " n = length xvec " by auto
with assms have " \ < exists > p . ( set p ) \ < subseteq > ( set xvec ) \ < times > set ( yvec ) \ < and > distinctPerm p \ < and > yvec = p \ < bullet > xvec "
proof ( induct n arbitrary : xvec yvec )
case ( 0 xvec yvec )
thus ? case by simp
next
case ( Suc n xvec yvec )
from \ < open > Suc n = length xvec \ < close >
obtain x xvec ' where " xvec = x # xvec ' " and " length xvec ' = n "
by ( case_tac xvec ) auto
from \ < open > length xvec = length yvec \ < close > \ < open > xvec = x # xvec ' \ < close >
obtain y yvec ' where " length xvec ' = length yvec ' " and " yvec = y # yvec ' "
by ( case_tac yvec ) auto
from \ < open > xvec = x # xvec ' \ < close > \ < open > yvec = y # yvec ' \ < close > \ < open > xvec \ < sharp > * yvec \ < close >
have " x \ < noteq > y " and " xvec ' \ < sharp > * yvec ' " and " x \ < sharp > yvec ' " and " y \ < sharp > xvec ' "
by ( auto simp add : fresh_list_cons )
from \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close > \ < open > xvec = x # xvec ' \ < close > \ < open > yvec = y # yvec ' \ < close > have " x \ < sharp > xvec ' " and " y \ < sharp > yvec ' " and " distinct xvec ' " and " distinct yvec ' "
by simp +
from \ < open > Suc n = length xvec \ < close > \ < open > xvec = x # xvec ' \ < close > have " n = length xvec ' " by simp
with \ < open > length xvec ' = length yvec ' \ < close > \ < open > xvec ' \ < sharp > * yvec ' \ < close > \ < open > distinct xvec ' \ < close > \ < open > distinct yvec ' \ < close >
obtain p where S : " set p \ < subseteq > set xvec ' \ < times > set yvec ' " and " distinctPerm p " and " yvec ' = p \ < bullet > xvec ' "
by ( drule_tac Suc ) auto
from S have " set ( ( x , y ) # p ) \ < subseteq > set ( x # xvec ' ) \ < times > set ( y # yvec ' ) " by auto
moreover from \ < open > x \ < sharp > xvec ' \ < close > \ < open > x \ < sharp > yvec ' \ < close > \ < open > y \ < sharp > xvec ' \ < close > \ < open > y \ < sharp > yvec ' \ < close > S have " x \ < sharp > p " and " y \ < sharp > p "
apply ( induct p )
by ( auto simp add : fresh_list_nil fresh_list_cons fresh_prod name_list_supp ) ( auto simp add : fresh_def )
with S \ < open > distinctPerm p \ < close > \ < open > x \ < noteq > y \ < close > have " distinctPerm ( ( x , y ) # p ) " by auto
moreover from \ < open > yvec ' = p \ < bullet > xvec ' \ < close > \ < open > x \ < sharp > p \ < close > \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > xvec ' \ < close > \ < open > y \ < sharp > xvec ' \ < close > have " ( y # yvec ' ) = ( ( x , y ) # p ) \ < bullet > ( x # xvec ' ) "
by ( simp add : calc_atm freshChainSimps )
ultimately show ? case using \ < open > xvec = x # xvec ' \ < close > \ < open > yvec = y # yvec ' \ < close >
by blast
qed
ultimately show ? thesis by blast
qed
lemma distinctApend [ simp ] :
fixes xvec : : " name list "
and yvec : : " name list "
shows " ( set xvec \ < inter > set yvec = { } ) = xvec \ < sharp > * yvec "
by ( auto simp add : fresh_star_def name_list_supp fresh_def )
lemma lengthAux :
fixes xvec : : " name list "
and y : : name
and yvec : : " name list "
assumes " length xvec = length ( y # yvec ) "
obtains z zvec where " xvec = z # zvec " and " length zvec = length yvec "
using assms
by ( induct xvec arbitrary : yvec y ) auto
lemma lengthAux2 :
fixes xvec : : " name list "
and yvec : : " name list "
and zvec : : " name list "
assumes " length xvec = length ( yvec @ y # zvec ) "
obtains xvec1 x xvec2 where " xvec = xvec1 @ x # xvec2 " and " length xvec1 = length yvec " and " length xvec2 = length zvec "
proof -
assume " \ < And > xvec1 x xvec2 .
\ < lbrakk > xvec = xvec1 @ x # xvec2 ; length xvec1 = length yvec ;
length xvec2 = length zvec \ < rbrakk >
\ < Longrightarrow > thesis "
moreover from assms have " \ < exists > xvec1 x xvec2 . xvec = xvec1 @ x # xvec2 \ < and > length xvec1 = length yvec \ < and > length xvec2 = length zvec "
apply ( rule_tac x = " take ( length yvec ) xvec " in exI )
apply ( rule_tac x = " hd ( drop ( length yvec ) xvec ) " in exI )
apply ( rule_tac x = " tl ( drop ( length yvec ) xvec ) " in exI )
by auto
ultimately show ? thesis by blast
qed
lemma semanticsCases [ consumes 11 , case_names cInput cCase cPar1 cPar2 cComm1 cComm2 cScope cBang ] :
fixes \ < Psi > : : ' b
and cP : : " ( ' a , ' b , ' c ) psi "
and cRs : : " ( ' a , ' b , ' c ) residual "
and C : : " ' d : : fs_name "
and x1 : : name
and x2 : : name
and xvec1 : : " name list "
and xvec2 : : " name list "
and xvec3 : : " name list "
and xvec4 : : " name list "
and xvec5 : : " name list "
assumes " \ < Psi > \ < rhd > cP \ < longmapsto > cRs "
and " length xvec1 = inputLength cP " and " distinct xvec1 "
and " length xvec2 = residualLength cRs " and " distinct xvec2 "
and " length xvec3 = residualLength cRs " and " distinct xvec3 "
and " length xvec4 = residualLength cRs " and " distinct xvec4 "
and " length xvec5 = residualLength cRs " and " distinct xvec5 "
and rInput : " \ < And > M K N Tvec P . ( \ < lbrakk > xvec1 \ < sharp > * \ < Psi > ; xvec1 \ < sharp > * cP ; xvec1 \ < sharp > * cRs \ < rbrakk > \ < Longrightarrow > cP = M \ < lparr > \ < lambda > * xvec1 N \ < rparr > . P \ < and > cRs = K \ < lparr > ( N [ xvec1 : : = Tvec ] ) \ < rparr > \ < prec > P [ xvec1 : : = Tvec ] \ < and >
\ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < and > distinct xvec1 \ < and > set xvec1 \ < subseteq > supp N \ < and > length xvec1 = length Tvec \ < and >
xvec1 \ < sharp > * Tvec \ < and > xvec1 \ < sharp > * \ < Psi > \ < and > xvec1 \ < sharp > * M \ < and > xvec1 \ < sharp > * K ) \ < Longrightarrow > Prop "
and rOutput : " \ < And > M K N P . \ < lbrakk > cP = M \ < langle > N \ < rangle > . P ; cRs = K \ < langle > N \ < rangle > \ < prec > P ; \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < rbrakk > \ < Longrightarrow > Prop "
and rCase : " \ < And > Cs P \ < phi > . \ < lbrakk > cP = Cases Cs ; \ < Psi > \ < rhd > P \ < longmapsto > cRs ; ( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P \ < rbrakk > \ < Longrightarrow > Prop "
and rPar1 : " \ < And > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' Q A \ < ^ sub > Q . ( \ < lbrakk > xvec2 \ < sharp > * \ < Psi > ; xvec2 \ < sharp > * cP ; xvec2 \ < sharp > * cRs \ < rbrakk > \ < Longrightarrow >
cP = P \ < parallel > Q \ < and > cRs = \ < alpha > \ < prec > ( P ' \ < parallel > Q ) \ < and > xvec2 = bn \ < alpha > \ < and >
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < and > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < and > distinct A \ < ^ sub > Q \ < and >
A \ < ^ sub > Q \ < sharp > * P \ < and > A \ < ^ sub > Q \ < sharp > * Q \ < and > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < and > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < and > A \ < ^ sub > Q \ < sharp > * P ' \ < and > A \ < ^ sub > Q \ < sharp > * C ) \ < Longrightarrow > Prop "
and rPar2 : " \ < And > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' P A \ < ^ sub > P . ( \ < lbrakk > xvec3 \ < sharp > * \ < Psi > ; xvec3 \ < sharp > * cP ; xvec3 \ < sharp > * cRs \ < rbrakk > \ < Longrightarrow >
cP = P \ < parallel > Q \ < and > cRs = \ < alpha > \ < prec > ( P \ < parallel > Q ' ) \ < and > xvec3 = bn \ < alpha > \ < and >
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < and > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < and > distinct A \ < ^ sub > P \ < and >
A \ < ^ sub > P \ < sharp > * P \ < and > A \ < ^ sub > P \ < sharp > * Q \ < and > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < and > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < and > A \ < ^ sub > P \ < sharp > * Q ' \ < and > A \ < ^ sub > P \ < sharp > * C ) \ < Longrightarrow > Prop "
and rComm1 : " \ < And > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q .
\ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > P ' \ < parallel > Q ' ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ;
A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * Q ;
xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop "
and rComm2 : " \ < And > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q .
\ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > P ' \ < parallel > Q ' ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ;
A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * Q ;
xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop "
and rOpen : " \ < And > P M xvec y yvec N P ' .
( \ < lbrakk > xvec4 \ < sharp > * \ < Psi > ; xvec4 \ < sharp > * cP ; xvec4 \ < sharp > * cRs ; x1 \ < sharp > \ < Psi > ; x1 \ < sharp > cP ; x1 \ < sharp > cRs ; x1 \ < sharp > xvec4 \ < rbrakk > \ < Longrightarrow >
cP = \ < lparr > \ < nu > x1 \ < rparr > P \ < and > cRs = M \ < lparr > \ < nu > * ( xvec @ x1 # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < and > xvec4 = xvec @ y # yvec \ < and >
\ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < and > x1 \ < in > supp N \ < and > x1 \ < sharp > xvec \ < and > x1 \ < sharp > yvec \ < and >
distinct xvec \ < and > distinct yvec \ < and > xvec \ < sharp > * \ < Psi > \ < and > xvec \ < sharp > * P \ < and > xvec \ < sharp > * M \ < and > xvec \ < sharp > * yvec \ < and >
yvec \ < sharp > * \ < Psi > \ < and > yvec \ < sharp > * P \ < and > yvec \ < sharp > * M ) \ < Longrightarrow > Prop "
and rScope : " \ < And > P \ < alpha > P ' . ( \ < lbrakk > xvec5 \ < sharp > * \ < Psi > ; xvec5 \ < sharp > * cP ; xvec5 \ < sharp > * cRs ; x2 \ < sharp > \ < Psi > ; x2 \ < sharp > cP ; x2 \ < sharp > cRs ; x2 \ < sharp > xvec5 \ < rbrakk > \ < Longrightarrow >
cP = \ < lparr > \ < nu > x2 \ < rparr > P \ < and > cRs = \ < alpha > \ < prec > \ < lparr > \ < nu > x2 \ < rparr > P ' \ < and > xvec5 = bn \ < alpha > \ < and >
\ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < and > x2 \ < sharp > \ < Psi > \ < and > x2 \ < sharp > \ < alpha > \ < and > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < and > distinct ( bn \ < alpha > ) ) \ < Longrightarrow > Prop "
and rBang : " \ < And > P . \ < lbrakk > cP = ! P ; \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > cRs ; guarded P \ < rbrakk > \ < Longrightarrow > Prop "
shows Prop
using \ < open > \ < Psi > \ < rhd > cP \ < longmapsto > cRs \ < close >
proof ( cases rule : semanticsCasesAux [ where C = " ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) " ] )
case ( cInput M K xvec N Tvec P )
have B : " cP = M \ < lparr > \ < lambda > * xvec N \ < rparr > . P " and C : " cRs = K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > \ < prec > ( P [ xvec : : = Tvec ] ) "
by fact +
from \ < open > xvec \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " xvec \ < sharp > * xvec1 " by simp
from \ < open > length xvec1 = inputLength cP \ < close > B have " length xvec1 = length xvec "
by simp
then obtain p where S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) " and " distinctPerm p " and " xvec1 = p \ < bullet > xvec "
using \ < open > xvec \ < sharp > * xvec1 \ < close > \ < open > distinct xvec \ < close > \ < open > distinct xvec1 \ < close >
by ( rule_tac constructPerm [ where xvec = xvec and yvec = xvec1 ] ) auto
show ? thesis
proof ( rule rInput [ where M = M and K = K and N = " p \ < bullet > N " and Tvec = Tvec and P = " p \ < bullet > P " ] , goal_cases )
case 1
from B \ < open > xvec \ < sharp > * xvec1 \ < close > \ < open > xvec1 \ < sharp > * cP \ < close > have " xvec1 \ < sharp > * N " and " xvec1 \ < sharp > * P "
by ( auto simp add : fresh_star_def inputChainFresh name_list_supp ) ( auto simp add : fresh_def )
from \ < open > cP = M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < close > S \ < open > xvec1 \ < sharp > * N \ < close > \ < open > xvec1 \ < sharp > * P \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close >
have " cP = M \ < lparr > \ < lambda > * xvec1 ( p \ < bullet > N ) \ < rparr > . ( p \ < bullet > P ) "
apply simp
by ( subst inputChainAlpha ) auto
moreover from \ < open > cRs = K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > \ < prec > P [ xvec : : = Tvec ] \ < close > S \ < open > xvec1 \ < sharp > * N \ < close > \ < open > xvec1 \ < sharp > * P \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close > \ < open > length xvec = length Tvec \ < close > \ < open > distinctPerm p \ < close >
have " cRs = K \ < lparr > ( ( p \ < bullet > N ) [ xvec1 : : = Tvec ] ) \ < rparr > \ < prec > ( p \ < bullet > P ) [ xvec1 : : = Tvec ] "
by ( simp add : renaming substTerm . renaming )
moreover note \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > distinct xvec \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close > have " distinct xvec1 " by simp
moreover from \ < open > set xvec \ < subseteq > supp N \ < close > have " ( p \ < bullet > set xvec ) \ < subseteq > ( p \ < bullet > ( supp N ) ) "
by ( simp add : eqvts )
with \ < open > xvec1 = p \ < bullet > xvec \ < close > have " set xvec1 \ < subseteq > supp ( p \ < bullet > N ) " by ( simp add : eqvts )
moreover from \ < open > length xvec = length Tvec \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close > have " length xvec1 = length Tvec "
by simp
moreover from \ < open > xvec1 \ < sharp > * cRs \ < close > C \ < open > length xvec = length Tvec \ < close > \ < open > distinct xvec \ < close > \ < open > set xvec \ < subseteq > supp N \ < close >
have " ( set xvec1 ) \ < sharp > * Tvec "
by ( rule_tac substTerm . subst3Chain [ where T = N ] ) auto
hence " xvec1 \ < sharp > * Tvec " by simp
moreover from \ < open > xvec \ < sharp > * Tvec \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > Tvec ) " by ( simp add : fresh_star_bij )
with S \ < open > xvec \ < sharp > * Tvec \ < close > \ < open > xvec1 \ < sharp > * Tvec \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close > have " xvec1 \ < sharp > * Tvec " by simp
moreover from \ < open > xvec \ < sharp > * M \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > M ) " by ( simp add : fresh_star_bij )
with S \ < open > xvec \ < sharp > * M \ < close > \ < open > xvec1 \ < sharp > * cP \ < close > B \ < open > xvec1 = p \ < bullet > xvec \ < close > have " xvec1 \ < sharp > * M " by simp
moreover from \ < open > xvec \ < sharp > * K \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) " by ( simp add : fresh_star_bij )
with S \ < open > xvec \ < sharp > * K \ < close > \ < open > xvec1 \ < sharp > * cRs \ < close > C \ < open > xvec1 = p \ < bullet > xvec \ < close > have " xvec1 \ < sharp > * K " by simp
ultimately show ? case using \ < open > xvec1 \ < sharp > * \ < Psi > \ < close > by blast
qed
next
case ( cOutput M K N P )
thus ? thesis by ( rule rOutput )
next
case ( cCase Cs P \ < phi > )
thus ? thesis by ( rule rCase )
next
case ( cPar1 \ < Psi > \ < ^ sub > Q P \ < alpha > P ' Q A \ < ^ sub > Q )
have B : " cP = P \ < parallel > Q " and C : " cRs = \ < alpha > \ < prec > P ' \ < parallel > Q "
by fact +
from \ < open > bn \ < alpha > \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " bn \ < alpha > \ < sharp > * xvec2 " by simp
from \ < open > A \ < ^ sub > Q \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " A \ < ^ sub > Q \ < sharp > * xvec2 " and " A \ < ^ sub > Q \ < sharp > * C " by simp +
from \ < open > length xvec2 = residualLength cRs \ < close > C have " length xvec2 = length ( bn \ < alpha > ) "
by simp
then obtain p where S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " and " distinctPerm p " and " xvec2 = bn ( p \ < bullet > \ < alpha > ) "
using \ < open > bn \ < alpha > \ < sharp > * xvec2 \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct xvec2 \ < close >
by ( rule_tac constructPerm [ where xvec = " bn \ < alpha > " and yvec = xvec2 ] ) ( auto simp add : eqvts )
show ? thesis
proof ( rule rPar1 [ where P = P and Q = Q and \ < alpha > = " p \ < bullet > \ < alpha > " and P ' = " p \ < bullet > P ' " and A \ < ^ sub > Q = A \ < ^ sub > Q and \ < Psi > \ < ^ sub > Q = \ < Psi > \ < ^ sub > Q ] , goal_cases )
case 1
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from B C S \ < open > bn \ < alpha > \ < sharp > * xvec2 \ < close > \ < open > xvec2 \ < sharp > * cRs \ < close > \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec2 \ < sharp > * cP \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close >
have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) \ < parallel > Q "
apply auto
by ( subst residualAlpha [ where p = p ] ) auto
moreover note \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close >
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > S B C S \ < open > bn \ < alpha > \ < sharp > * xvec2 \ < close > \ < open > xvec2 \ < sharp > * cRs \ < close > \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec2 \ < sharp > * cP \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) "
by ( subst residualAlpha [ symmetric ] ) auto
moreover note \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close >
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec2 \ < close > S \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " A \ < ^ sub > Q \ < sharp > * ( p \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , where pi = p ] ) simp
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec2 \ < close > S \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " A \ < ^ sub > Q \ < sharp > * ( p \ < bullet > P ' ) "
by ( subst fresh_star_bij [ symmetric , where pi = p ] ) simp
moreover note \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
ultimately show ? case by blast
qed
next
case ( cPar2 \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' P A \ < ^ sub > P )
have B : " cP = P \ < parallel > Q " and C : " cRs = \ < alpha > \ < prec > P \ < parallel > Q ' "
by fact +
from \ < open > bn \ < alpha > \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " bn \ < alpha > \ < sharp > * xvec3 " by simp
from \ < open > A \ < ^ sub > P \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " A \ < ^ sub > P \ < sharp > * xvec3 " and " A \ < ^ sub > P \ < sharp > * C " by simp +
from \ < open > length xvec3 = residualLength cRs \ < close > C have " length xvec3 = length ( bn \ < alpha > ) "
by simp
then obtain p where S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " and " distinctPerm p " and " xvec3 = bn ( p \ < bullet > \ < alpha > ) "
using \ < open > bn \ < alpha > \ < sharp > * xvec3 \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct xvec3 \ < close >
by ( rule_tac constructPerm [ where xvec = " bn \ < alpha > " and yvec = xvec3 ] ) ( auto simp add : eqvts )
show ? thesis
proof ( rule rPar2 [ where P = P and Q = Q and \ < alpha > = " p \ < bullet > \ < alpha > " and Q ' = " p \ < bullet > Q ' " and A \ < ^ sub > P = A \ < ^ sub > P and \ < Psi > \ < ^ sub > P = \ < Psi > \ < ^ sub > P ] , goal_cases )
case 1
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from B C S \ < open > bn \ < alpha > \ < sharp > * xvec3 \ < close > \ < open > xvec3 \ < sharp > * cRs \ < close > \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec3 \ < sharp > * cP \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close >
have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > P \ < parallel > ( p \ < bullet > Q ' ) "
apply auto
by ( subst residualAlpha [ where p = p ] ) auto
moreover note \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close >
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > S B C S \ < open > bn \ < alpha > \ < sharp > * xvec3 \ < close > \ < open > xvec3 \ < sharp > * cRs \ < close > \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec3 \ < sharp > * cP \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > Q ' ) "
by ( subst residualAlpha [ symmetric ] ) auto
moreover note \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close >
moreover from \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec3 \ < close > S \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " A \ < ^ sub > P \ < sharp > * ( p \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , where pi = p ] ) simp
moreover from \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec3 \ < close > S \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " A \ < ^ sub > P \ < sharp > * ( p \ < bullet > Q ' ) "
by ( subst fresh_star_bij [ symmetric , where pi = p ] ) simp
moreover note \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
ultimately show ? case by blast
qed
next
case ( cComm1 \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q )
thus ? thesis by ( rule_tac rComm1 [ where P = P and Q = Q ] ) ( assumption | simp ) +
next
case ( cComm2 \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q )
thus ? thesis by ( rule_tac rComm2 [ where P = P and Q = Q ] ) ( assumption | simp ) +
next
case ( cOpen P M xvec yvec N P ' x )
have B : " cP = \ < lparr > \ < nu > x \ < rparr > P " and C : " cRs = M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by fact +
from \ < open > xvec \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " xvec \ < sharp > * xvec4 " and " xvec \ < sharp > * cP " and " xvec \ < sharp > * cRs " and " x1 \ < sharp > xvec " by simp +
from \ < open > x \ < sharp > ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " x \ < sharp > xvec4 " and " x \ < sharp > cP " and " x \ < sharp > cRs " and " x \ < noteq > x1 " by simp +
from \ < open > yvec \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " yvec \ < sharp > * xvec4 " and " yvec \ < sharp > * cP " and " yvec \ < sharp > * cRs " and " x1 \ < sharp > yvec " by simp +
from \ < open > xvec \ < sharp > * cRs \ < close > \ < open > x \ < sharp > cRs \ < close > \ < open > yvec \ < sharp > * cRs \ < close > C have " ( xvec @ x # yvec ) \ < sharp > * M " by simp
from \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < close > have " ( xvec @ x # yvec ) \ < sharp > * \ < Psi > " by simp
from \ < open > length xvec4 = residualLength cRs \ < close > C obtain xvec ' y yvec ' where D : " xvec4 = xvec ' @ y # yvec ' " and " length xvec ' = length xvec " and " length yvec ' = length yvec "
by ( rule_tac lengthAux2 ) auto
with \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > distinct xvec4 \ < close >
have " distinct xvec ' " and " distinct yvec ' " and " xvec ' \ < sharp > * yvec ' " and " x \ < noteq > y " and " y \ < sharp > xvec ' " and " y \ < sharp > yvec ' "
and " x \ < sharp > xvec ' " and " x \ < sharp > yvec ' " and " y \ < sharp > xvec " and " y \ < sharp > yvec " and " xvec \ < sharp > * xvec ' " and " yvec \ < sharp > * yvec ' "
by auto
from \ < open > length xvec ' = length xvec \ < close > \ < open > xvec \ < sharp > * xvec ' \ < close > \ < open > distinct xvec \ < close > \ < open > distinct xvec ' \ < close >
obtain p where Sp : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) " and " distinctPerm p " and E : " xvec ' = p \ < bullet > xvec "
by ( metis constructPerm )
from \ < open > length yvec ' = length yvec \ < close > \ < open > yvec \ < sharp > * yvec ' \ < close > \ < open > distinct yvec \ < close > \ < open > distinct yvec ' \ < close >
obtain q where Sq : " set q \ < subseteq > set yvec \ < times > set ( q \ < bullet > yvec ) " and " distinctPerm q " and F : " yvec ' = q \ < bullet > yvec "
by ( metis constructPerm )
show ? thesis
proof ( rule rOpen [ where P = " ( [ ( x , x1 ) ] \ < bullet > P ) " and xvec = " p \ < bullet > xvec " and y = " y " and yvec = " q \ < bullet > yvec " and N = " ( p @ ( x1 , x ) # q ) \ < bullet > N " and P ' = " ( p @ ( x1 , x ) # q ) \ < bullet > P ' " and M = M ] , goal_cases )
case 1
from \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > D E F
have " x \ < noteq > y " and " x1 \ < noteq > y " and " x1 \ < sharp > p \ < bullet > xvec " and " x1 \ < sharp > q \ < bullet > yvec " by simp +
from \ < open > xvec4 \ < sharp > * cRs \ < close > \ < open > x1 \ < sharp > cRs \ < close > C have " xvec4 \ < sharp > * M " and " x1 \ < sharp > M " by simp +
from \ < open > cP = \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > x \ < sharp > cP \ < close > \ < open > x \ < noteq > x1 \ < close > have " ( [ ( x , x1 ) ] \ < bullet > cP ) = [ ( x , x1 ) ] \ < bullet > \ < lparr > \ < nu > x \ < rparr > P "
by simp
with \ < open > x \ < sharp > cP \ < close > \ < open > x1 \ < sharp > cP \ < close > have " cP = \ < lparr > \ < nu > x1 \ < rparr > ( [ ( x , x1 ) ] \ < bullet > P ) " by ( simp add : eqvts calc_atm )
moreover from C have " ( ( p @ ( x1 , x ) # q ) \ < bullet > cRs ) = ( p @ ( x1 , x ) # q ) \ < bullet > ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) " by ( simp add : fresh_star_bij )
with Sp Sq \ < open > xvec4 \ < sharp > * cRs \ < close > D E F \ < open > xvec \ < sharp > * cRs \ < close > \ < open > x \ < sharp > cRs \ < close > \ < open > yvec \ < sharp > * cRs \ < close > \ < open > xvec4 \ < sharp > * M \ < close > \ < open > ( xvec @ x # yvec ) \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > y \ < sharp > xvec ' \ < close > \ < open > y \ < sharp > yvec ' \ < close > \ < open > xvec ' \ < sharp > * yvec ' \ < close > \ < open > x1 \ < sharp > xvec \ < close > \ < open > x1 \ < sharp > yvec \ < close > \ < open > x1 \ < noteq > y \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > x1 \ < sharp > cRs \ < close > \ < open > x1 \ < sharp > cRs \ < close > \ < open > x \ < noteq > x1 \ < close > \ < open > x1 \ < sharp > M \ < close >
have " cRs = M \ < lparr > \ < nu > * ( ( p \ < bullet > xvec ) @ x1 # ( q \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( p @ ( x1 , x ) # q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ ( x1 , x ) # q ) \ < bullet > P ' ) "
by ( simp add : eqvts pt2 [ OF pt_name_inst ] calc_atm )
moreover from D E F have " xvec4 = ( p \ < bullet > xvec ) @ y # ( q \ < bullet > yvec ) " by simp
moreover from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > have " ( ( p @ ( x1 , x ) # q ) \ < bullet > \ < Psi > ) \ < rhd > ( ( p @ ( x1 , x ) # q ) \ < bullet > P ) \ < longmapsto > ( ( p @ ( x1 , x ) # q ) \ < bullet > ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) ) "
by ( intro eqvts )
with Sp Sq B C D E F \ < open > xvec4 \ < sharp > * \ < Psi > \ < close > \ < open > ( xvec @ x # yvec ) \ < sharp > * \ < Psi > \ < close > \ < open > xvec4 \ < sharp > * cRs \ < close > \ < open > x \ < sharp > xvec4 \ < close > C D \ < open > x \ < sharp > cRs \ < close > \ < open > yvec \ < sharp > * cRs \ < close > \ < open > xvec4 \ < sharp > * M \ < close > \ < open > ( xvec @ x # yvec ) \ < sharp > * M \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x1 \ < sharp > cRs \ < close > \ < open > x \ < noteq > x1 \ < close > \ < open > x1 \ < sharp > xvec \ < close > \ < open > x1 \ < sharp > yvec \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x1 \ < sharp > \ < Psi > \ < close > \ < open > xvec4 \ < sharp > * cP \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > xvec ' \ < sharp > * yvec ' \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > xvec4 \ < sharp > * cP \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > x \ < noteq > x1 \ < close > \ < open > xvec \ < sharp > * yvec \ < close >
have " \ < Psi > \ < rhd > ( [ ( x , x1 ) ] \ < bullet > P ) \ < longmapsto > M \ < lparr > \ < nu > * ( ( p \ < bullet > xvec ) @ ( q \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( p @ ( x1 , x ) # q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ ( x1 , x ) # q ) \ < bullet > P ' ) "
by ( simp add : eqvts pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] pt2 [ OF pt_name_inst ] name_swap )
moreover from \ < open > x \ < in > supp N \ < close > have " ( ( p @ ( x1 , x ) # q ) \ < bullet > x ) \ < in > ( ( p @ ( x1 , x ) # q ) \ < bullet > supp N ) "
by ( simp add : pt_set_bij [ OF pt_name_inst , OF at_name_inst ] )
hence " x1 \ < in > supp ( ( p @ ( x1 , x ) # q ) \ < bullet > N ) "
using \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x1 \ < sharp > xvec \ < close > \ < open > x1 \ < sharp > yvec \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > xvec ' \ < sharp > * yvec ' \ < close > D E F Sp Sq \ < open > x \ < noteq > x1 \ < close >
by ( simp add : eqvts pt2 [ OF pt_name_inst ] calc_atm )
moreover from \ < open > x1 \ < sharp > xvec4 \ < close > D E F have " x1 \ < sharp > ( p \ < bullet > xvec ) " and " x1 \ < sharp > ( q \ < bullet > yvec ) " by simp +
moreover from \ < open > distinct xvec ' \ < close > \ < open > distinct yvec ' \ < close > E F have " distinct ( p \ < bullet > xvec ) " and " distinct ( q \ < bullet > yvec ) " by simp +
moreover from \ < open > xvec ' \ < sharp > * yvec ' \ < close > E F have " ( p \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > yvec ) " by auto
moreover from \ < open > xvec \ < sharp > * \ < Psi > \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > ) " by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with Sp D E \ < open > xvec4 \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > " by ( simp add : eqvts )
moreover from \ < open > yvec \ < sharp > * \ < Psi > \ < close > have " ( p \ < bullet > yvec ) \ < sharp > * ( p \ < bullet > \ < Psi > ) " by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with Sq D F \ < open > xvec4 \ < sharp > * \ < Psi > \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < close > have " ( q \ < bullet > yvec ) \ < sharp > * \ < Psi > " by ( simp add : eqvts )
moreover from \ < open > xvec4 \ < sharp > * cP \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > B D E F have " ( p \ < bullet > xvec ) \ < sharp > * ( [ ( x , x1 ) ] \ < bullet > P ) " and " ( q \ < bullet > yvec ) \ < sharp > * ( [ ( x , x1 ) ] \ < bullet > P ) "
by simp +
moreover from \ < open > xvec4 \ < sharp > * M \ < close > C D E F have " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( q \ < bullet > yvec ) \ < sharp > * M " by simp +
ultimately show ? case
by blast
qed
next
case ( cScope P \ < alpha > P ' x )
have B : " cP = \ < lparr > \ < nu > x \ < rparr > P " and C : " cRs = \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' "
by fact +
from \ < open > bn \ < alpha > \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " bn \ < alpha > \ < sharp > * xvec5 " and " x2 \ < sharp > bn \ < alpha > " by simp +
from \ < open > x \ < sharp > ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " x \ < sharp > xvec5 " and " x \ < noteq > x2 " and " x \ < sharp > cRs " by simp +
from \ < open > length xvec5 = residualLength cRs \ < close > C have " length xvec5 = length ( bn \ < alpha > ) "
by simp
then obtain p where S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " and " distinctPerm p " and " xvec5 = bn ( p \ < bullet > \ < alpha > ) "
using \ < open > bn \ < alpha > \ < sharp > * xvec5 \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct xvec5 \ < close >
by ( rule_tac constructPerm [ where xvec = " bn \ < alpha > " and yvec = xvec5 ] ) ( auto simp add : eqvts )
show ? thesis
proof ( rule rScope [ where P = " [ ( x , x2 ) ] \ < bullet > P " and \ < alpha > = " [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > " and P ' = " [ ( x , x2 ) ] \ < bullet > p \ < bullet > P ' " ] , goal_cases )
case 1
from \ < open > x2 \ < sharp > cRs \ < close > C \ < open > x2 \ < sharp > bn \ < alpha > \ < close > \ < open > x \ < noteq > x2 \ < close > have " x2 \ < sharp > \ < alpha > " and " x2 \ < sharp > P ' " by ( auto simp add : abs_fresh )
from \ < open > cP = \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > x2 \ < sharp > cP \ < close > \ < open > x \ < noteq > x2 \ < close > have " cP = \ < lparr > \ < nu > x2 \ < rparr > ( [ ( x , x2 ) ] \ < bullet > P ) "
by ( simp add : alphaRes abs_fresh )
moreover from B C S \ < open > bn \ < alpha > \ < sharp > * xvec5 \ < close > \ < open > xvec5 \ < sharp > * cRs \ < close > \ < open > xvec5 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec5 \ < sharp > * cP \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > xvec5 \ < close >
have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > x \ < rparr > ( p \ < bullet > P ' ) "
apply auto
by ( subst residualAlpha [ where p = p ] alphaRes ) ( auto simp del : actionFresh )
hence " ( [ ( x , x2 ) ] \ < bullet > cRs ) = [ ( x , x2 ) ] \ < bullet > ( ( p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > x \ < rparr > ( p \ < bullet > P ' ) ) "
by simp
with \ < open > x2 \ < sharp > cRs \ < close > \ < open > x \ < sharp > cRs \ < close > have " cRs = ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > x2 \ < rparr > ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > P ' ) "
by ( simp add : eqvts calc_atm )
moreover from \ < open > xvec5 = bn ( p \ < bullet > \ < alpha > ) \ < close > have " ( [ ( x , x2 ) ] \ < bullet > xvec5 ) = ( [ ( x , x2 ) ] \ < bullet > bn ( p \ < bullet > \ < alpha > ) ) "
by simp
with \ < open > x \ < sharp > xvec5 \ < close > \ < open > x2 \ < sharp > xvec5 \ < close > have " xvec5 = bn ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) "
by ( simp add : eqvts )
moreover from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > S B C S \ < open > bn \ < alpha > \ < sharp > * xvec5 \ < close > \ < open > xvec5 \ < sharp > * cRs \ < close > \ < open > xvec5 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec5 \ < sharp > * cP \ < close > \ < open > x \ < sharp > xvec5 \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) "
by ( subst residualAlpha [ symmetric ] ) auto
hence " ( [ ( x , x2 ) ] \ < bullet > \ < Psi > ) \ < rhd > ( [ ( x , x2 ) ] \ < bullet > P ) \ < longmapsto > ( [ ( x , x2 ) ] \ < bullet > ( ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) ) ) "
by ( rule eqvt )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x2 \ < sharp > \ < Psi > \ < close > have " \ < Psi > \ < rhd > ( [ ( x , x2 ) ] \ < bullet > P ) \ < longmapsto > ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) \ < prec > ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > P ' ) "
by ( simp add : eqvts )
moreover note \ < open > x2 \ < sharp > \ < Psi > \ < close >
moreover from \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x2 \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > xvec5 \ < close > \ < open > x2 \ < sharp > xvec5 \ < close > S \ < open > x \ < noteq > x2 \ < close > \ < open > xvec5 = bn ( p \ < bullet > \ < alpha > ) \ < close > have " x2 \ < sharp > [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > "
apply ( subgoal_tac " x \ < sharp > p \ < and > x2 \ < sharp > p " )
apply ( simp add : perm_compose freshChainSimps del : actionFresh )
by ( auto dest : freshAlphaSwap )
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > have " ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > ( bn \ < alpha > ) ) \ < sharp > * ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > ( subject \ < alpha > ) ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
hence " bn ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) \ < sharp > * subject ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) "
by ( simp add : eqvts )
moreover from \ < open > distinct ( bn \ < alpha > ) \ < close > have " distinct ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > ( bn \ < alpha > ) ) " by simp
hence " distinct ( bn ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) ) " by ( simp add : eqvts )
ultimately show ? case by blast
qed
next
case ( cBang P )
thus ? thesis by ( rule_tac rBang ) auto
qed
lemma parCases [ consumes 5 , case_names cPar1 cPar2 cComm1 cComm2 ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Q : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and T : : " ( ' a , ' b , ' c ) psi "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > T "
and " bn \ < alpha > \ < sharp > * \ < Psi > "
and " bn \ < alpha > \ < sharp > * P "
and " bn \ < alpha > \ < sharp > * Q "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and rPar1 : " \ < And > P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop \ < alpha > ( P ' \ < parallel > Q ) "
and rPar2 : " \ < And > Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop \ < alpha > ( P \ < parallel > Q ' ) "
and rComm1 : " \ < And > \ < Psi > \ < ^ sub > Q M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K xvec Q ' A \ < ^ sub > Q .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * C ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * Q ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) "
and rComm2 : " \ < And > \ < Psi > \ < ^ sub > Q M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K Q ' A \ < ^ sub > Q .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * C ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * Q ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) "
shows " Prop \ < alpha > T "
proof -
from Trans have " distinct ( bn \ < alpha > ) " by ( auto dest : boundOutputDistinct )
have " length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) " by simp
note Trans
moreover have " length [ ] = inputLength ( P \ < parallel > Q ) " and " distinct [ ] "
by ( auto simp add : inputLength_inputLength ' _ inputLength ' ' . simps )
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover obtain x : : name where " x \ < sharp > \ < Psi > " and " x \ < sharp > P " and " x \ < sharp > Q " and " x \ < sharp > \ < alpha > " and " x \ < sharp > T "
by ( generate_fresh " name " ) auto
ultimately show ? thesis using \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close >
apply ( cases rule : semanticsCases [ of _ _ _ _ _ _ _ _ _ C x x ] )
apply ( auto simp add : psi . inject )
apply ( force simp add : residualInject residualInject ' intro : rPar1 )
apply ( force simp add : residualInject residualInject ' intro : rPar2 )
apply ( fastforce simp add : residualInject residualInject ' intro : rComm1 )
by ( fastforce simp add : residualInject residualInject ' intro : rComm2 )
qed
lemma parInputCases [ consumes 1 , case_names cPar1 cPar2 ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Q : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and R : : " ( ' a , ' b , ' c ) psi "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > R "
and rPar1 : " \ < And > P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop ( P ' \ < parallel > Q ) "
and rPar2 : " \ < And > Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop ( P \ < parallel > Q ' ) "
shows " Prop R "
proof -
from Trans obtain \ < alpha > where " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > R " and " bn \ < alpha > \ < sharp > * \ < Psi > " and " bn \ < alpha > \ < sharp > * P " and " bn \ < alpha > \ < sharp > * Q " and " bn \ < alpha > \ < sharp > * subject \ < alpha > " and " \ < alpha > = M \ < lparr > N \ < rparr > " by auto
thus ? thesis using rPar1 rPar2
by ( induct rule : parCases ) ( auto simp add : residualInject )
qed
lemma parOutputCases [ consumes 5 , case_names cPar1 cPar2 ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Q : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and R : : " ( ' a , ' b , ' c ) psi "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > R "
and " xvec \ < sharp > * \ < Psi > "
and " xvec \ < sharp > * P "
and " xvec \ < sharp > * Q "
and " xvec \ < sharp > * M "
and rPar1 : " \ < And > P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * xvec ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop ( P ' \ < parallel > Q ) "
and rPar2 : " \ < And > Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > P \ < sharp > * xvec ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop ( P \ < parallel > Q ' ) "
shows " Prop R "
proof -
from Trans have " distinct xvec " by ( auto dest : boundOutputDistinct )
obtain \ < alpha > where " \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " by simp
with Trans \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > xvec \ < sharp > * M \ < close >
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > R " and " bn \ < alpha > \ < sharp > * \ < Psi > " and " bn \ < alpha > \ < sharp > * P " and " bn \ < alpha > \ < sharp > * Q " " bn \ < alpha > \ < sharp > * subject \ < alpha > "
by simp +
thus ? thesis using \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > rPar1 rPar2 \ < open > distinct xvec \ < close >
by ( induct rule : parCases [ where C = " ( xvec , C ) " ] ) ( auto simp add : residualInject )
qed
lemma theEqvt [ eqvt_force ] :
fixes p : : " name prm "
and \ < alpha > : : " ' a action "
assumes " \ < alpha > \ < noteq > \ < tau > "
shows " ( p \ < bullet > the ( subject \ < alpha > ) ) = the ( p \ < bullet > ( subject \ < alpha > ) ) "
using assms
by ( induct rule : actionCases [ where \ < alpha > = \ < alpha > ] ) auto
lemma theSubjectFresh [ simp ] :
fixes \ < alpha > : : " ' a action "
and x : : name
assumes " \ < alpha > \ < noteq > \ < tau > "
shows " x \ < sharp > the ( subject \ < alpha > ) = x \ < sharp > subject \ < alpha > "
using assms
by ( cases rule : actionCases ) auto
lemma theSubjectFreshChain [ simp ] :
fixes \ < alpha > : : " ' a action "
and xvec : : " name list "
assumes " \ < alpha > \ < noteq > \ < tau > "
shows " xvec \ < sharp > * the ( subject \ < alpha > ) = xvec \ < sharp > * subject \ < alpha > "
using assms
by ( cases rule : actionCases ) auto
lemma obtainPrefix :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and B : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " distinct ( bn \ < alpha > ) "
and " \ < alpha > \ < noteq > \ < tau > "
and " B \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * B "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * subject \ < alpha > "
obtains M where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
using assms
proof ( nominal_induct avoiding : B arbitrary : thesis rule : semanticsFrameInduct ' )
case ( cAlpha \ < Psi > P \ < alpha > P ' p A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain M where subjEq : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cAlpha ) auto
from \ < open > set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > subjEq
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject ( p \ < bullet > \ < alpha > ) ) \ < leftrightarrow > M "
by ( simp add : subjectEqvt [ symmetric ] )
thus ? case using cAlpha \ < open > B \ < sharp > * M \ < close >
by auto
next
case ( cFrameAlpha \ < Psi > P A \ < ^ sub > P \ < Psi > \ < ^ sub > P p \ < alpha > P ' B )
then obtain M where subjEq : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cFrameAlpha ) auto
have S : " set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) " by fact
from subjEq have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < turnstile > ( p \ < bullet > the ( subject \ < alpha > ) ) \ < leftrightarrow > ( p \ < bullet > M ) "
by ( rule chanEqClosed )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * subject \ < alpha > \ < close > S \ < open > \ < alpha > \ < noteq > \ < tau > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close >
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > ( p \ < bullet > M ) "
by ( simp add : eqvts del : subjectEqvt )
moreover from \ < open > B \ < sharp > * M \ < close > have " ( p \ < bullet > B ) \ < sharp > * ( p \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * B \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * B \ < close > S have " B \ < sharp > * ( p \ < bullet > M ) " by ( simp add : eqvts )
ultimately show ? case by ( rule cFrameAlpha )
next
case ( cInput \ < Psi > M K xvec N Tvec P B )
from \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt AssertionStatEqSym [ OF Identity ] )
hence " \ < Psi > \ < otimes > \ < one > \ < turnstile > K \ < leftrightarrow > M " by ( rule chanEqSym )
moreover from \ < open > B \ < sharp > * ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P ) \ < close > have " B \ < sharp > * M " by simp
ultimately show ? case by ( rule_tac cInput ) auto
next
case ( cOutput \ < Psi > M K N P B )
from \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt AssertionStatEqSym [ OF Identity ] )
hence " \ < Psi > \ < otimes > \ < one > \ < turnstile > K \ < leftrightarrow > M "
by ( rule chanEqSym )
moreover from \ < open > B \ < sharp > * ( M \ < langle > N \ < rangle > . P ) \ < close > have " B \ < sharp > * M " by simp
ultimately show ? case by ( rule_tac cOutput ) auto
next
case ( cCase \ < Psi > P \ < alpha > P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain M where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cCase ) ( auto dest : memFreshChain )
with \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > show ? case by ( blast intro : cCase statEqEnt compositionSym Identity )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain M where " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
apply ( rule_tac cPar1 ) by assumption auto
thus ? case
by ( metis cPar1 statEqEnt Associativity Commutativity AssertionStatEqTrans Composition )
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q B )
then obtain M where " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cPar2 ) auto
thus ? case by ( metis cPar2 statEqEnt Associativity )
next
case cComm1
thus ? case by simp
next
case cComm2
thus ? case by simp
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain K where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K " and " B \ < sharp > * K "
apply ( rule_tac cOpen ) by force auto
thus ? case by ( fastforce intro : cOpen )
next
case ( cScope \ < Psi > P \ < alpha > P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain M where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cScope ) auto
thus ? case by ( fastforce intro : cScope )
next
case ( cBang \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain K where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > K " and " B \ < sharp > * K "
by ( rule_tac cBang ) auto
with \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > show ? case by ( metis cBang statEqEnt compositionSym Identity )
qed
lemma inputRenameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * K "
shows " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' "
using assms
proof ( nominal_induct avoiding : K rule : inputFrameInduct )
case ( cAlpha \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P p K )
have S : " set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) " by fact
from \ < open > \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > ( \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) ) ) \ < turnstile > ( p \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( rule chanEqClosed )
with S \ < open > distinctPerm p \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * K \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K " by ( simp add : eqvts )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
show ? case by blast
next
case ( cInput \ < Psi > M K xvec N Tvec P K ' )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > K \ < leftrightarrow > K ' \ < close > have " \ < Psi > \ < turnstile > K \ < leftrightarrow > K ' "
by ( blast intro : statEqEnt Identity )
with \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " \ < Psi > \ < turnstile > M \ < leftrightarrow > K ' "
by ( rule chanEqTrans )
thus ? case using \ < open > distinct xvec \ < close > \ < open > set xvec \ < subseteq > supp N \ < close > \ < open > length xvec = length Tvec \ < close >
by ( rule Input )
next
case ( cCase \ < Psi > P M N P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K \ < close > \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt Identity compositionSym AssertionStatEqSym )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' " by force
thus ? case using \ < open > ( \ < phi > , P ) mem Cs \ < close > \ < open > \ < Psi > \ < turnstile > \ < phi > \ < close > \ < open > guarded P \ < close > by ( rule Case )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
by ( metis statEqEnt Associativity Composition AssertionStatEqTrans Commutativity )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' " by force
thus ? case using \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close >
by ( rule_tac Par1 ) auto
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q M N Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q K )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
by ( rule statEqEnt [ OF AssertionStatEqSym [ OF Associativity ] ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > Q \ < sharp > * ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' " by force
thus ? case using \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close >
by ( rule_tac Par2 ) auto
next
case ( cScope \ < Psi > P M N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P )
hence " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' " by force
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > K \ < close > \ < open > x \ < sharp > N \ < close > show ? case
by ( rule_tac Scope ) auto
next
case ( cBang \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K \ < close > \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt Identity compositionSym AssertionStatEqSym )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * ( P \ < parallel > ! P ) ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' " by force
thus ? case using \ < open > guarded P \ < close > by ( rule Bang )
qed
lemma outputRenameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * K "
shows " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
using assms
apply ( simp add : residualInject )
proof ( nominal_induct avoiding : K rule : outputFrameInduct )
case ( cAlpha \ < Psi > P M A \ < ^ sub > P \ < Psi > \ < ^ sub > P p B K )
have S : " set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) " by fact
from \ < open > \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > ( \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) ) ) \ < turnstile > ( p \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( rule chanEqClosed )
with S \ < open > distinctPerm p \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * K \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K " by ( simp add : eqvts )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
show ? case by ( blast intro : cAlpha )
next
case ( cOutput \ < Psi > M K N P K ' )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > K \ < leftrightarrow > K ' \ < close > have " \ < Psi > \ < turnstile > K \ < leftrightarrow > K ' "
by ( blast intro : statEqEnt Identity )
with \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " \ < Psi > \ < turnstile > M \ < leftrightarrow > K ' "
by ( rule chanEqTrans )
thus ? case using Output by ( force simp add : residualInject )
next
case ( cCase \ < Psi > P M B \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K \ < close > \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt Identity compositionSym AssertionStatEqSym )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < longmapsto > ( ROut K B ) \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > ROut K B " by force
thus ? case using \ < open > ( \ < phi > , P ) mem Cs \ < close > \ < open > \ < Psi > \ < turnstile > \ < phi > \ < close > \ < open > guarded P \ < close > by ( rule Case )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
by ( metis statEqEnt Associativity Composition AssertionStatEqTrans Commutativity )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > ( ROut K ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' P ' ) ) \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( force simp add : residualInject )
thus ? case using \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close > Par1 [ where \ < alpha > = " K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " ]
by ( auto simp add : residualInject )
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q M xvec N Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q K )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
by ( rule statEqEnt [ OF AssertionStatEqSym [ OF Associativity ] ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > Q \ < sharp > * ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ROut K ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' Q ' ) \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ROut K ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' Q ' ) " by force
thus ? case using \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > Par2 [ where \ < alpha > = " K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " ]
by ( auto simp add : residualInject )
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P )
hence " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( force simp add : residualInject )
with \ < open > x \ < in > supp N \ < close > \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > K \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > Open show ? case
by ( auto simp add : residualInject )
next
case ( cScope \ < Psi > P M xvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P )
hence " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( force simp add : residualInject )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > K \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > N \ < close > Scope [ where \ < alpha > = " K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " ] show ? case
by ( auto simp add : residualInject )
next
case ( cBang \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K \ < close > \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt Identity compositionSym AssertionStatEqSym )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * ( P \ < parallel > ! P ) ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > ROut K B \ < close >
have " \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > ROut K B " by force
thus ? case using \ < open > guarded P \ < close > by ( rule Bang )
qed
lemma parCasesSubject [ consumes 7 , case_names cPar1 cPar2 cComm1 cComm2 ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Q : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and R : : " ( ' a , ' b , ' c ) psi "
and C : : " ' d : : fs_name "
and yvec : : " name list "
assumes Trans : " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > R "
and " bn \ < alpha > \ < sharp > * \ < Psi > "
and " bn \ < alpha > \ < sharp > * P "
and " bn \ < alpha > \ < sharp > * Q "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " yvec \ < sharp > * P "
and " yvec \ < sharp > * Q "
and rPar1 : " \ < And > P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop \ < alpha > ( P ' \ < parallel > Q ) "
and rPar2 : " \ < And > Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop \ < alpha > ( P \ < parallel > Q ' ) "
and rComm1 : " \ < And > \ < Psi > \ < ^ sub > Q M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K xvec Q ' A \ < ^ sub > Q .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; yvec \ < sharp > * M ; yvec \ < sharp > * K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * C ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * Q ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) "
and rComm2 : " \ < And > \ < Psi > \ < ^ sub > Q M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K Q ' A \ < ^ sub > Q .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; yvec \ < sharp > * M ; yvec \ < sharp > * K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * C ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * Q ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) "
shows " Prop \ < alpha > R "
using Trans \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close >
proof ( induct rule : parCases [ where C = " ( C , yvec ) " ] )
case ( cPar1 P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q )
thus ? case by ( rule_tac rPar1 ) auto
next
case ( cPar2 Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P )
thus ? case by ( rule_tac rPar2 ) auto
next
case ( cComm1 \ < Psi > \ < ^ sub > Q M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K xvec Q ' A \ < ^ sub > Q )
from \ < open > A \ < ^ sub > P \ < sharp > * ( C , yvec ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( C , yvec ) \ < close > \ < open > xvec \ < sharp > * ( C , yvec ) \ < close >
have " A \ < ^ sub > P \ < sharp > * C " and " A \ < ^ sub > Q \ < sharp > * C " and " xvec \ < sharp > * C " and " A \ < ^ sub > P \ < sharp > * yvec " and " A \ < ^ sub > Q \ < sharp > * yvec " and " xvec \ < sharp > * yvec "
by simp +
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " and FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and MeqK : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K " by fact +
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
obtain M ' where MeqM ' : " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > M ' " and " xvec \ < sharp > * M ' " and " yvec \ < sharp > * M ' " and " A \ < ^ sub > Q \ < sharp > * M ' "
by ( rule_tac B = " xvec @ yvec @ A \ < ^ sub > Q " in obtainPrefix ) ( assumption | force ) +
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > FrQ \ < open > distinct A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > yvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > xvec \ < sharp > * K \ < close > \ < open > distinct xvec \ < close >
obtain K ' where KeqK ' : " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K \ < leftrightarrow > K ' " and " xvec \ < sharp > * K ' " and " yvec \ < sharp > * K ' " and " A \ < ^ sub > P \ < sharp > * K ' "
by ( rule_tac B = " xvec @ yvec @ A \ < ^ sub > P " in obtainPrefix ) ( assumption | force | metis freshChainSym ) +
from MeqK KeqK ' have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans )
with \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K ' \ < lparr > N \ < rparr > \ < prec > P ' " using \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K ' \ < close >
by ( rule_tac inputRenameSubject ) ( assumption | force ) +
moreover note FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from MeqK MeqM ' have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K \ < leftrightarrow > M ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans chanEqSym )
with \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > FrQ \ < open > distinct A \ < ^ sub > Q \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M ' \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' " using \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M ' \ < close >
by ( rule_tac outputRenameSubject ) ( assumption | force ) +
moreover note FrQ \ < open > distinct A \ < ^ sub > Q \ < close >
moreover from MeqM ' KeqK ' MeqK have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K ' \ < leftrightarrow > M ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans chanEqSym )
moreover note \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
\ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M ' \ < close > \ < open > xvec \ < sharp > * K ' \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > yvec \ < sharp > * M ' \ < close > \ < open > yvec \ < sharp > * K ' \ < close > \ < open > distinct xvec \ < close >
ultimately show ? case
by ( rule_tac rComm1 )
next
case ( cComm2 \ < Psi > \ < ^ sub > Q M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K Q ' A \ < ^ sub > Q )
from \ < open > A \ < ^ sub > P \ < sharp > * ( C , yvec ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( C , yvec ) \ < close > \ < open > xvec \ < sharp > * ( C , yvec ) \ < close >
have " A \ < ^ sub > P \ < sharp > * C " and " A \ < ^ sub > Q \ < sharp > * C " and " xvec \ < sharp > * C " and " A \ < ^ sub > P \ < sharp > * yvec " and " A \ < ^ sub > Q \ < sharp > * yvec " and " xvec \ < sharp > * yvec "
by simp +
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " and FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and MeqK : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K " by fact +
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > distinct xvec \ < close >
obtain M ' where MeqM ' : " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > M ' " and " xvec \ < sharp > * M ' " and " yvec \ < sharp > * M ' " and " A \ < ^ sub > Q \ < sharp > * M ' "
by ( rule_tac B = " xvec @ yvec @ A \ < ^ sub > Q " in obtainPrefix ) ( assumption | force ) +
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > FrQ \ < open > distinct A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > yvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
obtain K ' where KeqK ' : " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K \ < leftrightarrow > K ' " and " xvec \ < sharp > * K ' " and " yvec \ < sharp > * K ' " and " A \ < ^ sub > P \ < sharp > * K ' "
by ( rule_tac B = " xvec @ yvec @ A \ < ^ sub > P " in obtainPrefix ) ( assumption | force | metis freshChainSym ) +
from MeqK KeqK ' have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans )
with \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K ' \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " using \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K ' \ < close >
by ( rule_tac outputRenameSubject ) ( assumption | force ) +
moreover note FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from MeqK MeqM ' have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K \ < leftrightarrow > M ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans chanEqSym )
with \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > FrQ \ < open > distinct A \ < ^ sub > Q \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M ' \ < lparr > N \ < rparr > \ < prec > Q ' " using \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M ' \ < close >
by ( rule_tac inputRenameSubject ) ( assumption | force ) +
moreover note FrQ \ < open > distinct A \ < ^ sub > Q \ < close >
moreover from MeqM ' KeqK ' MeqK have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K ' \ < leftrightarrow > M ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans chanEqSym )
moreover note \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
\ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M ' \ < close > \ < open > xvec \ < sharp > * K ' \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > yvec \ < sharp > * M ' \ < close > \ < open > yvec \ < sharp > * K ' \ < close > \ < open > distinct xvec \ < close >
ultimately show ? case
by ( rule_tac rComm2 )
qed
lemma inputCases [ consumes 1 , case_names cInput ] :
fixes \ < Psi > : : ' b
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
assumes Trans : " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < longmapsto > \ < alpha > \ < prec > P ' "
and rInput : " \ < And > K Tvec . \ < lbrakk > \ < Psi > \ < turnstile > M \ < leftrightarrow > K ; set xvec \ < subseteq > supp N ; length xvec = length Tvec ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop ( K \ < lparr > N [ xvec : : = Tvec ] \ < rparr > ) ( P [ xvec : : = Tvec ] ) "
shows " Prop \ < alpha > P ' "
proof -
{
fix xvec N P
assume Trans : " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " xvec \ < sharp > * \ < Psi > " and " xvec \ < sharp > * M " and " xvec \ < sharp > * \ < alpha > " and " xvec \ < sharp > * P ' " and " distinct xvec "
and rInput : " \ < And > K Tvec . \ < lbrakk > \ < Psi > \ < turnstile > M \ < leftrightarrow > K ; set xvec \ < subseteq > supp N ; length xvec = length Tvec ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop ( K \ < lparr > N [ xvec : : = Tvec ] \ < rparr > ) ( P [ xvec : : = Tvec ] ) "
from Trans have " bn \ < alpha > = [ ] "
apply -
by ( ind_cases " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < longmapsto > \ < alpha > \ < prec > P ' " ) ( auto simp add : residualInject )
from Trans have " distinct ( bn \ < alpha > ) " by ( auto dest : boundOutputDistinct )
have " length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) " by simp
note Trans
moreover have " length xvec = inputLength ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P ) " by auto
moreover note \ < open > distinct xvec \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover obtain x : : name where " x \ < sharp > \ < Psi > " and " x \ < sharp > P " and " x \ < sharp > M " and " x \ < sharp > xvec " and " x \ < sharp > \ < alpha > " and " x \ < sharp > P ' " and " x \ < sharp > N "
by ( generate_fresh " name " ) auto
ultimately have " Prop \ < alpha > P ' " using \ < open > bn \ < alpha > = [ ] \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * \ < alpha > \ < close > \ < open > xvec \ < sharp > * P ' \ < close >
apply ( cases rule : semanticsCases [ of _ _ _ _ _ _ _ _ _ C x ] )
apply ( force simp add : residualInject psi . inject rInput )
by ( fastforce simp add : residualInject psi . inject inputChainFresh ) +
}
note Goal = this
moreover obtain p : : " name prm " where " ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * P "
and " ( p \ < bullet > xvec ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > xvec ) \ < sharp > * P ' " and S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) "
and " distinctPerm p "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , M , N , P , \ < alpha > , P ' ) " in name_list_avoiding ) auto
from Trans \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > S have " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * ( p \ < bullet > xvec ) ( p \ < bullet > N ) \ < rparr > . ( p \ < bullet > P ) \ < longmapsto > \ < alpha > \ < prec > P ' "
by ( simp add : inputChainAlpha ' )
moreover {
fix K Tvec
assume " \ < Psi > \ < turnstile > M \ < leftrightarrow > K "
moreover assume " set ( p \ < bullet > xvec ) \ < subseteq > supp ( p \ < bullet > N ) "
hence " ( p \ < bullet > set ( p \ < bullet > xvec ) ) \ < subseteq > ( p \ < bullet > supp ( p \ < bullet > N ) ) " by simp
with \ < open > distinctPerm p \ < close > have " set xvec \ < subseteq > supp N " by ( simp add : eqvts )
moreover assume " length ( p \ < bullet > xvec ) = length ( Tvec : : ' a list ) "
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5 in Prozent C=90 H=96 G=93
¤ 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.2.932Bemerkung:
(vorverarbeitet am 2026-07-02)
¤
*Bot Zugriff