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).
=<とか、
HaskellやC言語と記号の使い方が異なってて微妙にひっかかる。
あと、
is
が、代入なのだが、 == に思えてしょうがない。