相思相愛の述語を記してください。(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?)で、今まで束縛、代入しか意識していなかったので、参考になりました。ユニフィケーションを生かすとすれば、木探索でノードをつなぐときに、普通親ノードと子ノードたちを束縛していたものを子ノードたちだけに統合が起これば、奇麗に記述することができると思いまし、もっと他の使い道もあるはずなので、今後他の言語で出てくることを期待したいです。(または作るか。)