RosettaCodeData/Task/Pascals-triangle/Prolog/pascals-triangle-1.pro

37 lines
649 B
Prolog

pascal(N) :-
pascal(1, N, [1], [[1]|X]-X, L),
maplist(my_format, L).
pascal(Max, Max, L, LC, LF) :-
!,
make_new_line(L, NL),
append_dl(LC, [NL|X]-X, LF-[]).
pascal(N, Max, L, NC, LF) :-
build_new_line(L, NL),
append_dl(NC, [NL|X]-X, NC1),
N1 is N+1,
pascal(N1, Max, NL, NC1, LF).
build_new_line(L, R) :-
build(L, 0, X-X, R).
build([], V, RC, RF) :-
append_dl(RC, [V|Y]-Y, RF-[]).
build([H|T], V, RC, R) :-
V1 is V+H,
append_dl(RC, [V1|Y]-Y, RC1),
build(T, H, RC1, R).
append_dl(X1-X2, X2-X3, X1-X3).
% to have a correct output !
my_format([H|T]) :-
write(H),
maplist(my_writef, T),
nl.
my_writef(X) :-
writef(' %5r', [X]).