-- Model of the system

include "Network.csp"

-- Global variable declarations
NS = {0..499}
N = 500

datatype IDS =   Fork.{0..499} |   Phil.{0..499}   
-- Datatype declarations

-- Channel declarations
channel putdown : NS.NS
channel pickup : NS.NS
channel eat : NS
channel getup : NS
channel sit : NS


Atom(Fork.id) = (Fork.id,let 
	prev(id) = (id - 1) % N
	F =	[] i : {id,prev(id)} @ pickup.i.id -> putdown.i.id -> F
within
	F,{|pickup.i.id,putdown.i.id | i <- {id,((id -1) % N)}|})
Atom(Phil.id) = (Phil.id,let 
	next(id) = (id + 1) % N
	P = sit.id -> pickup.id.id -> pickup.id!next(id) -> eat.id -> 
	putdown.id.id -> putdown.id!next(id) -> getup.id -> P
	AP = sit.id -> pickup.id!next(id) -> pickup.id.id -> 
	eat.id -> putdown.id!next(id) -> putdown.id.id ->
	 getup.id -> AP
within 
	if id == N-1 then AP else P,{|pickup.id.i,putdown.id.i,sit.id,getup.id,eat.id | i <- {id,((id +1) %N)}|})

Network = DefaultNetwork(IDS)



