Programowanie Wspolbiezne, 2001-05-16

Rozwiazanie zadania 2

A( i : 1 .. N ) ::
  gram : boolean;
  s    : ( wolny, odpadl, koniec );
  moja_liczba, jego_liczba, i : integer;
  z_kim : integer;

  gram := true;
  *[ gram -> z_kim := losuj;
             Sedzia ! chce_walczyc_z( z_kim );
             Sedzia ? odp( s );
             [  s = koniec -> gram := false
             [] s = odpadl -> skip
             [] s = wolny  ->
                             moja_liczba := losuj;
                             [ (i:1..M) i = z_kim -> B(i) ! moja_liczba;  
                                                     B(i) ? jego_liczba; ]

                             [ moja_liczba >= jego_liczba -> Sedzia ! pokonalem( z_kim ) 
                             []
                               moja_liczba < jego_liczba  ->  gram := false;
                             ]
             ]          
  ]

|| 

B( j : 1 .. N ) ::
  gram : boolean;
  moja_liczba, jego_liczba, i : integer;
 
  gram := true;
  *[(i:1..N) gram; A(i) ? jego_liczba ->  
        moja_liczba := losuj;
        A(i) ! moja_liczba; 
        [  moja_liczba > jego_liczba  -> Sedzia ! pokonalem( i ) 
        [] moja_liczba <= jego_liczba -> gram := false;
        ]
   ]

||

Sedzia ::
  ilu_B : integer;                       comment ilu jeszcze pozostalo w grze
  i, j, k : integer;
  stan_A : (1..N) integer;                  comment na kogo czeka proces A
  stan_B : (1..M) (wolny, walczy, odpadl);
  
  ilu_B := N;
  *[ (i:1..N) stan_A(i) <> 0 -> stan_A(i) := 0 ]  comment na nikogo nie czeka
  *[ (i:1..M) stan_B(i) <> wolny -> stan_B(i) := wolny ]

  *[      (i:1..N) A(i) ? chce_walczyc_z( j ) ->
                         [ stan_B(j) = wolny  -> 
                                     A(i) ! odp(wolny);
                                     stan_B(j) := walczy;
                         []
                           stan_B(j) = odpadl -> [ ilu_B > 0 -> 
                                                          A(i) ! odp( odpadl );
                                                  []
                                                   ilu_B = 0 ->
                                                          A(i) ! odp( koniec );
                                                 ]
                         []
                           stan_B(j) = walczy -> stan_A(i) := j;
                         ]
       []
          (i:1..N) A(i) ? pokonalem(j) -> 
                         stan_B(j) := odpadl;
                         ilu_B--;
                         
                         *[ (i:1..N) stan_A(i) = j -> 
                                   A(i) ! odp( odpadl ); 
                                   stan_A(i) := 0; 
                          ]
                         
       []
          (i:1..M) B(i) ? pokonalem(j) -> 
                         stan_A(j) := -1;              comment odpadl
                         stan_B(i) := wolny;

                         *[ (k:1..N) stan_B(i) = wolny; stan_A(k) = i ->
                                   A(k) ! odp( wolny );
                                   stan_A(k) := 0;
                                   stan_B(i) := walczy;  
                         ]
  ]

Istnieja rowniez rozwiazania bez wyroznionego centralnego procesu Sedzia; znalezienie takowego rozwiazania pozostawiamy jednak Czytelnikowi...




Slawomir Lasota 2001-05-29