All pastes #2006608 Raw Edit

Untitled

public text v1 · immutable
#2006608 ·published 2010-11-30 10:15 UTC
rendered paste body
/* Una palestra ha un’utenza composta da N uomini e N donne. 
Poiché dispone di un solo spogliatoio deve organizzare turni 
per evitare che persone di sesso diverso si trovino contemporaneamente 
nello spogliatoio. Un Inserviente è quindi incaricato di ottimizzare 
l’accesso allo spogliatoio consentendo a una donna (un uomo) di cambiarsi 
solo se lo spogliatoio è libero o se è già occupato da un’altra donna (un altro uomo).
La palestra ha inoltre una categoria vip, con NV membri, che consente a chi vi 
appartiene (uomo o donna) di avere la precedenza e di cambiarsi da solo.
Modellare il sistema supponendo che gli utenti possono arrivare in ordine 
qualsiasi ed abbiano un comportamento ciclico. Assumere N=3 e NV=1. 
Realizzare il sistema in Java con N e NV parametri del main. */


const N=3
const NV=1

range NRange=0..N
range PersoneRange=0..N+N+NV
range VipRange=0..NV
range SexRange=0..2 //0=donne,1=uomini, 2=vip

// N+N+NV persone

Donna = (entraDonna -> spogliaDonna -> esciDonna -> Donna).
Uomo = (entraUomo -> spogliaUomo -> esciUomo -> Uomo).
Vip = (richiediIngressoVip -> entraVip -> spogliaVip -> esciVip -> Vip).

Inserviente = Inserviente[0][0][0],
Inserviente[npersone:PersoneRange][sesso:SexRange][nvip:VipRange] = (
	//Donne
	when (nvip==0 & ((sesso==0 & npersone<(N+N+NV)) | (npersone==0))) d[NRange].entraDonna -> Inserviente[npersone+1][0][nvip] |
	when (sesso==0 & npersone>0) d[NRange].esciDonna -> Inserviente[npersone-1][0][nvip] |
	//Uomini
	when (nvip==0 & ((sesso==1 & npersone<(N+N+NV)) | (npersone==0))) u[NRange].entraUomo -> Inserviente[npersone+1][1][nvip] |
	when (sesso==1 & npersone>0) u[NRange].esciUomo -> Inserviente[npersone-1][1][nvip] |
	//Vip
	//Se c'è un vip in attesa...
	when (nvip<NV) v[VipRange].richiediIngressoVip -> Inserviente[npersone][sesso][nvip+1] |  
	//Se non ci sono persone posso far entrare un VIP
	when (npersone==0 & nvip>0) v[VipRange].entraVip -> Inserviente[npersone+1][2][nvip-1] |
	when (npersone>0) v[VipRange].esciVip -> Inserviente[npersone-1][0][nvip] 
).

||Donne = (d[NRange]:Donna).
||Uomini = (u[NRange]:Uomo).
||Vips = (v[VipRange]:Vip).

||SYS = (Donne || Uomini || Inserviente || Vips).