エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

もっと気軽に Prolog でフィボナッチ数列

先日、フィボナッチ数列を求める Prolog のコードを書いたわけですが。

もっとすっきりと書けることに気がつきました。

add(X, Y, Z) :-
  Z is (X + Y).

fib(N, Fib) :-
  length(Fib, N),
  append(Fib, [_], [1|Fib2]),
  append(Fib2, [_], [1|Fib3]),
  maplist(add, Fib, Fib2, Fib3).

1番目からN番目までのフィボナッチ数の数列を Fib 、2番目からN + 1番目までのフィボナッチ数の数列を Fib2 、3番目からN + 2番目までのフィボナッチ数の数列を Fib3 とすると、つまり

  • Fib = { F1, F2, F3, ..., FN - 1, FN }
  • Fib2 = { F2, F3, F4, ..., FN, FN + 1 }
  • Fib3 = { F3, F4, F5, ..., FN + 1, FN + 2 }

とすると、

  • Fib の要素の数は N に等しい
  • Fib と { FN + 1 } を連結した数列は、Fib2 の先頭に F1 ( = 1 ) を追加した数列に等しい
  • Fib2 と { FN + 2 } を連結した数列は、Fib3 の先頭に F2 ( = 1 ) を追加した数列に等しい
  • Fibi 番目の要素 FiFib2i 番目の要素 Fi + 1 を加えたものは Fib3i 番目の要素 Fi + 2 に等しい

となるので、それをそのままコードにしてみました。
ただ FN + 1FN + 2 の値は利用しないので、変数名を指定せずにワイルドカードにしています。