:- module main. main :- true | unix:unix([bind(inet(654321),R)]), main(R). main(R) :- R=normal(SSock) | generic:new(merge, Lss, Ls), chat(Chat, Lss, Ls), accept(SSock, Chat). accept(SSock, Chat) :- true | SSock = [accept2(R) | SSock1], accept(R, SSock1, Chat). accept(R, SSock, Chat) :- R=normal(I,O) | lio:lio(LI, I), lio:lio(LO, O), Chat = [chat(LI,LO) | Chat1], accept(SSock, Chat1). chat(Chat, Lss, Ls) :- Chat=[chat(LI,LO)|Chat1] | Lss = {Ls1, Lss1}, getl(K, LI, Ls1), putl(K, Ls, LO), chat(Chat1, Lss1, Ls). alternatively. chat(Chat, Lss, Ls) :- Ls=[_|Ls1] | chat(Chat, Lss, Ls1). getl(K, LI, Ls) :- true | LI = [getl(L) | LI1], getl(K, L, LI1, Ls). getl(K, L, LI, Ls) :- L="." | K = kill, Ls = [], LI = []. otherwise. getl(K, L, LI, Ls) :- string(L,_,8) | Ls = [L | Ls1], getl(K, LI, Ls1). putl(K, Ls, LO) :- K=kill | LO = [putl("."), fflush(F) | LO1], wait(F, LO1, []). alternatively. putl(K, Ls, LO) :- Ls=[L|Ls1] | LO = [putl(L), fflush(F) | LO1], wait(F, LO1, LO2), putl(K, Ls1, LO2). wait(F, LO, LO1) :- F=0 | LO = LO1.