質問文二分木の作成をやってきたが、ここで、質問を受け取って、自分の知識に基づいて解答を作成するシステムを作る。
質問は、平文で受け取るので、そこから知識の二分木に結びつけなければならないのだが、一旦、質問文を二分木に変換するのがいいと思った。prologで作成しようと思ったが、いろいろ面倒なので、これまでのjavaの作成システムにサーバー機能も持たせて、そこにアクセスして単文を二分木にしようと思う。
prologのクライアントを作成した。
% % 文章を与えて、サーバーからprolog二分木を取ってくるクライアント % % 文字列とutf8のバイトコードを相互に変換する % http://www.ibot.co.jp/wpibot/?p=2681 など参照 :- ['utf8string.swi']. % swi-prologモジュールの組み込み :- use_module(library(streampool)). % クライアントをスタートさせて、ストリームを取得、グローバル変数に保存する create_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)). % 単文を送信して、二分木を受け取る chat_to_server(Term) :- % 送信文字列をコードに変換する utf8tring(Bytes,Term), nb_getval(socketIn,In), nb_getval(socketOut,Out), % コマンドをつけて、サーバーに送信 format(Out, 'GETTREE:~s~n', [Bytes]), flush_output(Out), %read(In, ReplyCode), % これではうまくいかない % サーバーからコードを受信する read_line_to_codes(In, ReplyCode), %write(ReplyCode), % コードを文字列に変換 utf8tring(ReplyCode,Reply), % 表示する format('Reply: ~s~n', [Reply]). % ストリームを閉じる close_connection :- nb_getval(socketIn,In), nb_getval(socketOut,Out), close(In, [force(true)]), close(Out, [force(true)]).
prologは、utf8のバイトコードで送受信するので、その変換が必要だった。すでに作成したシステムがあったので、簡単に済ますことができた。
実行結果は次のよう。
?- ['../client.swi']. true. ?- create_client(localhost,25000). true. ?- chat_to_server(アトムはロボットですか). Reply: dialog(190520092729_0_0,node(ですか,node(は,[アトム, 'S:普/C:自然物/D:科学・技術'],[ロボット, 'S:普/C:人工物-その他/D:科学・技術']),[ ])). true.