K L M A ---> B ---> C ---> D +----> F L AC L@BC=K@AC A>F L@BF=K@AF BC L@BC=K@AB B>F L@BF=K@AB AB K@AB=Exported A>B K@AB=Exported BD M@CD-Removed AD M@CD=L@BD | | K@AB=L@BC=M@CD=L@BD +L@BD A>C L@BC=K@AC | | K@AB=L@BC=M@CD=L@BD=K@AC +K@AC CC L@BC-Removed AC L@BC-Removed BC L@BC=K@AC | | K@AB=L@BC=M@CD=K@AC +K@AC B>D M@CD=L@BD | | K@AB=L@BC=M@CD=K@AC=L@BD +L@BD BD M@CD-Removed AC L@B(C)=K(@AC) AD M@C(D)=K(@AD) AE N@D(E)=K(@AE) AC L@B(C)=K(@AC) AD M(@CD)=Exportin BD M@C(D)=K(@AD) AE N@D(E)=K(@AE) DC L@B(C)=K(@AC) B>C L(@BC)=Exportin BD M@C(D)=K(@AD) A>E N@D(E)=K(@AE) C +open* open- -> -open* +open* K: +bind K -> +closing K -fuse K L -> +opening KL -remove K -> closed K -open* K: -bind K -> closed K +fuse K L -> +exporting L +remove K -> -closing K +export K -> -closing K +closing K: -fuse K L -> +closing KL -remove K -> closed K -closing K: -bind K -> closed K -remove K -> closed K +exporting L: -fuse L M -> +closing LM / +forward KLM / -remove L -> exporting L -export L -> closed L IO bound fused removed NS wrap unwrap remove fuse bind T id var close remove fuse bind +D bind -> bound fuse +D1 -> (D=D1) fuse -D1 -> exporting +D remove -> !! +D removed !! -D bind -> !! -D bound !! fuse +D1 -> D=D1 fuse -D1 -> !! -D & -D1 fused !! remove -> removed A ---> B <--- C K L A <--- B ---> C K L A ---> B ---> C K L A>B K=[] BC K@B=[] CA K=L@C NG(CC L@B=[] | CB L=_ | closing(-L) Bclosed B>C L=_ CA K=L@C NG(CC L@B=L' | opening(+L') CB L=_ | closing(-L) Bclosed B>C L=_ CA K=L@C NG(CC L@B=L' | opening(+L') CC L'=[] | closing(+L') CB L=_ | closing(-L) Bclosed B>C L=_ CC L=K@A NG(AA K@B=K' | opening(-K') AB K=[] | closing(+K) Bclosed B>A K=_ AC L=K@A NG(AA K@B=K' | opening(-K') AB K=_ | closing(+K) Bclosed B>A K=_ AC L=K@A NG(AA K@B=K' | opening(-K') AB K=_ | closing(+K) Bclosed A>B K=[] BA K=_ AC L=K@A NG(AB K=[] | closing(+K) BA K@B=K' | opening(-K') AC K'=[] | closing(+K') CB K=_ | closing(+K) Bclosed B>A K=_ Aindirectly_exporting 第三者へ輸出 indirectly_exporting->closed removeMessage を受け取る closing->indirectly_exporting あり得ない closed->indirectly_exporting あり得ない indirectly_exporting->open* あり得ない indirectly_exporting->closing あり得ない append(X,Y,^Z) append(X,Y,Z) :- Z=^(Z1) | append1(X,Y,Z1). append1(X,Y,Z) :- X=[] | Z=[]. append1(X,Y,Z) :- X=[A|X1] | Z=[A|Z1], append1(X1,Y,Z1). Sock=[chat(I,^O)|Sock1], serv(Sock) :- Sock=[chat(I,^O)|Sock1] | chat(I,O), serv(Sock1). chat(I,O) :- I=[] | O=[]. chat(I,O) :- I=[L|I1] | O=[L|O1], chat(I1,O1). append(X,Y,^Z) :- X=[] | Z=Y. append(X,Y,^Z) :- X=[A|X1] | Z=[A|Z1], append(X1,Y,^Z1). chat(I,^O) :- I=[] | O=[]. chat(I,^O) :- I=[L|I1] | O=[L|O1], chat(I1,^O1).