Library EPPTheorem

Require Export EPP.

Local Open Scope nat_scope.

The EPP Theorem


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.

Completeness

The completeness part of the EPP theorem.

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.