stars(Commands) :- buildStars(0,0,Commands,Stars), mins(Stars,X,Y), shift(X,Y,Stars,Shifted), sortPairs(Shifted,Sorted), printStars(0,0,Sorted). buildStars(_,_,[],[]). buildStars(X,Y,[left |Cs],Stars) :- X1 is X-1, buildStars(X1,Y,Cs,Stars). buildStars(X,Y,[up |Cs],Stars) :- Y1 is Y-1, buildStars(X,Y1,Cs,Stars). buildStars(X,Y,[right|Cs],Stars) :- X1 is X+1, buildStars(X1,Y,Cs,Stars). buildStars(X,Y,[down |Cs],Stars) :- Y1 is Y+1, buildStars(X,Y1,Cs,Stars). buildStars(X,Y,[star |Cs],[(X,Y)|Stars]) :- buildStars(X,Y,Cs,Stars). mins([(X,Y)|Ps],Mx,My) :- mins(X,Y,Ps,Mx,My). mins(X,Y,[],X,Y). mins(X,Y,[(A,B)|Ps],Mx,My) :- X1 is min(X,A), Y1 is min(Y,B), mins(X1,Y1,Ps,Mx,My). shift(_,_,[],[]). shift(X,Y,[(A,B)|Ps],[(C,D)|SPs]) :- C is A-X, D is B-Y, shift(X,Y,Ps,SPs). sortPairs([],[]). sortPairs([(X,Y)|Ps],SPs) :- sortPairs(Ps,SPs1), insertPair((X,Y),SPs1,SPs). insertPair(P,[],[P]). insertPair(P,[P|Ps],[P|Ps]) :- !. insertPair(P,[Q|Ps],[P,Q|Ps]) :- leqPair(P,Q), !. insertPair(P,[Q|Ps],[Q|Qs]) :- insertPair(P,Ps,Qs). leqPair((B,A),(C,A)) :- B =< C. leqPair((_,A),(_,C)) :- A < C. printStars(_,[]) :- nl. printStars(X,Y,[(X,Y)|Ps]) :- write('*'), X1 is X+1, printStars(X1,Y,Ps). printStars(X,Y,[(Z,Y)|Ps]) :- X < Z, Tab is Z-X, tab(Tab), printStars(Z,Y,[(Z,Y)|Ps]). printStars(_,Y,[(A,B)|Ps]) :- Y < B, nl, Y1 is Y+1, printStars(0,Y1,[(A,B)|Ps]).