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.
		
		
		
		
		
			
		
			
				
					
					
						
							157 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							157 lines
						
					
					
						
							4.3 KiB
						
					
					
				| // Modest version of http://www.prismmodelchecker.org/casestudies/consensus_prism.php | |
| // Command line: mcsta.exe consensus-6.modest -S Memory --nochainopt --bounded-alg StateElimination -E "K=2" | |
| 
 | |
| action done; | |
| 
 | |
| // constants | |
| const int N = 6; | |
| const int K = 4; | |
| const int range = 2 * (K + 1) * N; | |
| const int counter_init = (K + 1) * N; | |
| const int left = N; | |
| const int right = 2 * (K + 1) * N - N; | |
| 
 | |
| // shared coin | |
| int(0..range) counter = counter_init; | |
| reward coin_flips; | |
| 
 | |
| property C1 = P(<> (fin1 == 1 && fin2 == 1 && fin3 == 1 && fin4 == 1 && fin5 == 1 && fin6 == 1)) >= 1; | |
| property C2 = Pmin(<> (fin1 == 1 && fin2 == 1 && fin3 == 1 && fin4 == 1 && fin5 == 1 && fin6 == 1 && coin1 == 1 && coin2 == 1 && coin3 == 1 && coin4 == 1 && coin5 == 1 && coin6 == 1)); | |
| 
 | |
| int(0..1) fin1, fin2, fin3, fin4, fin5, fin6; | |
| int(0..1) coin1, coin2, coin3, coin4, coin5, coin6; | |
| 
 | |
| process Tourist1() | |
| { | |
| 	process Flip() { palt { :1: {= coin1 = 0, coin_flips++ =} :1: {= coin1 = 1, coin_flips++ =} }; Write() } | |
| 	process Write() { | |
| 		alt { | |
| 		::	when(coin1 == 0 && counter > 0) {= counter-- =}; Check() | |
| 		::	when(coin1 == 1 && counter < range) {= counter++, coin1 = 0 =}; Check() | |
| 		} | |
| 	} | |
| 	process Check() { | |
| 		alt { | |
| 		::	when(counter <= left) {= coin1 = 0, fin1 = 1 =}; Finished() | |
| 		::	when(counter >= right) {= coin1 = 1, fin1 = 1 =}; Finished() | |
| 		::	when(counter > left && counter < right) Tourist1() | |
| 		} | |
| 	} | |
| 	process Finished() { done; Finished() } | |
| 
 | |
| 	Flip() | |
| } | |
| 
 | |
| process Tourist2() | |
| { | |
| 	process Flip() { palt { :1: {= coin2 = 0, coin_flips++ =} :1: {= coin2 = 1, coin_flips++ =} }; Write() } | |
| 	process Write() { | |
| 		alt { | |
| 		::	when(coin2 == 0 && counter > 0) {= counter-- =}; Check() | |
| 		::	when(coin2 == 1 && counter < range) {= counter++, coin2 = 0 =}; Check() | |
| 		} | |
| 	} | |
| 	process Check() { | |
| 		alt { | |
| 		::	when(counter <= left) {= coin2 = 0, fin2 = 1 =}; Finished() | |
| 		::	when(counter >= right) {= coin2 = 1, fin2 = 1 =}; Finished() | |
| 		::	when(counter > left && counter < right) Tourist2() | |
| 		} | |
| 	} | |
| 	process Finished() { done; Finished() } | |
| 
 | |
| 	Flip() | |
| } | |
| 
 | |
| process Tourist3() | |
| { | |
| 	process Flip() { palt { :1: {= coin3 = 0, coin_flips++ =} :1: {= coin3 = 1, coin_flips++ =} }; Write() } | |
| 	process Write() { | |
| 		alt { | |
| 		::	when(coin3 == 0 && counter > 0) {= counter-- =}; Check() | |
| 		::	when(coin3 == 1 && counter < range) {= counter++, coin3 = 0 =}; Check() | |
| 		} | |
| 	} | |
| 	process Check() { | |
| 		alt { | |
| 		::	when(counter <= left) {= coin3 = 0, fin3 = 1 =}; Finished() | |
| 		::	when(counter >= right) {= coin3 = 1, fin3 = 1 =}; Finished() | |
| 		::	when(counter > left && counter < right) Tourist3() | |
| 		} | |
| 	} | |
| 	process Finished() { done; Finished() } | |
| 
 | |
| 	Flip() | |
| } | |
| 
 | |
| process Tourist4() | |
| { | |
| 	process Flip() { palt { :1: {= coin4 = 0, coin_flips++ =} :1: {= coin4 = 1, coin_flips++ =} }; Write() } | |
| 	process Write() { | |
| 		alt { | |
| 		::	when(coin4 == 0 && counter > 0) {= counter-- =}; Check() | |
| 		::	when(coin4 == 1 && counter < range) {= counter++, coin4 = 0 =}; Check() | |
| 		} | |
| 	} | |
| 	process Check() { | |
| 		alt { | |
| 		::	when(counter <= left) {= coin4 = 0, fin4 = 1 =}; Finished() | |
| 		::	when(counter >= right) {= coin4 = 1, fin4 = 1 =}; Finished() | |
| 		::	when(counter > left && counter < right) Tourist4() | |
| 		} | |
| 	} | |
| 	process Finished() { done; Finished() } | |
| 
 | |
| 	Flip() | |
| } | |
| 
 | |
| process Tourist5() | |
| { | |
| 	process Flip() { palt { :1: {= coin5 = 0, coin_flips++ =} :1: {= coin5 = 1, coin_flips++ =} }; Write() } | |
| 	process Write() { | |
| 		alt { | |
| 		::	when(coin5 == 0 && counter > 0) {= counter-- =}; Check() | |
| 		::	when(coin5 == 1 && counter < range) {= counter++, coin5 = 0 =}; Check() | |
| 		} | |
| 	} | |
| 	process Check() { | |
| 		alt { | |
| 		::	when(counter <= left) {= coin5 = 0, fin5 = 1 =}; Finished() | |
| 		::	when(counter >= right) {= coin5 = 1, fin5 = 1 =}; Finished() | |
| 		::	when(counter > left && counter < right) Tourist5() | |
| 		} | |
| 	} | |
| 	process Finished() { done; Finished() } | |
| 
 | |
| 	Flip() | |
| } | |
| 
 | |
| process Tourist6() | |
| { | |
| 	process Flip() { palt { :1: {= coin6 = 0, coin_flips++ =} :1: {= coin6 = 1, coin_flips++ =} }; Write() } | |
| 	process Write() { | |
| 		alt { | |
| 		::	when(coin6 == 0 && counter > 0) {= counter-- =}; Check() | |
| 		::	when(coin6 == 1 && counter < range) {= counter++, coin6 = 0 =}; Check() | |
| 		} | |
| 	} | |
| 	process Check() { | |
| 		alt { | |
| 		::	when(counter <= left) {= coin6 = 0, fin6 = 1 =}; Finished() | |
| 		::	when(counter >= right) {= coin6 = 1, fin6 = 1 =}; Finished() | |
| 		::	when(counter > left && counter < right)  Tourist6() | |
| 		} | |
| 	} | |
| 	process Finished() { done; Finished() } | |
| 
 | |
| 	Flip() | |
| } | |
| 
 | |
| par { | |
| ::	Tourist1() | |
| ::	Tourist2() | |
| ::	Tourist3() | |
| ::	Tourist4() | |
| ::	Tourist5() | |
| ::	Tourist6() | |
| }
 |