助詞「で」のprolog処理:構文解析

さらに、「ニワトリは、庭で卵を生む」となったらどうだろう。素直に考えれば、prologに次の宣言文を加えれば良いということになる。

は(ニワトリ,で(庭,を(卵,生む))).

例えば、これに

?- は(ニワトリ,で(X,を(卵,生む))).

と問い合わせると、

X = 庭.

と返してくる。質問は、ニワトリはどこで卵を産みますか、という趣旨である。それに「庭」と答えているわけだ。

一見もっともらしいが、ちょっと引っかかる。「を」が「で」の中に入っているのが気になる。逆でもいいのではないかということだ。

は(ニワトリ,を(卵,で(庭,生む))).

これは、構文解析の問題である。

そこで、この文章をCabochaにかけてみる。

$ cabocha -f1
ニワトリは庭で卵を生んだ
* 0 3D 0/1 -1.268576
ニワトリ	名詞,一般,*,*,*,*,ニワトリ,ニワトリ,ニワトリ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
* 1 3D 0/1 -1.268576
庭	名詞,一般,*,*,*,*,庭,ニワ,ニワ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
* 2 3D 0/1 -1.268576
卵	名詞,一般,*,*,*,*,卵,タマゴ,タマゴ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
* 3 -1D 0/1 0.000000
生ん	動詞,自立,*,*,五段・マ行,連用タ接続,生む,ウン,ウン
だ	助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ
EOS

すなわち、ニワトリ、庭、卵、のすべての名詞句が、「生んだ」という動詞句にかかっているのである。*がついた行の2番目の3Dという記号が、3番目の句、「生んだ」への係りを表している。

そうなると、宣言文が

は(ニワトリ,生む).
で(庭,生む).
を(卵,生む).

に分解されていると考えてもいいのだろう。この三つの宣言が真の時は、

?- は(ニワトリ,で(庭,を(卵,生む))).

の問い合わせには、「真」を返して欲しい。このこと自体は、prologの規則を使って記述することができる。

は(ニワトリ,で(庭,を(卵,生む))) :- は(ニワトリ,生む),で(庭,生む),を(卵,生む).

ということになる。

次のようなファイル、test2.swiを作成して、

%%%%%%%%%%%%%%%%%%%%%
% 事実の宣言
は(ニワトリ,生む).
で(庭,生む).
を(卵,生む).
% ルール
は(ニワトリ,で(庭,を(卵,生む))) :- は(ニワトリ,生む),で(庭,生む),を(卵,生む).
%%%%%%%%%%%%%%%%%%%%%

$ swirl -f test2.swi

とprologに読み込ませて、

?- は(ニワトリ,で(庭,を(卵,生む))).
true .

クエリをかけると、trueとなる。