wvogel日記

自分用の技術備忘録が多めです.

Prolog練習

2月に入るまでブログが滞ると思われるので、
時間のあるときに少しずつ。


今日は、少し趣旨を変えて、久しぶりにPrologに触ってみることに。
fizzbuzz問題を書いていく!


ではやっていきましょう

ある数を受け取り、それについてのfizzbuzz1を求めるような
基本的な述語は、次のように定義できます。

f(N) :- 
  N mod 15 =:= 0,write(' fizzbuzz ').
f(N) :-
  N mod  3 =:= 0,write(' fizz ').
f(N) :-
  N mod  5 =:= 0,write(' buzz ').
f(N) :-
  write(N).

では、数のリストに対しての述語はどう記述したら良いのか。


簡単な再帰を書いたら良い
全部をまとめて書くと、次のようになります。

fizzbuzz([]).
fizzbuzz([X|Xs]) :-
  f(X),
  fizzbuzz(Xs).

f(N) :- 
  N mod 15 =:= 0,write(' fizzbuzz ').
f(N) :-
  N mod  3 =:= 0,write(' fizz ').
f(N) :-
  N mod  5 =:= 0,write(' buzz ').
f(N) :-
  write(N).

空リストを渡された場合は、何も処理をしません。
Haskellでいうところの

f :: [a] -> IO ()
f [] = return ()

のようなもの。


fizzbuzzを書いたら、階乗なんかも書きたくなる

kaijou(A) :- g(A,1).

g(K,X) :-
  K =< 1 ,write(X).
g(K,X) :-
  K > 1,
  X2 is K*X,
  g(K-1,X2).


=<とか、
HaskellC言語と記号の使い方が異なってて微妙にひっかかる。
あと、
is
が、代入なのだが、 == に思えてしょうがない。