Browse Source
Added 4_14 and 4_16 to synchronous leader election.
Added 4_14 and 4_16 to synchronous leader election.
git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@324 bbc10eb1-c90d-0410-af57-cb519fbb1720master
2 changed files with 192 additions and 0 deletions
-
95prism-examples/leader/synchronous/leader4_14.pm
-
97prism-examples/leader/synchronous/leader4_16.pm
@ -0,0 +1,95 @@ |
|||
// synchronous leader election protocol (itai & Rodeh) |
|||
// dxp/gxn 25/01/01 |
|||
// N=4 and K=14 |
|||
|
|||
probabilistic |
|||
|
|||
// CONSTANTS |
|||
const N=4; // number of processes |
|||
const K=14; // range of probabilistic choice |
|||
|
|||
// counter module used to count the number of processes that have been read |
|||
// and to know when a process has decided |
|||
module counter |
|||
|
|||
// counter (c=i means process j reading process (i-1)+j next) |
|||
c : [1..N-1]; |
|||
|
|||
// reading |
|||
[read] c<N-1 -> (c'=c+1); |
|||
// finished reading |
|||
[read] c=N-1 -> (c'=c); |
|||
//done |
|||
[done] u1 | u2 | u3 | u4 -> (c'=c); |
|||
// pick again reset counter |
|||
[retry] !(u1 | u2 | u3 | u4) -> (c'=1); |
|||
// loop (when finished to avoid deadlocks) |
|||
[loop] s1=3 -> (c'=c); |
|||
|
|||
endmodule |
|||
|
|||
// processes form a ring and suppose: |
|||
// process 1 reads process 2 |
|||
// process 2 reads process 3 |
|||
// process 3 reads process 1 |
|||
module process1 |
|||
|
|||
// local state |
|||
s1 : [0..3]; |
|||
// s1=0 make random choice |
|||
// s1=1 reading |
|||
// s1=2 deciding |
|||
// s1=3 finished |
|||
|
|||
// has a unique id so far (initially true) |
|||
u1 : bool; |
|||
|
|||
// value to be sent to next process in the ring (initially sets this to its own value) |
|||
v1 : [0..K-1]; |
|||
|
|||
// random choice |
|||
p1 : [0..K-1]; |
|||
|
|||
// pick value |
|||
[pick] s1=0 -> 1/14 : (s1'=1) & (p1'=0) & (v1'=0) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=1) & (v1'=1) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=2) & (v1'=2) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=3) & (v1'=3) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=4) & (v1'=4) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=5) & (v1'=5) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=6) & (v1'=6) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=7) & (v1'=7) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=8) & (v1'=8) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=9) & (v1'=9) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=10) & (v1'=10) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=11) & (v1'=11) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=12) & (v1'=12) & (u1'=true) |
|||
+ 1/14 : (s1'=1) & (p1'=13) & (v1'=13) & (u1'=true); |
|||
// read |
|||
[read] s1=1 & u1 & !p1=v2 & c<N-1 -> (u1'=true) & (v1'=v2); |
|||
[read] s1=1 & u1 & p1=v2 & c<N-1 -> (u1'=false) & (v1'=v2) & (p1'=0); |
|||
[read] s1=1 & !u1 & c<N-1 -> (u1'=false) & (v1'=v2); |
|||
// read and move to decide |
|||
[read] s1=1 & u1 & !p1=v2 & c=N-1 -> (s1'=2) & (u1'=true) & (v1'=0) & (p1'=0); |
|||
[read] s1=1 & u1 & p1=v2 & c=N-1 -> (s1'=2) & (u1'=false) & (v1'=0) & (p1'=0); |
|||
[read] s1=1 & !u1 & c=N-1 -> (s1'=2) & (u1'=false) & (v1'=0); |
|||
// done |
|||
[done] s1=2 -> (s1'=3) & (u1'=false) & (v1'=0) & (p1'=0); |
|||
//retry |
|||
[retry] s1=2 -> (s1'=0) & (u1'=false) & (v1'=0) & (p1'=0); |
|||
// loop (when finished to avoid deadlocks) |
|||
[loop] s1=3 -> (s1'=3); |
|||
|
|||
endmodule |
|||
|
|||
// construct remaining processes through renaming |
|||
module process2=process1[s1=s2,p1=p2,v1=v2,u1=u2,v2=v3] endmodule |
|||
module process3=process1[s1=s3,p1=p3,v1=v3,u1=u3,v2=v4] endmodule |
|||
module process4=process1[s1=s4,p1=p4,v1=v4,u1=u4,v2=v1] endmodule |
|||
|
|||
// REWARDS -expected number of rounds |
|||
rewards |
|||
|
|||
[pick] true : 1; |
|||
|
|||
endrewards |
|||
@ -0,0 +1,97 @@ |
|||
// synchronous leader election protocol (itai & Rodeh) |
|||
// dxp/gxn 25/01/01 |
|||
// N=4 and K=16 |
|||
|
|||
probabilistic |
|||
|
|||
// CONSTANTS |
|||
const N=4; // number of processes |
|||
const K=16; // range of probabilistic choice |
|||
|
|||
// counter module used to count the number of processes that have been read |
|||
// and to know when a process has decided |
|||
module counter |
|||
|
|||
// counter (c=i means process j reading process (i-1)+j next) |
|||
c : [1..N-1]; |
|||
|
|||
// reading |
|||
[read] c<N-1 -> (c'=c+1); |
|||
// finished reading |
|||
[read] c=N-1 -> (c'=c); |
|||
//done |
|||
[done] u1 | u2 | u3 | u4 -> (c'=c); |
|||
// pick again reset counter |
|||
[retry] !(u1 | u2 | u3 | u4) -> (c'=1); |
|||
// loop (when finished to avoid deadlocks) |
|||
[loop] s1=3 -> (c'=c); |
|||
|
|||
endmodule |
|||
|
|||
// processes form a ring and suppose: |
|||
// process 1 reads process 2 |
|||
// process 2 reads process 3 |
|||
// process 3 reads process 1 |
|||
module process1 |
|||
|
|||
// local state |
|||
s1 : [0..3]; |
|||
// s1=0 make random choice |
|||
// s1=1 reading |
|||
// s1=2 deciding |
|||
// s1=3 finished |
|||
|
|||
// has a unique id so far (initially true) |
|||
u1 : bool; |
|||
|
|||
// value to be sent to next process in the ring (initially sets this to its own value) |
|||
v1 : [0..K-1]; |
|||
|
|||
// random choice |
|||
p1 : [0..K-1]; |
|||
|
|||
// pick value |
|||
[pick] s1=0 -> 1/16 : (s1'=1) & (p1'=0) & (v1'=0) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=1) & (v1'=1) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=2) & (v1'=2) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=3) & (v1'=3) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=4) & (v1'=4) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=5) & (v1'=5) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=6) & (v1'=6) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=7) & (v1'=7) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=8) & (v1'=8) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=9) & (v1'=9) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=10) & (v1'=10) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=11) & (v1'=11) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=12) & (v1'=12) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=13) & (v1'=13) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=14) & (v1'=14) & (u1'=true) |
|||
+ 1/16 : (s1'=1) & (p1'=15) & (v1'=15) & (u1'=true); |
|||
// read |
|||
[read] s1=1 & u1 & !p1=v2 & c<N-1 -> (u1'=true) & (v1'=v2); |
|||
[read] s1=1 & u1 & p1=v2 & c<N-1 -> (u1'=false) & (v1'=v2) & (p1'=0); |
|||
[read] s1=1 & !u1 & c<N-1 -> (u1'=false) & (v1'=v2); |
|||
// read and move to decide |
|||
[read] s1=1 & u1 & !p1=v2 & c=N-1 -> (s1'=2) & (u1'=true) & (v1'=0) & (p1'=0); |
|||
[read] s1=1 & u1 & p1=v2 & c=N-1 -> (s1'=2) & (u1'=false) & (v1'=0) & (p1'=0); |
|||
[read] s1=1 & !u1 & c=N-1 -> (s1'=2) & (u1'=false) & (v1'=0); |
|||
// done |
|||
[done] s1=2 -> (s1'=3) & (u1'=false) & (v1'=0) & (p1'=0); |
|||
//retry |
|||
[retry] s1=2 -> (s1'=0) & (u1'=false) & (v1'=0) & (p1'=0); |
|||
// loop (when finished to avoid deadlocks) |
|||
[loop] s1=3 -> (s1'=3); |
|||
|
|||
endmodule |
|||
|
|||
// construct remaining processes through renaming |
|||
module process2=process1[s1=s2,p1=p2,v1=v2,u1=u2,v2=v3] endmodule |
|||
module process3=process1[s1=s3,p1=p3,v1=v3,u1=u3,v2=v4] endmodule |
|||
module process4=process1[s1=s4,p1=p4,v1=v4,u1=u4,v2=v1] endmodule |
|||
|
|||
// REWARDS -expected number of rounds |
|||
rewards |
|||
|
|||
[pick] true : 1; |
|||
|
|||
endrewards |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue