さらに、「ニワトリは、庭で卵を生む」となったらどうだろう。素直に考えれば、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となる。