Thm* E:EventStruct, tr:|E| List, ls: ||tr||.
is-send(E)(tr[ls]) ![](FONT/eq.png)
( j: ||tr||. ls < j ![](FONT/eq.png) is-send(E)(tr[j])) ![](FONT/eq.png)
( i,j: ||tr||. i j ![](FONT/eq.png) is-send(E)(tr[j]) ![](FONT/eq.png) (i (switchR(tr)^*) ls) ![](FONT/eq.png) (j (switchR(tr)^*) ls)) | [switch_inv_rel_closure_lemma1] |
Thm* E:EventStruct, tr:|E| List, ls,i: ||tr||.
is-send(E)(tr[ls]) ![](FONT/eq.png) (i (switchR(tr)^*) ls) ![](FONT/eq.png) is-send(E)(tr[i]) | [switch_inv_rel_closure_send] |
Thm* E:TaggedEventStruct, x:|E| List, i: (||x||-1).
switch_inv(E)(x) ![](FONT/eq.png)
is-send(E)(x[(i+1)]) ![](FONT/eq.png)
is-send(E)(x[i]) loc(E)(x[i]) = loc(E)(x[(i+1)]) ![](FONT/eq.png) switch_inv(E)(swap(x;i;i+1)) | [switch_inv_swap] |
Thm* E:EventStruct, L:|E| List.
L = nil ![](FONT/eq.png) Causal(E)(L) ![](FONT/eq.png) ( i: ||L||. is-send(E)(L[i])) | [P_causal_non_nil] |
Thm* E:EventStruct, tr:|E| List.
No-dup-deliver(E)(tr)
![](FONT/if_big.png)
( x,y:|E|.
is-send(E)(x) ![](FONT/eq.png)
is-send(E)(y) ![](FONT/eq.png) (y =msg=(E) x) ![](FONT/eq.png) loc(E)(x) = loc(E)(y) ![](FONT/eq.png) sublist(|E|;[x; y];tr)) | [P_no_dup_iff] |
Thm* E:EventStruct, tr:|E| List.
Causal(E)(tr) ![](FONT/if_big.png) ( tr':|E| List. tr' tr ![](FONT/eq.png) ( x tr'.( y tr'.is-send(E)(y) & (y =msg=(E) x)))) | [P_causal_iff] |
Def switchR(tr)(i,j)
== (is-send(E)(tr[i]))
& (is-send(E)(tr[j]))
& i < j & tr[j] somewhere delivered before tr[i] j < i & tr[i] somewhere delivered before tr[j] | [switch_inv_rel] |
Def switch_inv(E)(tr)
== i,j,k: ||tr||.
i < j ![](FONT/eq.png)
(is-send(E)(tr[i])) ![](FONT/eq.png)
(is-send(E)(tr[j])) ![](FONT/eq.png)
tag(E)(tr[i]) = tag(E)(tr[j]) ![](FONT/eq.png)
tr[j] delivered at time k ![](FONT/eq.png)
( k': ||tr||. k' < k & tr[i] delivered at time k' & loc(E)(tr[k']) = loc(E)(tr[k])) | [switch_inv] |
Def asyncR(E)
== swap adjacent[ loc(E)(x) = loc(E)(y)
& ![](FONT/not.png) (is-send(E)(x)) & ![](FONT/not.png) (is-send(E)(y)) (is-send(E)(x)) & (is-send(E)(y))] | [R_async] |
Def delayableR(E)
== swap adjacent[![](FONT/not.png) (x =msg=(E) y)
& ![](FONT/not.png) (is-send(E)(x)) & (is-send(E)(y)) (is-send(E)(x)) & ![](FONT/not.png) (is-send(E)(y))] | [R_delayable] |
Def switch-decomposable(E)(L)
== L = nil |E| List
( Q:( ||L||![](FONT/dash.png) Prop).
( i: ||L||. Dec(Q(i)))
& ( i: ||L||. Q(i))
& ( i: ||L||. Q(i) ![](FONT/eq.png) (is-send(E)(L[i])))
& ( i,j: ||L||. Q(i) ![](FONT/eq.png) Q(j) ![](FONT/eq.png) tag(E)(L[i]) = tag(E)(L[j]))
& ( i,j: ||L||. Q(i) ![](FONT/eq.png) i j ![](FONT/eq.png) C(Q)(j))) | [switch_decomposable] |
Def AD-normal(E)(tr)
== i: (||tr||-1).
( (is-send(E)(tr[i])) ![](FONT/eq.png) ![](FONT/not.png) (is-send(E)(tr[(i+1)])) ![](FONT/eq.png) (tr[i] =msg=(E) tr[(i+1)]))
& (( x,y: ||tr||.
x < y
& (is-send(E)(tr[x]))
& (is-send(E)(tr[y]))
& tr[x] delivered at time i+1
& tr[y] delivered at time i)
![](FONT/eq.png)
loc(E)(tr[i]) = loc(E)(tr[(i+1)])) | [switch_normal] |
Def Macro
x R_del(E) y
== ![](FONT/not.png) (x =msg=(E) y)
& is-deliver(E)(x) & (is-send(E)(y)) (is-send(E)(x)) & is-deliver(E)(y) | [R_del] |
Def send-enabledR(E)(L_1,L_2) == x:|E|. (is-send(E)(x)) & L_2 = (L_1 @ [x]) | [R_send_enabled] |
Def R_ad_normal(tr)(a,b)
== ( (is-send(E)(a)) ![](FONT/eq.png) ![](FONT/not.png) (is-send(E)(b)) ![](FONT/eq.png) (a =msg=(E) b))
& (![](FONT/not.png) (is-send(E)(a)) ![](FONT/eq.png)
![](FONT/not.png) (is-send(E)(b)) ![](FONT/eq.png)
( x,y: ||tr||.
x < y
& (is-send(E)(tr[x]))
& (is-send(E)(tr[y]))
& (tr[x] =msg=(E) b)
& (tr[y] =msg=(E) a))
![](FONT/eq.png)
loc(E)(a) = loc(E)(b)) | [R_ad_normal] |
Def Causal(E)(tr)
== i: ||tr||. j: ||tr||. j i & (is-send(E)(tr[j])) & (tr[j] =msg=(E) tr[i]) | [P_causal] |
Def No-dup-deliver(E)(tr)
== i,j: ||tr||.
![](FONT/not.png) (is-send(E)(tr[i])) ![](FONT/eq.png)
![](FONT/not.png) (is-send(E)(tr[j])) ![](FONT/eq.png) (tr[j] =msg=(E) tr[i]) ![](FONT/eq.png) loc(E)(tr[i]) = loc(E)(tr[j]) ![](FONT/eq.png) i = j | [P_no_dup] |
Def x delivered at time k == (x =msg=(E) tr[k]) & ![](FONT/not.png) (is-send(E)(tr[k])) | [delivered_at] |
Def tr delivered at p == filter( e.![](FONT/not.png) is-send(E)(e)![](FONT/and.png) loc(E)(e) = p;tr) | [deliveries_at] |
Def switch_inv(E; tr)
== i,j,k: ||tr||.
i < j ![](FONT/eq.png)
(is-send(E)(tr[i])) ![](FONT/eq.png)
(is-send(E)(tr[j])) ![](FONT/eq.png)
tag(E)(tr[i]) = tag(E)(tr[j]) ![](FONT/eq.png)
(tr[j] =msg=(E) tr[k]) ![](FONT/eq.png)
![](FONT/not.png) (is-send(E)(tr[k])) ![](FONT/eq.png)
( k': ||tr||.
k' < k & loc(E)(tr[k']) = loc(E)(tr[k]) & (tr[i] =msg=(E) tr[k']) & ![](FONT/not.png) (is-send(E)(tr[k']))) | [switch_inv2001_03_15_DASH_PM_DASH_12_53_21] |