:-main(50,50).
main(A, B) :- gen(0, A, 10, As), gen(0, B, 5, Bs) , merge(As, Bs, Rs), compact(Rs, Os), outputln(Os). 
% main(A, B) :- gen(0, A, 10, As), gen(0, B, 5, Bs) , merge(As, Bs, Rs), outputln(Rs). 
% 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 = [].

gen(N, Max, I, Ns) :- N=<Max | Ns=[N|Ns1], N1:=N+I, gen(N1, Max, I, Ns1) .
gen(N, Max, I, Ns) :- N>Max  | Ns=[].

merge([A|As], Bs, Os) :- true | Os = [A|Os1], merge(As, Bs, Os1) .
merge(As, [B|Bs], Os) :- true | Os = [B|Os1], merge(As, Bs, Os1) .
merge([],Bs, Os) :- true | Bs=Os.
merge(As,[], Os) :- true | As=Os.

compact([],   Os) :- true | Os =[].
compact([X|L],Os) :- true | Os=[X|Os1], remove(X,L,Z), compact(Z,Os1).

remove(X,[],Z)    :- true | Z=[].
remove(X,[X|L],Z) :- true | remove(X,L,Z).
remove(X,[A|L],Z) :- X \= A| Z=[A|Z1], remove(X,L,Z1).
