You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							85 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							85 lines
						
					
					
						
							2.4 KiB
						
					
					
				| // synchronous leader election protocol  (itai & Rodeh) | |
| // dxp/gxn 25/01/01 | |
| 
 | |
| dtmc | |
| 
 | |
| // CONSTANTS | |
| const int N = 3; // number of processes | |
| const int K = 5; // 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 -> 1:(c'=c+1); | |
| 	// finished reading | |
| 	[read] c=N-1 -> 1:(c'=c); | |
| 	//decide | |
| 	[done] u1|u2|u3 -> 1:(c'=c); | |
| 	// pick again reset counter  | |
| 	[retry] !(u1|u2|u3) -> 1:(c'=1); | |
| 	// loop (when finished to avoid deadlocks) | |
| 	[loop] s1=3 -> 1:(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/K : (s1'=1) & (p1'=0) & (v1'=0) & (u1'=true) | |
| 	             + 1/K : (s1'=1) & (p1'=1) & (v1'=1) & (u1'=true) | |
| 	             + 1/K : (s1'=1) & (p1'=2) & (v1'=2) & (u1'=true) | |
| 	             + 1/K : (s1'=1) & (p1'=3) & (v1'=3) & (u1'=true) | |
| 	             + 1/K : (s1'=1) & (p1'=4) & (v1'=4) & (u1'=true); | |
| 	// read | |
| 	[read] s1=1 &  u1 & c<N-1 -> 1:(u1'=(p1!=v2)) & (v1'=v2); | |
| 	[read] s1=1 & !u1 & c<N-1 -> 1:(u1'=false) & (v1'=v2) & (p1'=0); | |
| 	// read and move to decide | |
| 	[read] s1=1 &  u1 & c=N-1 -> 1:(s1'=2) & (u1'=(p1!=v2)) & (v1'=0) & (p1'=0); | |
| 	[read] s1=1 & !u1 & c=N-1 -> 1:(s1'=2) & (u1'=false) & (v1'=0); | |
| 	// deciding | |
| 	// done | |
| 	[done] s1=2 -> 1:(s1'=3) & (u1'=false) & (v1'=0) & (p1'=0); | |
| 	//retry | |
| 	[retry] s1=2 -> 1:(s1'=0) & (u1'=false) & (v1'=0) & (p1'=0); | |
| 	// loop (when finished to avoid deadlocks) | |
| 	[loop] s1=3 -> 1:(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=v1 ] endmodule | |
| 
 | |
| // expected number of rounds | |
| rewards "num_rounds" | |
| 	[pick] true : 1; | |
| endrewards | |
| 
 | |
| // labels | |
| label "elected" = s1=3&s2=3&s3=3; | |
| 
 |