次に、助詞「を」を処理しよう。前と同じ「ニワトリは卵を生む」というデータの中には「を」が入っている。先には、
は(ニワトリ,産む(卵)).
と知識化したのだが、この後半が良くなかった。そこで、そこを改良して、助詞「を」をオペレータ化をすることにする。つまり、
は(ニワトリ,を(卵,生む)).
とても、文章データを基にしたprolog知識としていい線をいっている。ほとんど、文章そのものを形にした感じがある。
この知識に対して問い合わせした結果は次のようになる。
?- は(X,を(卵,Y)). X = ニワトリ, Y = 生む. ?- は(ニワトリ,を(Z,生む)). Z = 卵.
前半は、「卵というのは、ニワトリが生むものである」というわけである。後半は「ニワトリが生むとしたら、それは卵である」ということになる。少し面白いのは次の問い合わせである。
?- は(ニワトリ,Z). Z = を(卵, 生む).
ニワトリとは何かに対して、卵を生むものであるという、意味を返してきているのである。ここには、プログラム自体と、データを同じように扱うという特色が現れているのだと思う。
さらに次のようなことを考える。元々の「ニワトリは卵を生む」という情報の中には、「卵」は「生む」という動詞に結びつくのだという大切な「知識」が含まれている。これも、prolog化できそうな気がする。
そこで、
を(卵,Z)
のユニフィケーションを求めると、次のようにエラーになる。
?- を(卵,Z). ERROR: Undefined procedure: を/2 (DWIM could not correct goal)
当然なのは当然なのだが、なんとしたものか。もちろん、を(卵, 生む).を宣言してしまえば、問題はないのだが。なんか方法はあるはずだが、今の私のprologの知識では、なんともならない。
宣言文の中にある、相対的に独立した部分知識を取り出す手続きがあればいい。(要検討)