通常文を単純疑問文に改訂するprolog

先の記事では、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の二分木作成システムで作ったもの)。が、それとは違う二分木システムの単純疑問文になる。プログラムのものは、左の葉に長いシステムで、こちらは、元の文章に引きづられているので、右に長い文章になっている。