Up to index of Isabelle/HOL/HOL-Complex/CSP-Prover
theory CSP_law_fp_cpo = CSP_proc_cpo: (*-------------------------------------------*
| CSP-Prover |
| February 2005 |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory CSP_law_fp_cpo = CSP_proc_cpo:
(*****************************************************************
1. cpo fixed point theory in CSP-Prover
2.
3.
4.
*****************************************************************)
(*******************************
check rev (Lfp)
*******************************)
consts
CHECKcpo :: "('m,'a) procRC => ('n,'a) procRC =>
('m => ('n,'a) proc) => bool"
("/(2CHECKcpo /_ )/(2=>F /_ )/(2BY /_)" [50,50,50] 50)
defs
CHECKcpo_def :
"CHECKcpo R1 =>F R2 BY f12 ==
(LET:Lfp (LetD R2) IN (InP R2)
<=F LET:Lfp (LetD R2) IN (Rewrite (InP R1) By f12)) &
(ALL C. LET:Lfp (LetD R2) IN (f12 C)
<=F LET:Lfp (LetD R2) IN (Rewrite (LetD R1 C) By f12))"
(*------------------------------------*
| X-Symbols |
*------------------------------------*)
syntax (output)
"_CHECKcpoX" :: "('n,'a) procRC => ('m,'a) procRC =>
('m => ('n,'a) proc) => bool"
("/(2CHECKcpo /_ )/(2=>F /_ )/(2BY /_)" [50,50,50] 50)
syntax (xsymbols)
"_CHECKcpoX" :: "('n,'a) procRC => ('m,'a) procRC =>
('m => ('n,'a) proc) => bool"
("/(2CHECKcpo /_ )/(2\<sqsupseteq>F /_ )/(2BY /_)" [50,50,50] 50)
translations
"CHECKcpo R1 \<sqsupseteq>F R2 BY f" == "CHECKcpo R1 =>F R2 BY f"
(*********************************************************
Lemmas
*********************************************************)
(*-------------------------------------------------------*
| |
| Fixpoint unwind (CSP-Prover rule) |
| |
*-------------------------------------------------------*)
lemma csp_unwind_cpo:
"LET:Lfp df IN <C> =F LET:Lfp df IN df C"
apply (simp add: eqF_def)
apply (subgoal_tac "[[df]]DF hasLFP")
apply (simp add: Proc_name_evalSF)
apply (simp add: evalSF_evalDF)
apply (insert LFP_is[of "[[df]]DF"], simp)
apply (simp add: isLFP_def)
apply (simp add: evalDF_Tarski_thm)
done
(*********************************************************
Fixpoint (reverse refinment check : Lfp)
f12 : df1 --> df2
*********************************************************)
lemma csp_check_fp_induct_cpo:
"CHECKcpo (LET:Lfp df1 IN P1) =>F (LET:Lfp df2 IN P2) BY f12
==> LET:Lfp df2 IN P2 <=F LET:Lfp df1 IN P1"
apply (simp add: CHECKcpo_def)
apply (elim conjE)
apply (simp add: refF_def)
apply (simp add: RewriteBy_compo)
apply (simp add: evalSF_evalDF)
apply (subgoal_tac "[[df1]]DF hasLFP & [[df2]]DF hasLFP")
apply (subgoal_tac "[[P1]]SF (LFP [[df1]]DF)
<= [[P1]]SF ([[f12]]DF (LFP [[df2]]DF))", simp)
apply (subgoal_tac "LFP [[df1]]DF <= [[f12]]DF (LFP [[df2]]DF)")
apply (simp add: evalSF_mono)
apply (fold order_prod_def)
apply (insert LFP_is[of "[[df1]]DF"], simp)
apply (simp add: isLFP_def)
apply (rule cpo_fixpoint_induction_rev[of "[[df1]]DF"])
apply (simp_all add: evalDF_continuous)
apply (simp add: evalDF_Tarski_thm)
done
(*-------------------------------------------------------*
| |
| Check fixpoint (CSP-Prover intro rule) |
| |
*-------------------------------------------------------*)
(*** unfold fixpoint for reverse refinement ***)
lemma csp_check_cpo:
"[| (LET:Lfp (LetD R2) IN (InP R2) <=F
LET:Lfp (LetD R2) IN (Rewrite (InP R1) By f12)) ;
!!C. LET:Lfp (LetD R2) IN (f12 C) <=F
LET:Lfp (LetD R2) IN (Rewrite (LetD R1 C) By f12) |]
==> CHECKcpo R1 =>F R2 BY f12"
by (simp add: CHECKcpo_def)
(*-------------------------------------------------------*
| |
| Fixed point induction (CSP-Prover intro rule) |
| |
*-------------------------------------------------------*)
(*** reverse refinement : Lfp ***)
lemma csp_fp_induct_cpo:
"[| LET:Lfp df1 IN P1 <=F LET:Lfp df1 IN (Rewrite P2 By f21) ;
!!C. LET:Lfp df1 IN (f21 C) <=F LET:Lfp df1 IN (Rewrite (df2 C) By f21) |]
==> LET:Lfp df1 IN P1 <=F LET:Lfp df2 IN P2"
apply (rule csp_check_fp_induct_cpo[of _ _ _ _ f21])
by (simp add: csp_check_cpo)
end
lemma csp_unwind_cpo:
LET:Lfp df IN <C> =F LET:Lfp df IN df C
lemma csp_check_fp_induct_cpo:
CHECKcpo
LET:Lfp df1 IN P1
=>F
LET:Lfp df2 IN P2
BY f12
==>
LET:Lfp df2 IN P2 <=F
LET:Lfp df1 IN P1
lemma csp_check_cpo:
[|
LET:Lfp LetD R2 IN InP R2 <=F
LET:Lfp LetD R2 IN Rewrite (InP R1) By f12;
!!C.
LET:Lfp LetD R2 IN f12 C <=F
LET:Lfp LetD R2 IN Rewrite (LetD R1 C) By f12 |]
==> CHECKcpo R1 =>F R2 BY f12
lemma csp_fp_induct_cpo:
[|
LET:Lfp df1 IN P1 <=F
LET:Lfp df1 IN Rewrite P2 By f21;
!!C.
LET:Lfp df1 IN f21 C <=F
LET:Lfp df1 IN Rewrite (df2 C) By f21 |]
==>
LET:Lfp df1 IN P1 <=F
LET:Lfp df2 IN P2