PL|LP 相思相愛

相思相愛の述語を記してください。(Prologで実装しなさい。)

ソースコード
					?- remove.
					likes(john, apple).
					likes(john, wine).
					likes(john, mary).
					likes(mary, wine).
					likes(mary, john).
					lovers(X, Y) :- likes(X,Y), likes(Y,X).
					?- clear.
					?- listing.
					?- lovers(X, Y).
実行結果
					yes
					?- listing.
					likes(john,apple).
					likes(john,wine).
					likes(john,mary).
					likes(mary,wine).
					likes(mary,john).
					lovers(X,Y) :- 
						likes(X,Y), 
						likes(Y,X).
					yes
					?- lovers(X,Y).
					X = john ,
					Y = mary ;
					X = mary ,
					Y = john ;
					no

その他、感想

Prolog

 非手続き型プログラミング言語"Prolog"を使ってみて、今までの言語と比べて、"for","while","if"と言った構文がない分、ブレース括弧がなくて、コードが横に長くならない特徴があると単純に思いました。そして、普通ならソースコード7行目のように、for-eachで複数の値同士が一致するかを判別する物を1行で記述していて、PythonやRuby等のような内包表記よりもスマート(賢い)だと思いました。

 また、関数呼び出しが中心なものだと感じました。そして、ユニフィケーション(統合)に関しては、初めて知ったもの(arrow?)で、今まで束縛、代入しか意識していなかったので、参考になりました。ユニフィケーションを生かすとすれば、木探索でノードをつなぐときに、普通親ノードと子ノードたちを束縛していたものを子ノードたちだけに統合が起これば、奇麗に記述することができると思いまし、もっと他の使い道もあるはずなので、今後他の言語で出てくることを期待したいです。(または作るか。)

トップページへ戻る