Library BranchingOrder
Section BranchingOrder.
Local Ltac rew_inv H H' := rewrite <- H in H'; inversion H'.
Variable Sig : Signature.
The branching order is defined as: B has more branches than B' if B' can be
obtained from B by removing some branches in branching terms.
Inductive more_branches : Behaviour Sig -> Behaviour Sig -> Prop :=
| MB_End : more_branches bnil bnil
| MB_Send p e a B B': more_branches B B' ->
more_branches (p ! e @! a; B) (p ! e @! a; B')
| MB_Recv p x a B B': more_branches B B' ->
more_branches (p ? x @? a; B) (p ? x @? a; B')
| MB_Sel p l a B B': more_branches B B' ->
more_branches (p (+) l @+ a; B) (p (+) l @+ a; B')
| MB_Branching_NN p mBl mBr :
more_branches (p & mBl // mBr) (p & None // None)
| MB_Branching_NS p mBl a Br Br' : more_branches Br Br' ->
more_branches (p & mBl // Some (a,Br)) (p & None // Some (a,Br'))
| MB_Branching_SN p a Bl Bl' mBr : more_branches Bl Bl' ->
more_branches (p & Some (a,Bl) // mBr) (p & Some (a,Bl') // None)
| MB_Branching_SS p a Bl Bl' a' Br Br' :
more_branches Bl Bl' -> more_branches Br Br' ->
more_branches (p & Some (a,Bl) // Some (a',Br)) (p & Some (a,Bl') // Some (a',Br'))
| MB_Cond b B1 B1' B2 B2' : more_branches B1 B1' -> more_branches B2 B2' ->
more_branches (If b Then B1 Else B2) (If b Then B1' Else B2')
| MB_Call X : more_branches (Call _ X) (Call _ X)
.
Notation "B [>>] B'" := (more_branches B B') (at level 50).
Order properties.
Lemma MB_refl : forall B, B [>>] B.
Lemma MB_refl' : forall B B', B = B' -> B [>>] B'.
Lemma MB_trans : forall B B' B'', B [>>] B' -> B' [>>] B'' -> B [>>] B''.
Lemma MB_antisym : forall B B', B [>>] B' -> B' [>>] B -> B = B'.
This relation extends to networks in the natural way.
Definition more_branches_N (N N':Network Sig) := forall p, N p [>>] N' p.
Notation "N (>>) N'" := (more_branches_N N N') (at level 50).
Open Scope SP.
Lemma MBN_refl : forall N, N (>>) N.
Lemma MBN_refl' : forall N N', N (==) N' -> N (>>) N'.
Lemma MBN_trans : forall N N' N'', N (>>) N' -> N' (>>) N'' -> N (>>) N''.
Lemma MBN_antisym : forall N N', N (>>) N' -> N' (>>) N -> N (==) N'.
Lemma SP_To_MBN : forall D N1 s N2 s' D' N1' tl,
<<N1,s>> --[tl,D]--> <<N2,s'>> -> N1' (>>) N1 -> (forall X, D X = D' X) ->
exists N2', <<N1',s>> --[tl,D']--> <<N2',s'>> /\ N2' (>>) N2.
Lemma SPP_To_MBN : forall P1 s P2 s' P1' tl,
Net P1' (>>) Net P1 -> (forall X, Procs P1 X = Procs P1' X) ->
(P1,s) --[tl]--> (P2,s') ->
exists P2', (P1',s) --[tl]--> (P2',s') /\ Net P2' (>>) Net P2
/\ forall X, Procs P2 X = Procs P2' X.
Lemma SPP_ToStar_MBN : forall P1 s P2 s' P1' tl,
Net P1' (>>) Net P1 -> (forall X, Procs P1 X = Procs P1' X) ->
(P1,s) --[tl]-->* (P2,s') ->
exists P2', (P1',s) --[tl]-->* (P2',s') /\ Net P2' (>>) Net P2
/\ forall X, Procs P1' X = Procs P2' X.
End BranchingOrder.
Notation "N (>>) N'" := (more_branches_N _ N N') (at level 50).
Notation "B [>>] B'" := (more_branches _ B B') (at level 50).