length([],0). length([X|Xs],1+L) :- L >= 0, length(Xs,L). index([X|Xs],0,X). index([X|Xs],I+1,Y) :- I>=0, index(Xs,I,Y). fiblist_helper(Xs) :- L <= 2, length(Xs,L). fiblist_helper([A,B,C|Rest]) :- A + B = C, fiblist_helper([B,C|Rest]). fiblist([]). fiblist([0]). fiblist([0,1]). fiblist([0,1|Rest]) :- fiblist_helper([0,1|Rest]). fib(F,N) :- index(Fibs,N,F), fiblist(Fibs). add([],[],[]). add([Z|Zs],[X|Xs],[Y|Ys]) :- Z = X + Y, add(Zs,Xs,Ys). sub(Z,X,Y) :- add(X,Z,Y). append(Ys,[],Ys). append([X|Zs],[X|Xs],Ys) :- append(Zs,Xs,Ys). appendlists([],[]). appendlists(Zs,[X|Xs]) :- append(Zs,X,Y), appendlists(Y,Xs). sum([],0). sum([X|Xs],S+X) :- sum(Xs,S). linelength([],0). linelength(Line,Len) :- L > 0, length(Line,L), sum(Line,S), Len = S + L - 1. max(X,X,Y) :- X > Y. max(Y,X,Y) :- Y >= X. maxlinelength([Line],Len) :- linelength(Line,Len). maxlinelength([A,B|Lines],Len) :- linelength(A,X), linelength(B,Y), max(L,X,Y),max(Len,L,Reclen), maxlinelength([B|Lines],Reclen). format(Format,Words,H,W) :- H >= Lf, length(Format,Lf), appendlists(Words,Format), W >= Max, maxlinelength(Format,Max).