前回、関数プログラミングのリハビリがてら、Haskell で
Fizz-Buzz 問題を解いてみたのだが、まぁ、問題が簡単すぎで、あんまり "関数型言語ならでは" という雰囲気がでなかった。
Haskell の構文を思い出すのには役だったが、リハビリというにはちょっとだったかも。
そんな思いのせいか、無性に
Prolog でも Fizz-Buzz 問題を解いてみたくなった。
使った処理系は
P#。
trans(N,fizzBuzz) :- trans(N,fizz), trans(N,buzz).
trans(N,fizz) :- 0 is N mod 3.
trans(N,buzz) :- 0 is N mod 5.
trans(N,N).
do(101).
do(N) :-
trans(N,Result), write(Result), nl,
N2 is N + 1,
do(N2).
こんな感じですかね。
これで、
?- do(1).
と "問い合わせ" すると、コンソールに結果表示される。
「1から100まで」という、いわゆるループというか、あるいは、[1,2,3,...,100] というリストの生成とかを Prolog ではどうやるのがいいのか、知識不足と経験不足でよくわからなかったため、自己流で再帰で書いた。
Prolog ならではの雰囲気は、前半の trans 述語。
"N が fizz でも buzz でもある場合は fizzBuzz である" とか、"上記いずれにも該当しない場合は N は N である" など、論理プログラミングというか、ユニフィケーションおもしろい、といったところである。