格助詞「は」のprolog処理

先の記事で、助詞「の」の prolog処理の例を示したが、格助詞「は」の処理例は以下のようになる。

は(ニワトリ, 鳥).
生む(A, 卵) :- は(A, 鳥).

一行目は、宣言文である。すなわち「ニワトリは鳥である」。二行目は、規則となるで、「鳥は卵を生む」を表している。もう少し丁寧に文に即して言えば「卵を生むものであるためには、それが鳥であれば良い」とも言える。

この知識を利用すると、次のように質問に答えることができる。

?- 生む(ニワトリ,卵).  %一つ目の問い合わせ
true.

?- 生む(ニワトリ,Y).   % 二つ目の問い合わせ
Y = 卵.

となる。一つ目は、ニワトリは卵を生むというのは正しい、二つ目は、ニワトリが生むとしたら、それは卵だろうということを表している。

ただ、ちょっと気に入らないところがある。元々は、「ニワトリは卵を生む」という文章をprolog化したかったのだが、少し趣旨が違ってきたように思う。

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

書けば上記のようになるはずだ。これだけを prologの宣言文とする。すると次のような、問い合わせに対応できる。

%(1)
?- は(X,生む(Y)). 
X = ニワトリ,
Y = 卵.
%(2)
?- は(ニワトリ,生む(Y)).
Y = 卵.
%(3)
?- は(X,生む(卵)). 
X = ニワトリ.

(1)は、現状の知識では、何かを生む何者とは、という問い合わせに、ニワトリならば卵を生むけれどね、という答えしか出さない。(2)ニワトリが何かを生むとしたら、それは卵であると答える。(3)卵を生むものであるならば、それはニワトリであろう、というわけである。

知識が増えたらどうなるだろう。「アヒルも卵を生む」というわけである。宣言文が二つになる。

% 知識の表現
は(ニワトリ,生む(卵)).
は(アヒル,生む(卵)).

すると、先の答えが少し違ってくる。

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

?- は(アヒル,生む(卵)).
true.

?- は(X,生む(卵)).
X = ニワトリ ;
X = アヒル.

卵を生むものには、ニワトリもいるがアヒルもいる、というわけである。前者の場合は、

% 知識の表現
は(ニワトリ, 鳥).
は(アヒル, 鳥).
生む(A, 卵) :- は(A, 鳥).

となる。増えた分は単純だ。問い合わせの例は次のようになる

?- 生む(X,卵).
X = ニワトリ ;
X = アヒル.

となる。こっちの方が、単純に思える。ただ、単純な文章が持つ「知識」が、単純に表現されていないから、しっくりいかないのである。