Prolog に触る(1)

とりあえず like.pro として以下のようなファイルを作って、SWI-Prolog に読み込ませてみる。

like(taro, coffee).
like(taro, hanako).
like(hanako, hanako).
like(sizuka, isamu).
like(isamu, sizuka).
like(coffee, human).
human(taro).
human(hanako).
human(sizuka).
human(isamu).

で、インタプリタで色々質問。

1 ?- like(taro, hanako).

Yes
2 ?- like(hanako, taro).

No
3 ?- human(taro).

Yes

Yes/No の 1bit の返事をしてくれた喜ぼう。

4 ?- like(taro, X).

X = coffee ;

X = hanako ;

No

こういうことですね。

< taro が like な X はなんですか。
> coffee じゃないですか?
< いや違う(「;」の入力)
> hanako じゃないですか?
< いや違う
> じゃあもう知らねえよ馬鹿
6 ?- like(X, hanako).

X = taro 

Yes
7 ?- like(Foo, Bar).

Foo = taro,
Bar = coffee ;

Foo = taro,
Bar = hanako ;

Yes
8 ?- human(X).

X = taro 

Yes
9 ?- like(X, X).

X = hanako 

Yes

自由変数(X, Y みたいな大文字で始まる識別子)はどこにでも指定できるよ、と。うん、これは述語論理そのまんまじゃなかろうか。あとここまでしかやったことない俺がほざくのもなんだが、Prologって簡単じゃね? 噂に聞いた評判では、むずいむずいと評判だったけど、それは Prolog でプログラム書くのが難しいのであって、Prolog が難しいわけじゃないのではないか。
まだわからんけど。

12 ?- like(X, Y), like(Y,X).

X = hanako,
Y = hanako ;

X = sizuka,
Y = isamu 

Yes
13 ?- like(X, Y), human(Y).

X = taro,
Y = hanako ;

X = hanako,
Y = hanako ;

X = sizuka,
Y = isamu ;

X = isamu,
Y = sizuka ;

No

こんなんもできた。X, Y のような自由変数は、それ以降で束縛されてるとか。
えーと例えば上の 13 はこんな論理式に相当するだろうか。\exists{(X,Y)}, L_{XY} & H_{Y} (L:Like, H:Human という述語で)

とりあえず、論理学の講義は受けといてよかったなあと思った。

test