先の記事では、クライアント側がjavaだったが、クライアント側もprologにした。クライアントプログラムは、先の平文を二分木にするクライアントを少し変えたものだ。
% % prologのテレパシーサーバーに質問し、回答を得るクライアント % % 文字列とutf8のバイトコードを相互に変換する % http://www.ibot.co.jp/wpibot/?p=2681 など参照 :- ['../lib/utf8string.swi']. % swi-prologモジュールの組み込み :- use_module(library(streampool)). % クライアントをスタートさせて、ストリームを取得、グローバル変数に保存する telepathy_client(Host, Port) :- setup_call_catcher_cleanup(tcp_socket(Socket), tcp_connect(Socket, Host:Port), exception(_), tcp_close_socket(Socket)), setup_call_cleanup(tcp_open_socket(Socket, In, Out), nb_setval(socketIn,In), nb_setval(socketOut,Out)). telepathy_to_server(Term,Reply) :- % 送信文字列をコードに変換する utf8tring(Bytes,Term), nb_getval(socketIn,In), nb_getval(socketOut,Out), % コマンをつけて、サーバーに送信 % format(Out, '~w:~s~n', [Com,Bytes]), % 当面コマンドをつけない format(Out, '~s~n', [Bytes]), flush_output(Out), %read(In, ReplyCode), % これではうまくいかない % サーバーからコードを受信する read_line_to_codes(In, ReplyCode), % write(ReplyCode),nl, % コードを文字列に変換 utf8tring(ReplyCode,Reply). % 表示する %format('Reply: ~s~n', [Reply]). % ストリームを閉じる telepathy_close :- nb_getval(socketIn,In), nb_getval(socketOut,Out), close(In, [force(true)]), close(Out, [force(true)]).
サーバー側は、前の記事と同じで変更ない。実行結果は以下のようである。
まず、クライアント側。
?- ['telepathy_client.swi']. true. ?- telepathy_client(localhost,30000). true. ?- telepathy_to_server(アトムとはなんですか,Reply). Reply = アトムはロボットです.
続いて、サーバー側。
?- ['telepathy_server.swi']. true. ?- server(30000). Receive = > アトムとはなんですか Send = > アトムはロボットです
これからは、知識が多い場合の処理はもう少し後にして、単純な知識が様々に利用される状況を想定してみる。