Theory Weaken_Transition

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

context weak
begin

definition weakenTransition :: "'b ⇒ ('a, 'b, 'c) psi ⇒ 'a action ⇒ ('a, 'b, 'c) psi ⇒ bool" (‹_ ⊳ _ ⟹_ ≺ _› [80, 80, 80, 80] 80)
where
  "Ψ ⊳ P ⟹α ≺ P' ≡ (∃P''' P''. Ψ ⊳ P ⟹^τ P''' ∧ Ψ ⊳ P''' ⟼α ≺ P'' ∧ Ψ ⊳ P'' ⟹^τ P') ∨ (P = P' ∧ α = τ)"

lemma weakenTransitionCases[consumes 1, case_names cBase cStep]:
  assumes "Ψ ⊳ P ⟹α ≺ P'"
  and "Prop (τ) P"
  and "⋀P''' P''. ⟦Ψ ⊳ P ⟹^τ P'''; Ψ ⊳ P''' ⟼α ≺ P''; Ψ ⊳ P'' ⟹^τ P'⟧ ⟹ Prop α P'"

  shows "Prop α P'"
using assms
by(auto simp add: weakenTransition_def)

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

  assumes "Ψ ⊳ P ⟹^τ P'"

  shows "insertAssertion (extractFrame P) Ψ ↪F insertAssertion (extractFrame P') Ψ"
using assms
by(induct rule: tauChainInduct) (auto intro: statImpTauDerivative dest: FrameStatImpTrans)

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

  assumes "Ψ ⊳ P ⟹^τ P'"
  shows "Ψ ⊗ Ψ' ⊳ P ⟹^τ P'"
using assms
proof(induct rule: tauChainInduct)
  case(TauBase P)
  thus ?case by simp
next
  case(TauStep P P' P'')
  note ‹Ψ ⊗ Ψ' ⊳ P ⟹^τ P'›
  moreover from ‹Ψ ⊳ P' ⟼τ ≺ P''› have "Ψ ⊗ Ψ' ⊳ P' ⟼τ ≺ P''" by(rule weakenTransition)
  ultimately show ?case by(auto dest: tauActTauChain)
qed

end

end