shapes(Matrix,N) :- transform(Matrix,[],Matrix1), numbervars(Matrix1,0,N). transform([],_,[]). transform([Line|RestMatrix],PrevLine,[Line1|RestMatrix1]) :- new_neighbor(PrevLine,P1,PrevLine1), new_neighbor(PrevLine1,P2,PrevLine2), transformline(Line,black,P1,P2,PrevLine2,white(_),Line1), transform(RestMatrix,Line1,RestMatrix1). transformline([],_,_,_,_,_,[]). transformline([black|Xs],_,P1,P2,RP,_,[black|Ys]) :- new_neighbor(RP,P3,RestRP), transformline(Xs,P1,P2,P3,RestRP,white(_),Ys). transformline([white|Xs],P0,P1,P2,RP,WhiteVar,[WhiteVar|Ys]) :- new_neighbor(RP,P3,RestRP), bind(P0,WhiteVar), bind(P1,WhiteVar), bind(P2,WhiteVar), transformline(Xs,P1,P2,P3,RestRP,WhiteVar,Ys). bind(black,_). bind(white(V),white(V)). new_neighbor([],black,[]). new_neighbor([X|R],X,R).