:-main(1000).
main(Max) :- fibo(0, 1, Max, Os), outputln(Os). 
% main(A, B) :- gen(0, A, 10, Rs), gen(0, B, 5, Rs) , outputln(Rs). 
% main(A, B) :- outputln([2,3,4,5]). 

outputln(Xs)       :- true | output(Xs, Os), io:outstream(Os).
output([P|Ps], Os) :- true | Os = [write(P), nl|Os1], output(Ps, Os1).
output([]    , Os) :- true | Os = [].

fibo(X, Y, Max, Os) :- X=<Max | Os=[X1|Os1], X1:=X+Y, Y1:=X, fibo(X1, Y1, Max, Os1) .
fibo(X, Y, Max, Os) :- X>Max  | Os=[].

ave(N, []    , A, Os) :- true | Os=[].
ave(N, [X|Xs], A, Os) :- true | Os=[As|Os1], N1:=N+1, As:=(X+A)/N1, ave(N1, Xs, As, Os1).
