Is it possible to have lazy lists in Prolog? Something like the following:
ones([1 | Y]) :- ones(Y).
Although this obviously doesn\'t work
% A simple generic solution using SWI-Prolog
% Returns a prefix of a lazy sequence
prefix(Prefix,PrefixLength,LazySequenceName) :-
apply(LazySequenceName,[LazySequence]),
length(Prefix,PrefixLength),
append(Prefix,_,LazySequence).
% Lazy sequence of natural numbers
nat(LazySequence) :-
nat(0,LazySequence).
nat(Item,LazySequence) :-
freeze(LazySequence,
(LazySequence=[Item|Rest], Next is Item+1, nat(Next,Rest)) ).
% Lazy sequence of Fibonacci numbers
fib(LazySequence) :-
fib(1,0,LazySequence).
fib(A,B,LazySequence) :-
freeze(LazySequence,
(LazySequence=[C|Rest], C is A+B, fib(B,C,Rest))).
% Examples
test :-
prefix(N,10,nat), format('Ten first natural numbers: ~w~n',[N]),
prefix(F,10,fib), format('Ten first Fibonacci numbers: ~w~n',[F]),
fib(S), nth1(100,S,X), format('The hundredth Fibonacci number: ~w~n',[X]).