Library EPPTheorem
Section EPP_Theorem.
Local Ltac sup := rewrite set_union_iff; auto.
Variable Sig : Signature.
Notation Pid := (pid Sig).
Notation Var := (var Sig).
Notation Value := (value Sig).
Notation Expr := (expr Sig).
Notation BExpr := (bexpr Sig).
Notation RecVar := (recvar Sig).
Notation Ann := (ann Sig).
Notation Ev := (ev Sig).
Notation BEv := (bev Sig).
Notation PR := (DecProd RecVar Pid).
Notation Sig' := (Sig' Sig).
Open Scope CC.
Section Completeness.
Lemma EPP_Complete : forall (P:CC.Program Sig) (HP:projectable_P P),
str_proj_P P -> forall s tl P' s', (P,s) --[tl]--> (P',s') ->
exists N tl', ((epp P HP,s) --[tl']--> (N,s'))%SP
/\ Procs N = Procs (epp P HP)
/\ forall (HP':projectable_P P'), Net N (>>) Net (epp P' HP').
Lemma EPP_Complete' : forall (P:CC.Program Sig) (HP:projectable_P P),
str_proj_P P -> forall s tl P' s', (P,s) --[tl]-->* (P',s') ->
exists N tl', ((epp P HP,s) --[tl']-->* (N,s'))%SP
/\ forall HP', Net N (>>) Net (epp P' HP').
Lemma EPP_Complete'' : forall (P:CC.Program Sig) (HP:projectable_P P),
Program_WF P -> initial (Main P) -> forall s tl P' s', (P,s) --[tl]-->* (P',s') ->
exists N tl', ((epp P HP,s) --[tl']-->* (N,s'))%SP
/\ forall HP', Net N (>>) Net (epp P' HP').
End Completeness.
Section Soundness.
Soundness of EPP
Soundness is proven by case analysis on the label of the reduction, and then by induction on the choreography. We split the proofs for each label in separate results, as we get some stronger statements.Open Scope SP_scope.
Lemma SP_To_bproj_Com : forall D D' ps C HC s N' s' p x q v,
@str_proj_P Sig (D,C) ->
<<epp_C D ps C HC,s>> --[RL_Com p v q x,D']--> <<N',s'>> ->
exists C', (<<C,s>> --[RL_Com p v q x,D]--> <<C',s'>>)%CC
/\ forall HC', (N' (==) (epp_C D ps C' HC')).
Lemma SP_To_bproj_Sel_l : forall D D' ps C HC s N' s' p q,
@str_proj_P Sig (D,C) ->
<<epp_C D ps C HC,s>> --[RL_Sel p q left,D']--> <<N',s'>> ->
exists C', (<<C,s>> --[RL_Sel p q left,D]--> <<C',s'>>)%CC
/\ forall HC', (N' (==) (epp_C D ps C' HC')).
Lemma SP_To_bproj_Sel_r : forall D D' ps C HC s N' s' p q,
@str_proj_P Sig (D,C) ->
<<epp_C D ps C HC,s>> --[RL_Sel p q right,D']--> <<N',s'>> ->
exists C', (<<C,s>> --[RL_Sel p q right,D]--> <<C',s'>>)%CC
/\ forall HC', (N' (==) (epp_C D ps C' HC')).
Lemma SP_To_bproj_Cond : forall D D' ps C HC s N' s' p,
@str_proj_P Sig (D,C) ->
<<epp_C D ps C HC,s>> --[RL_Cond p,D']--> <<N',s'>> ->
exists C', (<<C,s>> --[RL_Cond p,D]--> <<C',s'>>)%CC
/\ forall HC', (N' (>>) (epp_C D ps C' HC')).
Lemma SP_To_bproj_Call : forall D (D':DefSetB Sig') ps C HC s N' s' p X,
@str_proj_P Sig (D,C) ->
(forall X, projectable_C D (snd (D X)) ps) ->
(forall p HX, In p ps -> D' (X,p) = epp_C D ps (snd (D X)) HX p) ->
<<epp_C D ps C HC,s>> --[RL_Call ((X,p):recvar Sig') p,D']--> <<N',s'>> ->
exists C', (<<C,s>> --[RL_Call X p,D]--> <<C',s'>>)%CC
/\ forall HC', (N' (>>) epp_C D ps C' HC').
Lemma SP_To_bproj_Call_name : forall D D' ps C HC s N' s' p X,
<<epp_C D ps C HC,s>> --[RL_Call X p,D']--> <<N',s'>> ->
exists (Y:RecVar), X = (Y,p) /\ X_Free _ Y C.
Lemma EPP_Sound : forall (P:CC.Program Sig) (HP:projectable_P P),
str_proj_P P -> forall s tl N' s', (epp P HP,s) --[tl]--> (N',s') ->
exists P' tl', ((P,s) --[tl']--> (P',s'))%CC /\
forall HP', Net N' (>>) Net (epp P' HP').
Lemma SP_To_MBN_epp : forall D N1 s N2 s' tl D' ps C HC,
N1 (>>) @epp_C Sig D' ps C HC -> <<N1,s>> --[tl,D]--> <<N2,s'>> ->
exists N2', <<epp_C D' ps C HC,s>> --[tl,D]--> <<N2',s'>> /\ N2 (>>) N2'.
Lemma SPP_To_MBN_epp : forall P1 s P2 s' tl P HP,
(forall X, Procs P1 X = Procs (epp P HP) X) ->
Net P1 (>>) Net (epp P HP) -> SPP_To Sig' (P1,s) tl (P2,s') ->
exists P2', ((epp P HP,s) --[tl]--> (P2',s')) /\ Net P2 (>>) Net P2'
/\ forall X, Procs P2 X = Procs P2' X.
Generalizing the last result to -->* already requires the EPP Theorem.
Lemma SPP_ToStar_MBN_epp : forall P1 s P2 s' tl P,
@str_proj_P Sig P -> forall (HP:projectable_P P),
(forall X, Procs P1 X = Procs (epp P HP) X) ->
Net P1 (>>) Net (epp P HP) -> (P1,s) --[tl]-->* (P2,s') ->
exists P2', (epp P HP,s) --[tl]-->* (P2',s') /\ Net P2 (>>) Net P2'
/\ forall X, Procs P2 X = Procs P2' X.
Lemma EPP_Sound' : forall (P:CC.Program Sig) (HP:projectable_P P),
str_proj_P P -> forall s tl P' s', (epp P HP,s) --[tl]-->* (P',s') ->
exists P'' tl', ((P,s) --[tl']-->* (P'',s'))%CC /\
forall HP'', Net P' (>>) Net (epp P'' HP'').
End Soundness.
End EPP_Theorem.