// There is a problem in this code ... can you fix it ?

define NP 1
define NC 4
define N 4

PRODUCTEUR ==
		nb : integer := 0; message : string;
		*[
			true ->
				message := "objet num " + nb;
				liste!prod(message);
				print ("production " + i + " : " + message + "\n");
				nb := nb + 1
		]
		
BUFFER ==
		tampon : [0..N-1] string := [0..N-1] "";
		dernier,premier,nb : integer := 0;
		message : string := "";
		*[
			(i:1..NP) nb /= N ; producteur[i]?prod(tampon[dernier]) ->
				dernier := (dernier +  1) mod N; nb:=nb+1;
				print ("P - positions " + " : " + premier + dernier + " - nbr d'elements : " + nb + "\n")
		[]
			(i:1..NC) nb = N & true; consommateur[i]!cons(tampon[premier],(N+dernier-premier)mod N) ->
				premier := (premier + 1) mod N; nb := nb-1;
				print ("C - positions " + " : " + premier + dernier + " - nbr d'elements : " + nb + "\n")
		]		

CONSOMMATEUR ==
		message : string; k: integer;
		*[ 
			true ->
				liste?cons(message,k);
				print ("consommateur " + i + " : " + message + "\n");
				sleep(500*i)
		]

MAIN ==
		[
			producteur[i:1..NP] :: PRODUCTEUR
		||
			consommateur[i:1..NC] :: CONSOMMATEUR
		||
			liste :: BUFFER
		]