public
Created

Prolog definition of infinite Fibonacci sequence

  • Download Gist
example.txt
1 2 3
?- fibs(F), take(F, 20, _).
F = [0, 1, 1, 2, 3, 5, 8, 13, 21|...],
freeze(_G2395, zip_with(plus, [2584, 4181|_G2395], [4181|_G2395], _G2395)).
fibonacci.pl
Perl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
zip_with(_, [], []).
zip_with(Goal, [A|As], [B|Bs], [C|Cs]) :-
call(Goal, A, B, C),
freeze(Cs, zip_with(Goal, As, Bs, Cs)).
 
% implementation from SWI pack list_util
take([], N, []) :-
N > 0,
!.
take(_, 0, []) :-
!.
take([H|T], N1, [H|Rest]) :-
N1 > 0,
succ(N0, N1),
take(T, N0, Rest).
 
% infinite, lazy Fibonacci sequence
fibs([0,1|T]) :-
F = [0,1|T],
F1 = [1|T],
freeze(T, zip_with(plus, F, F1, T)).

Thank you very much! Here's my take on it:

fib(X):- X=[0,1|Z], ffib(Z,X).
ffib(Z,X):- X=[A|Y], Y=[B|_], N is A+B, freeze(Z, (Z=[N|W],ffib(W,Y)) ).

Seems to work too:

13 ?- fib(X), length(A,15),append(A,B,X), writeln(A).
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

This a translation of

fib = 0:1:ffib fib where ffib (a: y@(b:_)) = (a+b):ffib y

@WillNess nicely done

thx! and thank you for showing it to me first. :)

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.