知識に基づく対話を考えるときに、疑問文の生成は避けて通れない。疑問文は、対話のトリガー、対話を動機づけるものだ。まず、終助詞の「か」を加えて単純疑問文を生成することを試みるのが順当である。
準備として、既存二分木に部分二分木(ないしは語)を加える汎用プログラムを作成しておく。
%% 空のツリーに、Nodeを与えると、それ自身を返す insert(_,Node,[],Node). %% 既存ツリーが語の場合 insert(left,node(Value,Left,[]),Word,node(Value,Left,Word)) :- atom(Word),!. insert(right,node(Value,[],Right),Word,node(Value,Word,Right)) :- atom(Word),!. %% すでにTreeがある場合 insert(left,Node,node(Value, Left, Right), node(Value, New, Right)) :- insert(left,Node,Left,New),!. insert(right,Node,node(Value, Left, Right), node(Value, Left, New)) :- insert(right,Node,Right,New),!.
例えば、「アトムはロボットです」という二分木は、
node(は,アトム,ロボットです)
と書ける。
これを先のinsertを用いて単純疑問文に変えてみよう。
?- ['create.swi']. true. ?- insert(right,node(か,[],[]),node(は,アトム,ロボットです),Q疑問文). Q疑問文 = node(は, アトム, node(か, ロボットです, [])). ?- insert(right,node(か,[],[]),node(は,アトム, node(の,博士,ロボットです)),Q疑問文). Q疑問文 = node(は, アトム, node(の, 博士, node(か, ロボットです, []))). ?- insert(right,node(か,[],[]),node(は,アトム,node([],ロボットです,[])),Q疑問文). Q疑問文 = node(は, アトム, node([], ロボットです, node(か, [], []))).
最後のものは、明らかに、無駄なツリーを持つものになってしまったが、変更は容易である。
次は、「どれ、どちら、どなた、どこ、だれ、いつ、いくつ、どの、どう、なぜ」という、疑問詞を持った疑問文を生成することを試みる。