読者です 読者をやめる 読者になる 読者になる

今日学んだこと

読書感想文とか、勉強した内容とか

FizzBuzzで学ぶProlog

そういえば記事にするの忘れてた。

ちょっと前に、CodeIQにてこんな設問がありました。

codeiq.jp

ふむふむ・・・コレならネタ枠として、あまり技術力無い僕でも参加できそうだ・・・ということで参加してみました。

Prologってコード見たことある?

そういう言語があるっていうのを聞いたことがある人は多いと思います。
ただ、実際にコード見たり書いたりしたことある人って少ないんじゃないかなーと思ってます。

僕も、気になってはいたものの、実際に手を動かした事がなかったので、コレは良い機会だと作ってみました。

実際のコードがこちら

% fizzbuzzの仕様
% 15 で割り切れる場合は FizzBuzz を出力する
% 5 で割り切れる場合は Buzz を出力する
% 3 で割り切れる場合は Fizz を出力する
% その他の場合は入力した数値をそのまま出力する
% 
% 参考文献
% http://ja.wikipedia.org/wiki/Prolog
% http://wiki.bit-hive.com/y10/pg/Prolog%B4%F0%C1%C3
% http://stackoverflow.com/questions/16776166/create-something-like-a-for-in-swi-prolog

% 条件定義
'15で割り切れる'(X) :- X mod 15 =:= 0.
'5で割り切れる'(X)  :- X mod 5 =:= 0.
'3で割り切れる'(X)  :- X mod 3 =:= 0.
'その他の場合'(X)   :- \+'15で割り切れる'(X), \+'5で割り切れる'(X), \+'3で割り切れる'(X). % 処理上無くても良いけど、言葉の定義に合わせる

% 結果定義
'FizzBuzzを出力する'(_)     :- print('FizzBuzz').
'Buzzを出力する'(_)         :- print('Buzz').
'Fizzを出力する'(_)         :- print('Fizz').
'数値をそのまま出力する'(X) :- print(X).

% 処理定義
'Fizz?Buzz?FizzBuzz?'(X) :-
    '15で割り切れる'(X) -> 'FizzBuzzを出力する'(X);
    '5で割り切れる'(X)  -> 'Buzzを出力する'(X);
    '3で割り切れる'(X)  -> 'Fizzを出力する'(X);
    'その他の場合'(X)   -> '数値をそのまま出力する'(X).

% 1〜100を渡す
:- forall(between(1,100,I), 'Fizz?Buzz?FizzBuzz?'(I)).

・・・Prologっぽくないかもしれないけど、なんかすごくきれいじゃない?
最終的にこの形になったとき、思わず感動してしまった。

学習の友として主にWikipediaを利用しており(何故かすごく充実している)、そこにあるサンプルに従い日本語を多用したこともあるんだけど、なんだかいつも書いてるコードより読みやすいし論理的な気もしてくる。

<参考文献>
Prolog - Wikipedia

実用的なものが作れるのか、まだ僕にはわからないけど

最近良く聞くWatsonなんかもPrologが使われている(もしかすると過去形?)なんて話も聞く

Watsonは、こんなふうにかんがえる―日本IBM 武田浩一氏に訊く、旧来AIとコグニティブの違い (1/3):EnterpriseZine(エンタープライズジン)

(非手続き型プログラミング言語の)Prolog中心の推論エンジンを作ろうというものでした

なんで、使おうと思えば使えるだろうし、他の言語より適してる場面もあるんだと思う。

だからと言って僕がProlog使って何か作るかというと、多分つくらない気もする。

ただ、いつも使ってるJavaなりPythonなりなんなりと別のパラダイムの言語、たとえばLispとかPrologとか、そういうのを触るのは純粋に面白い。まだ入り口しか見てない訳だけど。

こうやってプログラムの面白さを再認識する為にも、いろんな言語を触ってみるのはいいかもなーと思った次第です。