:- use_module(library(lists), [member/2]). star(Commands) :- collect_stars(Commands,Stars), Stars = [star(StartCol,StartLine0)|RestStars], max_line(RestStars,StartLine0,StartLine), write_stars(Stars,StartLine,StartCol). write_stars([],_,_). write_stars(Lines,StartLine,StartCol) :- Lines = [_|_], write1line(Lines,StartLine,StartCol), findall(star(A,B),(member(star(A,B),Lines), B \== StartLine), RestLines), StartLine1 is StartLine - 1, write_stars(RestLines,StartLine1,StartCol). write1line(Lines,StartLine,StartCol) :- findall(Col,member(star(Col,StartLine),Lines),Cols), sort(Cols,ColsS), writecols(ColsS,StartCol), nl. writecols([],_). writecols([X|R],Col) :- Col1 is Col + 1, ( Col == X -> write('*'), writecols(R,Col1) ; write(' '), writecols([X|R],Col1) ).