助詞「を」のprolog処理

次に、助詞「を」を処理しよう。前と同じ「ニワトリは卵を生む」というデータの中には「を」が入っている。先には、

は(ニワトリ,産む(卵)).

と知識化したのだが、この後半が良くなかった。そこで、そこを改良して、助詞「を」をオペレータ化をすることにする。つまり、

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

とても、文章データを基にしたprolog知識としていい線をいっている。ほとんど、文章そのものを形にした感じがある。
この知識に対して問い合わせした結果は次のようになる。

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

?- は(ニワトリ,を(Z,生む)).
Z = 卵.

前半は、「卵というのは、ニワトリが生むものである」というわけである。後半は「ニワトリが生むとしたら、それは卵である」ということになる。少し面白いのは次の問い合わせである。

?- は(ニワトリ,Z).
Z = を(卵, 生む).

ニワトリとは何かに対して、卵を生むものであるという、意味を返してきているのである。ここには、プログラム自体と、データを同じように扱うという特色が現れているのだと思う。

さらに次のようなことを考える。元々の「ニワトリは卵を生む」という情報の中には、「卵」は「生む」という動詞に結びつくのだという大切な「知識」が含まれている。これも、prolog化できそうな気がする。

そこで、

を(卵,Z)

のユニフィケーションを求めると、次のようにエラーになる。

?- を(卵,Z).
ERROR: Undefined procedure: を/2 (DWIM could not correct goal)

当然なのは当然なのだが、なんとしたものか。もちろん、を(卵, 生む).を宣言してしまえば、問題はないのだが。なんか方法はあるはずだが、今の私のprologの知識では、なんともならない。

宣言文の中にある、相対的に独立した部分知識を取り出す手続きがあればいい。(要検討)