law(pingpong,language(prolog)). sent(X,ping(M),Y) :- not(pingTo(Y)@CS), do(add(pingTo(Y))), do(forward). arrived(X,ping(M),Y) :- do(add(pingFrom(X))), do(deliver). sent(X,pong(M),Y) :- pingFrom(Y)@CS, do(remove(pingFrom(Y))), do(forward). arrived(X,pong(M),Y) :- do(remove(pingTo(X))), do(deliver). disconnected :- do(quit).