AIサーバーとAIクライアント:prolog二分木

先の記事では、クライアント側が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 = > アトムはロボットです

これからは、知識が多い場合の処理はもう少し後にして、単純な知識が様々に利用される状況を想定してみる。