先の記事では、node(か,[],[]) というフレーズを挿入して、疑問文を作る方法を示したが、もう少し柔軟に作成する方法を試みよう。
%% %% 言語二分木を疑問文に変換する %% mkquestionは、単純な確認疑問文を作成する %% %% ------------------------- confirm :- knowledge(_,Node),mkquestion(Node,Q),write(Q). % 再帰の終端処理 mkquestion(node(N,L,R),P) :- atom(R),atom_concat(R,'か',R1),P = node(N,L,R1). mkquestion(node(N,L,[]),P) :- atom(N),atom_concat(N,'か',N1),P = node(N1,L,[]). mkquestion(node([],L,[]),P) :- atom(L),atom_concat(L,'か',L1),P = node([],L1,[]). % こんなことがあるのだろうか? mkquestion(node([],L,[]),P) :- node(N2,L2,R2) = L,mkquestion(R2,P2),P = node(N2,L2,P2). % 基本的な再帰処理 mkquestion(node(N,L,R),P) :- mkquestion(R,P1),P = node(N,L,P1). %% line = アトムはロボットですか %% phrases: [ 0 r1 ] question(testline_0_0, node(ですか, node(は, [アトム, 'S:普/C:自然物/D:科学・技術'], [ロボット, 'S:普/C:人工物-その他/D:科学・技術'] ), [ ] ) ). %% line = アトムはロボットです %% phrases: [ r0 1 ] knowledge(testline_0_0, node(は, [アトム, 'S:普/C:自然物/D:科学・技術'], node(です, [ロボット, 'S:普/C:人工物-その他/D:科学・技術'], [ ] ) ) ).
これは、knowledgeの宣言文を単純疑問文に改訂するprologである。状況としては、知識は持っているが、それが確かであることを確認する単純な疑問文と考えれば良い。次のようになる。
?- ['quetion.swi']. true. ?- confirm. %出力、タブは事後的に入力 node(は, [アトム,S:普/C:自然物/D:科学・技術], node(ですか, [ロボット,S:普/C:人工物-その他/D:科学・技術], [] ) ) true .
プログラムの方には、questionの頭部で、単純疑問文の例を書いておいた(javaの二分木作成システムで作ったもの)。が、それとは違う二分木システムの単純疑問文になる。プログラムのものは、左の葉に長いシステムで、こちらは、元の文章に引きづられているので、右に長い文章になっている。