Thm* E:TaggedEventStruct, x:|E| List, i: (||x||-1).
switch_inv(E)(x) 
is-send(E)(x[(i+1)]) 
is-send(E)(x[i]) loc(E)(x[i]) = loc(E)(x[(i+1)])  switch_inv(E)(swap(x;i;i+1)) | [switch_inv_swap] |
Thm* E:EventStruct, a,b:|E|, tr:|E| List.
a somewhere delivered before b

( k: ||tr||.
a delivered at time k 
( k': ||tr||. k' < k & b delivered at time k' & loc(E)(tr[k']) = loc(E)(tr[k]))) | [not_delivered_before_somewhere] |
Thm* E:EventStruct, tr:|E| List.
No-dup-deliver(E)(tr)

( x,y:|E|.
is-send(E)(x) 
is-send(E)(y)  (y =msg=(E) x)  loc(E)(x) = loc(E)(y)  sublist(|E|;[x; y];tr)) | [P_no_dup_iff] |
Def switch_inv(E)(tr)
== i,j,k: ||tr||.
i < j 
(is-send(E)(tr[i])) 
(is-send(E)(tr[j])) 
tag(E)(tr[i]) = tag(E)(tr[j]) 
tr[j] delivered at time k 
( 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)
&  (is-send(E)(x)) &  (is-send(E)(y)) (is-send(E)(x)) & (is-send(E)(y))] | [R_async] |
Def AD-normal(E)(tr)
== i: (||tr||-1).
( (is-send(E)(tr[i]))   (is-send(E)(tr[(i+1)]))  (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)

loc(E)(tr[i]) = loc(E)(tr[(i+1)])) | [switch_normal] |
Def x somewhere delivered before y
== k: ||tr||.
x delivered at time k
& ( k': ||tr||. y delivered at time k'  loc(E)(tr[k']) = loc(E)(tr[k])  k k') | [delivered_before_somewhere] |
Def R_ad_normal(tr)(a,b)
== ( (is-send(E)(a))   (is-send(E)(b))  (a =msg=(E) b))
& ( (is-send(E)(a)) 
 (is-send(E)(b)) 
( 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))

loc(E)(a) = loc(E)(b)) | [R_ad_normal] |
Def No-dup-deliver(E)(tr)
== i,j: ||tr||.
 (is-send(E)(tr[i])) 
 (is-send(E)(tr[j]))  (tr[j] =msg=(E) tr[i])  loc(E)(tr[i]) = loc(E)(tr[j])  i = j | [P_no_dup] |
Def tr delivered at p == filter( e. is-send(E)(e) loc(E)(e) = p;tr) | [deliveries_at] |
Def switch_inv(E; tr)
== i,j,k: ||tr||.
i < j 
(is-send(E)(tr[i])) 
(is-send(E)(tr[j])) 
tag(E)(tr[i]) = tag(E)(tr[j]) 
(tr[j] =msg=(E) tr[k]) 
 (is-send(E)(tr[k])) 
( k': ||tr||.
k' < k & loc(E)(tr[k']) = loc(E)(tr[k]) & (tr[i] =msg=(E) tr[k']) &  (is-send(E)(tr[k']))) | [switch_inv2001_03_15_DASH_PM_DASH_12_53_21] |