dtmc

 

 

global inchannelOne : [0..4] init 4;//suppose at beginning 4 players are all in channel 1

global inchannelTwo : [0..4];

global inchannelThree : [0..4];

global inchannelFour : [0..4];

 

global inchannelOneNextRound : [0..4];//temporarily record how many agents choose action 1 in next round

global inchannelTwoNextRound : [0..4];

global inchannelThreeNextRound : [0..4];

global inchannelFourNextRound : [0..4];

 

global p1end : bool init false;//record if Agent1 module ends or not

global p2end : bool init false;

global p3end : bool init false;

global p4end : bool init false;

global RoundBegin : bool init true;

//p5end : bool init false;

//p6end : bool init false;

 

formula safe = inchannelOneNextRound < 4 & inchannelTwoNextRound < 4 & inchannelThreeNextRound < 4 & inchannelFourNextRound < 4;

 

module Agent1

 

    p1 :[0..4] init 1;

    //0 idle

    //1 in channel 1

    //2 in channel 2

    //3 in channel 3

    //4 in channel 4

 

    //no channel has just one player

    [] safe & RoundBegin & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour != 1 ->

         0.25 : (p1'=1)& (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         0.25 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         0.25 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         0.25 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);   

    //p1 is the only agent in channel 1

    [] safe & RoundBegin & p1=1 & inchannelOne=1  -> (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1);

 

    [] safe & RoundBegin & p1=1 & inchannelOne!=1 & inchannelTwo=1 & inchannelThree!=1 & inchannelFour!=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=1 & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree=1 & inchannelFour!=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=1 & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1);

 

    [] safe & RoundBegin & p1=1 & inchannelOne!=1 & inchannelTwo=1 & inchannelThree=1 & inchannelFour!=1 ->

         0.5 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         0.5 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=1 & inchannelOne!=1 & inchannelTwo=1 & inchannelThree!=1 & inchannelFour=1 ->

         0.5 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         0.5 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1);

 

    [] safe & RoundBegin & p1=1 & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree=1 & inchannelFour=1 ->

         0.5 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         0.5 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1);

    //p1 is the only aget in channel 2

    [] safe & RoundBegin & p1=2 & inchannelTwo=1  -> (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1);

   

    [] safe & RoundBegin & p1=2 & inchannelOne=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour!=1 ->

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=2 & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree=1 & inchannelFour!=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=2 & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1);

 

    [] safe & RoundBegin & p1=2 & inchannelOne=1 & inchannelTwo!=1 & inchannelThree=1 & inchannelFour!=1 ->

         0.5 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         0.5 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=2 & inchannelOne=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour=1 ->

         0.5 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         0.5 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1);

 

    [] safe & RoundBegin & p1=2 & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree=1 & inchannelFour=1 ->

         0.5 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         0.5 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1);

    //p1 is the only agent in channel 3

    [] safe & RoundBegin & p1=3 & inchannelThree=1  -> (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1);

   

    [] safe & RoundBegin & p1=3 & inchannelOne=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour!=1 ->

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=3 & inchannelOne!=1 & inchannelTwo=1 & inchannelThree!=1 & inchannelFour!=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=3 & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1);

 

    [] safe & RoundBegin & p1=3 & inchannelOne=1 & inchannelTwo=1 & inchannelThree!=1 & inchannelFour!=1 ->

         0.5 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         0.5 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=3 & inchannelOne=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour=1 ->

         0.5 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         0.5 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1);

 

    [] safe & RoundBegin & p1=3 & inchannelOne!=1 & inchannelTwo=1 & inchannelThree!=1 & inchannelFour=1 ->

         0.5 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         0.5 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1);

    //p1 is the only agent in channel 4

    [] safe & RoundBegin & p1=4 & inchannelFour=1  -> (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

   

    [] safe & RoundBegin & p1=4 & inchannelOne=1 & inchannelTwo!=1 & inchannelThree!=1 & inchannelFour!=1 ->

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=4 & inchannelOne!=1 & inchannelTwo=1 & inchannelThree!=1 & inchannelFour!=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=4 & inchannelOne!=1 & inchannelTwo!=1 & inchannelThree=1 & inchannelFour!=1 ->

         1/3 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         1/3 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         1/3 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=4 & inchannelOne=1 & inchannelTwo=1 & inchannelThree!=1 & inchannelFour!=1 ->

         0.5 : (p1'=3) & (p1end'=true) & (RoundBegin'=false) & (inchannelThreeNextRound' = inchannelThreeNextRound + 1) +

         0.5 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=4 & inchannelOne=1 & inchannelTwo!=1 & inchannelThree=1 & inchannelFour!=1 ->

         0.5 : (p1'=2) & (p1end'=true) & (RoundBegin'=false) & (inchannelTwoNextRound' = inchannelTwoNextRound + 1) +

         0.5 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

 

    [] safe & RoundBegin & p1=4 & inchannelOne!=1 & inchannelTwo=1 & inchannelThree=1 & inchannelFour!=1 ->

         0.5 : (p1'=1) & (p1end'=true) & (RoundBegin'=false) & (inchannelOneNextRound' = inchannelOneNextRound + 1) +

         0.5 : (p1'=4) & (p1end'=true) & (RoundBegin'=false) & (inchannelFourNextRound' = inchannelFourNextRound + 1);

   

 

endmodule

 

module Agent2 = Agent1[RoundBegin=p1end, p1end=p2end, p1=p2] endmodule

module Agent3 = Agent1[RoundBegin=p2end, p1end=p3end, p1=p3] endmodule

module Agent4 = Agent1[RoundBegin=p3end, p1end=p4end, p1=p4] endmodule

 

module Roundfinish

    [] p4end -> (inchannelOne'=inchannelOneNextRound) & (inchannelOneNextRound'=0) & (inchannelTwo'=inchannelTwoNextRound) & (inchannelTwoNextRound'=0) &

                (inchannelThree'=inchannelThreeNextRound) & (inchannelThreeNextRound'=0) & (inchannelFour'=inchannelFourNextRound) & (inchannelFourNextRound'=0) &

                (RoundBegin'=true) & (p4end'=false);

  

endmodule

 

label "MDO" = inchannelOne=1&inchannelTwo=1&inchannelThree=1&inchannelFour=1;