このディレクトリの索引
#  http://d.hatena.ne.jp/JunichiIto/touch/20111007/1317976730
#
#  Fizz-Buzz問題の例はこんな感じだ。
#  
#  1から100までの数をプリントするプログラムを書け。
#  ただし3の倍数のときは数の代わりに「Fizz」と、
#  5の倍数のときは「Buzz」とプリントし、
#  3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
#  
#  ちゃんとしたプログラマであれば、
#  これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。
#  怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数には
#  それができないのだ。
#  自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。
#  

        
'Fizz-Buzz問題の例' :-
        '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。'.


'1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。' :-
        for(1,N,100),
        '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N),
        N = 100.

'1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :-
        'ただし3の倍数のときは数の代わりに「Fizz」と'(N,_表示アトム),
        プリントする(_表示アトム),!.
'1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :-
        'ただし5の倍数のときは数の代わりに「Buzz」と'(N,_表示アトム),
        プリントする(_表示アトム),!.
'1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :-
        '3と5両方の倍数のときは数の代わりに「FizzBuzz」と'(N,_表示アトム),
        プリントする(_表示アトム),!.
'1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :-
        '3の倍数でなく、5の倍数でもない場合は数字をそのまま'(N,_表示アトム),
        プリントする(_表示アトム),!.

'ただし3の倍数のときは数の代わりに「Fizz」と'(N,'Fizz') :-
        0 is N mod 3,
        \+(0 is N mod 5).

'ただし5の倍数のときは数の代わりに「Buzz」と'(N,'Buzz') :-
        0 is N mod 3,
        \+(0 is N mod 5).

'3と5両方の倍数の場合には「FizzBuzz」'(N,'FizzBuzz') :-
        0 is N mod 3,
        0 is N mod 5.

'3の倍数でなく、5の倍数でもない場合は数字をそのまま表示する'(N,_表示アトム) :-
        \+(0 is N mod 3),
        \+(0 is N mod 5),
        swritef(_表示アトム,'%t',[N]).

プリントする(_表示アトム) :-
        writef('%t',[_表示アトム]).
  


%  少考
%  
%  このプログラムの問題点はプリントが複数箇所に分散していること。
%  普通は for(1,N,100) と N=100. の間で表示アトムを受け取って
%  プリントするように書く。
%  私のプログラミングスタイルでは、述語名に沿って本体(:- の後)を記述することを
%  旨としているため、敢えて将来のメンテナンスの難しさ覚悟で
%  このような記述にした。
%  
%  カットはなくてもよいのですが、「書き手の意志」を示すものとして入れることを
%  勧めます。