先の記事で、助詞「の」の 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 = アヒル.
となる。こっちの方が、単純に思える。ただ、単純な文章が持つ「知識」が、単純に表現されていないから、しっくりいかないのである。